MoriMori
Mori

Import from other agents

Switched to Mori from another agent? Pull your skills and memory straight in from Hermes, Claude Code, or OpenClaw — read-only, injection-scanned, and gated behind your approval.

What import does

Import lifts the two things worth keeping out of a competing agent — your skills and your memory — and brings them into Mori. It reads a known agent's home directory on your Mac, parses the skills and memory notes it finds, and files them into Mori's own stores. Three agents are recognized today: Hermes (~/.hermes), Claude Code (~/.claude), and OpenClaw (~/.openclaw).

Nothing is executed. Imported content is data — Mori reads it, she never runs it — and the whole path is pure filesystem: no shell, no network, and it never throws an error back into the app. The most an import can do is add a pending skill and some scanned memory lines, both of which you review before they matter.

Where to find it

Import lives on the Settings page under Import from other agents. Open it and Mori scans your home directory once, in the background, for each recognized agent. Any it finds shows a row with the detected path and a count — how many skills and memory lines are sitting there to pull — plus an Import button. Agents that aren't installed show as "Not detected" and have no button.

Detection is read-only: it counts what's there without moving anything. Nothing is imported until you click Import for a specific agent, and each agent is a separate, explicit click.

What gets pulled

For each agent, import looks only in that agent's standard locations, one level deep — it never crawls arbitrarily far into a foreign tree.

  • Skills — one skill per name.md file, or per name/SKILL.md folder (the open agentskills.io layout; skill.md and README.md are accepted too). Frontmatter and the first heading are used to fill the skill's name and description.
  • Memory — the agent's memory and notes files (MEMORY.md, USER.md, notes.md, a memory/ folder), split into individual fact lines. For Claude Code, per-project projects/*/memory and each project's CLAUDE.md are read too.

Claude Code's commands/ directory is read as skills alongside skills/. Chat history (session databases) is counted so you know it's there, but importing it lands in a later update — it is never parsed today.

Imported skills wait for your approval

A skill you import does not go live. Every imported skill is written into Mori's pending store with approval: pending in its frontmatter, and Mori will not follow it on any task until you approve it. You review the full procedure on the Skills page under Awaiting your approval, then approve or reject each one.

Imported skills are slug-prefixed by their origin (hermes-…, claude-…, openclaw-…) so they can never collide with or silently overwrite a skill you already have, and each carries a source tag recording exactly where it came from. This is the same pending gate agent-authored skills pass through — imports simply enter it from outside.

---
name: Deploy the staging site
description: Use when pushing the staging branch to Vercel.
version: 1.0
source: agent
metadata:
  mori:
    approval: pending
    source: import:claude
---
1. run_terminal_command git push origin staging
2. verify the preview URL responds
3. report the deploy URL

Memory is scanned before it's stored

Every memory line passes through the same injection and credential scan as any other memory write before it can be stored. A line that reads like a prompt-injection attempt — a fake system: or assistant: role prefix, an "ignore previous instructions" phrase, role or control tags — or that contains something shaped like a live secret (an API key, an AWS key, a private-key block) is refused and counted, never stored. Memory is data Mori remembers, never instructions she follows, so nothing that tries to smuggle instructions in through it survives the door.

Clean lines are stored tagged [imported], de-duped against what Mori already remembers, and marked evictable rather than pinned — so a big import can't crowd out the facts you added by hand. The import report tells you exactly how many were added and how many the scan rejected.

Provider names, never keys

Import peeks at the agent's config files for one reason only: to learn which model providers you already use, so the report can say "providers detected: anthropic, openai" and help you get set up faster. It reads names only, matched against a fixed whitelist of known provider names.

A key value can never come through, even if the config is shaped in an unexpected way, because the scanner only ever emits tokens that are in the whitelist — and an API key is never one of them. Your keys stay exactly where they are; import never reads, copies, or moves them.

The report

After you click Import, Mori shows a short receipt for that agent:

  • how many skills were imported and that they're pending your approval in Skills,
  • how many memory lines were added, and how many the safety scan rejected,
  • how many sessions were found and deferred,
  • any provider names detected in the config.

Detect is read-only — it counts what's there (often hundreds of memory lines from a long-lived Claude Code install) without moving a single byte. Everything import does is auditable this way: you see the counts before you commit, and the receipt after.