/cortex-import
Import memories from other AI memory systems into Cortex. Supports claude-mem (SQLite), Claude Desktop sessions, ChatGPT web export (JSON), Gemini Takeout (JSON), Cursor conversations, and Claude Code JSONL. Use when the user says 'import from claude-mem', 'migrate memories',
$ npx -y skills add cdeust/Cortex --skill cortex-import --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/cortex-import
Context preview
The summary Claude sees to decide when to auto-load this skill.
Import memories from other AI memory systems into Cortex. Supports claude-mem (SQLite), Claude Desktop sessions, ChatGPT web export (JSON), Gemini Takeout (JSON), Cursor conversations, and Claude Code JSONL. Use when the user says 'import from claude-mem', 'migrate memories',
SKILL.md
cortex-import.SKILL.mdname: cortex-import
description: "Import memories from other AI memory systems into Cortex. Supports claude-mem (SQLite), Claude Desktop sessions, ChatGPT web export (JSON), Gemini Takeout (JSON), Cursor conversations, and Claude Code JSONL. Use when the user says 'import from claude-mem', 'migrate memories', 'import ChatGPT history', 'import from Gemini', 'transfer memories', or when Cortex detects another memory system is installed."
Import Memories — Multi-Source Migration
Detect available memory sources and import them into Cortex. Run fully autonomously — detect, import, consolidate.
Phase 1: Source Detection
Run this bash command to detect all sources:
echo "=== Memory Sources ==="
# 1. Claude Code JSONL
CC=$(find ~/.claude/projects -name "*.jsonl" 2>/dev/null | wc -l | tr -d ' ')
echo "Claude Code JSONL: $CC files"
# 2. Claude Desktop sessions
CD=$(find ~/Library/Application\ Support/Claude/claude-code-sessions -name "*.json" 2>/dev/null | wc -l | tr -d ' ')
echo "Claude Desktop: $CD session files"
# 3. claude-mem
if [ -f ~/.claude-mem/claude-mem.db ]; then
CM=$(sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM observations" 2>/dev/null || echo "0")
echo "claude-mem: $CM observations"
else
echo "claude-mem: not found"
fi
# 4. ChatGPT — desktop app stores binary, need web export
CHATGPT=$(find ~/Downloads -name "conversations.json" -maxdepth 3 2>/dev/null | head -1)
if [ -n "$CHATGPT" ]; then
echo "ChatGPT export: $CHATGPT"
else
echo "ChatGPT: no export (get from chatgpt.com → Settings → Data controls → Export)"
fi
# 5. Gemini Takeout
GEMINI=$(find ~/Downloads -path "*Gemini*" -name "*.json" -maxdepth 5 2>/dev/null | head -1)
if [ -n "$GEMINI" ]; then
echo "Gemini export: $GEMINI"
else
echo "Gemini: no export (get from takeout.google.com → select Gemini Apps)"
fi
# 6. Cursor
if [ -d ~/.cursor ]; then
CU=$(find ~/.cursor -name "*.jsonl" 2>/dev/null | wc -l | tr -d ' ')
echo "Cursor: $CU files"
else
echo "Cursor: not installed"
fiReport findings, then proceed with each detected source.
Phase 2: Claude Code Import
If Claude Code JSONL files exist (always the case):
cortex:backfill_memories({"max_files": 500, "min_importance": 0.3, "force_reprocess": false})Phase 3: claude-mem Import
If `~/.claude-mem/claude-mem.db` exists, run:
DEPS_DIR="$HOME/.claude/plugins/data/hypermnesia-mcp-cortex-plugins/deps"
PYTHONPATH="${CLAUDE_PLUGIN_ROOT:-/Users/cdeust/.claude/plugins/marketplaces/cortex-plugins}:$DEPS_DIR" \
DATABASE_URL="${DATABASE_URL:-postgresql://localhost:5432/cortex}" \
python3 -c "
import sqlite3, json, asyncio, sys, os
db_path = os.path.expanduser('~/.claude-mem/claude-mem.db')
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
rows = conn.execute('SELECT type, title, narrative, facts, concepts, created_at_epoch, project FROM observations ORDER BY created_at_epoch').fetchall()
print(f'Found {len(rows)} claude-mem observations')
from mcp_server.handlers.remember import handler as remember_handler
from datetime import datetime, timezone
imported = 0
for row in rows:
parts = []
if row['title']: parts.append(row['title'])
if row['narrative']: parts.append(row['narrative'])
if row['facts']:
try:
for f in json.loads(row['facts']): parts.append(str(f))
except: pass
content = '\n'.join(parts)
if len(content) < 20: continue
tags = ['imported', 'claude-mem']
if row['type']: tags.append(row['type'])
if row['concepts']:
try: tags.extend(json.loads(row['concepts'])[:5])
except: pass
created_at = None
if row['created_at_epoch']:
try: created_at = datetime.fromtimestamp(row['created_at_epoch'], tz=timezone.utc).isoformat()
except: pass
result = asyncio.run(remember_handler({'content': content, 'tags': tags, 'domain': row['project'] or '', 'source': 'claude-mem', 'force': True, 'created_at': created_at}))
if result.get('stored'): imported += 1
print(f'Imported {imported} memories from claude-mem')
conn.close()
"Phase 4: ChatGPT Import
If a `conversations.json` file was found in Downloads, or the user provides one:
DEPS_DIR="$HOME/.claude/plugins/data/hypermnesia-mcp-cortex-plugins/deps"
PYTHONPATH="${CLAUDE_PLUGIN_ROOT:-/Users/cdeust/.claude/plugins/marketplaces/cortex-plugins}:$DEPS_DIR" \
DATABASE_URL="${DATABASE_URL:-postgresql://localhost:5432/cortex}" \
python3 -c "
import json, asyncio, sys, os
path = 'REPLACE_WITH_PATH_TO_CONVERSATIONS_JSON'
with open(path) as f: data = json.load(f)
from mcp_server.handlers.remember import handler as remember_handler
from datetime import datetime, timezone
imported = 0
for conv in data:
title = conv.get('title', '')
for nid, node in (conv.get('mapping') or {}).items():
msg = node.get('message') or {}
if not msg: continue
role = (msg.get('author') or {}).get('role', '')
if role not in ('user', 'assistant'): continue
parts = msg.get('content', {}).get('parts', [])
text = '\n'.join(str(p) for p in parts if isinstance(p, str))
if len(text) < 30: continue
created_at = None
ct = msg.get('create_time')
if ct:
try: created_at = datetime.fromtimestamp(ct, tz=timezone.utc).isoformat()
except: pass
result = asyncio.run(remember_handler({'content': text[:4000], 'tags': ['imported', 'chatgpt', role], 'domain': title[:50] or 'chatgpt', 'source': 'chatgpt', 'force': False, 'created_at': created_at}))
if result.get('stored'): imported += 1
print(f'Imported {imported} memories from ChatGPT')
"If no export file exists, tell the user: > ChatGPT desktop app stores conversations in binary format — not readable. To import, export from the web: > 1. Go to **chatgpt.com → Settings → Data controls → Export data** > 2. Wait for the email with the download link > 3. Unzip to ~/Downloads/ > 4. Run
Read more
name: cortex-import description: "Import memories from other AI memory systems into Cortex. Supports claude-mem (SQLite), Claude Desktop sessions, ChatGPT web export (JSON), Gemini Takeout (JSON), Cursor conversations, and Claude Code JSONL. Use when the user says 'import from claude-mem', 'migrate memories', 'import ChatGPT history', 'import from Gemini', 'transfer memories', or when Cortex detects another memory system is installed."
Import Memories — Multi-Source Migration
Detect available memory sources and import them into Cortex. Run fully autonomously — detect, import, consolidate.
Phase 1: Source Detection
Run this bash command to detect all sources:
echo "=== Memory Sources ==="
# 1. Claude Code JSONL
CC=$(find ~/.claude/projects -name "*.jsonl" 2>/dev/null | wc -l | tr -d ' ')
echo "Claude Code JSONL: $CC files"
# 2. Claude Desktop sessions
CD=$(find ~/Library/Application\ Support/Claude/claude-code-sessions -name "*.json" 2>/dev/null | wc -l | tr -d ' ')
echo "Claude Desktop: $CD session files"
# 3. claude-mem
if [ -f ~/.claude-mem/claude-mem.db ]; then
CM=$(sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM observations" 2>/dev/null || echo "0")
echo "claude-mem: $CM observations"
else
echo "claude-mem: not found"
fi
# 4. ChatGPT — desktop app stores binary, need web export
CHATGPT=$(find ~/Downloads -name "conversations.json" -maxdepth 3 2>/dev/null | head -1)
if [ -n "$CHATGPT" ]; then
echo "ChatGPT export: $CHATGPT"
else
echo "ChatGPT: no export (get from chatgpt.com → Settings → Data controls → Export)"
fi
# 5. Gemini Takeout
GEMINI=$(find ~/Downloads -path "*Gemini*" -name "*.json" -maxdepth 5 2>/dev/null | head -1)
if [ -n "$GEMINI" ]; then
echo "Gemini export: $GEMINI"
else
echo "Gemini: no export (get from takeout.google.com → select Gemini Apps)"
fi
# 6. Cursor
if [ -d ~/.cursor ]; then
CU=$(find ~/.cursor -name "*.jsonl" 2>/dev/null | wc -l | tr -d ' ')
echo "Cursor: $CU files"
else
echo "Cursor: not installed"
fiReport findings, then proceed with each detected source.
Phase 2: Claude Code Import
If Claude Code JSONL files exist (always the case):
cortex:backfill_memories({"max_files": 500, "min_importance": 0.3, "force_reprocess": false})Phase 3: claude-mem Import
If `~/.claude-mem/claude-mem.db` exists, run:
DEPS_DIR="$HOME/.claude/plugins/data/hypermnesia-mcp-cortex-plugins/deps"
PYTHONPATH="${CLAUDE_PLUGIN_ROOT:-/Users/cdeust/.claude/plugins/marketplaces/cortex-plugins}:$DEPS_DIR" \
DATABASE_URL="${DATABASE_URL:-postgresql://localhost:5432/cortex}" \
python3 -c "
import sqlite3, json, asyncio, sys, os
db_path = os.path.expanduser('~/.claude-mem/claude-mem.db')
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
rows = conn.execute('SELECT type, title, narrative, facts, concepts, created_at_epoch, project FROM observations ORDER BY created_at_epoch').fetchall()
print(f'Found {len(rows)} claude-mem observations')
from mcp_server.handlers.remember import handler as remember_handler
from datetime import datetime, timezone
imported = 0
for row in rows:
parts = []
if row['title']: parts.append(row['title'])
if row['narrative']: parts.append(row['narrative'])
if row['facts']:
try:
for f in json.loads(row['facts']): parts.append(str(f))
except: pass
content = '\n'.join(parts)
if len(content) < 20: continue
tags = ['imported', 'claude-mem']
if row['type']: tags.append(row['type'])
if row['concepts']:
try: tags.extend(json.loads(row['concepts'])[:5])
except: pass
created_at = None
if row['created_at_epoch']:
try: created_at = datetime.fromtimestamp(row['created_at_epoch'], tz=timezone.utc).isoformat()
except: pass
result = asyncio.run(remember_handler({'content': content, 'tags': tags, 'domain': row['project'] or '', 'source': 'claude-mem', 'force': True, 'created_at': created_at}))
if result.get('stored'): imported += 1
print(f'Imported {imported} memories from claude-mem')
conn.close()
"Phase 4: ChatGPT Import
If a `conversations.json` file was found in Downloads, or the user provides one:
DEPS_DIR="$HOME/.claude/plugins/data/hypermnesia-mcp-cortex-plugins/deps"
PYTHONPATH="${CLAUDE_PLUGIN_ROOT:-/Users/cdeust/.claude/plugins/marketplaces/cortex-plugins}:$DEPS_DIR" \
DATABASE_URL="${DATABASE_URL:-postgresql://localhost:5432/cortex}" \
python3 -c "
import json, asyncio, sys, os
path = 'REPLACE_WITH_PATH_TO_CONVERSATIONS_JSON'
with open(path) as f: data = json.load(f)
from mcp_server.handlers.remember import handler as remember_handler
from datetime import datetime, timezone
imported = 0
for conv in data:
title = conv.get('title', '')
for nid, node in (conv.get('mapping') or {}).items():
msg = node.get('message') or {}
if not msg: continue
role = (msg.get('author') or {}).get('role', '')
if role not in ('user', 'assistant'): continue
parts = msg.get('content', {}).get('parts', [])
text = '\n'.join(str(p) for p in parts if isinstance(p, str))
if len(text) < 30: continue
created_at = None
ct = msg.get('create_time')
if ct:
try: created_at = datetime.fromtimestamp(ct, tz=timezone.utc).isoformat()
except: pass
result = asyncio.run(remember_handler({'content': text[:4000], 'tags': ['imported', 'chatgpt', role], 'domain': title[:50] or 'chatgpt', 'source': 'chatgpt', 'force': False, 'created_at': created_at}))
if result.get('stored'): imported += 1
print(f'Imported {imported} memories from ChatGPT')
"If no export file exists, tell the user: > ChatGPT desktop app stores conversations in binary format — not readable. To import, export from the web: > 1. Go to **chatgpt.com → Settings → Data controls → Export data** > 2. Wait for the email with the download link > 3. Unzip to ~/Downloads/ > 4. Run
Showing the first part of this file.
Cross-platform persistent memory MCP for Codex, Gemini CLI, Claude Code, and other local MCP hosts. 36 cited neuroscience mechanisms, local-first SQLite/PostgreSQL, hybrid retrieval, decay-based consolidation, and reproducible benchmarks. Claude adds optional automatic lifecycle hooks.
Repo: cdeust/Cortex
Other skills on hypermnesia-mcp.
- /cortex-automate
Set up automation — prospective memory triggers, neuro-symbolic rules, and CLAUDE.md sync. Use when the user says 'remind me when', 'trigger when', 'create a rule', 'auto-remember', 'sync to CLAUDE.md', 'push insights', 'set up trigger', 'when I open this file', 'when this
Open skill - /cortex-consolidate
Run memory maintenance — decay old memories, compress stale content, consolidate episodic memories into semantic knowledge, and run sleep-like replay. Use when the user says 'clean up memories', 'consolidate', 'run maintenance', 'compress old memories', 'memory cleanup', or
Open skill - /cortex-debug-memory
Debug and fix memory system issues — validate memories, rate quality, manage protection, forget bad memories, and restore from checkpoints. Use when the user says 'fix memory', 'bad memory', 'wrong memory', 'delete this', 'protect this', 'this memory is wrong', 'memory quality',
Open skill - /cortex-explore-memory
Explore the memory system's state, find gaps in knowledge, assess coverage, and get diagnostic information. Use when the user asks 'what does my memory look like', 'show me memory stats', 'what am I missing', 'how good is my knowledge', 'memory health', 'show coverage', 'find
Open skill - /cortex-navigate-knowledge
Navigate the knowledge graph — trace entity relationships, explore causal chains, drill into memory clusters, and traverse co-access paths. Use when the user asks 'how are these related', 'what connects X to Y', 'show me the knowledge graph', 'trace the relationship', 'what
Open skill - /cortex-profile
View and manage your cognitive profile — how you think, work patterns, blind spots, and cross-domain connections. Use when the user says 'show my profile', 'how do I work', 'what are my patterns', 'cognitive style', 'blind spots', 'methodology', or at the start of a session to
Open skill

