A file-based personal knowledge graph at ~/memory/. Any agent can read/write. Human-browsable.
~/memory/
├── README.md # full architecture doc
├── graph/ # knowledge nodes
│ ├── people/
│ ├── projects/
│ ├── concepts/
│ ├── places/
│ ├── tools/
│ └── <any-category>/ # extend freely
├── log/ # daily activity logs
│ └── YYYY-MM-DD.md
├── indexes/ # computed — NEVER edit directly
│ ├── memory.db # SQLite (primary index, FTS5 search)
│ └── graph.html # interactive graph visualization
├── backfill/ # connection discovery
│ ├── suggestions.md
│ └── history.md
└── scripts/ # symlinks → skill's scripts/ directory
├── rebuild-indexes.js # full or incremental index rebuild
├── suggest-backfill.js # scoped connection discovery (+ QMD semantic)
├── query.js # CLI structural query tool
├── briefing.js # context assembly for agents
├── lint.js # graph validation and health checks
├── visualize.js # D3.js graph visualization generator
├── commit.js # git auto-commit for graph/log changes
└── promote.js # log-to-node promotion suggestions
Script location: Scripts live in the skill directory (scripts/). ~/memory/scripts/ contains symlinks to them. All scripts support MEMORY_ROOT env var (defaults to ~/memory) so they resolve paths correctly regardless of where they're installed.
If ~/memory/ does not exist, read references/setup.md and follow the scaffolding steps. This creates the folder structure, symlinks scripts, seeds initial nodes, and builds indexes.
If ~/memory/ already exists, proceed to Operations below.
Every node is a markdown file with YAML frontmatter:
---
type: project
created: 2026-03-20
updated: 2026-03-20
tags: [side-project, saas]
status: active
relations:
- { to: people/someone, type: owner }
- { to: tools/nextjs, type: built-with }
---
# Title
Free-form body.
## Changelog
- 2026-03-20: Created node
type — matches parent folder namecreated — ISO dateupdated — ISO date, last time node content was meaningfully changed. Used for staleness tracking.tags — flat list for categorizationstatus — active, archived, idea, done, etc.relations — list of { to, type } objects. to is relative path within graph/ (no .md). type is any string.Suggested standard types (non-standard types trigger info-level lint warnings):
uses, built-with, part-of, containscreator, owner, maintainerrelated-to, inspired-by, alternative-to, core-concept-of, core-value-ofled-to, preceded-by, evolved-intohome-of, lives-in, works-atWrite a relation on one side only. The index script computes the reverse.
Nodes can have a ## Changelog section at the bottom of the body. Format:
- YYYY-MM-DD: description of what changed
Templates for common node types are in the skill's templates/ directory:
person.md, project.md, tool.md, concept.md, place.mdUse these as starting points when creating new nodes. Copy and edit — don't modify the templates themselves.
# Check recent activity
cat ~/memory/log/$(date +%Y-%m-%d).md
# Context briefing for a node (full content + relations + recent logs)
node ~/memory/scripts/briefing.js --node projects/flowmind
# Topic briefing (search-based)
node ~/memory/scripts/briefing.js --topic "immutability"
# Semantic search (if QMD is installed — best for natural language queries)
qmd vsearch "trust and data integrity" # vector similarity
qmd query "what connects X and Y" # hybrid + reranking
# Structural search
node ~/memory/scripts/query.js --search "keyword"
# Node details with all relations
node ~/memory/scripts/query.js --node projects/flowmind
# All nodes related to something
node ~/memory/scripts/query.js --related-to people/abdullah
# Filter by type and status
node ~/memory/scripts/query.js --type project --status active
# Browse by tag
node ~/memory/scripts/query.js --tag side-project
# Recently modified nodes
node ~/memory/scripts/query.js --recent 7
# Stale nodes (not updated in N days)
node ~/memory/scripts/query.js --stale 30
# Graph overview
node ~/memory/scripts/query.js --stats
ls ~/memory/graph// templates/ directory to ~/memory/graph//.md created and updated to today)type: suggested if uncertainnode ~/memory/scripts/rebuild-indexes.js --incrementalqmd update && qmd embed (refreshes semantic search)updated field to today's date## Changelog section if significantnode ~/memory/scripts/rebuild-indexes.js --incrementalAppend to ~/memory/log/YYYY-MM-DD.md (create if needed):
- **HH:MM** [agent-name] Description {ref: path/to/node, path/to/other}
{ref: ...} references are backfill signals — they hint at connections between nodes.
# Rebuild indexes first (if not recently done)
node ~/memory/scripts/rebuild-indexes.js --incremental
# Generate suggestions (scoped — uses tags, FTS, log co-refs, + QMD semantic)
node ~/memory/scripts/suggest-backfill.js # all nodes
node ~/memory/scripts/suggest-backfill.js --scope recent # last 7 days only
node ~/memory/scripts/suggest-backfill.js --scope node:projects/flowmind # specific node
node ~/memory/scripts/suggest-backfill.js --no-qmd # skip semantic search
# Rebuild with automatic scoped backfill on changed nodes
node ~/memory/scripts/rebuild-indexes.js --incremental --with-backfill
Review ~/memory/backfill/suggestions.md. Accept by adding the relation to the node's frontmatter. Reject by logging in backfill/history.md.
node ~/memory/scripts/lint.js # check for issues
node ~/memory/scripts/lint.js --fix # auto-fix (adds missing updated fields)
Checks: missing required fields, broken relations, orphan nodes, duplicate titles, non-standard relation types.
node ~/memory/scripts/visualize.js # generates ~/memory/indexes/graph.html
open ~/memory/indexes/graph.html # view in browser
Interactive D3.js force-directed graph. Nodes colored by type, sized by connections. Click for details.
node ~/memory/scripts/commit.js # auto-commit graph/ and log/ changes
node ~/memory/scripts/commit.js --message "custom msg" # with custom message
Stages graph/, log/, backfill/history.md, and README.md changes, commits with descriptive message. Does NOT auto-push.
node ~/memory/scripts/promote.js # find recurring topics without nodes
node ~/memory/scripts/promote.js --min 5 # raise mention threshold
node ~/memory/scripts/promote.js --days 30 # only recent logs
Scans logs for entities mentioned 3+ times without existing nodes. Suggests node creation.
Create a folder under graph/. No config changes. Indexes adapt on rebuild.
log/YYYY-MM-DD.md when you do something significant.{ref: ...}.indexes/. Run the rebuild script instead.graph/recipes/? Create the folder. No config changes.suggested type for uncertain relations. Let a human or another agent confirm.updated on changes. Keep the updated field current for temporal tracking.lint.js to check.共 1 个版本