memgit 0.12.0__tar.gz → 0.14.0__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 (83) hide show
  1. {memgit-0.12.0 → memgit-0.14.0}/PKG-INFO +40 -7
  2. {memgit-0.12.0 → memgit-0.14.0}/README.md +37 -4
  3. {memgit-0.12.0 → memgit-0.14.0}/memgit/__init__.py +1 -1
  4. {memgit-0.12.0 → memgit-0.14.0}/memgit/cli.py +299 -38
  5. memgit-0.14.0/memgit/cloud/__init__.py +7 -0
  6. memgit-0.14.0/memgit/cloud/auto.py +278 -0
  7. {memgit-0.12.0 → memgit-0.14.0}/memgit/cloud/commands.py +131 -4
  8. {memgit-0.12.0 → memgit-0.14.0}/memgit/cloud/sync.py +17 -0
  9. {memgit-0.12.0 → memgit-0.14.0}/memgit/delivery.py +3 -1
  10. memgit-0.14.0/memgit/drift.py +191 -0
  11. {memgit-0.12.0 → memgit-0.14.0}/memgit/env.py +13 -0
  12. memgit-0.14.0/memgit/gate.py +431 -0
  13. {memgit-0.12.0 → memgit-0.14.0}/memgit/hooks.py +166 -9
  14. {memgit-0.12.0 → memgit-0.14.0}/memgit/http_server.py +5 -0
  15. {memgit-0.12.0 → memgit-0.14.0}/memgit/links.py +76 -0
  16. memgit-0.14.0/memgit/markup.py +279 -0
  17. {memgit-0.12.0 → memgit-0.14.0}/memgit/mcp_server.py +186 -11
  18. {memgit-0.12.0 → memgit-0.14.0}/memgit/metrics.py +22 -1
  19. {memgit-0.12.0 → memgit-0.14.0}/memgit/models.py +5 -0
  20. {memgit-0.12.0 → memgit-0.14.0}/memgit/repo.py +64 -14
  21. {memgit-0.12.0 → memgit-0.14.0}/memgit/scorer.py +19 -0
  22. {memgit-0.12.0 → memgit-0.14.0}/memgit/toon.py +29 -0
  23. {memgit-0.12.0 → memgit-0.14.0}/memgit.egg-info/PKG-INFO +40 -7
  24. {memgit-0.12.0 → memgit-0.14.0}/memgit.egg-info/SOURCES.txt +9 -0
  25. {memgit-0.12.0 → memgit-0.14.0}/pyproject.toml +9 -2
  26. memgit-0.14.0/tests/test_action_gate.py +424 -0
  27. memgit-0.14.0/tests/test_cloud_autosync.py +248 -0
  28. memgit-0.14.0/tests/test_cloud_two_machines.py +136 -0
  29. memgit-0.14.0/tests/test_markup.py +233 -0
  30. memgit-0.14.0/tests/test_mcp_store_bootstrap.py +69 -0
  31. {memgit-0.12.0 → memgit-0.14.0}/tests/test_v030.py +3 -0
  32. {memgit-0.12.0 → memgit-0.14.0}/tests/test_version_stamps.py +16 -4
  33. memgit-0.12.0/memgit/cloud/__init__.py +0 -6
  34. {memgit-0.12.0 → memgit-0.14.0}/LICENSE +0 -0
  35. {memgit-0.12.0 → memgit-0.14.0}/memgit/audit.py +0 -0
  36. {memgit-0.12.0 → memgit-0.14.0}/memgit/backup.py +0 -0
  37. {memgit-0.12.0 → memgit-0.14.0}/memgit/cloud/client.py +0 -0
  38. {memgit-0.12.0 → memgit-0.14.0}/memgit/cloud/crypto.py +0 -0
  39. {memgit-0.12.0 → memgit-0.14.0}/memgit/cloud/state.py +0 -0
  40. {memgit-0.12.0 → memgit-0.14.0}/memgit/evaluate.py +0 -0
  41. {memgit-0.12.0 → memgit-0.14.0}/memgit/gitdigest.py +0 -0
  42. {memgit-0.12.0 → memgit-0.14.0}/memgit/graph.py +0 -0
  43. {memgit-0.12.0 → memgit-0.14.0}/memgit/importer.py +0 -0
  44. {memgit-0.12.0 → memgit-0.14.0}/memgit/license.py +0 -0
  45. {memgit-0.12.0 → memgit-0.14.0}/memgit/org.py +0 -0
  46. {memgit-0.12.0 → memgit-0.14.0}/memgit/project.py +0 -0
  47. {memgit-0.12.0 → memgit-0.14.0}/memgit/sanitize.py +0 -0
  48. {memgit-0.12.0 → memgit-0.14.0}/memgit/savings.py +0 -0
  49. {memgit-0.12.0 → memgit-0.14.0}/memgit/store.py +0 -0
  50. {memgit-0.12.0 → memgit-0.14.0}/memgit/tiers.py +0 -0
  51. {memgit-0.12.0 → memgit-0.14.0}/memgit/tokens.py +0 -0
  52. {memgit-0.12.0 → memgit-0.14.0}/memgit/usage.py +0 -0
  53. {memgit-0.12.0 → memgit-0.14.0}/memgit.egg-info/dependency_links.txt +0 -0
  54. {memgit-0.12.0 → memgit-0.14.0}/memgit.egg-info/entry_points.txt +0 -0
  55. {memgit-0.12.0 → memgit-0.14.0}/memgit.egg-info/requires.txt +2 -2
  56. {memgit-0.12.0 → memgit-0.14.0}/memgit.egg-info/top_level.txt +0 -0
  57. {memgit-0.12.0 → memgit-0.14.0}/setup.cfg +0 -0
  58. {memgit-0.12.0 → memgit-0.14.0}/tests/test_accrue.py +0 -0
  59. {memgit-0.12.0 → memgit-0.14.0}/tests/test_advanced.py +0 -0
  60. {memgit-0.12.0 → memgit-0.14.0}/tests/test_aliases.py +0 -0
  61. {memgit-0.12.0 → memgit-0.14.0}/tests/test_audit.py +0 -0
  62. {memgit-0.12.0 → memgit-0.14.0}/tests/test_backup.py +0 -0
  63. {memgit-0.12.0 → memgit-0.14.0}/tests/test_cloud_guard.py +0 -0
  64. {memgit-0.12.0 → memgit-0.14.0}/tests/test_core.py +0 -0
  65. {memgit-0.12.0 → memgit-0.14.0}/tests/test_delivery.py +0 -0
  66. {memgit-0.12.0 → memgit-0.14.0}/tests/test_dependency_floor.py +0 -0
  67. {memgit-0.12.0 → memgit-0.14.0}/tests/test_env_inventory.py +0 -0
  68. {memgit-0.12.0 → memgit-0.14.0}/tests/test_git_args.py +0 -0
  69. {memgit-0.12.0 → memgit-0.14.0}/tests/test_license.py +0 -0
  70. {memgit-0.12.0 → memgit-0.14.0}/tests/test_lock_exclusion.py +0 -0
  71. {memgit-0.12.0 → memgit-0.14.0}/tests/test_org.py +0 -0
  72. {memgit-0.12.0 → memgit-0.14.0}/tests/test_savings.py +0 -0
  73. {memgit-0.12.0 → memgit-0.14.0}/tests/test_server_lifecycle.py +0 -0
  74. {memgit-0.12.0 → memgit-0.14.0}/tests/test_setup.py +0 -0
  75. {memgit-0.12.0 → memgit-0.14.0}/tests/test_store_repo.py +0 -0
  76. {memgit-0.12.0 → memgit-0.14.0}/tests/test_tiers.py +0 -0
  77. {memgit-0.12.0 → memgit-0.14.0}/tests/test_toon.py +0 -0
  78. {memgit-0.12.0 → memgit-0.14.0}/tests/test_v020.py +0 -0
  79. {memgit-0.12.0 → memgit-0.14.0}/tests/test_v040.py +0 -0
  80. {memgit-0.12.0 → memgit-0.14.0}/tests/test_v060.py +0 -0
  81. {memgit-0.12.0 → memgit-0.14.0}/tests/test_v070.py +0 -0
  82. {memgit-0.12.0 → memgit-0.14.0}/tests/test_v080.py +0 -0
  83. {memgit-0.12.0 → memgit-0.14.0}/tests/test_v081.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memgit
