basic-memory 0.11.0__py3-none-any.whl → 0.12.1__py3-none-any.whl
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.
- basic_memory/__init__.py +1 -1
- basic_memory/api/app.py +11 -3
- basic_memory/cli/app.py +12 -7
- basic_memory/cli/commands/mcp.py +18 -9
- basic_memory/cli/commands/sync.py +9 -8
- basic_memory/cli/commands/tool.py +28 -15
- basic_memory/cli/main.py +12 -44
- basic_memory/config.py +30 -6
- basic_memory/db.py +3 -1
- basic_memory/file_utils.py +3 -0
- basic_memory/markdown/entity_parser.py +16 -7
- basic_memory/markdown/utils.py +21 -13
- basic_memory/mcp/prompts/continue_conversation.py +4 -4
- basic_memory/mcp/prompts/search.py +2 -2
- basic_memory/mcp/server.py +29 -3
- basic_memory/mcp/tools/read_note.py +2 -3
- basic_memory/mcp/tools/search.py +64 -28
- basic_memory/mcp/tools/write_note.py +3 -1
- basic_memory/repository/repository.py +0 -4
- basic_memory/repository/search_repository.py +11 -11
- basic_memory/schemas/search.py +2 -2
- basic_memory/services/context_service.py +1 -1
- basic_memory/services/entity_service.py +10 -10
- basic_memory/services/file_service.py +1 -1
- basic_memory/services/initialization.py +143 -0
- basic_memory/services/link_resolver.py +8 -1
- basic_memory/services/search_service.py +3 -23
- basic_memory/sync/sync_service.py +120 -191
- basic_memory/sync/watch_service.py +49 -30
- basic_memory/utils.py +10 -2
- {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/METADATA +42 -11
- {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/RECORD +35 -34
- {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/WHEEL +0 -0
- {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/entry_points.txt +0 -0
- {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -70,22 +70,30 @@ class WatchServiceState(BaseModel):
|
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
class WatchService:
|
|
73
|
-
def __init__(
|
|
73
|
+
def __init__(
|
|
74
|
+
self,
|
|
75
|
+
sync_service: SyncService,
|
|
76
|
+
file_service: FileService,
|
|
77
|
+
config: ProjectConfig,
|
|
78
|
+
quiet: bool = False,
|
|
79
|
+
):
|
|
74
80
|
self.sync_service = sync_service
|
|
75
81
|
self.file_service = file_service
|
|
76
82
|
self.config = config
|
|
77
83
|
self.state = WatchServiceState()
|
|
78
84
|
self.status_path = config.home / ".basic-memory" / WATCH_STATUS_JSON
|
|
79
85
|
self.status_path.parent.mkdir(parents=True, exist_ok=True)
|
|
80
|
-
|
|
86
|
+
|
|
87
|
+
# quiet mode for mcp so it doesn't mess up stdout
|
|
88
|
+
self.console = Console(quiet=quiet)
|
|
81
89
|
|
|
82
90
|
async def run(self): # pragma: no cover
|
|
83
91
|
"""Watch for file changes and sync them"""
|
|
84
92
|
logger.info(
|
|
85
93
|
"Watch service started",
|
|
86
|
-
directory=str(self.config.home),
|
|
87
|
-
debounce_ms=self.config.sync_delay,
|
|
88
|
-
pid=os.getpid(),
|
|
94
|
+
f"directory={str(self.config.home)}",
|
|
95
|
+
f"debounce_ms={self.config.sync_delay}",
|
|
96
|
+
f"pid={os.getpid()}",
|
|
89
97
|
)
|
|
90
98
|
|
|
91
99
|
self.state.running = True
|
|
@@ -111,8 +119,8 @@ class WatchService:
|
|
|
111
119
|
finally:
|
|
112
120
|
logger.info(
|
|
113
121
|
"Watch service stopped",
|
|
114
|
-
directory=str(self.config.home),
|
|
115
|
-
runtime_seconds=int((datetime.now() - self.state.start_time).total_seconds()),
|
|
122
|
+
f"directory={str(self.config.home)}",
|
|
123
|
+
f"runtime_seconds={int((datetime.now() - self.state.start_time).total_seconds())}",
|
|
116
124
|
)
|
|
117
125
|
|
|
118
126
|
self.state.running = False
|
|
@@ -154,7 +162,7 @@ class WatchService:
|
|
|
154
162
|
|
|
155
163
|
start_time = time.time()
|
|
156
164
|
|
|
157
|
-
logger.info("Processing file changes
|
|
165
|
+
logger.info(f"Processing file changes, change_count={len(changes)}, directory={directory}")
|
|
158
166
|
|
|
159
167
|
# Group changes by type
|
|
160
168
|
adds: List[str] = []
|
|
@@ -177,9 +185,17 @@ class WatchService:
|
|
|
177
185
|
modifies.append(relative_path)
|
|
178
186
|
|
|
179
187
|
logger.debug(
|
|
180
|
-
"Grouped file changes
|
|
188
|
+
f"Grouped file changes, added={len(adds)}, deleted={len(deletes)}, modified={len(modifies)}"
|
|
181
189
|
)
|
|
182
190
|
|
|
191
|
+
# because of our atomic writes on updates, an add may be an existing file
|
|
192
|
+
for added_path in adds: # pragma: no cover TODO add test
|
|
193
|
+
entity = await self.sync_service.entity_repository.get_by_file_path(added_path)
|
|
194
|
+
if entity is not None:
|
|
195
|
+
logger.debug(f"Existing file will be processed as modified, path={added_path}")
|
|
196
|
+
adds.remove(added_path)
|
|
197
|
+
modifies.append(added_path)
|
|
198
|
+
|
|
183
199
|
# Track processed files to avoid duplicates
|
|
184
200
|
processed: Set[str] = set()
|
|
185
201
|
|
|
@@ -223,15 +239,16 @@ class WatchService:
|
|
|
223
239
|
status="success",
|
|
224
240
|
)
|
|
225
241
|
self.console.print(f"[blue]→[/blue] {deleted_path} → {added_path}")
|
|
242
|
+
logger.info(f"move: {deleted_path} -> {added_path}")
|
|
226
243
|
processed.add(added_path)
|
|
227
244
|
processed.add(deleted_path)
|
|
228
245
|
break
|
|
229
246
|
except Exception as e: # pragma: no cover
|
|
230
247
|
logger.warning(
|
|
231
248
|
"Error checking for move",
|
|
232
|
-
old_path=deleted_path,
|
|
233
|
-
new_path=added_path,
|
|
234
|
-
error=str(e),
|
|
249
|
+
f"old_path={deleted_path}",
|
|
250
|
+
f"new_path={added_path}",
|
|
251
|
+
f"error={str(e)}",
|
|
235
252
|
)
|
|
236
253
|
|
|
237
254
|
# Handle remaining changes - group them by type for concise output
|
|
@@ -247,6 +264,7 @@ class WatchService:
|
|
|
247
264
|
await self.sync_service.handle_delete(path)
|
|
248
265
|
self.state.add_event(path=path, action="deleted", status="success")
|
|
249
266
|
self.console.print(f"[red]✕[/red] {path}")
|
|
267
|
+
logger.info(f"deleted: {path}")
|
|
250
268
|
processed.add(path)
|
|
251
269
|
delete_count += 1
|
|
252
270
|
|
|
@@ -257,28 +275,27 @@ class WatchService:
|
|
|
257
275
|
full_path = directory / path
|
|
258
276
|
if not full_path.exists() or full_path.is_dir():
|
|
259
277
|
logger.debug(
|
|
260
|
-
"Skipping non-existent or directory path
|
|
278
|
+
f"Skipping non-existent or directory path, path={path}"
|
|
261
279
|
) # pragma: no cover
|
|
262
280
|
processed.add(path) # pragma: no cover
|
|
263
281
|
continue # pragma: no cover
|
|
264
282
|
|
|
265
|
-
logger.debug("Processing new file
|
|
283
|
+
logger.debug(f"Processing new file, path={path}")
|
|
266
284
|
entity, checksum = await self.sync_service.sync_file(path, new=True)
|
|
267
285
|
if checksum:
|
|
268
286
|
self.state.add_event(
|
|
269
287
|
path=path, action="new", status="success", checksum=checksum
|
|
270
288
|
)
|
|
271
289
|
self.console.print(f"[green]✓[/green] {path}")
|
|
272
|
-
logger.
|
|
273
|
-
"
|
|
274
|
-
path=path,
|
|
275
|
-
|
|
276
|
-
checksum=checksum,
|
|
290
|
+
logger.info(
|
|
291
|
+
"new file processed",
|
|
292
|
+
f"path={path}",
|
|
293
|
+
f"checksum={checksum}",
|
|
277
294
|
)
|
|
278
295
|
processed.add(path)
|
|
279
296
|
add_count += 1
|
|
280
297
|
else: # pragma: no cover
|
|
281
|
-
logger.warning("Error syncing new file
|
|
298
|
+
logger.warning(f"Error syncing new file, path={path}") # pragma: no cover
|
|
282
299
|
self.console.print(
|
|
283
300
|
f"[orange]?[/orange] Error syncing: {path}"
|
|
284
301
|
) # pragma: no cover
|
|
@@ -296,7 +313,7 @@ class WatchService:
|
|
|
296
313
|
processed.add(path)
|
|
297
314
|
continue
|
|
298
315
|
|
|
299
|
-
logger.debug("Processing modified file
|
|
316
|
+
logger.debug(f"Processing modified file: path={path}")
|
|
300
317
|
entity, checksum = await self.sync_service.sync_file(path, new=False)
|
|
301
318
|
self.state.add_event(
|
|
302
319
|
path=path, action="modified", status="success", checksum=checksum
|
|
@@ -311,17 +328,18 @@ class WatchService:
|
|
|
311
328
|
f"[yellow]...[/yellow] Repeated changes to {path}"
|
|
312
329
|
) # pragma: no cover
|
|
313
330
|
else:
|
|
314
|
-
#
|
|
331
|
+
# haven't processed this file
|
|
315
332
|
self.console.print(f"[yellow]✎[/yellow] {path}")
|
|
333
|
+
logger.info(f"modified: {path}")
|
|
316
334
|
last_modified_path = path
|
|
317
335
|
repeat_count = 0
|
|
318
336
|
modify_count += 1
|
|
319
337
|
|
|
320
338
|
logger.debug(
|
|
321
|
-
"Modified file processed"
|
|
322
|
-
path=path
|
|
323
|
-
entity_id=entity.id if entity else None
|
|
324
|
-
checksum=checksum,
|
|
339
|
+
"Modified file processed, "
|
|
340
|
+
f"path={path} "
|
|
341
|
+
f"entity_id={entity.id if entity else None} "
|
|
342
|
+
f"checksum={checksum}",
|
|
325
343
|
)
|
|
326
344
|
processed.add(path)
|
|
327
345
|
|
|
@@ -339,16 +357,17 @@ class WatchService:
|
|
|
339
357
|
|
|
340
358
|
if changes:
|
|
341
359
|
self.console.print(f"{', '.join(changes)}", style="dim") # pyright: ignore
|
|
360
|
+
logger.info(f"changes: {len(changes)}")
|
|
342
361
|
|
|
343
362
|
duration_ms = int((time.time() - start_time) * 1000)
|
|
344
363
|
self.state.last_scan = datetime.now()
|
|
345
364
|
self.state.synced_files += len(processed)
|
|
346
365
|
|
|
347
366
|
logger.info(
|
|
348
|
-
"File change processing completed"
|
|
349
|
-
processed_files=len(processed),
|
|
350
|
-
total_synced_files=self.state.synced_files,
|
|
351
|
-
duration_ms=duration_ms
|
|
367
|
+
"File change processing completed, "
|
|
368
|
+
f"processed_files={len(processed)}, "
|
|
369
|
+
f"total_synced_files={self.state.synced_files}, "
|
|
370
|
+
f"duration_ms={duration_ms}"
|
|
352
371
|
)
|
|
353
372
|
|
|
354
373
|
await self.write_status()
|
basic_memory/utils.py
CHANGED
|
@@ -138,15 +138,23 @@ def parse_tags(tags: Union[List[str], str, None]) -> List[str]:
|
|
|
138
138
|
|
|
139
139
|
Returns:
|
|
140
140
|
A list of tag strings, or an empty list if no tags
|
|
141
|
+
|
|
142
|
+
Note:
|
|
143
|
+
This function strips leading '#' characters from tags to prevent
|
|
144
|
+
their accumulation when tags are processed multiple times.
|
|
141
145
|
"""
|
|
142
146
|
if tags is None:
|
|
143
147
|
return []
|
|
144
148
|
|
|
149
|
+
# Process list of tags
|
|
145
150
|
if isinstance(tags, list):
|
|
146
|
-
|
|
151
|
+
# First strip whitespace, then strip leading '#' characters to prevent accumulation
|
|
152
|
+
return [tag.strip().lstrip("#") for tag in tags if tag and tag.strip()]
|
|
147
153
|
|
|
154
|
+
# Process comma-separated string of tags
|
|
148
155
|
if isinstance(tags, str):
|
|
149
|
-
|
|
156
|
+
# Split by comma, strip whitespace, then strip leading '#' characters
|
|
157
|
+
return [tag.strip().lstrip("#") for tag in tags.split(",") if tag and tag.strip()]
|
|
150
158
|
|
|
151
159
|
# For any other type, try to convert to string and parse
|
|
152
160
|
try: # pragma: no cover
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.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
|
|
@@ -47,8 +47,8 @@ Basic Memory lets you build persistent knowledge through natural conversations w
|
|
|
47
47
|
Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
|
|
48
48
|
enable any compatible LLM to read and write to your local knowledge base.
|
|
49
49
|
|
|
50
|
-
- Website:
|
|
51
|
-
- Documentation:
|
|
50
|
+
- Website: https://basicmachines.co
|
|
51
|
+
- Documentation: https://memory.basicmachines.co
|
|
52
52
|
|
|
53
53
|
## Pick up your conversation right where you left off
|
|
54
54
|
|
|
@@ -187,7 +187,7 @@ The note embeds semantic content and links to other topics via simple Markdown f
|
|
|
187
187
|
|
|
188
188
|
3. You see this file on your computer in real time in the current project directory (default `~/$HOME/basic-memory`).
|
|
189
189
|
|
|
190
|
-
- Realtime sync
|
|
190
|
+
- Realtime sync is enabled by default with the v0.12.0 version
|
|
191
191
|
|
|
192
192
|
4. In a chat with the LLM, you can reference a topic:
|
|
193
193
|
|
|
@@ -296,6 +296,43 @@ Examples of relations:
|
|
|
296
296
|
- documented_in [[Coffee Journal]]
|
|
297
297
|
```
|
|
298
298
|
|
|
299
|
+
## Using with VS Code
|
|
300
|
+
For one-click installation, click one of the install buttons below...
|
|
301
|
+
|
|
302
|
+
[](https://insiders.vscode.dev/redirect/mcp/install?name=basic-memory&config=%7B%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22basic-memory%22%2C%22mcp%22%5D%7D) [](https://insiders.vscode.dev/redirect/mcp/install?name=basic-memory&config=%7B%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22basic-memory%22%2C%22mcp%22%5D%7D&quality=insiders)
|
|
303
|
+
|
|
304
|
+
You can use Basic Memory with VS Code to easily retrieve and store information while coding. Click the installation buttons above for one-click setup, or follow the manual installation instructions below.
|
|
305
|
+
|
|
306
|
+
### Manual Installation
|
|
307
|
+
|
|
308
|
+
Add the following JSON block to your User Settings (JSON) file in VS Code. You can do this by pressing `Ctrl + Shift + P` and typing `Preferences: Open User Settings (JSON)`.
|
|
309
|
+
|
|
310
|
+
```json
|
|
311
|
+
{
|
|
312
|
+
"mcp": {
|
|
313
|
+
"servers": {
|
|
314
|
+
"basic-memory": {
|
|
315
|
+
"command": "uvx",
|
|
316
|
+
"args": ["basic-memory", "mcp"]
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Optionally, you can add it to a file called `.vscode/mcp.json` in your workspace. This will allow you to share the configuration with others.
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
{
|
|
327
|
+
"servers": {
|
|
328
|
+
"basic-memory": {
|
|
329
|
+
"command": "uvx",
|
|
330
|
+
"args": ["basic-memory", "mcp"]
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
299
336
|
## Using with Claude Desktop
|
|
300
337
|
|
|
301
338
|
Basic Memory is built using the MCP (Model Context Protocol) and works with the Claude desktop app (https://claude.ai/):
|
|
@@ -341,13 +378,7 @@ config:
|
|
|
341
378
|
|
|
342
379
|
2. Sync your knowledge:
|
|
343
380
|
|
|
344
|
-
|
|
345
|
-
# One-time sync of local knowledge updates
|
|
346
|
-
basic-memory sync
|
|
347
|
-
|
|
348
|
-
# Run realtime sync process (recommended)
|
|
349
|
-
basic-memory sync --watch
|
|
350
|
-
```
|
|
381
|
+
Basic Memory will sync the files in your project in real time if you make manual edits.
|
|
351
382
|
|
|
352
383
|
3. In Claude Desktop, the LLM can now use these tools:
|
|
353
384
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
basic_memory/__init__.py,sha256=
|
|
2
|
-
basic_memory/config.py,sha256=
|
|
3
|
-
basic_memory/db.py,sha256=
|
|
1
|
+
basic_memory/__init__.py,sha256=45SW0xM0KuIkvy6KfeAwERAglEya26oqmJ0WvHoG_gA,123
|
|
2
|
+
basic_memory/config.py,sha256=jZmBOj4Gl2l56pApiN88s6juPDaX1g2LcvuVUnUeG0Q,9203
|
|
3
|
+
basic_memory/db.py,sha256=8SmrmNAlJlmYT9yIJiPwNq8SN8mB2rbW5t33Rqpyl2I,6052
|
|
4
4
|
basic_memory/deps.py,sha256=yI6RL_5-8LXw7ywSJ_84BXAczDtv2h9GFLw-E9XDJFg,5770
|
|
5
|
-
basic_memory/file_utils.py,sha256=
|
|
6
|
-
basic_memory/utils.py,sha256=
|
|
5
|
+
basic_memory/file_utils.py,sha256=eaxTKLLEbTIy_Mb_Iv_Dmt4IXAJSrZGVi-Knrpyci3E,6700
|
|
6
|
+
basic_memory/utils.py,sha256=2dbUbChLn5gwQgPY-m5XKYOBbeKFEwnRUrZDsm2kGIE,5026
|
|
7
7
|
basic_memory/alembic/alembic.ini,sha256=IEZsnF8CbbZnkwBr67LzKKNobHuzTaQNUvM8Psop5xc,3733
|
|
8
8
|
basic_memory/alembic/env.py,sha256=GyQpEpQu84flqAdelxR0-H9nbkHrVoCboYGfmltBDoA,2737
|
|
9
9
|
basic_memory/alembic/migrations.py,sha256=lriHPXDdBLSNXEW3QTpU0SJKuVd1V-8NrVkpN3qfsUQ,718
|
|
@@ -13,7 +13,7 @@ basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink
|
|
|
13
13
|
basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py,sha256=RsGymQzfRXV1LSNKiyi0lMilTxW1NgwS9jR67ye2apI,1428
|
|
14
14
|
basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py,sha256=Lbo3dEzdId_vKRFe3jMkGFF3dNQpblPIQa4Bh7np-zA,4020
|
|
15
15
|
basic_memory/api/__init__.py,sha256=wCpj-21j1D0KzKl9Ql6unLBVFY0K1uGp_FeSZRKtqpk,72
|
|
16
|
-
basic_memory/api/app.py,sha256=
|
|
16
|
+
basic_memory/api/app.py,sha256=GFFX3MOusEzbDaAVDECk3B46xybuinUfMt4Atw0Nr8c,1724
|
|
17
17
|
basic_memory/api/routers/__init__.py,sha256=SKuL-weA58hYj0NOMCQRfmsaumlNjjyVHDXNpRO38bQ,305
|
|
18
18
|
basic_memory/api/routers/knowledge_router.py,sha256=iYuBguMb6ERitAwoelSejBYJqLTGfjpkzAHrqwTKjVE,5876
|
|
19
19
|
basic_memory/api/routers/memory_router.py,sha256=W_uHJe2c4XN96mFj6XNvUH6INVbl1BMxy0KUchLcbxU,5421
|
|
@@ -21,34 +21,34 @@ basic_memory/api/routers/project_info_router.py,sha256=Qv12_QL3SRpo7bPcpAjizJmkZ
|
|
|
21
21
|
basic_memory/api/routers/resource_router.py,sha256=WEJEqEaY_yTKj5-U-rW4kXQKUcJflykgwI6_g_R41ck,8058
|
|
22
22
|
basic_memory/api/routers/search_router.py,sha256=R_a5OF5_8rCjmoOMhmw3M4VLCy6I1KLGJ-otSLB0rbI,1953
|
|
23
23
|
basic_memory/cli/__init__.py,sha256=arcKLAWRDhPD7x5t80MlviZeYzwHZ0GZigyy3NKVoGk,33
|
|
24
|
-
basic_memory/cli/app.py,sha256=
|
|
25
|
-
basic_memory/cli/main.py,sha256=
|
|
24
|
+
basic_memory/cli/app.py,sha256=hFRYznTSI58t6FEDUwF_PUgKZF0V63sCHzBDDb5FOAk,2142
|
|
25
|
+
basic_memory/cli/main.py,sha256=WhYOCKliF48DLDOukOg3QPiD16IP3AJfhdCIe7Wlh2g,666
|
|
26
26
|
basic_memory/cli/commands/__init__.py,sha256=3oojcC-Y-4RPqff9vtwWziT_T4uvBVicL0pSHNilVkU,393
|
|
27
27
|
basic_memory/cli/commands/db.py,sha256=-jgVH2fs_s1vvBNJx_FWspQVHv0F6Qd7V5ZPxtYn_jQ,1125
|
|
28
28
|
basic_memory/cli/commands/import_chatgpt.py,sha256=M4_oUN9o_BaW5jpKQu2pTEybivB5ccVolhdZzmhLOsI,8162
|
|
29
29
|
basic_memory/cli/commands/import_claude_conversations.py,sha256=D_4-0xFKkZka7xFvvW8OkgjLv3TFqsC_VuB2Z-Y3avU,6827
|
|
30
30
|
basic_memory/cli/commands/import_claude_projects.py,sha256=KzUuf3wrlvJlqTWCzoLRrNxD3OYNteRXaTFj5IB1FA8,6649
|
|
31
31
|
basic_memory/cli/commands/import_memory_json.py,sha256=zqpU4eCzQXx04aRsigddJAyhvklmTgSAzeRTuEdNw0c,5194
|
|
32
|
-
basic_memory/cli/commands/mcp.py,sha256=
|
|
32
|
+
basic_memory/cli/commands/mcp.py,sha256=sWwRLRbY_FYUNxoy1a8risypnjS9YvZbnP3IjijiUZ0,1025
|
|
33
33
|
basic_memory/cli/commands/project.py,sha256=BSjdz07xDM3R4CUXggv1qhrWLJsEgvGFir6aOUzdr2Q,11330
|
|
34
34
|
basic_memory/cli/commands/status.py,sha256=nbs3myxaNtehEEJ4BBngPuKs-vqZTHNCCb0bTgDsE-s,5277
|
|
35
|
-
basic_memory/cli/commands/sync.py,sha256=
|
|
36
|
-
basic_memory/cli/commands/tool.py,sha256=
|
|
35
|
+
basic_memory/cli/commands/sync.py,sha256=3jwgabxkF4WyFZ-gRC1l8A8p8Z_aYrzHRXOtUfYy2yc,8324
|
|
36
|
+
basic_memory/cli/commands/tool.py,sha256=7wte1TqjG__NcC7BB0BRLl8THB3t5eAngud0zVHBQ8k,9506
|
|
37
37
|
basic_memory/markdown/__init__.py,sha256=DdzioCWtDnKaq05BHYLgL_78FawEHLpLXnp-kPSVfIc,501
|
|
38
|
-
basic_memory/markdown/entity_parser.py,sha256=
|
|
38
|
+
basic_memory/markdown/entity_parser.py,sha256=I4K1Uq8kLYBmShIZQuXI9FuQjzpoV924-jDH9dIiYb8,4420
|
|
39
39
|
basic_memory/markdown/markdown_processor.py,sha256=S5ny69zu2dlqO7tWJoLrpLSzg8emQIDq7Du7olpJUsk,4968
|
|
40
40
|
basic_memory/markdown/plugins.py,sha256=gtIzKRjoZsyvBqLpVNnrmzl_cbTZ5ZGn8kcuXxQjRko,6639
|
|
41
41
|
basic_memory/markdown/schemas.py,sha256=eyxYCr1hVyWmImcle0asE5It_DD6ARkqaBZYu1KK5n4,1896
|
|
42
|
-
basic_memory/markdown/utils.py,sha256=
|
|
42
|
+
basic_memory/markdown/utils.py,sha256=wr7KnDMThgnztkOoqSG_ANPhwNBoPkyjYP1sA1Wnxe4,3270
|
|
43
43
|
basic_memory/mcp/__init__.py,sha256=dsDOhKqjYeIbCULbHIxfcItTbqudEuEg1Np86eq0GEQ,35
|
|
44
44
|
basic_memory/mcp/async_client.py,sha256=Eo345wANiBRSM4u3j_Vd6Ax4YtMg7qbWd9PIoFfj61I,236
|
|
45
45
|
basic_memory/mcp/main.py,sha256=0kbcyf1PxRC1bLnHv2zzParfJ6cOq7Am9ScF9UoI50U,703
|
|
46
|
-
basic_memory/mcp/server.py,sha256=
|
|
46
|
+
basic_memory/mcp/server.py,sha256=RgNIyRUsuBgoCntj_5Dn2_QNTBYQ1tjFSEn-Z1PoFzU,1099
|
|
47
47
|
basic_memory/mcp/prompts/__init__.py,sha256=-Bl9Dgj2TD9PULjzggPqXuvPEjWCRy7S9Yg03h2-U7A,615
|
|
48
48
|
basic_memory/mcp/prompts/ai_assistant_guide.py,sha256=8TI5xObiRVcwv6w9by1xQHlX0whvyE7-LGsiqDMRTFg,821
|
|
49
|
-
basic_memory/mcp/prompts/continue_conversation.py,sha256=
|
|
49
|
+
basic_memory/mcp/prompts/continue_conversation.py,sha256=I1FdNXIsSBKsu2ABj8TRRr-mdZKZ1K8LMCUfAik5Iqs,4424
|
|
50
50
|
basic_memory/mcp/prompts/recent_activity.py,sha256=7607MWiGJWY0vPurhVII17LxLZlXY_zmH3xH9LfT6SY,2793
|
|
51
|
-
basic_memory/mcp/prompts/search.py,sha256=
|
|
51
|
+
basic_memory/mcp/prompts/search.py,sha256=Z4eb1HFb46p9Ezz9nDLsqedePDQtxWafmpcnR_NZUtA,6282
|
|
52
52
|
basic_memory/mcp/prompts/utils.py,sha256=u_bG8DMtMMERvGPJfA3gbl5VAs0xmkuK8ZJBkY8xyV8,5371
|
|
53
53
|
basic_memory/mcp/resources/ai_assistant_guide.md,sha256=qnYWDkYlb-JmKuOoZ5llmRas_t4dWDXB_i8LE277Lgs,14777
|
|
54
54
|
basic_memory/mcp/tools/__init__.py,sha256=prvB6M150ba8WT-v-tmo4Yfu4JG-0yCi6nfK4SsL7XI,882
|
|
@@ -57,11 +57,11 @@ basic_memory/mcp/tools/canvas.py,sha256=fHC90eshnSSmROTBV-tBB-FSuXSpYVj_BcDrc96p
|
|
|
57
57
|
basic_memory/mcp/tools/delete_note.py,sha256=mnrgOv-D7f6nsgZIAK0Wvyn0dbkwCg8adW_xJd7jwc0,829
|
|
58
58
|
basic_memory/mcp/tools/project_info.py,sha256=pyoHpOMhjMIvZFku2iEIpXc2XDtbnNeb-OMrJlYR9LU,1710
|
|
59
59
|
basic_memory/mcp/tools/read_content.py,sha256=PKnvLzNmHfzoIxRKXNaYW5P5q0d1azVwG9juPXPYeQo,8148
|
|
60
|
-
basic_memory/mcp/tools/read_note.py,sha256=
|
|
60
|
+
basic_memory/mcp/tools/read_note.py,sha256=e9un3pKPiIgUzY5x-aFYxBkgQMDwrLAYMMqmDzgq0FQ,6451
|
|
61
61
|
basic_memory/mcp/tools/recent_activity.py,sha256=S0LgIk9RaeYzIsi2FIHs0KK7R1K-LJy3QaSokGlY9ew,3501
|
|
62
|
-
basic_memory/mcp/tools/search.py,sha256=
|
|
62
|
+
basic_memory/mcp/tools/search.py,sha256=TU9Q89rv9lCUmAWjxcc-J_jFQE8CAQM0lM_b-J8VLRc,3786
|
|
63
63
|
basic_memory/mcp/tools/utils.py,sha256=tOWklfSlDcoAJCRBmxkCVwkTY_TDBa5vOGxzU8J5eiQ,13636
|
|
64
|
-
basic_memory/mcp/tools/write_note.py,sha256=
|
|
64
|
+
basic_memory/mcp/tools/write_note.py,sha256=d7vb8vqwLmDJfSOYV_ZWJlbJD9tZyKvLlb7LTMgPXSM,4990
|
|
65
65
|
basic_memory/models/__init__.py,sha256=Bf0xXV_ryndogvZDiVM_Wb6iV2fHUxYNGMZNWNcZi0s,307
|
|
66
66
|
basic_memory/models/base.py,sha256=4hAXJ8CE1RnjKhb23lPd-QM7G_FXIdTowMJ9bRixspU,225
|
|
67
67
|
basic_memory/models/knowledge.py,sha256=lbKd8VOOVPqXtIhNMY30bIokoQutFjLpHwLD5At90MY,6644
|
|
@@ -71,8 +71,8 @@ basic_memory/repository/entity_repository.py,sha256=VLKlQ97-_HhSqc-st_YToWUNE4pJ
|
|
|
71
71
|
basic_memory/repository/observation_repository.py,sha256=BOcy4wARqCXu-thYyt7mPxt2A2C8TW0le3s_X9wrK6I,1701
|
|
72
72
|
basic_memory/repository/project_info_repository.py,sha256=nHWzs0WBQ366WfzIYZgnAfU6tyQ_8slEszWNlDSeIlo,336
|
|
73
73
|
basic_memory/repository/relation_repository.py,sha256=DwpTcn9z_1sZQcyMOUABz1k1VSwo_AU63x2zR7aerTk,2933
|
|
74
|
-
basic_memory/repository/repository.py,sha256=
|
|
75
|
-
basic_memory/repository/search_repository.py,sha256=
|
|
74
|
+
basic_memory/repository/repository.py,sha256=X03U6FA3tpQ8FoULL7J7GByUeArSc2Ajb5GIJjZ8HBA,11934
|
|
75
|
+
basic_memory/repository/search_repository.py,sha256=z6oX6wCLo2JaW2hawtgiyxmTsboKTjuO7cgXsFsQhmA,11607
|
|
76
76
|
basic_memory/schemas/__init__.py,sha256=KHzF2lZhYXRsH2g6tV5Oivlk1EHFfrlbKuiRllqnBzs,1570
|
|
77
77
|
basic_memory/schemas/base.py,sha256=dwnaI5fJXsdp81mdH0ZpmJ-WICY-0M7ZPWeW5OUgBG8,5685
|
|
78
78
|
basic_memory/schemas/delete.py,sha256=UAR2JK99WMj3gP-yoGWlHD3eZEkvlTSRf8QoYIE-Wfw,1180
|
|
@@ -80,20 +80,21 @@ basic_memory/schemas/memory.py,sha256=qqQm89nZQKtrhquHlRnR6LaSWynPi4MgtcMcqvGH5z
|
|
|
80
80
|
basic_memory/schemas/project_info.py,sha256=qsZfafp8bn2oqCizX_CVwJZS4HE79kOmaNiNK9C_9_w,3380
|
|
81
81
|
basic_memory/schemas/request.py,sha256=58r9mPGc4Am9rR_zGzo-yqXcsrl5I6n3M5LjGK5gFFk,1626
|
|
82
82
|
basic_memory/schemas/response.py,sha256=lVYR31DTtSeFRddGWX_wQWnQgyiwX0LEpNJ4f4lKpTM,6440
|
|
83
|
-
basic_memory/schemas/search.py,sha256=
|
|
83
|
+
basic_memory/schemas/search.py,sha256=21GKEQEM3lebJfaTP_gz6DZR4tusx6AeR2E13LtjOvs,3650
|
|
84
84
|
basic_memory/services/__init__.py,sha256=oop6SKmzV4_NAYt9otGnupLGVCCKIVgxEcdRQWwh25I,197
|
|
85
|
-
basic_memory/services/context_service.py,sha256=
|
|
86
|
-
basic_memory/services/entity_service.py,sha256=
|
|
85
|
+
basic_memory/services/context_service.py,sha256=vUo4j-_UDDlpL_PxoNTqmG5kZ2m7UfPyIz6FY3SCU7o,9715
|
|
86
|
+
basic_memory/services/entity_service.py,sha256=lCdqRnAkaolt_pr48lFxRXAj2YRS-nasJTkepBf3zlU,12915
|
|
87
87
|
basic_memory/services/exceptions.py,sha256=VGlCLd4UD2w5NWKqC7QpG4jOM_hA7jKRRM-MqvEVMNk,288
|
|
88
|
-
basic_memory/services/file_service.py,sha256=
|
|
89
|
-
basic_memory/services/
|
|
90
|
-
basic_memory/services/
|
|
88
|
+
basic_memory/services/file_service.py,sha256=egoJnhoHBUX_wepjkLyyc6qZkPfOexlj8p0HRvtdxWw,9940
|
|
89
|
+
basic_memory/services/initialization.py,sha256=T8KPFpFzeURORPjvfhvHE7Vnmx_TXUUGumBCEEiCJaM,4787
|
|
90
|
+
basic_memory/services/link_resolver.py,sha256=3I3wp5HHpe17DNHhn1IG3_yWWHYtEZKRNL7I2j_AHos,3599
|
|
91
|
+
basic_memory/services/search_service.py,sha256=1K1YuWFVreKjn6LkbOpl-zCmXYjqOQS1qB-yvkwu-zc,9817
|
|
91
92
|
basic_memory/services/service.py,sha256=V-d_8gOV07zGIQDpL-Ksqs3ZN9l3qf3HZOK1f_YNTag,336
|
|
92
93
|
basic_memory/sync/__init__.py,sha256=CVHguYH457h2u2xoM8KvOilJC71XJlZ-qUh8lHcjYj4,156
|
|
93
|
-
basic_memory/sync/sync_service.py,sha256=
|
|
94
|
-
basic_memory/sync/watch_service.py,sha256=
|
|
95
|
-
basic_memory-0.
|
|
96
|
-
basic_memory-0.
|
|
97
|
-
basic_memory-0.
|
|
98
|
-
basic_memory-0.
|
|
99
|
-
basic_memory-0.
|
|
94
|
+
basic_memory/sync/sync_service.py,sha256=UYIHk6ACVLo34RLg08voo_vDosNh_pua3HEXY9JM2zw,19610
|
|
95
|
+
basic_memory/sync/watch_service.py,sha256=ipkW9zK1MhisvdHambB9sesB6vNm0OapMZZM7w0GmsQ,14338
|
|
96
|
+
basic_memory-0.12.1.dist-info/METADATA,sha256=zdQD7uRrb9DBoBS8XM362yUZ5nd-w3PFARc4E7BIMAI,14992
|
|
97
|
+
basic_memory-0.12.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
98
|
+
basic_memory-0.12.1.dist-info/entry_points.txt,sha256=wvE2mRF6-Pg4weIYcfQ-86NOLZD4WJg7F7TIsRVFLb8,90
|
|
99
|
+
basic_memory-0.12.1.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
|
100
|
+
basic_memory-0.12.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|