basic-memory 0.1.0__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of basic-memory might be problematic. Click here for more details.

Files changed (127) hide show
  1. {basic_memory-0.1.0 → basic_memory-0.1.1}/CHANGELOG.md +6 -0
  2. {basic_memory-0.1.0 → basic_memory-0.1.1}/PKG-INFO +1 -1
  3. {basic_memory-0.1.0 → basic_memory-0.1.1}/pyproject.toml +1 -1
  4. basic_memory-0.1.1/src/basic_memory/cli/commands/__init__.py +5 -0
  5. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/cli/main.py +2 -3
  6. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/db.py +6 -1
  7. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/repository/search_repository.py +2 -0
  8. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/database_service.py +2 -1
  9. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/sync/sync_service.py +9 -4
  10. basic_memory-0.1.0/src/basic_memory/cli/commands/__init__.py +0 -5
  11. basic_memory-0.1.0/src/basic_memory/cli/commands/init.py +0 -38
  12. {basic_memory-0.1.0 → basic_memory-0.1.1}/.github/workflows/release.yml +0 -0
  13. {basic_memory-0.1.0 → basic_memory-0.1.1}/.github/workflows/test.yml +0 -0
  14. {basic_memory-0.1.0 → basic_memory-0.1.1}/.gitignore +0 -0
  15. {basic_memory-0.1.0 → basic_memory-0.1.1}/.python-version +0 -0
  16. {basic_memory-0.1.0 → basic_memory-0.1.1}/CITATION.cff +0 -0
  17. {basic_memory-0.1.0 → basic_memory-0.1.1}/CODE_OF_CONDUCT.md +0 -0
  18. {basic_memory-0.1.0 → basic_memory-0.1.1}/CONTRIBUTING.md +0 -0
  19. {basic_memory-0.1.0 → basic_memory-0.1.1}/LICENSE +0 -0
  20. {basic_memory-0.1.0 → basic_memory-0.1.1}/Makefile +0 -0
  21. {basic_memory-0.1.0 → basic_memory-0.1.1}/README.md +0 -0
  22. {basic_memory-0.1.0 → basic_memory-0.1.1}/basic-memory.md +0 -0
  23. {basic_memory-0.1.0 → basic_memory-0.1.1}/memory.json +0 -0
  24. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/__init__.py +0 -0
  25. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/api/__init__.py +0 -0
  26. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/api/app.py +0 -0
  27. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/api/routers/__init__.py +0 -0
  28. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/api/routers/knowledge_router.py +0 -0
  29. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/api/routers/memory_router.py +0 -0
  30. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/api/routers/resource_router.py +0 -0
  31. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/api/routers/search_router.py +0 -0
  32. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/cli/__init__.py +0 -0
  33. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/cli/app.py +0 -0
  34. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
  35. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/cli/commands/status.py +0 -0
  36. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/cli/commands/sync.py +0 -0
  37. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/config.py +0 -0
  38. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/deps.py +0 -0
  39. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/file_utils.py +0 -0
  40. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/markdown/__init__.py +0 -0
  41. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/markdown/entity_parser.py +0 -0
  42. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/markdown/markdown_processor.py +0 -0
  43. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/markdown/plugins.py +0 -0
  44. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/markdown/schemas.py +0 -0
  45. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/markdown/utils.py +0 -0
  46. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/__init__.py +0 -0
  47. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/async_client.py +0 -0
  48. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/main.py +0 -0
  49. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/server.py +0 -0
  50. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/tools/__init__.py +0 -0
  51. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/tools/ai_edit.py +0 -0
  52. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/tools/knowledge.py +0 -0
  53. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/tools/memory.py +0 -0
  54. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/tools/notes.py +0 -0
  55. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/tools/search.py +0 -0
  56. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/mcp/tools/utils.py +0 -0
  57. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/models/__init__.py +0 -0
  58. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/models/base.py +0 -0
  59. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/models/knowledge.py +0 -0
  60. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/models/search.py +0 -0
  61. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/repository/__init__.py +0 -0
  62. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/repository/entity_repository.py +0 -0
  63. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/repository/observation_repository.py +0 -0
  64. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/repository/relation_repository.py +0 -0
  65. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/repository/repository.py +0 -0
  66. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/__init__.py +0 -0
  67. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/base.py +0 -0
  68. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/delete.py +0 -0
  69. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/discovery.py +0 -0
  70. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/memory.py +0 -0
  71. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/request.py +0 -0
  72. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/response.py +0 -0
  73. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/schemas/search.py +0 -0
  74. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/__init__.py +0 -0
  75. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/context_service.py +0 -0
  76. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/entity_service.py +0 -0
  77. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/exceptions.py +0 -0
  78. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/file_service.py +0 -0
  79. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/link_resolver.py +0 -0
  80. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/search_service.py +0 -0
  81. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/services/service.py +0 -0
  82. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/sync/__init__.py +0 -0
  83. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/sync/file_change_scanner.py +0 -0
  84. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/sync/utils.py +0 -0
  85. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/sync/watch_service.py +0 -0
  86. {basic_memory-0.1.0 → basic_memory-0.1.1}/src/basic_memory/utils.py +0 -0
  87. {basic_memory-0.1.0 → basic_memory-0.1.1}/tasks.md +0 -0
  88. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/api/conftest.py +0 -0
  89. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/api/test_knowledge_router.py +0 -0
  90. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/api/test_memory_router.py +0 -0
  91. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/api/test_resource_router.py +0 -0
  92. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/api/test_search_router.py +0 -0
  93. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/cli/test_import_memory_json.py +0 -0
  94. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/conftest.py +0 -0
  95. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/edit_file_test.py +0 -0
  96. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/markdown/__init__.py +0 -0
  97. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/markdown/test_entity_parser.py +0 -0
  98. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/markdown/test_markdown_plugins.py +0 -0
  99. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/markdown/test_markdown_processor.py +0 -0
  100. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/markdown/test_observation_edge_cases.py +0 -0
  101. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/markdown/test_parser_edge_cases.py +0 -0
  102. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/markdown/test_relation_edge_cases.py +0 -0
  103. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/mcp/conftest.py +0 -0
  104. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/mcp/test_tool_ai_edit.py +0 -0
  105. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/mcp/test_tool_get_entity.py +0 -0
  106. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/mcp/test_tool_memory.py +0 -0
  107. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/mcp/test_tool_notes.py +0 -0
  108. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/repository/test_entity_repository.py +0 -0
  109. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/repository/test_observation_repository.py +0 -0
  110. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/repository/test_relation_repository.py +0 -0
  111. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/repository/test_repository.py +0 -0
  112. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/schemas/test_memory_url.py +0 -0
  113. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/schemas/test_schemas.py +0 -0
  114. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/schemas/test_search.py +0 -0
  115. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/services/test_context_service.py +0 -0
  116. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/services/test_database_service.py +0 -0
  117. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/services/test_entity_service.py +0 -0
  118. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/services/test_file_service.py +0 -0
  119. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/services/test_link_resolver.py +0 -0
  120. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/services/test_search_service.py +0 -0
  121. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/sync/test_file_change_scanner.py +0 -0
  122. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/sync/test_sync_service.py +0 -0
  123. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/sync/test_watch_service.py +0 -0
  124. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/test_basic_memory.py +0 -0
  125. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/utils/test_file_utils.py +0 -0
  126. {basic_memory-0.1.0 → basic_memory-0.1.1}/tests/utils/test_permalink_formatting.py +0 -0
  127. {basic_memory-0.1.0 → basic_memory-0.1.1}/uv.lock +0 -0