3
- Version: 0.12.0
3
+ Version: 0.14.0
4
4
  Summary: Git for AI memory — version-controlled context persistence across Claude, GPT, Gemini, Cursor, Windsurf, and more
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://memgit.dev
@@ -22,14 +22,14 @@ License-File: LICENSE
22
22
  Requires-Dist: click>=8.0
23
23
  Requires-Dist: rich>=13.0
24
24
  Requires-Dist: mcp<2,>=1.28.1
25
+ Requires-Dist: pynacl>=1.5
26
+ Requires-Dist: httpx>=0.27
25
27
  Provides-Extra: dev
26
28
  Requires-Dist: pytest>=8.0; extra == "dev"
27
29
  Requires-Dist: pytest-anyio>=0.0.0; extra == "dev"
28
30
  Provides-Extra: tokens
29
31
  Requires-Dist: tiktoken>=0.7; extra == "tokens"
30
32
  Provides-Extra: cloud
31
- Requires-Dist: pynacl>=1.5; extra == "cloud"
32
- Requires-Dist: httpx>=0.27; extra == "cloud"
33
33
  Dynamic: license-file
34
34
 
35
35
  <p align="center">
@@ -160,7 +160,7 @@ pip install memgit
160
160
  ```
161
161
  (The Chocolatey package is live on community.chocolatey.org; newly pushed versions can take a few days to clear moderation — `pip install memgit` always has the latest.)
162
162
 
163
- **Any AI tool config (no Python needed — npx auto-installs on first run):**
163
+ **Any AI tool config (needs Python 3.11+ on PATH; npx installs memgit into its own environment on first run and creates the store):**
164
164
  ```json
