mirror of
https://github.com/akitaonrails/ai-memory.git
synced 2026-10-02 03:24:46 +08:00
7.7 KiB
7.7 KiB
Backup and Restore of AI Agent Assets (Skills, MCP, Plugins)
1. Context and Motivation
ai-memory coordinates memory and context across AI coding agents (Claude Code, OpenAI Codex, Antigravity CLI, Gemini CLI, Cursor, OpenCode, Devin, Grok, Kiro, etc.).
Before these commands were added:
- Server Backup:
ai-memory backuptakes a snapshot of the server's SQLite database (memory.sqlite), git wiki (wiki/), andconfig.tomlviaPOST /admin/backup. - Client Configuration Knowledge:
ai-memoryinstallers (install_mcp.rs,install_skills.rs,install_hooks.rs,uninstall.rs) already have detailed definitions of where each supported AI harness stores MCP servers, skills, plugins, and project instructions. - Gap: There was no command to snapshot, export, backup, or restore host agent configurations (MCP servers, agent skills, plugins, instructions). Moving to a new machine required reconfiguring every agent manually.
2. Target Matrix by Agent Harness
| Harness | MCP Configuration | Skills (Global / Project) | Plugins / Extensions | Instructions / Rules |
|---|---|---|---|---|
| Claude Code / Desktop | ~/.claude.json~/.claude/settings.jsonclaude_desktop_config.json |
~/.claude/skills/.claude/skills/ |
~/.claude/plugins/Claude Extensions/ |
CLAUDE.md |
| OpenAI Codex CLI | ~/.codex/config.toml~/.codex/mcp.json |
~/.agents/skills/.agents/skills/~/.codex/skills/ |
~/.codex/plugins/ |
AGENTS.md |
Antigravity CLI (agy) / Gemini |
~/.gemini/settings.json~/.gemini/config/mcp_config.jsonantigravity-cli/mcp_config.json |
~/.gemini/antigravity-cli/skills/~/.gemini/skills/.gemini/skills/ |
antigravity-cli/plugins/~/.gemini/plugins/ |
GEMINI.mdAGENTS.mdrules/ |
| Cursor IDE | ~/.cursor/mcp.json.cursor/mcp.json |
— | VS Code / Cursor extensions | .cursorrules.cursor/rules/ |
| OpenCode (v1 / v2) | opencode.jsonopencode.jsonc~/.config/opencode/opencode.json |
~/.config/opencode/skills/ |
~/.config/opencode/plugins/ |
AGENTS.md |
| Devin CLI | ~/.devin/config.json |
~/.devin/skills/ |
— | Devin instructions |
| Grok Build CLI | ~/.grok/config.toml |
~/.grok/skills/ |
— | Grok instructions |
| Kiro CLI (AWS) | ~/.kiro/settings/mcp.json |
~/.kiro/agents/*.json |
— | — |
| OpenClaw | ~/.openclaw/config.json |
— | ~/.openclaw/extensions/ |
— |
| VS Code Copilot | .vscode/mcp.json |
— | Extensions | Copilot instructions |
Claude Desktop config paths use the same platform-aware resolver as
install-mcp, including packaged Windows installs. OpenCode uses
%USERPROFILE%\.config\opencode on Windows too, as its
official troubleshooting guide
documents.
3. Architecture & CLI Design
Dedicated Host CLI Subcommands: backup-agents and restore-agents
Host configurations live on the client filesystem, independent of whether the ai-memory serve daemon is running. Therefore, backup and restore of agent assets execute as client-side commands.
CLI Command Specification
# Backup all detected agents into an archive
ai-memory backup-agents -o agent-assets.tar.gz
# Filter specific agents or scopes
ai-memory backup-agents --agents claude,codex,antigravity --scope both -o backup.tar.gz
# Include raw MCP-config secrets (warns loudly; every archive is 0600 on Unix)
ai-memory backup-agents -o backup.tar.gz --include-secrets
# Dry-run inspection of an archive before restoring
ai-memory restore-agents -i backup.tar.gz
# Apply the reviewed restoration plan
ai-memory restore-agents -i backup.tar.gz --apply
4. Archive Manifest Schema (manifest.json)
Stored in the root of the generated tarball:
{
"$schema": "https://ai-memory.dev/schemas/agent-backup-v1.json",
"version": 1,
"created_at": "2026-09-28T14:30:00Z",
"host": {
"os": "macos",
"arch": "aarch64",
"home_dir": null
},
"sanitized": true,
"entries": [
{
"agent": "claude-code",
"asset_kind": "mcp-config",
"scope": "global",
"archive_path": "agents/claude-code/settings.json",
"target_relative": ".claude/settings.json"
},
{
"agent": "claude-code",
"asset_kind": "skill",
"scope": "global",
"archive_path": "agents/claude-code/skills/custom-skill/SKILL.md",
"target_relative": ".claude/skills/custom-skill/SKILL.md"
},
{
"agent": "codex",
"asset_kind": "mcp-config",
"scope": "global",
"archive_path": "agents/codex/config.toml",
"target_relative": ".codex/config.toml"
}
]
}
5. Security & Invariants
- Secret Redaction:
- By default, known tokens, bearer headers, and environment keys (
*_TOKEN,*_KEY,*_SECRET) in UTF-8 MCP config files are sanitized usingai-memory-hooks::sanitizer. - Skills, plugins, and instruction files are copied verbatim and may contain secrets.
- Passing
--include-secretsbypasses MCP redaction. Every archive is set to mode0600on Unix because verbatim instructions and plugins may also contain credentials. Other platforms rely on their native ACLs.
- By default, known tokens, bearer headers, and environment keys (
- Symlink Safety:
- Archives do not traverse or include external symlinks (
follow_symlinks(false)). - Restore rejects a symlink at the target or in any archive-controlled descendant below the approved home/project/config root.
- Archives do not traverse or include external symlinks (
- Path Traversal Protection:
- Restoring rejects traversal and permits only allowlisted agent destinations. Claude Desktop uses the same platform-specific path resolver as
install-mcp. - Archive entries are regular UTF-8 paths only, and entry count, manifest, per-file, and total expanded sizes are bounded before content is staged.
- Every manifest entry must have exactly one body and a well-formed SHA-256; duplicate paths/destinations, missing bodies, unmanifested bodies, and checksum mismatches are refused. Checksums detect corruption or internal inconsistency; they do not authenticate an archive's author.
- Restoring rejects traversal and permits only allowlisted agent destinations. Claude Desktop uses the same platform-specific path resolver as
- Atomic Restores:
- The output archive is completed and synced in a private sibling tempfile before it replaces the requested destination.
- Target files use temporary file + rename + sync
(
ai_memory_wiki::write_atomic). If a later write fails, earlier writes are rolled back; timestamped copies of overwritten files remain available. - Non-managed custom files are never overwritten without explicit
--force. - Portable Unix execute/read/write bits are restored; set-id and sticky bits are never accepted from a manifest.
- Active Content:
- Skills, plugins, and instruction files can contain executable code or
model-visible instructions. Restore is dry-run by default and prints this
warning; only use
--applyfor an archive whose source and listed paths you trust. SHA-256 consistency is not a signature.
- Skills, plugins, and instruction files can contain executable code or
model-visible instructions. Restore is dry-run by default and prints this
warning; only use
6. Implementation Map
crates/ai-memory-core:- Add
agent_backupmodule containingAgentAssetKind,AgentAssetScope,AgentBackupEntry, andAgentBackupManifest.
- Add
crates/ai-memory-cli:src/cli.rs: RegisterBackupAgents(BackupAgentsArgs)andRestoreAgents(RestoreAgentsArgs).src/commands/backup_agents.rs: Scan host configs, package archive.src/commands/restore_agents.rs: Validate manifest, present diffs, write files.
- Tests:
- Roundtrip tests: archive -> verify manifest -> extract into temporary directory -> assert equality.
- Sanitization tests: ensure keys are redacted unless requested otherwise.
- Security tests: reject path traversal payloads (
../../etc/passwd).