@@ -1,6 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.1.1 (2025-02-07)
5
+
6
+
4
7
  ## v0.1.0 (2025-02-07)
5
8
 
6
9
  ### Bug Fixes
@@ -17,6 +20,9 @@
17
20
  - Install fastapi deps after removing basic-foundation
18
21
  ([`51a741e`](https://github.com/basicmachines-co/basic-memory/commit/51a741e7593a1ea0e5eb24e14c70ff61670f9663))
19
22
 
23
+ - Recreate search index on db reset
24
+ ([`1fee436`](https://github.com/basicmachines-co/basic-memory/commit/1fee436bf903a35c9ebb7d87607fc9cc9f5ff6e7))
25
+
20
26
  - Remove basic-foundation from deps
21
27
  ([`b8d0c71`](https://github.com/basicmachines-co/basic-memory/commit/b8d0c7160f29c97cdafe398a7e6a5240473e0c89))
22
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: Local-first knowledge management combining Zettelkasten with knowledge graphs
5
5
  Project-URL: Homepage, https://github.com/basicmachines-co/basic-memory
6
6
  Project-URL: Repository, https://github.com/basicmachines-co/basic-memory
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "basic-memory"
3
- version = "0.1.0"
3
+ version = "0.1.1"
4
4
  description = "Local-first knowledge management combining Zettelkasten with knowledge graphs"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12.1"
@@ -0,0 +1,5 @@
1
+ """Command module exports."""
2
+
3
+ from . import status, sync, import_memory_json
4
+
5
+ __all__ = [ "status", "sync", "import_memory_json.py"]
@@ -5,11 +5,10 @@ import typer
5
5
  from loguru import logger
6
6
 
7
7
  from basic_memory.cli.app import app
8
- from basic_memory.cli.commands.init import init
9
8
 
10
9
  # Register commands
11
- from basic_memory.cli.commands import init, status, sync
12
- __all__ = ["init", "status", "sync"]
10
+ from basic_memory.cli.commands import status, sync
11
+ __all__ = ["status", "sync"]
13
12
 
14
13
  from basic_memory.config import config
15
14
 
@@ -15,6 +15,8 @@ from sqlalchemy.ext.asyncio import (
15
15
  )
16
16
 
17
17
  from basic_memory.models import Base, SCHEMA_VERSION
18
+ from basic_memory.models.search import CREATE_SEARCH_INDEX
19
+ from basic_memory.repository.search_repository import SearchRepository
18
20
 
19
21
  # Module level state
20
22
  _engine: Optional[AsyncEngine] = None
@@ -77,7 +79,10 @@ async def init_db() -> None:
77
79
  await session.execute(text("PRAGMA foreign_keys=ON"))
78
80
  conn = await session.connection()
79
81
  await conn.run_sync(Base.metadata.create_all)
80
-
82
+
83
+ # recreate search index
84
+ await session.execute(CREATE_SEARCH_INDEX)
85
+
81
86
  await session.commit()
82
87
 
83
88
  async def drop_db():
@@ -70,6 +70,8 @@ class SearchRepository:
70
70
 
71
71
  async def init_search_index(self):
72
72
  """Create or recreate the search index."""
73
+
74
+ logger.info("Initializing search index")
73
75
  async with db.scoped_session(self.session_maker) as session:
74
76
  await session.execute(CREATE_SEARCH_INDEX)
75
77
  await session.commit()
@@ -13,6 +13,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
13
13
  from basic_memory import db
14
14
  from basic_memory.config import ProjectConfig
15
15
  from basic_memory.models import Base
16
+ from basic_memory.repository.search_repository import SearchRepository
16
17
 
17
18
 
18
19
  async def check_schema_matches_models(session: AsyncSession) -> Tuple[bool, List[str]]:
@@ -127,7 +128,7 @@ class DatabaseService:
127
128
  for diff in differences:
128
129
  logger.warning(f" {diff}")
129
130
  logger.info("Rebuilding database to match current models...")
130
- await self.initialize_db()
131
+ await self.initialize_db()
131
132
  return True
132
133
 
133
134
  logger.info("Database schema matches models")
@@ -4,6 +4,7 @@ from pathlib import Path
4
4
  from typing import Dict
5
5
 
6
6
  from loguru import logger
7
+ from sqlalchemy.exc import IntegrityError
7
8
 
8
9
  from basic_memory import file_utils
9
10
  from basic_memory.markdown import EntityParser, EntityMarkdown
@@ -153,10 +154,14 @@ class SyncService:
153
154
  # check we found a link that is not the source
154
155
  if target_entity and target_entity.id != relation.from_id:
155
156
  logger.debug(f"Resolved forward reference: {relation.to_name} -> {target_entity.permalink}")
156
- await self.relation_repository.update(relation.id, {
157
- "to_id": target_entity.id,
158
- "to_name": target_entity.title # Update to actual title
159
- })
157
+
158
+ try:
159
+ await self.relation_repository.update(relation.id, {
160
+ "to_id": target_entity.id,
161
+ "to_name": target_entity.title # Update to actual title
162
+ })
163
+ except IntegrityError as e:
164
+ logger.info(f"Ignoring duplicate relation {relation}")
160
165
 
161
166
  # update search index
162
167
  await self.search_service.index_entity(target_entity)
@@ -1,5 +0,0 @@
1
- """Command module exports."""
2
-
3
- from . import init, status, sync, import_memory_json
4
-
5
- __all__ = ["init", "status", "sync", "import_memory_json.py"]
@@ -1,38 +0,0 @@
1
- """Initialize command for basic-memory CLI."""
2
-
3
- import asyncio
4
- from pathlib import Path
5
-
6
- import typer
7
- from loguru import logger
8
-
9
- from basic_memory.cli.app import app
10
- from basic_memory.db import engine_session_factory, DatabaseType
11
- from basic_memory.config import config
12
-
13
-
14
- async def _init(force: bool = False):
15
- """Initialize the database."""
16
- db_path = config.database_path
17
-
18
- if db_path.exists() and not force:
19
- typer.echo(f"Database already exists at {db_path}. Use --force to reinitialize.")
20
- raise typer.Exit(1)
21
-
22
- # Create data directory if needed
23
- db_path.parent.mkdir(parents=True, exist_ok=True)
24
-
25
- try:
26
- async with engine_session_factory(db_path, db_type=DatabaseType.FILESYSTEM, init=True):
27
- typer.echo(f"Initialized database at {db_path}")
28
- except Exception as e:
29
- logger.error(f"Error initializing database: {e}")
30
- typer.echo(f"Error initializing database: {e}")
31
- raise typer.Exit(1)
32
-
33
- @app.command()
34
- def init(
35
- force: bool = typer.Option(False, "--force", "-f", help="Force reinitialization if database exists")
36
- ):
37
- """Initialize a new basic-memory database."""
38
- asyncio.run(_init(force))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes