mnemo-dev 0.5.2__tar.gz → 0.6.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.
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/PKG-INFO +103 -38
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/README.md +102 -37
- mnemo_dev-0.6.0/mnemo/__init__.py +5 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/api_discovery/__init__.py +10 -0
- mnemo_dev-0.6.0/mnemo/breaking/__init__.py +2 -0
- mnemo_dev-0.6.0/mnemo/cli.py +950 -0
- mnemo_dev-0.6.0/mnemo/config.py +97 -0
- mnemo_dev-0.6.0/mnemo/conventions/__init__.py +2 -0
- mnemo_dev-0.6.0/mnemo/core/__init__.py +12 -0
- mnemo_dev-0.6.0/mnemo/core/atomic.py +71 -0
- mnemo_dev-0.6.0/mnemo/core/datamark.py +40 -0
- mnemo_dev-0.6.0/mnemo/core/injection.py +36 -0
- mnemo_dev-0.6.0/mnemo/core/store.py +110 -0
- mnemo_dev-0.6.0/mnemo/corrections/__init__.py +2 -0
- mnemo_dev-0.6.0/mnemo/dead_code/__init__.py +2 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/doctor.py +42 -0
- mnemo_dev-0.6.0/mnemo/drift/__init__.py +3 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/embeddings/__init__.py +27 -0
- mnemo_dev-0.6.0/mnemo/embeddings/dense.py +135 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/clustering.py +4 -3
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/freshness.py +38 -25
- mnemo_dev-0.6.0/mnemo/engine/java_enrich.py +189 -0
- mnemo_dev-0.6.0/mnemo/engine/layout.py +91 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/pipeline.py +27 -5
- mnemo_dev-0.6.0/mnemo/engine/query.py +51 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/schema.py +1 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/scope.py +104 -58
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/enrichment.py +5 -5
- mnemo_dev-0.6.0/mnemo/errors/__init__.py +2 -0
- mnemo_dev-0.6.0/mnemo/health/__init__.py +2 -0
- mnemo_dev-0.6.0/mnemo/hooks/__init__.py +23 -0
- mnemo_dev-0.6.0/mnemo/hooks/claude.py +120 -0
- mnemo_dev-0.6.0/mnemo/hooks/discovery.py +46 -0
- mnemo_dev-0.6.0/mnemo/hooks/git.py +58 -0
- mnemo_dev-0.6.0/mnemo/hooks/kiro.py +432 -0
- mnemo_dev-0.6.0/mnemo/hooks/templates/__init__.py +160 -0
- mnemo_dev-0.6.0/mnemo/incidents/__init__.py +2 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/init.py +8 -1
- mnemo_dev-0.6.0/mnemo/intent.py +158 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/knowledge/__init__.py +0 -16
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/mcp_server.py +1 -1
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/_shared.py +8 -6
- mnemo_dev-0.6.0/mnemo/memory/decisions.py +417 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/episodes.py +2 -7
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/hierarchy.py +0 -3
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/indexing.py +6 -1
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/lessons.py +2 -7
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/linking.py +0 -10
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/retention.py +0 -2
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/search.py +55 -30
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/services.py +41 -2
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/slots.py +1 -1
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/store.py +39 -48
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/temporal.py +2 -7
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/plan/__init__.py +95 -10
- mnemo_dev-0.6.0/mnemo/quality/__init__.py +19 -0
- mnemo_dev-0.5.2/mnemo/breaking/__init__.py → mnemo_dev-0.6.0/mnemo/quality/breaking.py +2 -7
- mnemo_dev-0.5.2/mnemo/conventions/__init__.py → mnemo_dev-0.6.0/mnemo/quality/conventions.py +12 -6
- mnemo_dev-0.6.0/mnemo/quality/gates.py +113 -0
- mnemo_dev-0.5.2/mnemo/security/__init__.py → mnemo_dev-0.6.0/mnemo/quality/security.py +4 -10
- mnemo_dev-0.6.0/mnemo/records/__init__.py +11 -0
- mnemo_dev-0.6.0/mnemo/regressions/__init__.py +2 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/repo_map/identity.py +7 -1
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/repo_map/scanner.py +1 -2
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/retrieval.py +24 -0
- mnemo_dev-0.6.0/mnemo/security/__init__.py +2 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/serve.py +194 -20
- mnemo_dev-0.6.0/mnemo/skills/__init__.py +465 -0
- mnemo_dev-0.6.0/mnemo/skills/orchestrator.py +189 -0
- mnemo_dev-0.6.0/mnemo/templates/__init__.py +141 -0
- mnemo_dev-0.6.0/mnemo/templates/generator.py +106 -0
- mnemo_dev-0.6.0/mnemo/templates/hosts/__init__.py +64 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tool_registry.py +1 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/__init__.py +2 -1
- mnemo_dev-0.6.0/mnemo/tools/capture.py +78 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/code.py +15 -13
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/engine.py +4 -128
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/git.py +0 -14
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/graph.py +3 -3
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/memory.py +59 -2
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/meta.py +18 -7
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/plan.py +3 -43
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/safety.py +15 -15
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/search.py +1 -1
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/tools/team.py +44 -128
- mnemo_dev-0.6.0/mnemo/ui_static/index.html +316 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/__init__.py +14 -0
- mnemo_dev-0.6.0/mnemo/watcher.py +94 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/workspace/__init__.py +20 -4
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo_dev.egg-info/PKG-INFO +103 -38
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo_dev.egg-info/SOURCES.txt +54 -7
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/pyproject.toml +20 -2
- mnemo_dev-0.6.0/tests/test_commit_gen.py +237 -0
- mnemo_dev-0.6.0/tests/test_decisions_eventsourced.py +383 -0
- mnemo_dev-0.6.0/tests/test_embeddings.py +298 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_engine_pipeline.py +54 -0
- mnemo_dev-0.6.0/tests/test_engine_query.py +88 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_full_cycle.py +3 -3
- mnemo_dev-0.6.0/tests/test_graph_tools.py +137 -0
- mnemo_dev-0.6.0/tests/test_hook_lifecycle.py +296 -0
- mnemo_dev-0.6.0/tests/test_hooks.py +335 -0
- mnemo_dev-0.6.0/tests/test_integration_pipeline.py +203 -0
- mnemo_dev-0.6.0/tests/test_knowledge.py +103 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_mcp_integration.py +1 -1
- mnemo_dev-0.6.0/tests/test_memory_comprehensive.py +260 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_memory_lifecycle.py +3 -3
- mnemo_dev-0.6.0/tests/test_monster_harness.py +610 -0
- mnemo_dev-0.6.0/tests/test_parsers_multilang.py +95 -0
- mnemo_dev-0.6.0/tests/test_pr_gen.py +165 -0
- mnemo_dev-0.6.0/tests/test_quality_modules.py +165 -0
- mnemo_dev-0.6.0/tests/test_remaining_modules.py +250 -0
- mnemo_dev-0.6.0/tests/test_retrieval.py +136 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_search_quality.py +1 -1
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_secondary_collections.py +16 -6
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_self_maintenance.py +1 -1
- mnemo_dev-0.6.0/tests/test_workflow_skills.py +378 -0
- mnemo_dev-0.6.0/tests/test_workspace.py +239 -0
- mnemo_dev-0.5.2/mnemo/__init__.py +0 -5
- mnemo_dev-0.5.2/mnemo/chunking.py +0 -36
- mnemo_dev-0.5.2/mnemo/cli.py +0 -503
- mnemo_dev-0.5.2/mnemo/code_review/__init__.py +0 -74
- mnemo_dev-0.5.2/mnemo/config.py +0 -56
- mnemo_dev-0.5.2/mnemo/embeddings/dense.py +0 -86
- mnemo_dev-0.5.2/mnemo/hooks/__init__.py +0 -686
- mnemo_dev-0.5.2/mnemo/hooks/extractor.py +0 -31
- mnemo_dev-0.5.2/mnemo/sprint/__init__.py +0 -102
- mnemo_dev-0.5.2/mnemo/test_intel/__init__.py +0 -110
- mnemo_dev-0.5.2/mnemo/tools/observe.py +0 -44
- mnemo_dev-0.5.2/mnemo/ui_static/index.html +0 -207
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/LICENSE +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/analyzers/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/clients.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/commit_gen/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/commit_gen/mining.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/cache.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/db.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/memory_graph.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/engine/workers.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/memory/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/onboarding/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/persistence/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/persistence/export.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/persistence/snapshot.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/pr_gen/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/prompts/__init__.py +0 -0
- /mnemo_dev-0.5.2/mnemo/dead_code/__init__.py → /mnemo_dev-0.6.0/mnemo/quality/dead_code.py +0 -0
- /mnemo_dev-0.5.2/mnemo/drift/__init__.py → /mnemo_dev-0.6.0/mnemo/quality/drift.py +0 -0
- /mnemo_dev-0.5.2/mnemo/health/__init__.py → /mnemo_dev-0.6.0/mnemo/quality/health.py +0 -0
- /mnemo_dev-0.5.2/mnemo/regressions/__init__.py → /mnemo_dev-0.6.0/mnemo/quality/regressions.py +0 -0
- /mnemo_dev-0.5.2/mnemo/corrections/__init__.py → /mnemo_dev-0.6.0/mnemo/records/corrections.py +0 -0
- /mnemo_dev-0.5.2/mnemo/errors/__init__.py → /mnemo_dev-0.6.0/mnemo/records/errors.py +0 -0
- /mnemo_dev-0.5.2/mnemo/incidents/__init__.py → /mnemo_dev-0.6.0/mnemo/records/incidents.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/repo_map/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/repo_map/parsers.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/storage.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/team_graph/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/types.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/audit.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/circuit_breaker.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/dedup.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/logger.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/metrics.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/observations.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/privacy.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/stemmer.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/utils/synonyms.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo/velocity/__init__.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo_dev.egg-info/dependency_links.txt +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo_dev.egg-info/entry_points.txt +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo_dev.egg-info/requires.txt +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/mnemo_dev.egg-info/top_level.txt +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/setup.cfg +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_audit.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_circuit_breaker.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_clients.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_code_quality_tools.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_engine_db.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_enrichment.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_export.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_init.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_memory.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_metrics.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_plan_features.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_privacy.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_serve.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_slots.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_snapshot.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_stemmer.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_storage.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_synonyms.py +0 -0
- {mnemo_dev-0.5.2 → mnemo_dev-0.6.0}/tests/test_tool_routing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mnemo-dev
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Persistent memory and repo map for AI coding assistants
|
|
5
5
|
Author: Mnemo Contributors
|
|
6
6
|
License: AGPL-3.0
|
|
@@ -59,18 +59,18 @@ Dynamic: license-file
|
|
|
59
59
|
<p align="center">
|
|
60
60
|
<a href="https://pypi.org/project/mnemo-dev/"><img src="https://img.shields.io/pypi/v/mnemo-dev?style=flat-square&color=blue" alt="PyPI" /></a>
|
|
61
61
|
<a href="https://www.npmjs.com/package/@mnemo-dev/mcp"><img src="https://img.shields.io/npm/v/@mnemo-dev/mcp?style=flat-square&color=red" alt="npm" /></a>
|
|
62
|
-
<a href="#"><img src="https://img.shields.io/badge/tests-
|
|
62
|
+
<a href="#"><img src="https://img.shields.io/badge/tests-641%20passing-brightgreen?style=flat-square" alt="Tests" /></a>
|
|
63
63
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-AGPL--3.0-purple?style=flat-square" alt="License" /></a>
|
|
64
64
|
<a href="https://pypi.org/project/mnemo-dev/"><img src="https://img.shields.io/pypi/pyversions/mnemo-dev?style=flat-square" alt="Python" /></a>
|
|
65
65
|
<a href="https://marketplace.visualstudio.com/items?itemName=Nikhil1057.mnemo-vscode"><img src="https://img.shields.io/badge/VS%20Code-extension-007ACC?style=flat-square&logo=visualstudiocode" alt="VS Code" /></a>
|
|
66
66
|
</p>
|
|
67
67
|
|
|
68
68
|
<p align="center">
|
|
69
|
-
<code>[100% R@5]</code> <code>[2ms search]</code> <code>[58 tools]</code> <code>[
|
|
69
|
+
<code>[100% R@5]</code> <code>[2ms search]</code> <code>[58 tools]</code> <code>[17 agent-facing]</code> <code>[11 lifecycle hooks]</code> <code>[0 external DBs]</code> <code>[641 tests]</code>
|
|
70
70
|
</p>
|
|
71
71
|
|
|
72
72
|
<p align="center">
|
|
73
|
-
<a href="#install">Install</a> • <a href="#why-mnemo">Why</a> • <a href="#benchmarks">Benchmarks</a> • <a href="#how-it-works">How It Works</a> • <a href="#supported-clients">Clients</a> • <a href="#features">Features</a> • <a href="#mcp-tools-
|
|
73
|
+
<a href="#install">Install</a> • <a href="#why-mnemo">Why</a> • <a href="#benchmarks">Benchmarks</a> • <a href="#how-it-works">How It Works</a> • <a href="#supported-clients">Clients</a> • <a href="#features">Features</a> • <a href="#mcp-tools-17-agent-facing">Tools</a> • <a href="#dashboard-ui">Dashboard</a> • <a href="#architecture">Architecture</a>
|
|
74
74
|
</p>
|
|
75
75
|
|
|
76
76
|
---
|
|
@@ -89,7 +89,7 @@ Session 2: you ask the agent to add a new endpoint. It already knows your servic
|
|
|
89
89
|
```bash
|
|
90
90
|
pip install mnemo-dev # or: brew tap Mnemo-mcp/tap && brew install mnemo
|
|
91
91
|
cd your-project
|
|
92
|
-
mnemo init
|
|
92
|
+
mnemo init --client kiro # or: amazonq, cursor, claude-code, copilot, generic
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
---
|
|
@@ -141,8 +141,7 @@ Then initialize:
|
|
|
141
141
|
|
|
142
142
|
```bash
|
|
143
143
|
cd your-project
|
|
144
|
-
mnemo init
|
|
145
|
-
mnemo init --client kiro # or: cursor, claude-code, copilot, generic
|
|
144
|
+
mnemo init --client kiro # or: amazonq, cursor, claude-code, copilot, generic
|
|
146
145
|
```
|
|
147
146
|
|
|
148
147
|
**That's it.** Your agent now has persistent memory, semantic search, and architectural understanding.
|
|
@@ -267,13 +266,13 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
267
266
|
## How It Works
|
|
268
267
|
|
|
269
268
|
```
|
|
270
|
-
┌─── INIT (one-time, ~7s for 300 files)
|
|
269
|
+
┌─── INIT (one-time, ~7s for 300 files) ───────────────────────────┐
|
|
271
270
|
│ │
|
|
272
271
|
│ 1. Scan: single os.walk pass across repo │
|
|
273
272
|
│ 2. Parse: tree-sitter AST (14 langs) + Roslyn (C#) │
|
|
274
273
|
│ 3. Graph: LadybugDB — files, classes, methods, CALLS edges │
|
|
275
274
|
│ 4. Scope: cross-file function call resolution │
|
|
276
|
-
│ 5. Cluster:
|
|
275
|
+
│ 5. Cluster: Louvain community detection │
|
|
277
276
|
│ 6. Index: ONNX vector embeddings for semantic search │
|
|
278
277
|
│ 7. Detect: languages, services, key classes, frameworks │
|
|
279
278
|
│ 8. Configure: MCP server + hooks for your AI client │
|
|
@@ -281,10 +280,10 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
281
280
|
└──────────────────────────────────────────────────────────────────┘
|
|
282
281
|
│
|
|
283
282
|
▼
|
|
284
|
-
┌─── SESSION START (automatic via hooks)
|
|
283
|
+
┌─── SESSION START (automatic via hooks) ──────────────────────────┐
|
|
285
284
|
│ │
|
|
286
285
|
│ mnemo_recall injects into agent context: │
|
|
287
|
-
│ • Architectural decisions (permanent, never evicted)
|
|
286
|
+
│ • Architectural decisions (permanent, never evicted) │
|
|
288
287
|
│ • Hot memories (scored by access × recency × importance) │
|
|
289
288
|
│ • Active plan + next task │
|
|
290
289
|
│ • Compact repo index (classes per service) │
|
|
@@ -297,7 +296,7 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
297
296
|
▼
|
|
298
297
|
┌─── DURING SESSION (tools + freshness) ──────────────────────────┐
|
|
299
298
|
│ │
|
|
300
|
-
│ Agent has
|
|
299
|
+
│ Agent has 17 MCP tools available: │
|
|
301
300
|
│ • mnemo_lookup → full service/class architecture │
|
|
302
301
|
│ • mnemo_search → semantic search (code, memory, APIs) │
|
|
303
302
|
│ • mnemo_impact → blast radius if X changes │
|
|
@@ -310,7 +309,7 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
310
309
|
└──────────────────────────────────────────────────────────────────┘
|
|
311
310
|
│
|
|
312
311
|
▼
|
|
313
|
-
┌─── SESSION END (auto-capture via stop hook)
|
|
312
|
+
┌─── SESSION END (auto-capture via stop hook) ─────────────────────┐
|
|
314
313
|
│ │
|
|
315
314
|
│ • Detects learnings (bug fixes, discoveries) │
|
|
316
315
|
│ • Records session decisions │
|
|
@@ -319,11 +318,11 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
319
318
|
└──────────────────────────────────────────────────────────────────┘
|
|
320
319
|
│
|
|
321
320
|
▼
|
|
322
|
-
┌─── BETWEEN SESSIONS (decay + maintenance)
|
|
321
|
+
┌─── BETWEEN SESSIONS (decay + maintenance) ───────────────────────┐
|
|
323
322
|
│ │
|
|
324
323
|
│ Every 10th recall: │
|
|
325
324
|
│ • Retention scored: salience × exp(-0.01 × days) + access │
|
|
326
|
-
│ • Hot (≥0.5) → Warm (≥0.25) → Cold → Evicted
|
|
325
|
+
│ • Hot (≥0.5) → Warm (≥0.25) → Cold → Evicted │
|
|
327
326
|
│ • Contradictions auto-superseded (sim > 0.9) │
|
|
328
327
|
│ • Low-value pruning (cap: 200 active memories) │
|
|
329
328
|
│ • Graph synced (stale memory nodes removed) │
|
|
@@ -331,7 +330,6 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
331
330
|
│ Pinned forever: architecture, decision, preference │
|
|
332
331
|
│ │
|
|
333
332
|
└──────────────────────────────────────────────────────────────────┘
|
|
334
|
-
└─────────────────────────────────────────────────────────────┘
|
|
335
333
|
```
|
|
336
334
|
|
|
337
335
|
---
|
|
@@ -340,6 +338,8 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
340
338
|
|
|
341
339
|
### 🧠 Memory System
|
|
342
340
|
- **Categorized storage**: architecture, pattern, bug, preference, decision, todo
|
|
341
|
+
- **Event-sourced decisions**: JSONL append-only event log, computed snapshots, supersede/redact operations
|
|
342
|
+
- **Branch-scoped decisions**: decisions tagged per branch, filtered on recall
|
|
343
343
|
- **Retention scoring**: access frequency × recency × importance (Ebbinghaus-inspired decay)
|
|
344
344
|
- **Branch-aware**: memories tagged with git branch, filtered on recall
|
|
345
345
|
- **Contradiction detection**: new facts auto-supersede old conflicting ones (threshold: 0.6)
|
|
@@ -360,7 +360,7 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
360
360
|
- **Knowledge graph**: files, folders, classes, methods, functions, projects, communities
|
|
361
361
|
- **14 languages**: Python, JS/TS, C#, Go, Java, Rust, Ruby, PHP, C/C++, Kotlin, Swift, Scala
|
|
362
362
|
- **Roslyn enrichment**: C# method signatures, implements, full AST detail
|
|
363
|
-
- **
|
|
363
|
+
- **Louvain community detection**: automatic functional clustering
|
|
364
364
|
- **CALLS edges**: scope-resolved function call graph with confidence scoring
|
|
365
365
|
- **Impact analysis**: upstream/downstream blast radius (N-hop BFS)
|
|
366
366
|
- **Incremental freshness**: graph + vector index auto-update within 30s of file changes
|
|
@@ -394,9 +394,45 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
394
394
|
|
|
395
395
|
---
|
|
396
396
|
|
|
397
|
-
##
|
|
397
|
+
## Workflow Skills & Orchestrator
|
|
398
398
|
|
|
399
|
-
Mnemo
|
|
399
|
+
Mnemo includes **6 workflow skills** that guide agents through a structured SDLC pipeline, with **quality gates** enforcing standards between phases.
|
|
400
|
+
|
|
401
|
+
### The Pipeline
|
|
402
|
+
|
|
403
|
+
```
|
|
404
|
+
investigate → plan → implement → verify → review → ship
|
|
405
|
+
↑ ↑
|
|
406
|
+
[tests_pass] [tests_pass + plan_done + no_findings]
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Each phase has a dedicated skill template with explicit instructions, shell commands for mnemo tools, and persistence hooks. The orchestrator tracks state in `.mnemo/autorun_state.json` and blocks advancement when gates fail.
|
|
410
|
+
|
|
411
|
+
### Quality Gates
|
|
412
|
+
|
|
413
|
+
| Gate | What it checks | Blocks |
|
|
414
|
+
|------|---------------|--------|
|
|
415
|
+
| `tests_pass` | Runs test suite (pytest/npm/maven/gradle) | review, ship |
|
|
416
|
+
| `plan_done` | All plan tasks marked complete | ship |
|
|
417
|
+
| `no_findings` | No unresolved critical findings in memory | ship |
|
|
418
|
+
|
|
419
|
+
### Template Resolver System
|
|
420
|
+
|
|
421
|
+
Skills use `{{RESOLVER}}` placeholders that get expanded per-host:
|
|
422
|
+
|
|
423
|
+
| Resolver | Injects |
|
|
424
|
+
|----------|---------|
|
|
425
|
+
| `{{PREAMBLE}}` | Mandatory header — forces tool usage, DO NOT PROCEED pattern |
|
|
426
|
+
| `{{LEARNINGS}}` | Past learnings relevant to current skill |
|
|
427
|
+
| `{{CONTEXT_LOAD}}` | Shell command to load brain context at skill start |
|
|
428
|
+
| `{{TOOL_REFERENCE}}` | Available mnemo commands table |
|
|
429
|
+
| `{{PERSIST_BLOCK}}` | Shell commands for persisting knowledge at skill end |
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## MCP Tools (58 total: 17 agent-facing + 42 specialized)
|
|
434
|
+
|
|
435
|
+
Mnemo exposes **17 consolidated agent-facing tools** via MCP — designed to cover every workflow in minimal tool calls. Under the hood, these route to **42 specialized internal tools** for granular operations.
|
|
400
436
|
|
|
401
437
|
### Agent-Facing Tools (what the AI calls)
|
|
402
438
|
|
|
@@ -405,6 +441,8 @@ Mnemo exposes **16 consolidated agent-facing tools** via MCP — designed to cov
|
|
|
405
441
|
| `mnemo_recall` | Load full project context at session start (budgeted ~2000 tokens) |
|
|
406
442
|
| `mnemo_remember` | Store important context with auto-categorization & dedup |
|
|
407
443
|
| `mnemo_decide` | Record permanent architectural decisions (never evicted) |
|
|
444
|
+
| `mnemo_supersede` | Supersede (replace) an existing decision by ID |
|
|
445
|
+
| `mnemo_redact` | Permanently redact a decision (e.g., accidental secrets) |
|
|
408
446
|
| `mnemo_forget` | Delete a specific memory by ID |
|
|
409
447
|
| `mnemo_search_memory` | Semantic search across memories (3-way RRF fusion) |
|
|
410
448
|
| `mnemo_lookup` | 360° detail: class methods, function signatures, or full service architecture |
|
|
@@ -569,23 +607,26 @@ mnemo serve # http://localhost:3333
|
|
|
569
607
|
|
|
570
608
|
```
|
|
571
609
|
.mnemo/
|
|
572
|
-
├── memory.json
|
|
573
|
-
├── decisions.json
|
|
574
|
-
├──
|
|
575
|
-
├──
|
|
576
|
-
├──
|
|
577
|
-
├──
|
|
578
|
-
├──
|
|
579
|
-
├──
|
|
580
|
-
├──
|
|
581
|
-
├──
|
|
582
|
-
├──
|
|
583
|
-
├──
|
|
584
|
-
├──
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
610
|
+
├── memory.json Memories with retention scores & access history
|
|
611
|
+
├── decisions.json Permanent architectural decisions (computed snapshot)
|
|
612
|
+
├── decisions.events.jsonl Event-sourced decision log (source of truth)
|
|
613
|
+
├── plans.json Task tracking with dependencies
|
|
614
|
+
├── context.json Auto-detected project metadata
|
|
615
|
+
├── learnings.json Typed learnings with confidence & key-dedup
|
|
616
|
+
├── autorun_state.json SDLC orchestrator phase tracking
|
|
617
|
+
├── graph.lbug/ LadybugDB knowledge graph (Kuzu engine)
|
|
618
|
+
├── vectors_code.npy ONNX embeddings of code symbols (384-dim)
|
|
619
|
+
├── vectors_memory.npy ONNX embeddings of memories
|
|
620
|
+
├── meta_*.json Vector metadata for cosine search
|
|
621
|
+
├── engine-meta.json File hashes for incremental detection
|
|
622
|
+
├── parse-cache.json AST parse cache (skip unchanged files)
|
|
623
|
+
├── tree.md Compact repo index (generated from graph)
|
|
624
|
+
├── corrections.json Wrong→right patterns with confidence
|
|
625
|
+
├── lessons.json Learned patterns with reinforcement
|
|
626
|
+
└── slots.json Pinned structured context (conventions, gotchas)
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
**Stack**: Python · LadybugDB (Kuzu) · ONNX Runtime · tree-sitter · Roslyn · NetworkX (Louvain)
|
|
589
630
|
|
|
590
631
|
**Zero cloud. Zero API keys. Zero telemetry. Everything runs locally.**
|
|
591
632
|
|
|
@@ -617,7 +658,7 @@ Pinned categories (never evicted): architecture, decision, preference
|
|
|
617
658
|
## CLI Reference
|
|
618
659
|
|
|
619
660
|
```bash
|
|
620
|
-
mnemo init
|
|
661
|
+
mnemo init --client CLIENT # Initialize in a repo (kiro, cursor, claude-code, amazonq, copilot, generic)
|
|
621
662
|
mnemo recall [--tier TIER] # Show agent context (compact, standard, deep)
|
|
622
663
|
mnemo map # Regenerate repo map from graph
|
|
623
664
|
mnemo serve [-p PORT] # Dashboard UI (default: 3333)
|
|
@@ -625,9 +666,33 @@ mnemo doctor # Diagnose installation issues
|
|
|
625
666
|
mnemo reset # Remove Mnemo data (safe: only Mnemo-owned files)
|
|
626
667
|
mnemo link [TARGET] # Link another repo to multi-repo workspace
|
|
627
668
|
mnemo remember "content" [-c CAT]# Store a memory
|
|
669
|
+
mnemo learn -t TYPE -k KEY -i TXT# Store a typed learning (7 types, key-dedup)
|
|
670
|
+
mnemo learnings [-t TYPE] # List stored learnings (sorted by confidence)
|
|
671
|
+
mnemo ingest [--file FILE] # ETL: extract learnings from session transcripts
|
|
628
672
|
mnemo tool NAME [--args] # Call any MCP tool from CLI
|
|
629
673
|
```
|
|
630
674
|
|
|
675
|
+
### Customizing What Gets Indexed
|
|
676
|
+
|
|
677
|
+
Mnemo skips a built-in set of heavy/non-source directories during indexing
|
|
678
|
+
(`node_modules`, `.venv`, `dist`, `build`, etc. — see `mnemo/config.py` for
|
|
679
|
+
the full list).
|
|
680
|
+
|
|
681
|
+
To skip additional directories in a specific repo, drop a `.mnemoignore`
|
|
682
|
+
file at the repo root with one directory name per line:
|
|
683
|
+
|
|
684
|
+
```
|
|
685
|
+
# Heavy dirs to exclude from indexing
|
|
686
|
+
data
|
|
687
|
+
logs
|
|
688
|
+
backups
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
Lines are matched by exact directory basename, anywhere in the tree (same
|
|
692
|
+
semantics as the built-in list). Blank lines and `#` comments are ignored.
|
|
693
|
+
Trailing slashes are tolerated. Glob / `.gitignore` semantics are not
|
|
694
|
+
supported yet — patterns are basenames only.
|
|
695
|
+
|
|
631
696
|
---
|
|
632
697
|
|
|
633
698
|
## Contributing
|
|
@@ -636,7 +701,7 @@ mnemo tool NAME [--args] # Call any MCP tool from CLI
|
|
|
636
701
|
git clone https://github.com/Mnemo-mcp/Mnemo.git
|
|
637
702
|
cd Mnemo
|
|
638
703
|
pip install -e ".[dev]"
|
|
639
|
-
pytest #
|
|
704
|
+
pytest # 641 tests
|
|
640
705
|
ruff check . # Lint
|
|
641
706
|
mnemo init # Test on self
|
|
642
707
|
```
|
|
@@ -7,18 +7,18 @@
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://pypi.org/project/mnemo-dev/"><img src="https://img.shields.io/pypi/v/mnemo-dev?style=flat-square&color=blue" alt="PyPI" /></a>
|
|
9
9
|
<a href="https://www.npmjs.com/package/@mnemo-dev/mcp"><img src="https://img.shields.io/npm/v/@mnemo-dev/mcp?style=flat-square&color=red" alt="npm" /></a>
|
|
10
|
-
<a href="#"><img src="https://img.shields.io/badge/tests-
|
|
10
|
+
<a href="#"><img src="https://img.shields.io/badge/tests-641%20passing-brightgreen?style=flat-square" alt="Tests" /></a>
|
|
11
11
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-AGPL--3.0-purple?style=flat-square" alt="License" /></a>
|
|
12
12
|
<a href="https://pypi.org/project/mnemo-dev/"><img src="https://img.shields.io/pypi/pyversions/mnemo-dev?style=flat-square" alt="Python" /></a>
|
|
13
13
|
<a href="https://marketplace.visualstudio.com/items?itemName=Nikhil1057.mnemo-vscode"><img src="https://img.shields.io/badge/VS%20Code-extension-007ACC?style=flat-square&logo=visualstudiocode" alt="VS Code" /></a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
17
|
-
<code>[100% R@5]</code> <code>[2ms search]</code> <code>[58 tools]</code> <code>[
|
|
17
|
+
<code>[100% R@5]</code> <code>[2ms search]</code> <code>[58 tools]</code> <code>[17 agent-facing]</code> <code>[11 lifecycle hooks]</code> <code>[0 external DBs]</code> <code>[641 tests]</code>
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
20
|
<p align="center">
|
|
21
|
-
<a href="#install">Install</a> • <a href="#why-mnemo">Why</a> • <a href="#benchmarks">Benchmarks</a> • <a href="#how-it-works">How It Works</a> • <a href="#supported-clients">Clients</a> • <a href="#features">Features</a> • <a href="#mcp-tools-
|
|
21
|
+
<a href="#install">Install</a> • <a href="#why-mnemo">Why</a> • <a href="#benchmarks">Benchmarks</a> • <a href="#how-it-works">How It Works</a> • <a href="#supported-clients">Clients</a> • <a href="#features">Features</a> • <a href="#mcp-tools-17-agent-facing">Tools</a> • <a href="#dashboard-ui">Dashboard</a> • <a href="#architecture">Architecture</a>
|
|
22
22
|
</p>
|
|
23
23
|
|
|
24
24
|
---
|
|
@@ -37,7 +37,7 @@ Session 2: you ask the agent to add a new endpoint. It already knows your servic
|
|
|
37
37
|
```bash
|
|
38
38
|
pip install mnemo-dev # or: brew tap Mnemo-mcp/tap && brew install mnemo
|
|
39
39
|
cd your-project
|
|
40
|
-
mnemo init
|
|
40
|
+
mnemo init --client kiro # or: amazonq, cursor, claude-code, copilot, generic
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
---
|
|
@@ -89,8 +89,7 @@ Then initialize:
|
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
91
|
cd your-project
|
|
92
|
-
mnemo init
|
|
93
|
-
mnemo init --client kiro # or: cursor, claude-code, copilot, generic
|
|
92
|
+
mnemo init --client kiro # or: amazonq, cursor, claude-code, copilot, generic
|
|
94
93
|
```
|
|
95
94
|
|
|
96
95
|
**That's it.** Your agent now has persistent memory, semantic search, and architectural understanding.
|
|
@@ -215,13 +214,13 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
215
214
|
## How It Works
|
|
216
215
|
|
|
217
216
|
```
|
|
218
|
-
┌─── INIT (one-time, ~7s for 300 files)
|
|
217
|
+
┌─── INIT (one-time, ~7s for 300 files) ───────────────────────────┐
|
|
219
218
|
│ │
|
|
220
219
|
│ 1. Scan: single os.walk pass across repo │
|
|
221
220
|
│ 2. Parse: tree-sitter AST (14 langs) + Roslyn (C#) │
|
|
222
221
|
│ 3. Graph: LadybugDB — files, classes, methods, CALLS edges │
|
|
223
222
|
│ 4. Scope: cross-file function call resolution │
|
|
224
|
-
│ 5. Cluster:
|
|
223
|
+
│ 5. Cluster: Louvain community detection │
|
|
225
224
|
│ 6. Index: ONNX vector embeddings for semantic search │
|
|
226
225
|
│ 7. Detect: languages, services, key classes, frameworks │
|
|
227
226
|
│ 8. Configure: MCP server + hooks for your AI client │
|
|
@@ -229,10 +228,10 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
229
228
|
└──────────────────────────────────────────────────────────────────┘
|
|
230
229
|
│
|
|
231
230
|
▼
|
|
232
|
-
┌─── SESSION START (automatic via hooks)
|
|
231
|
+
┌─── SESSION START (automatic via hooks) ──────────────────────────┐
|
|
233
232
|
│ │
|
|
234
233
|
│ mnemo_recall injects into agent context: │
|
|
235
|
-
│ • Architectural decisions (permanent, never evicted)
|
|
234
|
+
│ • Architectural decisions (permanent, never evicted) │
|
|
236
235
|
│ • Hot memories (scored by access × recency × importance) │
|
|
237
236
|
│ • Active plan + next task │
|
|
238
237
|
│ • Compact repo index (classes per service) │
|
|
@@ -245,7 +244,7 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
245
244
|
▼
|
|
246
245
|
┌─── DURING SESSION (tools + freshness) ──────────────────────────┐
|
|
247
246
|
│ │
|
|
248
|
-
│ Agent has
|
|
247
|
+
│ Agent has 17 MCP tools available: │
|
|
249
248
|
│ • mnemo_lookup → full service/class architecture │
|
|
250
249
|
│ • mnemo_search → semantic search (code, memory, APIs) │
|
|
251
250
|
│ • mnemo_impact → blast radius if X changes │
|
|
@@ -258,7 +257,7 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
258
257
|
└──────────────────────────────────────────────────────────────────┘
|
|
259
258
|
│
|
|
260
259
|
▼
|
|
261
|
-
┌─── SESSION END (auto-capture via stop hook)
|
|
260
|
+
┌─── SESSION END (auto-capture via stop hook) ─────────────────────┐
|
|
262
261
|
│ │
|
|
263
262
|
│ • Detects learnings (bug fixes, discoveries) │
|
|
264
263
|
│ • Records session decisions │
|
|
@@ -267,11 +266,11 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
267
266
|
└──────────────────────────────────────────────────────────────────┘
|
|
268
267
|
│
|
|
269
268
|
▼
|
|
270
|
-
┌─── BETWEEN SESSIONS (decay + maintenance)
|
|
269
|
+
┌─── BETWEEN SESSIONS (decay + maintenance) ───────────────────────┐
|
|
271
270
|
│ │
|
|
272
271
|
│ Every 10th recall: │
|
|
273
272
|
│ • Retention scored: salience × exp(-0.01 × days) + access │
|
|
274
|
-
│ • Hot (≥0.5) → Warm (≥0.25) → Cold → Evicted
|
|
273
|
+
│ • Hot (≥0.5) → Warm (≥0.25) → Cold → Evicted │
|
|
275
274
|
│ • Contradictions auto-superseded (sim > 0.9) │
|
|
276
275
|
│ • Low-value pruning (cap: 200 active memories) │
|
|
277
276
|
│ • Graph synced (stale memory nodes removed) │
|
|
@@ -279,7 +278,6 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
279
278
|
│ Pinned forever: architecture, decision, preference │
|
|
280
279
|
│ │
|
|
281
280
|
└──────────────────────────────────────────────────────────────────┘
|
|
282
|
-
└─────────────────────────────────────────────────────────────┘
|
|
283
281
|
```
|
|
284
282
|
|
|
285
283
|
---
|
|
@@ -288,6 +286,8 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
288
286
|
|
|
289
287
|
### 🧠 Memory System
|
|
290
288
|
- **Categorized storage**: architecture, pattern, bug, preference, decision, todo
|
|
289
|
+
- **Event-sourced decisions**: JSONL append-only event log, computed snapshots, supersede/redact operations
|
|
290
|
+
- **Branch-scoped decisions**: decisions tagged per branch, filtered on recall
|
|
291
291
|
- **Retention scoring**: access frequency × recency × importance (Ebbinghaus-inspired decay)
|
|
292
292
|
- **Branch-aware**: memories tagged with git branch, filtered on recall
|
|
293
293
|
- **Contradiction detection**: new facts auto-supersede old conflicting ones (threshold: 0.6)
|
|
@@ -308,7 +308,7 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
308
308
|
- **Knowledge graph**: files, folders, classes, methods, functions, projects, communities
|
|
309
309
|
- **14 languages**: Python, JS/TS, C#, Go, Java, Rust, Ruby, PHP, C/C++, Kotlin, Swift, Scala
|
|
310
310
|
- **Roslyn enrichment**: C# method signatures, implements, full AST detail
|
|
311
|
-
- **
|
|
311
|
+
- **Louvain community detection**: automatic functional clustering
|
|
312
312
|
- **CALLS edges**: scope-resolved function call graph with confidence scoring
|
|
313
313
|
- **Impact analysis**: upstream/downstream blast radius (N-hop BFS)
|
|
314
314
|
- **Incremental freshness**: graph + vector index auto-update within 30s of file changes
|
|
@@ -342,9 +342,45 @@ Works with **any** agent that speaks MCP. One server, one memory, shared across
|
|
|
342
342
|
|
|
343
343
|
---
|
|
344
344
|
|
|
345
|
-
##
|
|
345
|
+
## Workflow Skills & Orchestrator
|
|
346
346
|
|
|
347
|
-
Mnemo
|
|
347
|
+
Mnemo includes **6 workflow skills** that guide agents through a structured SDLC pipeline, with **quality gates** enforcing standards between phases.
|
|
348
|
+
|
|
349
|
+
### The Pipeline
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
investigate → plan → implement → verify → review → ship
|
|
353
|
+
↑ ↑
|
|
354
|
+
[tests_pass] [tests_pass + plan_done + no_findings]
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Each phase has a dedicated skill template with explicit instructions, shell commands for mnemo tools, and persistence hooks. The orchestrator tracks state in `.mnemo/autorun_state.json` and blocks advancement when gates fail.
|
|
358
|
+
|
|
359
|
+
### Quality Gates
|
|
360
|
+
|
|
361
|
+
| Gate | What it checks | Blocks |
|
|
362
|
+
|------|---------------|--------|
|
|
363
|
+
| `tests_pass` | Runs test suite (pytest/npm/maven/gradle) | review, ship |
|
|
364
|
+
| `plan_done` | All plan tasks marked complete | ship |
|
|
365
|
+
| `no_findings` | No unresolved critical findings in memory | ship |
|
|
366
|
+
|
|
367
|
+
### Template Resolver System
|
|
368
|
+
|
|
369
|
+
Skills use `{{RESOLVER}}` placeholders that get expanded per-host:
|
|
370
|
+
|
|
371
|
+
| Resolver | Injects |
|
|
372
|
+
|----------|---------|
|
|
373
|
+
| `{{PREAMBLE}}` | Mandatory header — forces tool usage, DO NOT PROCEED pattern |
|
|
374
|
+
| `{{LEARNINGS}}` | Past learnings relevant to current skill |
|
|
375
|
+
| `{{CONTEXT_LOAD}}` | Shell command to load brain context at skill start |
|
|
376
|
+
| `{{TOOL_REFERENCE}}` | Available mnemo commands table |
|
|
377
|
+
| `{{PERSIST_BLOCK}}` | Shell commands for persisting knowledge at skill end |
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## MCP Tools (58 total: 17 agent-facing + 42 specialized)
|
|
382
|
+
|
|
383
|
+
Mnemo exposes **17 consolidated agent-facing tools** via MCP — designed to cover every workflow in minimal tool calls. Under the hood, these route to **42 specialized internal tools** for granular operations.
|
|
348
384
|
|
|
349
385
|
### Agent-Facing Tools (what the AI calls)
|
|
350
386
|
|
|
@@ -353,6 +389,8 @@ Mnemo exposes **16 consolidated agent-facing tools** via MCP — designed to cov
|
|
|
353
389
|
| `mnemo_recall` | Load full project context at session start (budgeted ~2000 tokens) |
|
|
354
390
|
| `mnemo_remember` | Store important context with auto-categorization & dedup |
|
|
355
391
|
| `mnemo_decide` | Record permanent architectural decisions (never evicted) |
|
|
392
|
+
| `mnemo_supersede` | Supersede (replace) an existing decision by ID |
|
|
393
|
+
| `mnemo_redact` | Permanently redact a decision (e.g., accidental secrets) |
|
|
356
394
|
| `mnemo_forget` | Delete a specific memory by ID |
|
|
357
395
|
| `mnemo_search_memory` | Semantic search across memories (3-way RRF fusion) |
|
|
358
396
|
| `mnemo_lookup` | 360° detail: class methods, function signatures, or full service architecture |
|
|
@@ -517,23 +555,26 @@ mnemo serve # http://localhost:3333
|
|
|
517
555
|
|
|
518
556
|
```
|
|
519
557
|
.mnemo/
|
|
520
|
-
├── memory.json
|
|
521
|
-
├── decisions.json
|
|
522
|
-
├──
|
|
523
|
-
├──
|
|
524
|
-
├──
|
|
525
|
-
├──
|
|
526
|
-
├──
|
|
527
|
-
├──
|
|
528
|
-
├──
|
|
529
|
-
├──
|
|
530
|
-
├──
|
|
531
|
-
├──
|
|
532
|
-
├──
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
558
|
+
├── memory.json Memories with retention scores & access history
|
|
559
|
+
├── decisions.json Permanent architectural decisions (computed snapshot)
|
|
560
|
+
├── decisions.events.jsonl Event-sourced decision log (source of truth)
|
|
561
|
+
├── plans.json Task tracking with dependencies
|
|
562
|
+
├── context.json Auto-detected project metadata
|
|
563
|
+
├── learnings.json Typed learnings with confidence & key-dedup
|
|
564
|
+
├── autorun_state.json SDLC orchestrator phase tracking
|
|
565
|
+
├── graph.lbug/ LadybugDB knowledge graph (Kuzu engine)
|
|
566
|
+
├── vectors_code.npy ONNX embeddings of code symbols (384-dim)
|
|
567
|
+
├── vectors_memory.npy ONNX embeddings of memories
|
|
568
|
+
├── meta_*.json Vector metadata for cosine search
|
|
569
|
+
├── engine-meta.json File hashes for incremental detection
|
|
570
|
+
├── parse-cache.json AST parse cache (skip unchanged files)
|
|
571
|
+
├── tree.md Compact repo index (generated from graph)
|
|
572
|
+
├── corrections.json Wrong→right patterns with confidence
|
|
573
|
+
├── lessons.json Learned patterns with reinforcement
|
|
574
|
+
└── slots.json Pinned structured context (conventions, gotchas)
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
**Stack**: Python · LadybugDB (Kuzu) · ONNX Runtime · tree-sitter · Roslyn · NetworkX (Louvain)
|
|
537
578
|
|
|
538
579
|
**Zero cloud. Zero API keys. Zero telemetry. Everything runs locally.**
|
|
539
580
|
|
|
@@ -565,7 +606,7 @@ Pinned categories (never evicted): architecture, decision, preference
|
|
|
565
606
|
## CLI Reference
|
|
566
607
|
|
|
567
608
|
```bash
|
|
568
|
-
mnemo init
|
|
609
|
+
mnemo init --client CLIENT # Initialize in a repo (kiro, cursor, claude-code, amazonq, copilot, generic)
|
|
569
610
|
mnemo recall [--tier TIER] # Show agent context (compact, standard, deep)
|
|
570
611
|
mnemo map # Regenerate repo map from graph
|
|
571
612
|
mnemo serve [-p PORT] # Dashboard UI (default: 3333)
|
|
@@ -573,9 +614,33 @@ mnemo doctor # Diagnose installation issues
|
|
|
573
614
|
mnemo reset # Remove Mnemo data (safe: only Mnemo-owned files)
|
|
574
615
|
mnemo link [TARGET] # Link another repo to multi-repo workspace
|
|
575
616
|
mnemo remember "content" [-c CAT]# Store a memory
|
|
617
|
+
mnemo learn -t TYPE -k KEY -i TXT# Store a typed learning (7 types, key-dedup)
|
|
618
|
+
mnemo learnings [-t TYPE] # List stored learnings (sorted by confidence)
|
|
619
|
+
mnemo ingest [--file FILE] # ETL: extract learnings from session transcripts
|
|
576
620
|
mnemo tool NAME [--args] # Call any MCP tool from CLI
|
|
577
621
|
```
|
|
578
622
|
|
|
623
|
+
### Customizing What Gets Indexed
|
|
624
|
+
|
|
625
|
+
Mnemo skips a built-in set of heavy/non-source directories during indexing
|
|
626
|
+
(`node_modules`, `.venv`, `dist`, `build`, etc. — see `mnemo/config.py` for
|
|
627
|
+
the full list).
|
|
628
|
+
|
|
629
|
+
To skip additional directories in a specific repo, drop a `.mnemoignore`
|
|
630
|
+
file at the repo root with one directory name per line:
|
|
631
|
+
|
|
632
|
+
```
|
|
633
|
+
# Heavy dirs to exclude from indexing
|
|
634
|
+
data
|
|
635
|
+
logs
|
|
636
|
+
backups
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
Lines are matched by exact directory basename, anywhere in the tree (same
|
|
640
|
+
semantics as the built-in list). Blank lines and `#` comments are ignored.
|
|
641
|
+
Trailing slashes are tolerated. Glob / `.gitignore` semantics are not
|
|
642
|
+
supported yet — patterns are basenames only.
|
|
643
|
+
|
|
579
644
|
---
|
|
580
645
|
|
|
581
646
|
## Contributing
|
|
@@ -584,7 +649,7 @@ mnemo tool NAME [--args] # Call any MCP tool from CLI
|
|
|
584
649
|
git clone https://github.com/Mnemo-mcp/Mnemo.git
|
|
585
650
|
cd Mnemo
|
|
586
651
|
pip install -e ".[dev]"
|
|
587
|
-
pytest #
|
|
652
|
+
pytest # 641 tests
|
|
588
653
|
ruff check . # Lint
|
|
589
654
|
mnemo init # Test on self
|
|
590
655
|
```
|
|
@@ -131,3 +131,13 @@ def discover_apis(repo_root: Path) -> str:
|
|
|
131
131
|
if len(lines) <= 2:
|
|
132
132
|
return "No APIs discovered."
|
|
133
133
|
return "\n".join(lines)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def search_api(repo_root: Path, query: str) -> str:
|
|
137
|
+
"""Search discovered APIs by query."""
|
|
138
|
+
full = discover_apis(repo_root)
|
|
139
|
+
if "No APIs" in full:
|
|
140
|
+
return f"No APIs matching '{query}'."
|
|
141
|
+
query_lower = query.lower()
|
|
142
|
+
lines = [ln for ln in full.split("\n") if query_lower in ln.lower() or ln.startswith("#")]
|
|
143
|
+
return "\n".join(lines) if any(not ln.startswith("#") for ln in lines) else f"No APIs matching '{query}'."
|