165
165
  { "mcpServers": { "memgit": { "command": "npx", "args": ["-y", "memgit-mcp"] } } }
166
166
  ```
@@ -216,15 +216,16 @@ memgit resume --json # for tooling
216
216
  Wire it into Claude Code so memory becomes **automatic** — no tool call, no judgment required:
217
217
 
218
218
  ```bash
219
- memgit setup hooks # installs all five hooks (~/.claude/settings.json)
219
+ memgit setup hooks # installs all six hooks (~/.claude/settings.json)
220
220
  ```
221
221
 
222
222
  | Hook | What it enforces |
223
223
  |---|---|
224
224
  | `SessionStart` | every session opens with the resume digest in context — status board, checkpoints, critical rules, memory index |
225
225
  | `UserPromptSubmit` | each prompt is BM25-matched against the store; relevant memories are injected, ending with a "+N more on '<topic>'" depth hint when more exists (silent when nothing clears the relevance bar; never repeats within a session) — `--no-recall` to skip |
226
+ | `PreToolUse` | a Bash or file-write call that matches a memory's triggers is refused with the rule as the reason (priority-3 feedback and conventions) or gets the rule as context (the rest). memgit allow SLUG opens a short override window. Trigger cache only, `--no-gate` to skip |
226
227
  | `PostToolUse` | reading a file whose path matches a memory tag surfaces a one-line hint ("6 memories tagged 'x' relate to this path") — tagmap cache only, capped 3/session, `--no-ctx-recall` to skip |
227
- | `Stop` (guard) | a session that did real work but saved nothing gets ONE nudge to save durable facts before finishing — `--no-guard` to skip |
228
+ | `Stop` (guard) | a governed call that went through without the gate, or a session that did real work but saved nothing, gets ONE block before finishing. `--no-guard` to skip |
228
229
  | `Stop` (sync) | markdown memories are checkpointed asynchronously at session end |
229
230
 
230
231
  Why hooks and not just good tool descriptions? We measured it: across 166 real sessions, hook-injected context was delivered in **100%** of them while voluntary memory-tool calls happened in **6%**. What a hook enforces happens.
@@ -284,6 +285,8 @@ Once registered via MCP, every AI tool gets 6 tools:
284
285
 
285
286
  The tool descriptions teach the AI **judgment** — "does this request depend on state you don't have in context?" — rather than keyword triggers. Measured cost of the whole tool surface: ~1,150 tokens once per session; a `resume_session` reply is ~335.
286
287
 
288
+ **A save that arrives damaged is refused, not stored** (v0.13.0). A model sometimes closes a value with a tag named after the field (`</rule>`), and the host then delivers the next parameters inside that value: `why`, `when`, `tags` and `type_code` never arrive, and the memory is stored with defaults. On one machine that was 748 of 3,025 saves. `save_memory` now refuses any value carrying tool-call markup, names the field and the parameters it swallowed, and the model retries in the same turn. Markup quoted on purpose inside backticks is allowed. Every successful save echoes the length of each field it stored, which fields arrived empty, and which values came from a default. Damaged memories already in a store are never served back into context: the digest, the recall hook and read results show each field cut at the damage. `memgit doctor` counts them, and `memgit doctor --repair-markup` splits them back into their fields.
289
+
287
290
  ---
288
291
 
289
292
  ## Core operating guide (v0.5.0)
@@ -323,6 +326,29 @@ memgit pro deactivate # remove the key from this machine
323
326
  exports keep working.
324
327
  - If this store is logged in to memgit cloud, `pro activate` also upgrades that account.
325
328
 
329
+ ### Sync between machines and with a team
330
+
331
+ ```bash
332
+ memgit cloud signup --email you@example.com # 14-day trial; keys are made on this machine
333
+ memgit cloud team create myteam
334
+ memgit cloud link myteam/memory # creates the cloud repo on first link
335
+ memgit cloud auto on # every save syncs in the background from now on
336
+ ```
337
+
338
+ With autosync on, each save (including every `save_memory` your AI makes) starts one
339
+ background pull-then-push and returns immediately, and each session start pulls what other
340
+ machines saved. `memgit cloud auto status` shows the last run and why it would not run.
341
+
342
+ On a machine that runs an agent but no interactive sessions (a Mac mini, a VM), log in and
343
+ link once, then keep it current under systemd or launchd:
344
+
345
+ ```bash
346
+ memgit cloud watch --interval 60 # pull and push forever, one JSON line per run
347
+ memgit cloud watch --export ~/agent/.hermes.md # also write the digest for agents that read context files
348
+ ```
349
+
350
+ Everything leaves the machine end-to-end encrypted; the server stores ciphertext only.
351
+
326
352
  ---
327
353
 
328
354
  ## Backups that actually happen
@@ -415,6 +441,8 @@ memgit doctor # hygiene + scope losses: split labels, quaran
415
441
  memgit doctor --audit # every split and stranded label, the save landing rate, throughput
416
442
  memgit doctor --audit --json # the same report as JSON
417
443
  memgit doctor --relabel map.json # bulk re-project memories ({"slug": "Label" | ""}); one checkpoint
444
+ memgit doctor --repair-markup # dry run: memories whose fields swallowed other parameters on save
445
+ memgit doctor --repair-markup --yes [--project LABEL] # split them back into their fields; one checkpoint
418
446
  memgit lint # validate all memories (flags unknown provenance)
419
447
  memgit fsck # verify store integrity
420
448
 
@@ -441,7 +469,9 @@ memgit setup cline
441
469
  memgit setup continue
442
470
  memgit setup gemini-cli
443
471
  memgit setup hooks # Claude Code hooks: resume at start, per-prompt recall,
444
- # capture guard + auto-sync at stop (--no-recall / --no-guard)
472
+ # action gate on Bash and file writes, compliance and
473
+ # capture guard + auto-sync at stop (--no-recall / --no-guard / --no-gate)
474
+ memgit doctor --rules # critical rules next to same-topic lines in CLAUDE.md, AGENTS.md, ...
445
475
 
446
476
  # Pro (licence key)
447
477
  memgit pro activate <key> # Polar-issued key; unlocks hosted E2E sync
@@ -506,6 +536,9 @@ memgit talks to nothing.
506
536
  | Cloud sync | `MEMGIT_CLOUD_API` | Overrides the memgit cloud API base URL. |
507
537
  | | `MEMGIT_CLOUD_APP` | Overrides the memgit cloud web app base URL used in printed links. |
508
538
  | | `MEMGIT_CLOUD_NO_CACHE` | Set to 1/true/yes to keep decrypted keys out of credentials.json; the passphrase is then re-prompted per command. |
539
+ | | `MEMGIT_NO_AUTOSYNC` | Set to 1/true/yes to stop saves and session starts from syncing to memgit cloud in the background, for this process only. |
540
+ | | `MEMGIT_AUTOSYNC_MAX_AGE` | Seconds after which a read (search, recall, an MCP lookup) starts a background fetch from memgit cloud (default 300). 0 turns read-triggered fetching off; saves and session starts still sync. |
541
+ | | `MEMGIT_AUTOSYNC_WAIT` | Seconds a session start waits for the fetch from memgit cloud before rendering the digest (default 3). 0 never waits. |
509
542
  | Tuning | `MEMGIT_LOCK_TIMEOUT` | Seconds a writer waits for the store lock before giving up (default 10). |
510
543
  | | `MEMGIT_IDLE_EVICT_SECONDS` | Idle seconds before the MCP server drops its in-memory caches while staying connected (default 900). |
511
544
  | | `MEMGIT_HOUSEKEEPING_INTERVAL` | Seconds between the MCP server's housekeeping passes. |
@@ -126,7 +126,7 @@ pip install memgit
126
126
  ```
