memgit 0.7.0__tar.gz → 0.8.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 (54) hide show
  1. {memgit-0.7.0 → memgit-0.8.0}/PKG-INFO +36 -4
  2. {memgit-0.7.0 → memgit-0.8.0}/README.md +35 -3
  3. {memgit-0.7.0 → memgit-0.8.0}/memgit/__init__.py +1 -1
  4. {memgit-0.7.0 → memgit-0.8.0}/memgit/cli.py +552 -32
  5. {memgit-0.7.0 → memgit-0.8.0}/memgit/delivery.py +92 -8
  6. memgit-0.8.0/memgit/evaluate.py +344 -0
  7. {memgit-0.7.0 → memgit-0.8.0}/memgit/hooks.py +75 -36
  8. {memgit-0.7.0 → memgit-0.8.0}/memgit/http_server.py +3 -1
  9. {memgit-0.7.0 → memgit-0.8.0}/memgit/links.py +87 -1
  10. {memgit-0.7.0 → memgit-0.8.0}/memgit/mcp_server.py +146 -3
  11. memgit-0.8.0/memgit/metrics.py +197 -0
  12. {memgit-0.7.0 → memgit-0.8.0}/memgit/models.py +8 -0
  13. {memgit-0.7.0 → memgit-0.8.0}/memgit/project.py +57 -1
  14. {memgit-0.7.0 → memgit-0.8.0}/memgit/repo.py +90 -29
  15. memgit-0.8.0/memgit/sanitize.py +60 -0
  16. memgit-0.8.0/memgit/scorer.py +351 -0
  17. {memgit-0.7.0 → memgit-0.8.0}/memgit/toon.py +8 -0
  18. {memgit-0.7.0 → memgit-0.8.0}/memgit.egg-info/PKG-INFO +36 -4
  19. {memgit-0.7.0 → memgit-0.8.0}/memgit.egg-info/SOURCES.txt +6 -1
  20. {memgit-0.7.0 → memgit-0.8.0}/pyproject.toml +1 -1
  21. {memgit-0.7.0 → memgit-0.8.0}/tests/test_delivery.py +1 -1
  22. {memgit-0.7.0 → memgit-0.8.0}/tests/test_v060.py +19 -3
  23. {memgit-0.7.0 → memgit-0.8.0}/tests/test_v070.py +50 -1
  24. memgit-0.8.0/tests/test_v080.py +301 -0
  25. memgit-0.8.0/tests/test_v081.py +472 -0
  26. memgit-0.7.0/memgit/scorer.py +0 -158
  27. {memgit-0.7.0 → memgit-0.8.0}/LICENSE +0 -0
  28. {memgit-0.7.0 → memgit-0.8.0}/memgit/cloud/__init__.py +0 -0
  29. {memgit-0.7.0 → memgit-0.8.0}/memgit/cloud/client.py +0 -0
  30. {memgit-0.7.0 → memgit-0.8.0}/memgit/cloud/commands.py +0 -0
  31. {memgit-0.7.0 → memgit-0.8.0}/memgit/cloud/crypto.py +0 -0
  32. {memgit-0.7.0 → memgit-0.8.0}/memgit/cloud/state.py +0 -0
  33. {memgit-0.7.0 → memgit-0.8.0}/memgit/cloud/sync.py +0 -0
  34. {memgit-0.7.0 → memgit-0.8.0}/memgit/gitdigest.py +0 -0
  35. {memgit-0.7.0 → memgit-0.8.0}/memgit/graph.py +0 -0
  36. {memgit-0.7.0 → memgit-0.8.0}/memgit/importer.py +0 -0
  37. {memgit-0.7.0 → memgit-0.8.0}/memgit/store.py +0 -0
  38. {memgit-0.7.0 → memgit-0.8.0}/memgit/tokens.py +0 -0
  39. {memgit-0.7.0 → memgit-0.8.0}/memgit/usage.py +0 -0
  40. {memgit-0.7.0 → memgit-0.8.0}/memgit.egg-info/dependency_links.txt +0 -0
  41. {memgit-0.7.0 → memgit-0.8.0}/memgit.egg-info/entry_points.txt +0 -0
  42. {memgit-0.7.0 → memgit-0.8.0}/memgit.egg-info/requires.txt +0 -0
  43. {memgit-0.7.0 → memgit-0.8.0}/memgit.egg-info/top_level.txt +0 -0
  44. {memgit-0.7.0 → memgit-0.8.0}/setup.cfg +0 -0
  45. {memgit-0.7.0 → memgit-0.8.0}/tests/test_accrue.py +0 -0
  46. {memgit-0.7.0 → memgit-0.8.0}/tests/test_advanced.py +0 -0
  47. {memgit-0.7.0 → memgit-0.8.0}/tests/test_aliases.py +0 -0
  48. {memgit-0.7.0 → memgit-0.8.0}/tests/test_core.py +0 -0
  49. {memgit-0.7.0 → memgit-0.8.0}/tests/test_setup.py +0 -0
  50. {memgit-0.7.0 → memgit-0.8.0}/tests/test_store_repo.py +0 -0
  51. {memgit-0.7.0 → memgit-0.8.0}/tests/test_toon.py +0 -0
  52. {memgit-0.7.0 → memgit-0.8.0}/tests/test_v020.py +0 -0
  53. {memgit-0.7.0 → memgit-0.8.0}/tests/test_v030.py +0 -0
  54. {memgit-0.7.0 → memgit-0.8.0}/tests/test_v040.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memgit
