letta/letta-filesystem-to-memfs/SKILL.md
Migrates deprecated Letta Filesystem folders/files to MemFS using markdown document corpora, chunking, local lexical search, and QMD semantic search via the memfs-search skill. Use when replacing folders.files.upload, working with PDFs or document QA, or emulating open_file, grep_file, and search_file behavior.
npx skillsauth add letta-ai/skills letta-filesystem-to-memfsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when a user wants the old Letta Filesystem behavior: upload documents, chunk them, attach them to an agent, and let the agent search/open them.
MemFS is not the same product. It is git-backed markdown memory. To mimic the old workflow, use the bundled CLI:
documents/<corpus>/<doc>/chunks/.system/filesystem/<corpus>.md.# Set this to the skill directory shown in the skill load header.
SKILL_DIR="/path/to/letta-filesystem-to-memfs"
# From any directory. MEMORY_DIR should point at the target agent's memfs repo.
uv run --with pymupdf \
"$SKILL_DIR/scripts/letta_fs_to_memfs.py" ingest \
--memory-dir "$MEMORY_DIR" \
--corpus product-docs \
--source ./docs/ \
--source ./guide.pdf \
--source https://arxiv.org/pdf/2310.08560
cd "$MEMORY_DIR"
git status --short
git diff --stat
Search the chunk corpus lexically:
uv run "$SKILL_DIR/scripts/letta_fs_to_memfs.py" search \
--memory-dir "$MEMORY_DIR" \
--corpus product-docs \
"memory hierarchy" \
-n 5
Semantic search with QMD. The CLI creates a corpus-scoped QMD collection over chunk files only:
uv run "$SKILL_DIR/scripts/letta_fs_to_memfs.py" qmd setup \
--memory-dir "$MEMORY_DIR" \
--corpus product-docs
uv run "$SKILL_DIR/scripts/letta_fs_to_memfs.py" qmd query \
--memory-dir "$MEMORY_DIR" \
--corpus product-docs \
"memory hierarchy" \
-n 5
Use qmd reindex after changing corpus files, and qmd search / qmd vsearch when you specifically want keyword-only or vector-only search.
The ingest script writes:
system/filesystem/<corpus>.md
Pinned index and operating instructions for the corpus.
documents/<corpus>/manifest.md
Corpus manifest.
documents/<corpus>/<doc-slug>/manifest.md
Per-document metadata and chunk table.
documents/<corpus>/<doc-slug>/chunks/chunk-0001.md
Chunk content with frontmatter metadata.
documents/<corpus>/chunks.jsonl
Machine-readable chunk export for custom indexing or debugging.
| Old Filesystem | MemFS mimic |
|---|---|
| folders.create | --corpus <name> creates documents/<corpus>/ |
| folders.files.upload | letta_fs_to_memfs.py ingest --source <file-or-directory-or-url> |
| OCR/chunk/embed job | Extract + chunk locally; qmd setup / qmd reindex for semantic search |
| agents.folders.attach | Enable MemFS, then review and sync repo changes when appropriate |
| open_file | Read chunk markdown files by path |
| grep_file | rg or letta_fs_to_memfs.py search |
| search_file | letta_fs_to_memfs.py qmd query over the corpus chunk collection |
system/filesystem/<corpus>.md for the small always-visible index only.system/; it will bloat the prompt.system/, usually under documents/<corpus>/....--source recursively ingests supported files (.pdf, .md, .txt, .json, .csv, .html, .xml).--glob / --exclude for messy directories. Defaults exclude .git, node_modules, .venv, and __pycache__.--max-download-mb 100; set 0 for unlimited.qmd subcommands when the user needs semantic search over many chunks.uv run --with pymupdf "$SKILL_DIR/scripts/letta_fs_to_memfs.py" ingest --help
uv run "$SKILL_DIR/scripts/letta_fs_to_memfs.py" search --help
uv run "$SKILL_DIR/scripts/letta_fs_to_memfs.py" qmd setup --help
uv run "$SKILL_DIR/scripts/letta_fs_to_memfs.py" qmd query --help
Compatibility wrappers remain for older examples:
uv run --with pymupdf "$SKILL_DIR/scripts/ingest_documents.py" --memory-dir "$MEMORY_DIR" --corpus docs --source ./docs
uv run "$SKILL_DIR/scripts/search_corpus.py" --memory-dir "$MEMORY_DIR" --corpus docs --query "refund policy"
The ingest script uses PyMuPDF when it sees a PDF. Run it with uv run --with pymupdf ....
For scanned PDFs or complex tables, use the tools/extracting-pdf-text skill first, then ingest the extracted markdown/text file with this skill.
See references/design.md for design notes and edge cases.
testing
Navigates archived ChatGPT or Claude-style conversation exports and a MemFS reference archive on demand. Use when recalling what a past assistant knew, searching old conversations, rendering specific chats, seeding reference memory from export sidecars, or mining historical context without doing a full import.
data-ai
Configures Letta agent compaction settings and custom summarization prompts. Use when a user asks to change an agent's compaction prompt, improve summaries after context eviction, tune sliding-window or all-message compaction, or design companion/coding-agent continuity summaries.
development
Semantic search over agent memory files. Use when you need to find conceptually related memory blocks, discover forgotten reference files, check what you already know before creating new memory, or search beyond exact keyword matching. Currently supports QMD (local, no API keys).
development
Build and maintain a persistent visual identity for your agent using Flux Kontext Pro. Use when the user asks the agent to generate selfies, avatars, character art, or any image that should look like the same person across generations.