github Python analyzed b4d16ca

jagoff/memo

v4.16.0
github

Your coding agent starts every session with amnesia — memo fixes that, 100% on your machine. Persistent memory for Claude Code, Codex, Cursor & any MCP client: Markdown source of truth, hybrid search (MLX/CPU + sqlite-vec), time-machine, contradiction radar, nightly self-optimization. No cloud, no keys.

maintainer
jagoff
licence
MIT
first seen
2026-06-07
last seen
2026-09-05
releases · 30d
30
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio · streamable-http · http verified reported listed in the official MCP registry counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit b4d16ca · analyzer v33 · 6h ago

skills & prompt files 5

danger signals3

code evidence v4.16.0 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 1285

filesystem 400

  • fs jagoff-memo-b4d16ca/packaging/mcpb/server/main.py :9 import shutil
  • fs (weak) jagoff-memo-b4d16ca/scripts/audit-data-integrity.py :23 from pathlib import Path
  • fs (weak) jagoff-memo-b4d16ca/scripts/check_mutation_results.py :9 from pathlib import Path
  • fs (weak) jagoff-memo-b4d16ca/scripts/eval_emission_ledger.py :39 from pathlib import Path
  • fs (weak) jagoff-memo-b4d16ca/scripts/migrate-from-mem-vault.py :54 from pathlib import Path
  • fs (weak) jagoff-memo-b4d16ca/scripts/migrate_synapse_chat_state.py :7 from pathlib import Path
  • fs (weak) jagoff-memo-b4d16ca/scripts/quality_gate.py :9 import shutil
  • fs (weak) jagoff-memo-b4d16ca/scripts/recall_eval.py :16 from pathlib import Path
  • fs (weak) jagoff-memo-b4d16ca/scripts/telemetry_report.py :38 import pathlib
  • fs (weak) jagoff-memo-b4d16ca/scripts/wave1_token_baseline.py :32 from pathlib import Path
  • fs (weak) jagoff-memo-b4d16ca/scripts/wave2_token_baseline.py :25 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/__init__.py :26 from pathlib import Path
show 28 more
  • fs jagoff-memo-b4d16ca/src/memo/adapter_matrix.py :33 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/agent_event_bus.py :23 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/analytics.py :17 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/artifact_store.py :14 import shutil
  • fs jagoff-memo-b4d16ca/src/memo/ask_gaps.py :27 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/atomic_io.py :12 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/audio_transcribe.py :17 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/belief.py :73 "belief: support lookup failed for %s; holding open (fail-closed): %s",
  • fs jagoff-memo-b4d16ca/src/memo/briefing.py :7 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cache_backend.py :13 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/capture_core.py :23 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/capture_hooks.py :23 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/capture_weights.py :28 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/chat/config.py :7 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/chat/feedback.py :9 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/chat/http.py :8 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/chat/sessions.py :11 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/claim_support.py :16 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_analytics.py :104 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_backup.py :45 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_banner.py :17 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_briefing.py :101 from pathlib import Path as _Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_capture.py :12 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_chat.py :18 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_chat_session.py :10 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_chronicle.py :5 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_code_facts.py :21 from pathlib import Path
  • fs jagoff-memo-b4d16ca/src/memo/cli_compress_context.py :19 from pathlib import Path

360 more not shown — this panel samples each group; the count above is the real total.

shell / exec 98

  • shell (weak) jagoff-memo-b4d16ca/scripts/quality_gate.py :10 import subprocess
  • shell (weak) jagoff-memo-b4d16ca/scripts/telemetry_report.py :40 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/claim_support.py :14 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_code_intel.py :22 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_dashboard.py :169 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_doctor.py :39 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_dream_report.py :736 import subprocess as _sp
  • shell jagoff-memo-b4d16ca/src/memo/cli_drift.py :11 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_idle_daemon.py :34 import subprocess as _subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_import.py :184 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_ingest_daemon.py :37 import subprocess as _subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_install_mcp.py :17 import subprocess
