| name | continues-ai-session-transfer |
| description | Resume AI coding sessions across Claude Code, Cursor, Copilot, Gemini, Codex, and 11+ other tools |
| triggers | ["switch my AI session to another tool","transfer this conversation to gemini","continue this session in cursor","hit the rate limit need to switch tools","export my claude session to copilot","resume my coding session in another AI","hand off this context to codex","migrate my AI conversation between tools"] |
continues-ai-session-transfer
Skill by ara.so — Devtools Skills collection
What it does
continues solves the context-switching problem when AI coding tools hit rate limits or need to be switched mid-session. It extracts conversation history, file changes, tool activity, and working state from one AI coding assistant and transfers it to another. Supports 16 tools with 240+ cross-tool handoff paths.
Supported tools: Claude Code, Codex, GitHub Copilot CLI, Gemini CLI, Cursor, Amp, Cline, Roo Code, Kilo Code, Kiro, Crush, OpenCode, Factory Droid, Antigravity, Kimi CLI, Qwen Code
Installation
No installation required with npx:
npx continues
For permanent installation:
npm install -g continues
This gives you both continues and cont as global commands.
Requirements: Node.js 22.5+ (uses built-in node:sqlite)
Core commands
Interactive session picker
Launch the TUI to select any session across all tools:
continues
Automatically prioritizes sessions from the current project directory.
Quick resume in same tool
Resume the most recent (or Nth most recent) session from a specific tool:
continues claude
continues codex 3
continues cursor
continues gemini
continues cline
continues amp
Works for all 16 supported tools. Uses native resume with full history.
Cross-tool handoff
Transfer a session from one tool to another:
continues resume abc123 --in gemini
continues resume abc123 --in codex --yolo --search
continues resume abc123 --in cursor --add-dir /tmp/shared
continues resume abc123 --in gemini --debug-prompt
List sessions
continues list
continues list --source claude
continues list --json
continues list --jsonl
continues list -n 10
Inspect session details
View detailed diagnostic information about a session:
continues inspect abc123
continues inspect abc123 --preset full --write-md handoff.md
continues inspect abc123 --truncate 50
Bulk export sessions
Export all sessions to files for backup or analysis:
continues dump all ./sessions
continues dump claude ./sessions/claude
continues dump cursor ./sessions/cursor
continues dump all ./sessions --json
continues dump all ./sessions --preset full
continues dump all ./sessions --limit 50
Output files: {source}_{id}.md or {source}_{id}.json
Scan and rebuild index
continues scan
continues rebuild
continues scan --rebuild
Session index cached at ~/.continues/sessions.jsonl (5-minute TTL).
Configuration
Verbosity presets
Control how much context gets transferred:
| Preset | Messages | Tool samples | Use case |
|---|
minimal | 3 | 0 | Token-constrained transfers |
standard | 10 | 5 | Default balanced handoff |
verbose | 20 | 10 | Complex multi-file tasks |
full | 50 | All | Complete session capture |
continues resume abc123 --preset verbose --in gemini
continues inspect abc123 --preset full
continues dump all ./backup --preset minimal
YAML configuration
Create .continues.yml in your project root:
preset: verbose
recentMessages: 15
shell:
maxSamples: 10
stdoutLines: 20
files:
maxSamples: 8
thinking:
maxChars: 2000
keyDecisions:
maxCount: 5
Configuration resolution order:
--config <path> flag
.continues.yml in current directory
~/.continues/config.yml (global)
standard preset (default)
Environment variable overrides
Customize tool data directories:
export CLAUDE_CONFIG_DIR="$HOME/.config/claude"
export CODEX_HOME="$HOME/.local/codex"
export GEMINI_CLI_HOME="$HOME/.gemini-custom"
export XDG_DATA_HOME="$HOME/.local/share"
Code examples
TypeScript: Programmatic session access
import { SessionRegistry } from 'continues';
import { ClaudeParser } from 'continues/parsers';
const registry = new SessionRegistry();
await registry.scan();
const claudeSessions = registry.getSessions('claude');
const projectSessions = registry.getSessionsForProject(process.cwd());
const parser = new ClaudeParser();
const sessionData = await parser.parse('~/.claude/projects/abc123/session.jsonl');
console.log(`Messages: ${sessionData.messages.length}`);
console.log(`Files touched: ${sessionData.files.length}`);
console.log(`Shell commands: ${sessionData.shell.length}`);
TypeScript: Custom handoff generation
import { HandoffGenerator } from 'continues/handoff';
import { SessionParser } from 'continues/parsers';
const parser = SessionParser.forTool('claude');
const session = await parser.parse(sessionPath);
const generator = new HandoffGenerator({
preset: 'verbose',
recentMessages: 20,
shell: { maxSamples: 15 }
});
const handoffDoc = generator.generate(session, {
sourceId: 'abc123',
sourceTool: 'claude',
targetTool: 'gemini'
});
await fs.writeFile('handoff.md', handoffDoc);
TypeScript: Adding a custom parser
import type { SessionData, BaseParser } from '../types';
export class MyToolParser implements BaseParser {
readonly name = 'mytool';
readonly format = 'json';
getSessionPaths(): string[] {
return [`${process.env.HOME}/.mytool/sessions/*.json`];
}
async parse(filePath: string): Promise<SessionData> {
const raw = JSON.parse(await fs.readFile(filePath, 'utf-8'));
return {
id: raw.id,
source: 'mytool',
projectPath: raw.workspace,
timestamp: new Date(raw.created_at),
messages: raw.chat.map(msg => ({
role: msg.role,
content: msg.,
: (msg.)
})),
: raw..( ({
: f.,
: f.,
: f.
})),
: raw..( ({
: cmd.,
: cmd.,
: cmd.,
: (cmd.)
})),
: {
: raw.,
: raw.?.,
: raw.?.
}
};
}
}
import { MyToolParser } from './mytool';
export const PARSERS = {
mytool: MyToolParser,
} as const;
export const TOOL_NAMES = [
'claude', 'codex', 'cursor', 'gemini', 'copilot',
'mytool'
] as const;
Session storage locations
Where continues looks for session data:
~/.claude/projectsagent-transcriptschats
<vscode-data>/globalStorage/rooveterinaryinc.roo-cline/tasks
All reads are read-only — continues never modifies source session files.
Common patterns
Rate limit recovery workflow
continues resume $(continues list --source claude -n 1 --json | jq -r '.[0].id') --in gemini --preset verbose
continues
Daily session backup
#!/bin/bash
DATE=$(date +%Y-%m-%d)
continues dump all "./backups/$DATE" --preset full --json
Project-specific handoff script
preset: verbose
recentMessages: 25
shell:
maxSamples: 15
LAST_SESSION=$(continues list -n 1 --json | jq -r '.[0].id')
continues resume "$LAST_SESSION" --in codex --yolo
Cross-tool testing
claude start "Implement auth middleware"
continues resume $(continues list --source claude -n 1 --json | jq -r '.[0].id') --in cursor
continues resume $(continues list --source cursor -n 1 --json | jq -r '.[0].id') --in gemini --debug-prompt
What gets transferred
Every handoff document includes:
- Recent messages: User/assistant conversation (3-50 messages based on preset)
- File changes: Edits, reads, writes with full paths
- Tool activity: Shell commands with output/exit codes, grep/glob results, MCP calls
- Key decisions: Architectural notes, debugging insights from thinking blocks
- Session metadata: Model, tokens, cache usage, timestamps
- Original session path: Full file path for traceability
Example handoff structure:
## Session Context
**Source**: claude (session: abc123)
**Project**: ~/dev/my-app
**Started**: 2026-02-19 05:28
**Model**: claude-sonnet-4
**Tokens**: 45,230 in / 12,847 out
## Recent Conversation
[Last 10 messages with timestamps and roles]
## Tool Activity
- **Bash** (×47): `npm test → exit 0`, `git status → exit 0`
- **Edit** (×12): `edit src/auth.ts`, `edit tests/auth.test.ts`
- **Grep** (×8): `grep "handleLogin" src/`
## Key Decisions
- Need to handle token refresh race with logout
- Using JWT short-lived tokens (15min) + refresh tokens
- Middleware order: auth → rate-limit → routes
## Files Modified
- src/auth.ts (edited)
- src/api/routes.ts (edited)
- tests/auth.test.ts (created)
Troubleshooting
No sessions found
continues scan
which claude codex cursor gemini
continues rebuild
Session parsing fails
continues inspect abc123 --verbose
file ~/.claude/projects/abc123/session.jsonl
continues resume abc123 --in gemini --preset minimal
Target tool doesn't receive context
continues resume abc123 --in cursor --debug-prompt
ls -la ~/.continues/handoffs/
echo "test" | cursor
VS Code extension sessions not found
export XDG_DATA_HOME="$HOME/.config"
~/Library/Application Support/Code/User/globalStorage/
continues rebuild
Symlink directories skipped
The scanner now handles symlinks correctly, but if you have custom symlinked session directories:
ls -la ~/.claude/projects
readlink ~/.claude/projects
stat ~/.claude/projects
Zero token counts showing
If sessions show "0 in / 0 out", the source tool doesn't track token usage in that session format. This is normal for some tools. Use --verbose to see other metadata:
continues inspect abc123 --verbose
Global flags
--config <path>
--preset <name>
--verbose
--debug
--in <tool>
--debug-prompt
Session index
continues maintains a local index at ~/.continues/sessions.jsonl:
- Auto-refreshes every 5 minutes
- Rebuilt with
continues rebuild or --rebuild flag
- Stores session ID, source, path, timestamp, project path
- Read-only — never modifies source session files
Development notes
When adding new tool support:
- Create parser in
src/parsers/<tool>.ts implementing BaseParser
- Add tool name to
src/types/tool-names.ts
- Register in
src/parsers/registry.ts
- Compile-time completeness check ensures no missing parsers
The registry enforces that every tool in TOOL_NAMES has a corresponding parser entry.