VaultSmith is a lightweight Python CLI that converts plain text into an Obsidian-compatible, cross-session knowledge graph.
It is designed for a two-layer memory model:
- Small, durable persistent memory (stable preferences/facts)
- Large, expandable vault graph (sessions/projects/people/concepts/decisions)
This keeps persistent memory compact while vault knowledge can grow indefinitely.
- Added
initcommand to bootstrap an agent-ready vault layout - Added memory-candidate extraction from text prefixes:
Preference:Environment:Convention:Profile:Memory:
- Added automatic updates to
05 Memory/Agent Memory Candidates.mdduring ingest - Added
memory_candidatescount to ingest output - Added reusable
99 System/AGENT-PLAYBOOK.mdand capture template - Added
linkcommand for deterministic cross-note auto-linking
- Ingest plaintext input
- Extract entities with deterministic heuristics (no external APIs)
- Write/update Obsidian notes with wikilinks
- Capture candidate durable facts for persistent memory promotion
- Auto-link recent ingest notes based on shared terms
- Generate weekly review synthesis
.
├── cli.py
├── requirements.txt
├── sample_input.txt
├── SKILL.md
└── vaultsmith/
├── __init__.py
├── bootstrap.py
├── config.py
├── extract.py
├── linker.py
├── models.py
├── pipeline.py
├── review.py
└── writer.py
- Projects:
- lines starting with
Project: - hashtags like
#project/<name>
- lines starting with
- People:
@nametokens
- Concepts:
- lines starting with
Concept: - TitleCase words repeated at least 2 times
- lines starting with
- Decisions:
- lines starting with
Decision:
- lines starting with
- Tasks:
- lines starting with
TODO: - markdown checkboxes like
- [ ] task
- lines starting with
- Memory candidates:
- lines starting with
Preference:/Environment:/Convention:/Profile:/Memory:
- lines starting with
00 Inbox05 Memory10 Projects20 People30 Concepts40 Decisions90 Reviews99 System
- Set environment-specific paths:
export VAULTSMITH_DIR="/absolute/path/to/vaultsmith"
export OBSIDIAN_VAULT_PATH="/absolute/path/to/your-obsidian-vault"- Bootstrap vault once:
cd "$VAULTSMITH_DIR"
python cli.py init --vault "$OBSIDIAN_VAULT_PATH" --agent-label "Any Agent"- Ingest a session/plaintext file:
python cli.py ingest --input sample_input.txt --vault "$OBSIDIAN_VAULT_PATH"- Auto-link recent ingest notes:
python cli.py link --vault "$OBSIDIAN_VAULT_PATH" --limit 25 --min-shared-terms 2- Generate weekly review:
python cli.py review --vault "$OBSIDIAN_VAULT_PATH"Optional: auto-close standard verification loops when artifacts exist (ingest note, auto links, review generation):
python cli.py review --vault "$OBSIDIAN_VAULT_PATH" --close-verified~/.hermes/skills/note-taking/vaultsmith/scripts/run_daily_cycle.sh \
--vaultsmith-dir "$VAULTSMITH_DIR" \
--vault "$OBSIDIAN_VAULT_PATH" \
--input /absolute/path/to/session_input.txt \
--run-id day-001The script also supports environment-variable-only mode and legacy positional args.
- New inbox capture note (always created):
00 Inbox/ingest-YYYYMMDD-HHMMSS-<run_id>.md
- Entity notes (created/appended idempotently):
10 Projects/<name>--<hash>.md20 People/<name>--<hash>.md30 Concepts/<name>--<hash>.md40 Decisions/<name>--<hash>.md
- Memory notes:
05 Memory/Agent Memory Candidates.md05 Memory/Persistent Memory Schema.md
- System note:
99 System/AGENT-PLAYBOOK.md
- Auto-link updates:
- appended
## Auto Links ...sections in recent00 Inbox/ingest-*.md
- appended
- Weekly review:
90 Reviews/weekly-review-YYYY-Www.md
- Entity notes append at most once per
run_id. - Memory-candidate note appends at most once per
run_id. - Linker auto-link section appends at most once per linker
run_id. - Inbox capture is always a new file per ingest run.
- If
--run-idis omitted, VaultSmith auto-generates one.
- Input files must be UTF-8 text.
- Missing/unreadable input or unwritable vault path returns concise stderr errors with exit code
1.
- Top Themes
- Open Loops
- Recent Decisions
- Suggested Next 3 Actions
- Stale Projects (>14 days)
Any agent/environment should follow:
- Run
initonce in the target vault. - Feed each meaningful session through
ingest. - Use memory prefixes when candidate durable facts appear.
- Promote only stable/repeated facts from
05 Memory/Agent Memory Candidates.mdto05 Memory/Persistent Memory Schema.md. - Run
linkregularly (before review) to grow interlinks. - Run
reviewon a recurring cadence.
Ingest with explicit run id:
python cli.py ingest --input sample_input.txt --vault "$OBSIDIAN_VAULT_PATH" --run-id demo-001Link with explicit run id:
python cli.py link --vault "$OBSIDIAN_VAULT_PATH" --limit 25 --min-shared-terms 2 --run-id link-001Memory-compatible input snippet:
Project: VaultSmith
Concept: Knowledge Graph
Decision: Keep deterministic extraction for MVP
TODO: Add weekly linker pass
Preference: User prefers concise action-status labels.
Environment: Obsidian vault path is /absolute/path/to/your-obsidian-vault.
Convention: Promote to persistent memory only after repetition.
Profile: Preferred name is Megabyte.
Memory: Quiet hours are 23:00-06:00 unless urgent.