show 28 more
  • shell jagoff-memo-b4d16ca/src/memo/cli_maint_daemon.py :36 import subprocess as _subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_maintain.py :303 import subprocess as _sp
  • shell jagoff-memo-b4d16ca/src/memo/cli_ops.py :334 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_recall_daemon.py :34 import subprocess as _subprocess
  • shell jagoff-memo-b4d16ca/src/memo/cli_session.py :192 import subprocess as _sp
  • shell jagoff-memo-b4d16ca/src/memo/cli_sync.py :553 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/code_context.py :15 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/code_evidence.py :19 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/code_impact.py :6 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/code_traceability.py :7 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/eval_against.py :14 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/eval_behavior.py :48 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/git_miner.py :19 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/ingest_helpers.py :26 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/integrations/wrap.py :19 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/journey_check.py :27 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/ops_launchd.py :6 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/recall_logic.py :1030 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/repo_index_helpers.py :14 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/repo_intelligence.py :6 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/repo_signals.py :6 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/repo_watcher.py :7 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/resume/_preview.py :13 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/runtime/agent_registry.py :14 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/runtime/autoupdate.py :27 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/runtime/codex.py :7 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/runtime/daemon.py :88 import subprocess
  • shell jagoff-memo-b4d16ca/src/memo/runtime/mcp.py :6 import subprocess

58 more not shown — this panel samples each group; the count above is the real total.

network 30

  • net (weak) jagoff-memo-b4d16ca/scripts/telemetry_report.py :43 import urllib.error
  • net jagoff-memo-b4d16ca/src/memo/cli_dashboard.py :23 from urllib.parse import parse_qs, urlsplit
  • net jagoff-memo-b4d16ca/src/memo/cli_doctor.py :196 import socket as _sock
  • net jagoff-memo-b4d16ca/src/memo/cli_install_mcp.py :359 import socket
  • net jagoff-memo-b4d16ca/src/memo/cli_proxy.py :11 import socket
  • net jagoff-memo-b4d16ca/src/memo/code_traceability.py :11 from urllib.parse import quote, unquote, urlsplit
  • net jagoff-memo-b4d16ca/src/memo/embed_protocol.py :46 import socket as _socket
  • net jagoff-memo-b4d16ca/src/memo/eval_bench.py :20 import urllib.request
  • net jagoff-memo-b4d16ca/src/memo/graph_discovery.py :7 from urllib.parse import unquote, urlsplit
  • net jagoff-memo-b4d16ca/src/memo/graph_projection.py :22 from urllib.parse import quote
  • net jagoff-memo-b4d16ca/src/memo/http_auth.py :17 from urllib.parse import urlsplit
  • net jagoff-memo-b4d16ca/src/memo/identity.py :13 import socket
show 18 more
  • net jagoff-memo-b4d16ca/src/memo/ops_launchd.py :276 import socket
  • net jagoff-memo-b4d16ca/src/memo/proxy/server.py :399 import httpx
  • net jagoff-memo-b4d16ca/src/memo/proxy_wiring.py :31 from urllib.parse import urlparse
  • net jagoff-memo-b4d16ca/src/memo/runtime/autoupdate.py :32 import urllib.error
  • net jagoff-memo-b4d16ca/src/memo/runtime/update.py :10 import urllib.error
  • net jagoff-memo-b4d16ca/src/memo/secret_store.py :11 import socket
  • net jagoff-memo-b4d16ca/src/memo/terminal_receiver.py :19 import socket
  • net (weak) jagoff-memo-b4d16ca/tests/resource_hygiene_plugin.py :13 "unclosed <socket.socket",
  • net (weak) jagoff-memo-b4d16ca/tests/test_autoupdate.py :204 monkeypatch.setattr(au.urllib.request, "urlopen", fake_urlopen)
  • net (weak) jagoff-memo-b4d16ca/tests/test_chat_http.py :566 import httpx
  • net (weak) jagoff-memo-b4d16ca/tests/test_embedder_client.py :13 import socket
  • net (weak) jagoff-memo-b4d16ca/tests/test_eval_bench.py :465 import urllib.request
  • net (weak) jagoff-memo-b4d16ca/tests/test_proxy_cli.py :58 import socket
  • net (weak) jagoff-memo-b4d16ca/tests/test_proxy_server.py :625 byte watchdog trip on a slow upstream. Feeds a real `httpx.Response` a
  • net (weak) jagoff-memo-b4d16ca/tests/test_proxy_wiring.py :92 import socket
  • net (weak) jagoff-memo-b4d16ca/tests/test_resource_hygiene_plugin.py :40 message = "unclosed <socket.socket fd=3, family=2, type=1, proto=0, laddr=('0.0.0.0', 0)>"
  • net (weak) jagoff-memo-b4d16ca/tests/test_runtime_update.py :495 monkeypatch.setattr(upd.urllib.request, "urlopen", lambda *_a, **_k: _Response())
  • net (weak) jagoff-memo-b4d16ca/tests/test_terminal_receiver_paths.py :15 import socket