127
127
  (The Chocolatey package is live on community.chocolatey.org; newly pushed versions can take a few days to clear moderation — `pip install memgit` always has the latest.)
128
128
 
129
- **Any AI tool config (no Python needed — npx auto-installs on first run):**
129
+ **Any AI tool config (needs Python 3.11+ on PATH; npx installs memgit into its own environment on first run and creates the store):**
130
130
  ```json
131
131
  { "mcpServers": { "memgit": { "command": "npx", "args": ["-y", "memgit-mcp"] } } }
132
132
  ```
@@ -182,15 +182,16 @@ memgit resume --json # for tooling
182
182
  Wire it into Claude Code so memory becomes **automatic** — no tool call, no judgment required:
183
183
 
184
184
  ```bash
185
- memgit setup hooks # installs all five hooks (~/.claude/settings.json)
185
+ memgit setup hooks # installs all six hooks (~/.claude/settings.json)
186
186
  ```
187
187
 
188
188
  | Hook | What it enforces |
189
189
  |---|---|
190
190
  | `SessionStart` | every session opens with the resume digest in context — status board, checkpoints, critical rules, memory index |
191
191
  | `UserPromptSubmit` | each prompt is BM25-matched against the store; relevant memories are injected, ending with a "+N more on '<topic>'" depth hint when more exists (silent when nothing clears the relevance bar; never repeats within a session) — `--no-recall` to skip |
