basic-memory 0.18.1__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.
Files changed (499) hide show
  1. {basic_memory-0.18.1 → basic_memory-0.18.3}/CHANGELOG.md +19 -0
  2. {basic_memory-0.18.1 → basic_memory-0.18.3}/PKG-INFO +1 -1
  3. basic_memory-0.18.3/docs/NOTE-FORMAT.md +494 -0
  4. basic_memory-0.18.3/docs/specs/SPEC-SCHEMA-IMPL.md +365 -0
  5. basic_memory-0.18.3/docs/specs/SPEC-SCHEMA.md +462 -0
  6. {basic_memory-0.18.1 → basic_memory-0.18.3}/server.json +2 -2
  7. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/__init__.py +1 -1
  8. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/d7e8f9a0b1c2_add_structured_metadata_indexes.py +5 -3
  9. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/app.py +2 -0
  10. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/__init__.py +2 -0
  11. basic_memory-0.18.3/src/basic_memory/api/v2/routers/schema_router.py +305 -0
  12. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/__init__.py +2 -1
  13. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/rclone_commands.py +5 -3
  14. basic_memory-0.18.3/src/basic_memory/cli/commands/schema.py +336 -0
  15. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/main.py +1 -0
  16. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/__init__.py +2 -0
  17. basic_memory-0.18.3/src/basic_memory/mcp/clients/schema.py +113 -0
  18. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/__init__.py +6 -0
  19. basic_memory-0.18.3/src/basic_memory/mcp/tools/schema.py +244 -0
  20. basic_memory-0.18.3/src/basic_memory/schema/__init__.py +58 -0
  21. basic_memory-0.18.3/src/basic_memory/schema/diff.py +111 -0
  22. basic_memory-0.18.3/src/basic_memory/schema/inference.py +323 -0
  23. basic_memory-0.18.3/src/basic_memory/schema/parser.py +236 -0
  24. basic_memory-0.18.3/src/basic_memory/schema/resolver.py +118 -0
  25. basic_memory-0.18.3/src/basic_memory/schema/validator.py +259 -0
  26. basic_memory-0.18.3/src/basic_memory/schemas/schema.py +121 -0
  27. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-01.md +17 -0
  28. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-02.md +16 -0
  29. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-03.md +16 -0
  30. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-04.md +15 -0
  31. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-05.md +16 -0
  32. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-06.md +16 -0
  33. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-07.md +17 -0
  34. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-08.md +17 -0
  35. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-09.md +16 -0
  36. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-10.md +16 -0
  37. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-11.md +15 -0
  38. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-12.md +17 -0
  39. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-13.md +15 -0
  40. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-14.md +16 -0
  41. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-15.md +15 -0
  42. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-16.md +15 -0
  43. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-17.md +14 -0
  44. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-18.md +16 -0
  45. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-19.md +15 -0
  46. basic_memory-0.18.3/test-int/fixtures/schema/drift/people/drift-person-20.md +16 -0
  47. basic_memory-0.18.3/test-int/fixtures/schema/drift/schema/Person.md +18 -0
  48. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/array-single.md +17 -0
  49. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/empty-note.md +5 -0
  50. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/explicit-overrides-type.md +20 -0
  51. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/inline-and-type.md +20 -0
  52. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/no-frontmatter.md +11 -0
  53. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/relation-only.md +15 -0
  54. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/type-no-schema.md +17 -0
  55. basic_memory-0.18.3/test-int/fixtures/schema/edge-cases/unicode-fields.md +19 -0
  56. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ada-lovelace.md +20 -0
  57. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/alan-turing.md +24 -0
  58. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/anders-hejlsberg.md +25 -0
  59. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/andrej-karpathy.md +21 -0
  60. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/barbara-liskov.md +22 -0
  61. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/bjarne-stroustrup.md +20 -0
  62. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/brendan-eich.md +22 -0
  63. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/claude-shannon.md +22 -0
  64. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dennis-ritchie.md +23 -0
  65. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/dijkstra.md +21 -0
  66. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/donald-knuth.md +22 -0
  67. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/fei-fei-li.md +20 -0
  68. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/geoffrey-hinton.md +23 -0
  69. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/grace-hopper.md +24 -0
  70. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/guido-van-rossum.md +22 -0
  71. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/james-gosling.md +21 -0
  72. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/john-carmack.md +24 -0
  73. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/ken-thompson.md +22 -0
  74. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/larry-page.md +18 -0
  75. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/leslie-lamport.md +24 -0
  76. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/linus-torvalds.md +26 -0
  77. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/margaret-hamilton.md +24 -0
  78. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rasmus-lerdorf.md +18 -0
  79. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/richard-stallman.md +23 -0
  80. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/rob-pike.md +23 -0
  81. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/satoshi-nakamoto.md +18 -0
  82. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/tim-berners-lee.md +25 -0
  83. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/vint-cerf.md +21 -0
  84. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yann-lecun.md +24 -0
  85. basic_memory-0.18.3/test-int/fixtures/schema/inference/people/yukihiro-matsumoto.md +19 -0
  86. basic_memory-0.18.3/test-int/fixtures/schema/schemas/Book.md +22 -0
  87. basic_memory-0.18.3/test-int/fixtures/schema/schemas/Meeting.md +22 -0
  88. basic_memory-0.18.3/test-int/fixtures/schema/schemas/Person.md +27 -0
  89. basic_memory-0.18.3/test-int/fixtures/schema/schemas/SoftwareProject.md +23 -0
  90. basic_memory-0.18.3/test-int/fixtures/schema/schemas/StrictSchema.md +22 -0
  91. basic_memory-0.18.3/test-int/fixtures/schema/valid/basic-memory.md +27 -0
  92. basic_memory-0.18.3/test-int/fixtures/schema/valid/explicit-ref-note.md +24 -0
  93. basic_memory-0.18.3/test-int/fixtures/schema/valid/no-schema-note.md +17 -0
  94. basic_memory-0.18.3/test-int/fixtures/schema/valid/paul-graham.md +29 -0
  95. basic_memory-0.18.3/test-int/fixtures/schema/valid/rich-hickey.md +24 -0
  96. basic_memory-0.18.3/test-int/fixtures/schema/valid/standup-2024-01-15.md +32 -0
  97. basic_memory-0.18.3/test-int/fixtures/schema/warnings/extra-observations.md +27 -0
  98. basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-multiple.md +19 -0
  99. basic_memory-0.18.3/test-int/fixtures/schema/warnings/missing-required.md +19 -0
  100. basic_memory-0.18.3/test-int/fixtures/schema/warnings/wrong-enum-value.md +21 -0
  101. basic_memory-0.18.3/test-int/test_schema/__init__.py +1 -0
  102. basic_memory-0.18.3/test-int/test_schema/conftest.py +85 -0
  103. basic_memory-0.18.3/test-int/test_schema/helpers.py +61 -0
  104. basic_memory-0.18.3/test-int/test_schema/test_diff_integration.py +72 -0
  105. basic_memory-0.18.3/test-int/test_schema/test_inference_integration.py +112 -0
  106. basic_memory-0.18.3/test-int/test_schema/test_parser_integration.py +83 -0
  107. basic_memory-0.18.3/test-int/test_schema/test_validator_integration.py +179 -0
  108. basic_memory-0.18.3/tests/api/v2/test_schema_router.py +347 -0
  109. basic_memory-0.18.3/tests/schema/__init__.py +1 -0
  110. basic_memory-0.18.3/tests/schema/test_diff.py +204 -0
  111. basic_memory-0.18.3/tests/schema/test_inference.py +270 -0
  112. basic_memory-0.18.3/tests/schema/test_parser.py +255 -0
  113. basic_memory-0.18.3/tests/schema/test_resolver.py +162 -0
  114. basic_memory-0.18.3/tests/schema/test_validator.py +257 -0
  115. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/test_rclone_commands.py +8 -10
  116. {basic_memory-0.18.1 → basic_memory-0.18.3}/.claude/commands/release/beta.md +0 -0
  117. {basic_memory-0.18.1 → basic_memory-0.18.3}/.claude/commands/release/changelog.md +0 -0
  118. {basic_memory-0.18.1 → basic_memory-0.18.3}/.claude/commands/release/release-check.md +0 -0
  119. {basic_memory-0.18.1 → basic_memory-0.18.3}/.claude/commands/release/release.md +0 -0
  120. {basic_memory-0.18.1 → basic_memory-0.18.3}/.claude/commands/spec.md +0 -0
  121. {basic_memory-0.18.1 → basic_memory-0.18.3}/.claude/commands/test-live.md +0 -0
  122. {basic_memory-0.18.1 → basic_memory-0.18.3}/.claude/settings.json +0 -0
  123. {basic_memory-0.18.1 → basic_memory-0.18.3}/.dockerignore +0 -0
  124. {basic_memory-0.18.1 → basic_memory-0.18.3}/.env.example +0 -0
  125. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  126. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  127. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  128. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  129. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/dependabot.yml +0 -0
  130. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/claude-code-review.yml +0 -0
  131. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/claude-issue-triage.yml +0 -0
  132. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/claude.yml +0 -0
  133. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/dev-release.yml +0 -0
  134. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/docker.yml +0 -0
  135. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/pr-title.yml +0 -0
  136. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/release.yml +0 -0
  137. {basic_memory-0.18.1 → basic_memory-0.18.3}/.github/workflows/test.yml +0 -0
  138. {basic_memory-0.18.1 → basic_memory-0.18.3}/.gitignore +0 -0
  139. {basic_memory-0.18.1 → basic_memory-0.18.3}/.python-version +0 -0
  140. {basic_memory-0.18.1 → basic_memory-0.18.3}/AGENTS.md +0 -0
  141. {basic_memory-0.18.1 → basic_memory-0.18.3}/CITATION.cff +0 -0
  142. {basic_memory-0.18.1 → basic_memory-0.18.3}/CLA.md +0 -0
  143. {basic_memory-0.18.1 → basic_memory-0.18.3}/CLAUDE.md +0 -0
  144. {basic_memory-0.18.1 → basic_memory-0.18.3}/CODE_OF_CONDUCT.md +0 -0
  145. {basic_memory-0.18.1 → basic_memory-0.18.3}/CONTRIBUTING.md +0 -0
  146. {basic_memory-0.18.1 → basic_memory-0.18.3}/Dockerfile +0 -0
  147. {basic_memory-0.18.1 → basic_memory-0.18.3}/LICENSE +0 -0
  148. {basic_memory-0.18.1/docs → basic_memory-0.18.3}/NOTE-FORMAT.md +0 -0
  149. {basic_memory-0.18.1 → basic_memory-0.18.3}/README.md +0 -0
  150. {basic_memory-0.18.1 → basic_memory-0.18.3}/SECURITY.md +0 -0
  151. {basic_memory-0.18.1 → basic_memory-0.18.3}/docker-compose-postgres.yml +0 -0
  152. {basic_memory-0.18.1 → basic_memory-0.18.3}/docker-compose.yml +0 -0
  153. {basic_memory-0.18.1 → basic_memory-0.18.3}/docs/ARCHITECTURE.md +0 -0
  154. {basic_memory-0.18.1 → basic_memory-0.18.3}/docs/Docker.md +0 -0
  155. {basic_memory-0.18.1 → basic_memory-0.18.3}/docs/ai-assistant-guide-extended.md +0 -0
  156. {basic_memory-0.18.1 → basic_memory-0.18.3}/docs/character-handling.md +0 -0
  157. {basic_memory-0.18.1 → basic_memory-0.18.3}/docs/cloud-cli.md +0 -0
  158. {basic_memory-0.18.1 → basic_memory-0.18.3}/docs/testing-coverage.md +0 -0
  159. {basic_memory-0.18.1 → basic_memory-0.18.3}/justfile +0 -0
  160. {basic_memory-0.18.1 → basic_memory-0.18.3}/llms-install.md +0 -0
  161. {basic_memory-0.18.1 → basic_memory-0.18.3}/pyproject.toml +0 -0
  162. {basic_memory-0.18.1 → basic_memory-0.18.3}/smithery.yaml +0 -0
  163. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/alembic.ini +0 -0
  164. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/env.py +0 -0
  165. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/migrations.py +0 -0
  166. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/script.py.mako +0 -0
  167. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/314f1ea54dc4_add_postgres_full_text_search_support_.py +0 -0
  168. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
  169. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
  170. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
  171. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
  172. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/6830751f5fb6_merge_multiple_heads.py +0 -0
  173. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/9d9c1cb7d8f5_add_mtime_and_size_columns_to_entity_.py +0 -0
  174. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/a1b2c3d4e5f6_fix_project_foreign_keys.py +0 -0
  175. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/a2b3c4d5e6f7_add_search_index_entity_cascade.py +0 -0
  176. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
  177. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
  178. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/e7e1f4367280_add_scan_watermark_tracking_to_project.py +0 -0
  179. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py +0 -0
  180. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/alembic/versions/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py +0 -0
  181. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/__init__.py +0 -0
  182. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/container.py +0 -0
  183. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/template_loader.py +0 -0
  184. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/__init__.py +0 -0
  185. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/directory_router.py +0 -0
  186. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/importer_router.py +0 -0
  187. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/knowledge_router.py +0 -0
  188. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/memory_router.py +0 -0
  189. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/project_router.py +0 -0
  190. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/prompt_router.py +0 -0
  191. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/resource_router.py +0 -0
  192. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/routers/search_router.py +0 -0
  193. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/api/v2/utils.py +0 -0
  194. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/__init__.py +0 -0
  195. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/app.py +0 -0
  196. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/auth.py +0 -0
  197. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/__init__.py +0 -0
  198. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/api_client.py +0 -0
  199. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/bisync_commands.py +0 -0
  200. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/cloud_utils.py +0 -0
  201. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/core_commands.py +0 -0
  202. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/rclone_config.py +0 -0
  203. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/rclone_installer.py +0 -0
  204. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/restore.py +0 -0
  205. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/schemas.py +0 -0
  206. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/snapshot.py +0 -0
  207. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/upload.py +0 -0
  208. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/cloud/upload_command.py +0 -0
  209. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/command_utils.py +0 -0
  210. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/db.py +0 -0
  211. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/doctor.py +0 -0
  212. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/format.py +0 -0
  213. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
  214. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
  215. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
  216. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  217. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/mcp.py +0 -0
  218. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/project.py +0 -0
  219. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/routing.py +0 -0
  220. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/status.py +0 -0
  221. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/commands/tool.py +0 -0
  222. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/cli/container.py +0 -0
  223. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/config.py +0 -0
  224. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/db.py +0 -0
  225. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps/__init__.py +0 -0
  226. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps/config.py +0 -0
  227. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps/db.py +0 -0
  228. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps/importers.py +0 -0
  229. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps/projects.py +0 -0
  230. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps/repositories.py +0 -0
  231. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps/services.py +0 -0
  232. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/deps.py +0 -0
  233. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/file_utils.py +0 -0
  234. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/ignore_utils.py +0 -0
  235. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/importers/__init__.py +0 -0
  236. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/importers/base.py +0 -0
  237. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/importers/chatgpt_importer.py +0 -0
  238. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
  239. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/importers/claude_projects_importer.py +0 -0
  240. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/importers/memory_json_importer.py +0 -0
  241. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/importers/utils.py +0 -0
  242. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/markdown/__init__.py +0 -0
  243. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/markdown/entity_parser.py +0 -0
  244. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/markdown/markdown_processor.py +0 -0
  245. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/markdown/plugins.py +0 -0
  246. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/markdown/schemas.py +0 -0
  247. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/markdown/utils.py +0 -0
  248. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/__init__.py +0 -0
  249. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/async_client.py +0 -0
  250. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/directory.py +0 -0
  251. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/knowledge.py +0 -0
  252. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/memory.py +0 -0
  253. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/project.py +0 -0
  254. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/resource.py +0 -0
  255. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/clients/search.py +0 -0
  256. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/container.py +0 -0
  257. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/project_context.py +0 -0
  258. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/__init__.py +0 -0
  259. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
  260. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
  261. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
  262. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/search.py +0 -0
  263. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/prompts/utils.py +0 -0
  264. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
  265. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/resources/project_info.py +0 -0
  266. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/server.py +0 -0
  267. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/build_context.py +0 -0
  268. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/canvas.py +0 -0
  269. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/chatgpt_tools.py +0 -0
  270. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/delete_note.py +0 -0
  271. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/edit_note.py +0 -0
  272. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/list_directory.py +0 -0
  273. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/move_note.py +0 -0
  274. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/project_management.py +0 -0
  275. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/read_content.py +0 -0
  276. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/read_note.py +0 -0
  277. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
  278. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/search.py +0 -0
  279. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/utils.py +0 -0
  280. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/view_note.py +0 -0
  281. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/mcp/tools/write_note.py +0 -0
  282. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/models/__init__.py +0 -0
  283. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/models/base.py +0 -0
  284. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/models/knowledge.py +0 -0
  285. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/models/project.py +0 -0
  286. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/models/search.py +0 -0
  287. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/project_resolver.py +0 -0
  288. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/__init__.py +0 -0
  289. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/entity_repository.py +0 -0
  290. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/metadata_filters.py +0 -0
  291. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/observation_repository.py +0 -0
  292. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/postgres_search_repository.py +0 -0
  293. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/project_info_repository.py +0 -0
  294. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/project_repository.py +0 -0
  295. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/relation_repository.py +0 -0
  296. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/repository.py +0 -0
  297. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/search_index_row.py +0 -0
  298. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/search_repository.py +0 -0
  299. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/search_repository_base.py +0 -0
  300. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/repository/sqlite_search_repository.py +0 -0
  301. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/runtime.py +0 -0
  302. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/__init__.py +0 -0
  303. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/base.py +0 -0
  304. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/cloud.py +0 -0
  305. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/delete.py +0 -0
  306. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/directory.py +0 -0
  307. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/importer.py +0 -0
  308. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/memory.py +0 -0
  309. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/project_info.py +0 -0
  310. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/prompt.py +0 -0
  311. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/request.py +0 -0
  312. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/response.py +0 -0
  313. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/search.py +0 -0
  314. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/sync_report.py +0 -0
  315. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/v2/__init__.py +0 -0
  316. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/v2/entity.py +0 -0
  317. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/schemas/v2/resource.py +0 -0
  318. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/__init__.py +0 -0
  319. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/context_service.py +0 -0
  320. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/directory_service.py +0 -0
  321. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/entity_service.py +0 -0
  322. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/exceptions.py +0 -0
  323. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/file_service.py +0 -0
  324. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/initialization.py +0 -0
  325. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/link_resolver.py +0 -0
  326. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/project_service.py +0 -0
  327. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/search_service.py +0 -0
  328. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/services/service.py +0 -0
  329. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/sync/__init__.py +0 -0
  330. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/sync/background_sync.py +0 -0
  331. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/sync/coordinator.py +0 -0
  332. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/sync/sync_service.py +0 -0
  333. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/sync/watch_service.py +0 -0
  334. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
  335. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/templates/prompts/search.hbs +0 -0
  336. {basic_memory-0.18.1 → basic_memory-0.18.3}/src/basic_memory/utils.py +0 -0
  337. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/BENCHMARKS.md +0 -0
  338. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/cli/test_cli_tool_json_integration.py +0 -0
  339. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/cli/test_project_commands_integration.py +0 -0
  340. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/cli/test_routing_integration.py +0 -0
  341. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/cli/test_version_integration.py +0 -0
  342. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/conftest.py +0 -0
  343. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_build_context_underscore.py +0 -0
  344. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_build_context_validation.py +0 -0
  345. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_chatgpt_tools_integration.py +0 -0
  346. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_default_project_mode_integration.py +0 -0
  347. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_delete_directory_integration.py +0 -0
  348. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_delete_note_integration.py +0 -0
  349. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_edit_note_integration.py +0 -0
  350. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_lifespan_shutdown_sync_task_cancellation_integration.py +0 -0
  351. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_list_directory_integration.py +0 -0
  352. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_move_directory_integration.py +0 -0
  353. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_move_note_integration.py +0 -0
  354. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_project_management_integration.py +0 -0
  355. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_project_state_sync_integration.py +0 -0
  356. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_read_content_integration.py +0 -0
  357. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_read_note_integration.py +0 -0
  358. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_search_integration.py +0 -0
  359. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_single_project_mcp_integration.py +0 -0
  360. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_smoke_integration.py +0 -0
  361. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/mcp/test_write_note_integration.py +0 -0
  362. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/test_db_wal_mode.py +0 -0
  363. {basic_memory-0.18.1 → basic_memory-0.18.3}/test-int/test_disable_permalinks_integration.py +0 -0
  364. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/Non-MarkdownFileSupport.pdf +0 -0
  365. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/README.md +0 -0
  366. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/Screenshot.png +0 -0
  367. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/__init__.py +0 -0
  368. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/__init__.py +0 -0
  369. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/conftest.py +0 -0
  370. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_directory_router.py +0 -0
  371. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_importer_router.py +0 -0
  372. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_knowledge_router.py +0 -0
  373. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_memory_router.py +0 -0
  374. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_project_router.py +0 -0
  375. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_prompt_router.py +0 -0
  376. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_resource_router.py +0 -0
  377. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/api/v2/test_search_router.py +0 -0
  378. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/cloud/test_cloud_api_client_and_utils.py +0 -0
  379. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/cloud/test_rclone_config_and_bmignore_filters.py +0 -0
  380. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/cloud/test_upload_path.py +0 -0
  381. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/conftest.py +0 -0
  382. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_auth_cli_auth.py +0 -0
  383. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_cli_container.py +0 -0
  384. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_cli_exit.py +0 -0
  385. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_cli_tool_exit.py +0 -0
  386. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_cli_tool_json_output.py +0 -0
  387. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_cli_tools.py +0 -0
  388. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_cloud_authentication.py +0 -0
  389. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_ignore_utils.py +0 -0
  390. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_import_chatgpt.py +0 -0
  391. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_import_claude_conversations.py +0 -0
  392. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_import_claude_projects.py +0 -0
  393. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_import_memory_json.py +0 -0
  394. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_project_add_with_local_path.py +0 -0
  395. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_restore_commands.py +0 -0
  396. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_routing.py +0 -0
  397. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_snapshot_commands.py +0 -0
  398. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/cli/test_upload.py +0 -0
  399. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/conftest.py +0 -0
  400. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/db/test_issue_254_foreign_key_constraints.py +0 -0
  401. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/importers/test_conversation_indexing.py +0 -0
  402. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/importers/test_importer_base.py +0 -0
  403. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/importers/test_importer_utils.py +0 -0
  404. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/__init__.py +0 -0
  405. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_date_frontmatter_parsing.py +0 -0
  406. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_entity_parser.py +0 -0
  407. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_entity_parser_error_handling.py +0 -0
  408. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_markdown_plugins.py +0 -0
  409. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_markdown_processor.py +0 -0
  410. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_markdown_utils.py +0 -0
  411. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_observation_edge_cases.py +0 -0
  412. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_parser_edge_cases.py +0 -0
  413. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_relation_edge_cases.py +0 -0
  414. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/markdown/test_task_detection.py +0 -0
  415. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/clients/__init__.py +0 -0
  416. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/clients/test_clients.py +0 -0
  417. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/conftest.py +0 -0
  418. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_async_client_force_local.py +0 -0
  419. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_async_client_modes.py +0 -0
  420. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_mcp_container.py +0 -0
  421. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_obsidian_yaml_formatting.py +0 -0
  422. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_permalink_collision_file_overwrite.py +0 -0
  423. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_project_context.py +0 -0
  424. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_prompts.py +0 -0
  425. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_recent_activity_prompt_modes.py +0 -0
  426. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_resources.py +0 -0
  427. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_server_lifespan_branches.py +0 -0
  428. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_build_context.py +0 -0
  429. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_canvas.py +0 -0
  430. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_contracts.py +0 -0
  431. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_delete_note.py +0 -0
  432. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_edit_note.py +0 -0
  433. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_list_directory.py +0 -0
  434. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_move_note.py +0 -0
  435. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_project_management.py +0 -0
  436. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_read_content.py +0 -0
  437. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_read_note.py +0 -0
  438. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_recent_activity.py +0 -0
  439. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_resource.py +0 -0
  440. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_search.py +0 -0
  441. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_utils.py +0 -0
  442. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_view_note.py +0 -0
  443. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_write_note.py +0 -0
  444. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/test_tool_write_note_kebab_filenames.py +0 -0
  445. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/mcp/tools/test_chatgpt_tools.py +0 -0
  446. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_entity_repository.py +0 -0
  447. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_entity_repository_upsert.py +0 -0
  448. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_entity_upsert_issue_187.py +0 -0
  449. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_metadata_filters.py +0 -0
  450. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_observation_repository.py +0 -0
  451. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_postgres_search_repository.py +0 -0
  452. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_project_info_repository.py +0 -0
  453. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_project_repository.py +0 -0
  454. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_relation_repository.py +0 -0
  455. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_repository.py +0 -0
  456. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_search_repository.py +0 -0
  457. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/repository/test_search_repository_edit_bug_fix.py +0 -0
  458. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/schemas/test_base_timeframe_minimum.py +0 -0
  459. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/schemas/test_memory_serialization.py +0 -0
  460. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/schemas/test_memory_url.py +0 -0
  461. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/schemas/test_memory_url_validation.py +0 -0
  462. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/schemas/test_relation_response_reference_resolution.py +0 -0
  463. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/schemas/test_schemas.py +0 -0
  464. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/schemas/test_search.py +0 -0
  465. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_context_service.py +0 -0
  466. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_directory_service.py +0 -0
  467. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_entity_service.py +0 -0
  468. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_entity_service_disable_permalinks.py +0 -0
  469. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_file_service.py +0 -0
  470. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_initialization.py +0 -0
  471. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_initialization_cloud_mode_branches.py +0 -0
  472. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_link_resolver.py +0 -0
  473. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_project_removal_bug.py +0 -0
  474. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_project_service.py +0 -0
  475. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_project_service_operations.py +0 -0
  476. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/services/test_search_service.py +0 -0
  477. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_character_conflicts.py +0 -0
  478. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_coordinator.py +0 -0
  479. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_sync_service.py +0 -0
  480. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_sync_service_incremental.py +0 -0
  481. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_sync_wikilink_issue.py +0 -0
  482. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_tmp_files.py +0 -0
  483. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_watch_service.py +0 -0
  484. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_watch_service_atomic_adds.py +0 -0
  485. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_watch_service_edge_cases.py +0 -0
  486. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/sync/test_watch_service_reload.py +0 -0
  487. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/test_config.py +0 -0
  488. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/test_deps.py +0 -0
  489. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/test_production_cascade_delete.py +0 -0
  490. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/test_project_resolver.py +0 -0
  491. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/test_runtime.py +0 -0
  492. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/utils/test_file_utils.py +0 -0
  493. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/utils/test_frontmatter_obsidian_compatible.py +0 -0
  494. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/utils/test_parse_tags.py +0 -0
  495. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/utils/test_permalink_formatting.py +0 -0
  496. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/utils/test_timezone_utils.py +0 -0
  497. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/utils/test_utf8_handling.py +0 -0
  498. {basic_memory-0.18.1 → basic_memory-0.18.3}/tests/utils/test_validate_project_path.py +0 -0
  499. {basic_memory-0.18.1 → basic_memory-0.18.3}/uv.lock +0 -0
@@ -1,5 +1,24 @@
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
+
14
+ ## v0.18.2 (2026-02-11)
15
+
16
+ ### Bug Fixes
17
+
18
+ - **#562**: Use VIRTUAL instead of STORED columns in SQLite migration
19
+ ([`344e651`](https://github.com/basicmachines-co/basic-memory/commit/344e651))
20
+ - Fixes compatibility issue with SQLite STORED generated columns
21
+
3
22
  ## v0.18.1 (2026-02-11)
4
23
 
5
24
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.18.1
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
+ ```