3
- Version: 0.7.0
3
+ Version: 0.8.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
@@ -44,7 +44,7 @@ Version-controlled, cross-AI context that persists, diffs, rolls back, and syncs
44
44
 
45
45
  [![PyPI](https://img.shields.io/pypi/v/memgit)](https://pypi.org/project/memgit/)
46
46
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
47
- [![Tests](https://img.shields.io/badge/tests-245%20passing-brightgreen)](tests/)
47
+ [![Tests](https://img.shields.io/badge/tests-404%20passing-brightgreen)](tests/)
48
48
 
49
49
  ---
50
50
 
@@ -292,6 +292,21 @@ A project's hardest onboarding problem isn't *what* it does — it's *how to wor
292
292
 
293
293
  And it **learns**: a sidecar usage ledger tracks which memories actually get recalled, and the most-used ones are auto-promoted as pointers into the guide over time (budget-capped, decaying, and always subordinate to the repo's own rules — it never restates or overrides them). Drifted? `memgit core heal` rebuilds it.
294
294
 
295
+ Since 0.8.0 it also **starts itself**: a project's first guide is created automatically once it holds a handful of memories, so the loop no longer waits on someone remembering to run `core seed`. The guide leads with what the project actually holds — "this project has N saved memories covering *topics*" — because a stated count of real prior work is evidence a model can act on, where an abstract instruction to check memory is something it can weigh against its own confidence and skip.
296
+
297
+ ---
298
+
299
+ ## Ranking you can prove
300
+
301
+ Retrieval quality used to be adjusted on intuition. `memgit eval` replaces that with a measurement, using two frozen sets mined from the store itself:
302
+
303
+ - **recall** — real prompts and the memories memgit actually surfaced for them. Measures *stability*: did a change break what used to work?
304
+ - **synthetic** — each memory queried by its own `why`, expecting itself back, with the slug's own words stripped out of the query. Measures *correctness*, independently of any past ranking. (The recall set alone is circular — its answers came from the ranking under test.)
305
+
306
+ Both report hit@1, recall@3/5/10 and MRR against a pinned baseline. There is deliberately no single blended score, and no fabricated "tokens saved" number.
307
+
308
+ It earns its keep immediately. Two changes built for 0.8.0 looked obviously right and were measured wrong: a recency multiplier (cut — real-prompt hit@1 −0.020, MRR −0.018) and destructive stemming, which fixed its motivating query while costing hit@1 −0.038 overall (rebuilt as an additive field, then +0.020/+0.041/+0.019). A BM25 normalisation bug introduced in the same release was caught the same way.
309
+
295
310
  ---
296
311
 
297
312
  ## Depth advertisement, trackers & supersession (v0.6.0)
@@ -330,6 +345,15 @@ memgit core seed # draft a guide from this project's skills + r
330
345
  memgit core sync # deliver it into each AI host's own rules file (additive)
331
346
  memgit core show / edit # view / curate the guide
332
347
  memgit core heal # self-repair a guide that has drifted
348
+ # (a project's FIRST guide is created automatically
349
+ # once it holds 5+ memories — no command needed)
350
+
351
+ # Retrieval evaluation — prove a ranking change helped
352
+ memgit eval mine # freeze a regression set from real recall events
353
+ memgit eval mine --synthetic # non-circular set: query each memory by its own `why`
354
+ memgit eval run --set recall # hit@1 / recall@3,5,10 / MRR vs the pinned baseline
355
+ memgit eval run --baseline # pin the current result as the comparison point
356
+ memgit eval run --misses 10 # inspect the cases where nothing relevant surfaced
333
357
 
334
358
  # Scale & proof
335
359
  memgit squash # compress old history (archives what it collapses)
@@ -386,6 +410,9 @@ memgit thread list / switch / create
386
410
  | **Windsurf** | MCP stdio | `memgit setup windsurf` |
387
411
  | **Cline / Roo-Code** | MCP stdio | `memgit setup cline` |
388
412
  | **Continue.dev** | MCP stdio | `memgit setup continue` |
413
+ | **Codex** | MCP stdio (TOML) | `memgit setup codex` |
414
+ | **Antigravity** | MCP stdio | `memgit setup antigravity` |
415
+ | **Gemini CLI** | MCP stdio | `memgit setup gemini-cli` |
389
416
  | **ChatGPT (Custom Actions)** | HTTP + OpenAPI | `memgit serve --http` → import `http://localhost:7474/openapi.json` |
390
417
  | **Gemini API** | HTTP function calling | `memgit serve --http` + `llm-tool-definitions.json` |
391
418
  | **Any MCP tool** | MCP stdio | Add `{"command": "memgit", "args": ["serve"]}` to config |
@@ -446,7 +473,7 @@ git clone https://github.com/code4161/memgit.git
446
473
  cd memgit
447
474
  python -m venv .venv && source .venv/bin/activate
448
475
  pip install -e ".[dev]"
449
- pytest # 245 tests, all passing, < 5 seconds
476
+ pytest # 404 tests, all passing, < 5 seconds
450
477
  ```
451
478
 
452
479
  See [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -477,8 +504,13 @@ See [CONTRIBUTING.md](CONTRIBUTING.md).
477
504
  - [x] Lossless memories — full `body` alongside the compact rule (v0.3.0)
478
505
  - [x] Project-scoped memories + `memgit onboard` mid-project bootstrap (v0.3.0)
479
506
  - [x] VS Code extension (v0.1.5, Marketplace: code416-memgit.memgit)
507
+ - [x] Codex + Antigravity support — MCP registration + `AGENTS.md` core guide (v0.8.0)
508
+ - [x] `memgit eval` — measured retrieval quality, real + non-circular sets (v0.8.0)
509
+ - [x] Usage-aware ranking — the recall ledger feeds relevance, not just the guide (v0.8.0)
510
+ - [x] Automatic core-guide bootstrap — the self-improving loop starts itself (v0.8.0)
480
511
  - [ ] JetBrains plugin (Phase 3)
481
- - [ ] Semantic search via embeddings (Phase 4)
512
+ - [ ] Semantic search via embeddings — gated on `memgit eval` showing a real gain (Phase 4)
513
+ - [ ] Public benchmark numbers (LongMemEval, LoCoMo) (Phase 4)
482
514
  - [x] memgit.dev website (live)
483
515
  - [ ] Memory compression / auto-summarization (Phase 5)
484
516
  - [ ] Team access control + audit trail (Phase 5)
@@ -10,7 +10,7 @@ Version-controlled, cross-AI context that persists, diffs, rolls back, and syncs
10
10
 
11
11
  [![PyPI](https://img.shields.io/pypi/v/memgit)](https://pypi.org/project/memgit/)
12
12
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
13
- [![Tests](https://img.shields.io/badge/tests-245%20passing-brightgreen)](tests/)
13
+ [![Tests](https://img.shields.io/badge/tests-404%20passing-brightgreen)](tests/)
14
14
 
15
15
  ---
16
16
 
@@ -258,6 +258,21 @@ A project's hardest onboarding problem isn't *what* it does — it's *how to wor
258
258
 
259
259
  And it **learns**: a sidecar usage ledger tracks which memories actually get recalled, and the most-used ones are auto-promoted as pointers into the guide over time (budget-capped, decaying, and always subordinate to the repo's own rules — it never restates or overrides them). Drifted? `memgit core heal` rebuilds it.
260
260
 
261
+ Since 0.8.0 it also **starts itself**: a project's first guide is created automatically once it holds a handful of memories, so the loop no longer waits on someone remembering to run `core seed`. The guide leads with what the project actually holds — "this project has N saved memories covering *topics*" — because a stated count of real prior work is evidence a model can act on, where an abstract instruction to check memory is something it can weigh against its own confidence and skip.
262
+
263
+ ---
264
+
265
+ ## Ranking you can prove
266
+
267
+ Retrieval quality used to be adjusted on intuition. `memgit eval` replaces that with a measurement, using two frozen sets mined from the store itself:
268
+
269
+ - **recall** — real prompts and the memories memgit actually surfaced for them. Measures *stability*: did a change break what used to work?
270
+ - **synthetic** — each memory queried by its own `why`, expecting itself back, with the slug's own words stripped out of the query. Measures *correctness*, independently of any past ranking. (The recall set alone is circular — its answers came from the ranking under test.)
271
+
272
+ Both report hit@1, recall@3/5/10 and MRR against a pinned baseline. There is deliberately no single blended score, and no fabricated "tokens saved" number.
273
+
274
+ It earns its keep immediately. Two changes built for 0.8.0 looked obviously right and were measured wrong: a recency multiplier (cut — real-prompt hit@1 −0.020, MRR −0.018) and destructive stemming, which fixed its motivating query while costing hit@1 −0.038 overall (rebuilt as an additive field, then +0.020/+0.041/+0.019). A BM25 normalisation bug introduced in the same release was caught the same way.
275
+
261
276
  ---
262
277
 
263
278
  ## Depth advertisement, trackers & supersession (v0.6.0)
@@ -296,6 +311,15 @@ memgit core seed # draft a guide from this project's skills + r
296
311
  memgit core sync # deliver it into each AI host's own rules file (additive)
297
312
  memgit core show / edit # view / curate the guide
298
313
  memgit core heal # self-repair a guide that has drifted
314
+ # (a project's FIRST guide is created automatically
315
+ # once it holds 5+ memories — no command needed)
316
+
317
+ # Retrieval evaluation — prove a ranking change helped
318
+ memgit eval mine # freeze a regression set from real recall events
319
+ memgit eval mine --synthetic # non-circular set: query each memory by its own `why`
320
+ memgit eval run --set recall # hit@1 / recall@3,5,10 / MRR vs the pinned baseline
321
+ memgit eval run --baseline # pin the current result as the comparison point
322
+ memgit eval run --misses 10 # inspect the cases where nothing relevant surfaced
299
323
 
300
324
  # Scale & proof
301
325
  memgit squash # compress old history (archives what it collapses)
@@ -352,6 +376,9 @@ memgit thread list / switch / create
352
376
  | **Windsurf** | MCP stdio | `memgit setup windsurf` |
353
377
  | **Cline / Roo-Code** | MCP stdio | `memgit setup cline` |
354
378
  | **Continue.dev** | MCP stdio | `memgit setup continue` |
379
+ | **Codex** | MCP stdio (TOML) | `memgit setup codex` |
380
+ | **Antigravity** | MCP stdio | `memgit setup antigravity` |
381
+ | **Gemini CLI** | MCP stdio | `memgit setup gemini-cli` |
355
382
  | **ChatGPT (Custom Actions)** | HTTP + OpenAPI | `memgit serve --http` → import `http://localhost:7474/openapi.json` |
356
383
  | **Gemini API** | HTTP function calling | `memgit serve --http` + `llm-tool-definitions.json` |
357
384
  | **Any MCP tool** | MCP stdio | Add `{"command": "memgit", "args": ["serve"]}` to config |
@@ -412,7 +439,7 @@ git clone https://github.com/code4161/memgit.git
412
439
  cd memgit
413
440
  python -m venv .venv && source .venv/bin/activate
414
441
  pip install -e ".[dev]"
415
- pytest # 245 tests, all passing, < 5 seconds
442
+ pytest # 404 tests, all passing, < 5 seconds
416
443
  ```
417
444
 
418
445
  See [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -443,8 +470,13 @@ See [CONTRIBUTING.md](CONTRIBUTING.md).
443
470
  - [x] Lossless memories — full `body` alongside the compact rule (v0.3.0)
444
471
  - [x] Project-scoped memories + `memgit onboard` mid-project bootstrap (v0.3.0)
445
472
  - [x] VS Code extension (v0.1.5, Marketplace: code416-memgit.memgit)
473
+ - [x] Codex + Antigravity support — MCP registration + `AGENTS.md` core guide (v0.8.0)
474
+ - [x] `memgit eval` — measured retrieval quality, real + non-circular sets (v0.8.0)
475
+ - [x] Usage-aware ranking — the recall ledger feeds relevance, not just the guide (v0.8.0)
476
+ - [x] Automatic core-guide bootstrap — the self-improving loop starts itself (v0.8.0)
446
477
  - [ ] JetBrains plugin (Phase 3)
447
- - [ ] Semantic search via embeddings (Phase 4)
478
+ - [ ] Semantic search via embeddings — gated on `memgit eval` showing a real gain (Phase 4)
479
+ - [ ] Public benchmark numbers (LongMemEval, LoCoMo) (Phase 4)
448
480
  - [x] memgit.dev website (live)
449
481
  - [ ] Memory compression / auto-summarization (Phase 5)
450
482
  - [ ] Team access control + audit trail (Phase 5)
@@ -1,3 +1,3 @@
1
1
  """memgit — git for AI memory."""
2
2
 
3
- __version__ = "0.7.0"
3
+ __version__ = "0.8.0"