secrets 1

  • secrets jagoff-memo-b4d16ca/src/memo/cli_banner.py :84 import getpass

database 120

  • db (weak) jagoff-memo-b4d16ca/scripts/audit-data-integrity.py :20 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/ask_gaps.py :25 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_code_facts.py :19 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_code_intel.py :21 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_diag.py :13 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_doctor.py :141 import sqlite3 as cg_sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_dream_passes.py :15 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_health.py :15 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_maintain.py :28 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_memory.py :16 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_recall_hook.py :9 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/cli_viz.py :82 import sqlite3 as _sqlite3
show 28 more
  • db jagoff-memo-b4d16ca/src/memo/code_context.py :14 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/code_evidence.py :18 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/code_impact.py :5 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/code_intel.py :20 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/code_traceability.py :6 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/codegraph_loader.py :23 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/confidence_calibration.py :13 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/config.py :208 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/context_pack.py :3 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/contradict.py :29 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/coordination.py :23 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/crossref.py :41 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/dream_hype.py :17 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/dream_vector.py :12 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/event_surface.py :9 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/graph.py :41 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/graph_projection.py :14 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/history.py :35 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/history_importers.py :118 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/memory/rerank_ops.py :10 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/memory/search_ops.py :13 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/memory/search_scoring_ops.py :14 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/memory/secret_ops.py :9 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/proactive/detectors/_totals.py :14 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/proactive/store.py :4 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/recall_logic.py :366 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/repo_index_helpers.py :13 import sqlite3
  • db jagoff-memo-b4d16ca/src/memo/repo_structural.py :11 import sqlite3

80 more not shown — this panel samples each group; the count above is the real total.

declared dependencies 39

  • fastmcp@>=0.5,<4
  • click@>=8.1.7
  • rich@>=13.7
  • pydantic@>=2.6
  • cryptography@>=50.0
  • sqlite-vec@>=0.1.9,<0.2
  • python-frontmatter@>=1.1
  • pyyaml@>=6.0
  • questionary@>=2.0
  • textual@>=8.2.8,<9
  • tomli-w@>=1.0
  • watchdog@>=4.0
show 27 more
  • mlx@>=0.18,<1; sys_platform ==
  • and@platform_machine ==
  • darwin@*
  • arm64@*
  • linux@*
  • pytest@>=9.0.3,<10
  • pytest-cov@>=5.0
  • pytest-xdist@>=3.6
  • pytest-timeout@>=2.3
  • pytest-asyncio@>=1.4,<2
  • hypothesis@>=6.158,<7
  • diff-cover@>=9,<11
  • httpx2@>=2.5,<3
  • freezegun@>=1.5
  • ruff@==0.16.4
  • mypy@>=1.10
  • types-PyYAML@>=6.0
  • pytest-randomly@>=4.1,<5
  • pytest-repeat@>=0.9.4,<1
  • mutmut@>=3,<4
  • pyobjc-framework-Vision@>=10.0; sys_platform ==
  • tantivy@>=0.22; sys_platform ==
  • mlx-vlm@>=0.1.12,<0.6.5; sys_platform ==
  • httpx@>=0.27,<1
  • pillow@>=10.0
  • fastapi@>=0.115
  • uvicorn@>=0.34

transport_posture 1

  • binds all interfaces (0.0.0.0) jagoff-memo-b4d16ca/tests/test_http_auth.py :93 cfg = load_http_auth_config(host="0.0.0.0", allow_no_auth=True)