192
+ | `PreToolUse` | a Bash or file-write call that matches a memory's triggers is refused with the rule as the reason (priority-3 feedback and conventions) or gets the rule as context (the rest). memgit allow SLUG opens a short override window. Trigger cache only, `--no-gate` to skip |
192
193
  | `PostToolUse` | reading a file whose path matches a memory tag surfaces a one-line hint ("6 memories tagged 'x' relate to this path") — tagmap cache only, capped 3/session, `--no-ctx-recall` to skip |
193
- | `Stop` (guard) | a session that did real work but saved nothing gets ONE nudge to save durable facts before finishing — `--no-guard` to skip |
194
+ | `Stop` (guard) | a governed call that went through without the gate, or a session that did real work but saved nothing, gets ONE block before finishing. `--no-guard` to skip |
194
195
  | `Stop` (sync) | markdown memories are checkpointed asynchronously at session end |
195
196
 
196
197
  Why hooks and not just good tool descriptions? We measured it: across 166 real sessions, hook-injected context was delivered in **100%** of them while voluntary memory-tool calls happened in **6%**. What a hook enforces happens.
@@ -250,6 +251,8 @@ Once registered via MCP, every AI tool gets 6 tools:
250
251
 
251
252
  The tool descriptions teach the AI **judgment** — "does this request depend on state you don't have in context?" — rather than keyword triggers. Measured cost of the whole tool surface: ~1,150 tokens once per session; a `resume_session` reply is ~335.
252
253
 
254
+ **A save that arrives damaged is refused, not stored** (v0.13.0). A model sometimes closes a value with a tag named after the field (`</rule>`), and the host then delivers the next parameters inside that value: `why`, `when`, `tags` and `type_code` never arrive, and the memory is stored with defaults. On one machine that was 748 of 3,025 saves. `save_memory` now refuses any value carrying tool-call markup, names the field and the parameters it swallowed, and the model retries in the same turn. Markup quoted on purpose inside backticks is allowed. Every successful save echoes the length of each field it stored, which fields arrived empty, and which values came from a default. Damaged memories already in a store are never served back into context: the digest, the recall hook and read results show each field cut at the damage. `memgit doctor` counts them, and `memgit doctor --repair-markup` splits them back into their fields.
255
+
253
256
  ---
254
257
 
255
258
  ## Core operating guide (v0.5.0)
@@ -289,6 +292,29 @@ memgit pro deactivate # remove the key from this machine
289
292
  exports keep working.
290
293
  - If this store is logged in to memgit cloud, `pro activate` also upgrades that account.
