| name | syncing-memory-filesystem |
| description | Manage git-backed memory repos. Load this skill when working with git-backed agent memory, setting up remote memory repos, resolving sync conflicts, or managing memory via git workflows. |
Git-Backed Memory Repos
Agents with the git-memory-enabled tag have their memory blocks stored in git repositories accessible via the Letta API. This enables version control, collaboration, and external editing of agent memory.
Features:
- Stored in cloud (GCS)
- Accessible via
$LETTA_BASE_URL/v1/git/<agent-id>/state.git
- Bidirectional sync: API <-> Git (webhook-triggered, ~2-3s delay)
- Structure:
memory/system/*.md for system blocks
What the CLI Harness Does Automatically
When memfs is enabled, the Letta Code CLI automatically:
- Adds the
git-memory-enabled tag to the agent (triggers backend to create the git repo)
- Clones the repo into
~/.letta/agents/<agent-id>/memory/ (git root is the memory directory)
- Configures a local credential helper in
memory/.git/config (so git push/git pull work without auth ceremony)
- Installs a pre-commit hook that validates frontmatter before each commit (see below)
- On subsequent startups: pulls latest changes, reconfigures credentials and hook (self-healing)
- During sessions: periodically checks
git status and reminds you (the agent) to commit/push if dirty
If any of these steps fail, you can replicate them manually using the sections below.
Authentication
The harness configures a per-repo credential helper during clone. To verify or reconfigure:
cd ~/.letta/agents/<agent-id>/memory
git config --get credential.$LETTA_BASE_URL.helper
git config credential.$LETTA_BASE_URL.helper \
'!f() { echo "username=letta"; echo "password=$LETTA_API_KEY"; }; f'
For cloning a different agent's repo (e.g. during memory migration), set up a global helper:
git config --global credential.$LETTA_BASE_URL.helper \
'!f() { echo "username=letta"; echo "password=$LETTA_API_KEY"; }; f'
Pre-Commit Hook (Frontmatter Validation)
The harness installs a git pre-commit hook that validates .md files under memory/ before each commit. This prevents pushes that the server would reject.
Rules:
- Every
.md file must have YAML frontmatter (--- header and closing ---)
- Required fields:
description (non-empty string), limit (positive integer)
read_only is a protected field: you (the agent) cannot add, remove, or change it. Files with read_only: true cannot be modified at all. Only the server/user sets this field.
- Unknown frontmatter keys are rejected
Valid file format:
---
description: What this block contains
limit: 20000
---
Block content goes here.
If the hook rejects a commit, read the error message — it tells you exactly which file and which rule was violated. Fix the file and retry.
Clone Agent Memory
git clone "$LETTA_BASE_URL/v1/git/<agent-id>/state.git" ~/my-agent-memory
ls ~/my-agent-memory/memory/system/
cat ~/my-agent-memory/memory/system/human.md
Enabling Git Memory (Manual)
If the harness /memfs enable failed, you can replicate it:
AGENT_ID="<your-agent-id>"
AGENT_DIR=~/.letta/agents/$AGENT_ID
MEMORY_REPO_DIR="$AGENT_DIR/memory"
curl -X PATCH "$LETTA_BASE_URL/v1/agents/$AGENT_ID" \
-H "Authorization: Bearer $LETTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tags": ["origin:letta-code", "git-memory-enabled"]}'
mkdir -p "$MEMORY_REPO_DIR"
git clone "$LETTA_BASE_URL/v1/git/$AGENT_ID/state.git" "$MEMORY_REPO_DIR"
cd "$MEMORY_REPO_DIR"
git config credential.$LETTA_BASE_URL.helper \
'!f() { echo "username=letta"; echo "password=$LETTA_API_KEY"; }; f'
Bidirectional Sync
API Edit -> Git Pull
cd ~/.letta/agents/<agent-id>/memory
git pull
Changes made via the API are automatically committed to git within 2-3 seconds.
Git Push -> API Update
cd ~/.letta/agents/<agent-id>/memory
echo "Updated info" > system/human.md
git add system/human.md
git commit -m "fix: update human block"
git push
Conflict Resolution
When both API and git have diverged:
cd ~/.letta/agents/<agent-id>/memory
git push
git pull --no-rebase
cat system/human.md
echo "final resolved content" > system/human.md
git add system/human.md
git commit -m "fix: resolved conflict in human block"
git push
Block Management
Create New Block
echo "My new block content" > system/new-block.md
git add system/new-block.md
git commit -m "feat: add new block"
git push
Delete/Detach Block
git rm system/persona.md
git commit -m "chore: remove persona block"
git push
Directory Structure
~/.letta/agents/<agent-id>/
├── .letta/
│ └── config.json # Agent metadata
└── memory/ # Git repo root
├── .git/ # Git repo data
└── system/ # System blocks (attached to agent)
├── human.md
└── persona.md
System blocks (memory/system/) are attached to the agent and appear in the agent's system prompt.
Requirements
- Agent must have
git-memory-enabled tag
- Valid API key with agent access
- Git installed locally
Troubleshooting
Clone fails with "Authentication failed":
- Check credential helper:
git config --get credential.$LETTA_BASE_URL.helper
- Reconfigure: see Authentication section above
- Verify the endpoint is reachable:
curl -u letta:$LETTA_API_KEY $LETTA_BASE_URL/v1/git/<agent-id>/state.git/info/refs?service=git-upload-pack
Push/pull doesn't update API:
- Wait 2-3 seconds for webhook processing
- Verify agent has
git-memory-enabled tag
- Check if you have write access to the agent
Harness setup failed (no .git/ after /memfs enable):
- Check debug logs (
LETTA_DEBUG=1)
- Follow "Enabling Git Memory (Manual)" steps above
Can't see changes immediately:
- Bidirectional sync has a 2-3 second delay for webhook processing
- Use
git pull to get latest API changes
- Use
git fetch to check remote without merging