291
294
 
295
+ ### Sync between machines and with a team
296
+
297
+ ```bash
298
+ memgit cloud signup --email you@example.com # 14-day trial; keys are made on this machine
299
+ memgit cloud team create myteam
300
+ memgit cloud link myteam/memory # creates the cloud repo on first link
301
+ memgit cloud auto on # every save syncs in the background from now on
302
+ ```
303
+
304
+ With autosync on, each save (including every `save_memory` your AI makes) starts one
305
+ background pull-then-push and returns immediately, and each session start pulls what other
306
+ machines saved. `memgit cloud auto status` shows the last run and why it would not run.
307
+
308
+ On a machine that runs an agent but no interactive sessions (a Mac mini, a VM), log in and
309
+ link once, then keep it current under systemd or launchd:
310
+
311
+ ```bash
312
+ memgit cloud watch --interval 60 # pull and push forever, one JSON line per run
313
+ memgit cloud watch --export ~/agent/.hermes.md # also write the digest for agents that read context files
314
+ ```
315
+
316
+ Everything leaves the machine end-to-end encrypted; the server stores ciphertext only.
317
+
292
318
  ---
293
319
 
294
320
  ## Backups that actually happen
@@ -381,6 +407,8 @@ memgit doctor # hygiene + scope losses: split labels, quaran
381
407
  memgit doctor --audit # every split and stranded label, the save landing rate, throughput
382
408
  memgit doctor --audit --json # the same report as JSON
383
409
  memgit doctor --relabel map.json # bulk re-project memories ({"slug": "Label" | ""}); one checkpoint
410
+ memgit doctor --repair-markup # dry run: memories whose fields swallowed other parameters on save
411
+ memgit doctor --repair-markup --yes [--project LABEL] # split them back into their fields; one checkpoint
384
412
  memgit lint # validate all memories (flags unknown provenance)
385
413
  memgit fsck # verify store integrity
386
414
 
@@ -407,7 +435,9 @@ memgit setup cline
407
435
  memgit setup continue
408
436
  memgit setup gemini-cli
409
437
  memgit setup hooks # Claude Code hooks: resume at start, per-prompt recall,
410
- # capture guard + auto-sync at stop (--no-recall / --no-guard)
438
+ # action gate on Bash and file writes, compliance and
439
+ # capture guard + auto-sync at stop (--no-recall / --no-guard / --no-gate)
440
+ memgit doctor --rules # critical rules next to same-topic lines in CLAUDE.md, AGENTS.md, ...
411
441
 
412
442
  # Pro (licence key)
413
443
  memgit pro activate <key> # Polar-issued key; unlocks hosted E2E sync
@@ -472,6 +502,9 @@ memgit talks to nothing.
472
502
  | Cloud sync | `MEMGIT_CLOUD_API` | Overrides the memgit cloud API base URL. |
473
503
  | | `MEMGIT_CLOUD_APP` | Overrides the memgit cloud web app base URL used in printed links. |
474
504
  | | `MEMGIT_CLOUD_NO_CACHE` | Set to 1/true/yes to keep decrypted keys out of credentials.json; the passphrase is then re-prompted per command. |
505
+ | | `MEMGIT_NO_AUTOSYNC` | Set to 1/true/yes to stop saves and session starts from syncing to memgit cloud in the background, for this process only. |
506
+ | | `MEMGIT_AUTOSYNC_MAX_AGE` | Seconds after which a read (search, recall, an MCP lookup) starts a background fetch from memgit cloud (default 300). 0 turns read-triggered fetching off; saves and session starts still sync. |
507
+ | | `MEMGIT_AUTOSYNC_WAIT` | Seconds a session start waits for the fetch from memgit cloud before rendering the digest (default 3). 0 never waits. |
475
508
  | Tuning | `MEMGIT_LOCK_TIMEOUT` | Seconds a writer waits for the store lock before giving up (default 10). |
476
509
  | | `MEMGIT_IDLE_EVICT_SECONDS` | Idle seconds before the MCP server drops its in-memory caches while staying connected (default 900). |
477
510
  | | `MEMGIT_HOUSEKEEPING_INTERVAL` | Seconds between the MCP server's housekeeping passes. |
@@ -1,3 +1,3 @@
1
1
  """memgit — git for AI memory."""
2
2
 
3
- __version__ = "0.12.0"
3
+ __version__ = "0.14.0"