sessions
Manage Claude Code session history, aliases, and session metadata.
Sessions Command
Manage Claude Code session history - list, load, alias, and edit sessions stored in ~/.claude/session-data/ with legacy reads from ~/.claude/sessions/.
Usage
/sessions [list|load|alias|info|help] [options]
Actions
List Sessions
Display all sessions with metadata, filtering, and pagination.
Use /sessions info when you need operator-surface context for a swarm: branch, worktree path, and session recency.
/sessions # List all sessions (default)/sessions list # Same as above/sessions list --limit 10 # Show 10 sessions/sessions list --date 2026-02-01 # Filter by date/sessions list --search abc # Search by session IDScript:
node -e "const _r = (()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();const sm = require(_r + '/scripts/lib/session-manager');const aa = require(_r + '/scripts/lib/session-aliases');const path = require('path');
const result = sm.getAllSessions({ limit: 20 });const aliases = aa.listAliases();const aliasMap = {};for (const a of aliases) aliasMap[a.sessionPath] = a.name;
console.log('Sessions (showing ' + result.sessions.length + ' of ' + result.total + '):');console.log('');console.log('ID Date Time Branch Worktree Alias');console.log('────────────────────────────────────────────────────────────────────');
for (const s of result.sessions) { const alias = aliasMap[s.filename] || ''; const metadata = sm.parseSessionMetadata(sm.getSessionContent(s.sessionPath)); const id = s.shortId === 'no-id' ? '(none)' : s.shortId.slice(0, 8); const time = s.modifiedTime.toTimeString().slice(0, 5); const branch = (metadata.branch || '-').slice(0, 12); const worktree = metadata.worktree ? path.basename(metadata.worktree).slice(0, 18) : '-';
console.log(id.padEnd(8) + ' ' + s.date + ' ' + time + ' ' + branch.padEnd(12) + ' ' + worktree.padEnd(18) + ' ' + alias);}"Load Session
Load and display a session’s content (by ID or alias).
/sessions load <id|alias> # Load session/sessions load 2026-02-01 # By date (for no-id sessions)/sessions load a1b2c3d4 # By short ID/sessions load my-alias # By alias nameScript:
node -e "const _r = (()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();const sm = require(_r + '/scripts/lib/session-manager');const aa = require(_r + '/scripts/lib/session-aliases');const id = process.argv[1];
// First try to resolve as aliasconst resolved = aa.resolveAlias(id);const sessionId = resolved ? resolved.sessionPath : id;
const session = sm.getSessionById(sessionId, true);if (!session) { console.log('Session not found: ' + id); process.exit(1);}
const stats = sm.getSessionStats(session.sessionPath);const size = sm.getSessionSize(session.sessionPath);const aliases = aa.getAliasesForSession(session.filename);
console.log('Session: ' + session.filename);console.log('Path: ' + session.sessionPath);console.log('');console.log('Statistics:');console.log(' Lines: ' + stats.lineCount);console.log(' Total items: ' + stats.totalItems);console.log(' Completed: ' + stats.completedItems);console.log(' In progress: ' + stats.inProgressItems);console.log(' Size: ' + size);console.log('');
if (aliases.length > 0) { console.log('Aliases: ' + aliases.map(a => a.name).join(', ')); console.log('');}
if (session.metadata.title) { console.log('Title: ' + session.metadata.title); console.log('');}
if (session.metadata.started) { console.log('Started: ' + session.metadata.started);}
if (session.metadata.lastUpdated) { console.log('Last Updated: ' + session.metadata.lastUpdated);}
if (session.metadata.project) { console.log('Project: ' + session.metadata.project);}
if (session.metadata.branch) { console.log('Branch: ' + session.metadata.branch);}
if (session.metadata.worktree) { console.log('Worktree: ' + session.metadata.worktree);}" "$ARGUMENTS"Create Alias
Create a memorable alias for a session.
/sessions alias <id> <name> # Create alias/sessions alias 2026-02-01 today-work # Create alias named "today-work"Script:
node -e "const _r = (()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();const sm = require(_r + '/scripts/lib/session-manager');const aa = require(_r + '/scripts/lib/session-aliases');
const sessionId = process.argv[1];const aliasName = process.argv[2];
if (!sessionId || !aliasName) { console.log('Usage: /sessions alias <id> <name>'); process.exit(1);}
// Get session filenameconst session = sm.getSessionById(sessionId);if (!session) { console.log('Session not found: ' + sessionId); process.exit(1);}
const result = aa.setAlias(aliasName, session.filename);if (result.success) { console.log('✓ Alias created: ' + aliasName + ' → ' + session.filename);} else { console.log('✗ Error: ' + result.error); process.exit(1);}" "$ARGUMENTS"Remove Alias
Delete an existing alias.
/sessions alias --remove <name> # Remove alias/sessions unalias <name> # Same as aboveScript:
node -e "const _r = (()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();const aa = require(_r + '/scripts/lib/session-aliases');
const aliasName = process.argv[1];if (!aliasName) { console.log('Usage: /sessions alias --remove <name>'); process.exit(1);}
const result = aa.deleteAlias(aliasName);if (result.success) { console.log('✓ Alias removed: ' + aliasName);} else { console.log('✗ Error: ' + result.error); process.exit(1);}" "$ARGUMENTS"Session Info
Show detailed information about a session.
/sessions info <id|alias> # Show session detailsScript:
node -e "const _r = (()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();const sm = require(_r + '/scripts/lib/session-manager');const aa = require(_r + '/scripts/lib/session-aliases');
const id = process.argv[1];const resolved = aa.resolveAlias(id);const sessionId = resolved ? resolved.sessionPath : id;
const session = sm.getSessionById(sessionId, true);if (!session) { console.log('Session not found: ' + id); process.exit(1);}
const stats = sm.getSessionStats(session.sessionPath);const size = sm.getSessionSize(session.sessionPath);const aliases = aa.getAliasesForSession(session.filename);
console.log('Session Information');console.log('════════════════════');console.log('ID: ' + (session.shortId === 'no-id' ? '(none)' : session.shortId));console.log('Filename: ' + session.filename);console.log('Date: ' + session.date);console.log('Modified: ' + session.modifiedTime.toISOString().slice(0, 19).replace('T', ' '));console.log('Project: ' + (session.metadata.project || '-'));console.log('Branch: ' + (session.metadata.branch || '-'));console.log('Worktree: ' + (session.metadata.worktree || '-'));console.log('');console.log('Content:');console.log(' Lines: ' + stats.lineCount);console.log(' Total items: ' + stats.totalItems);console.log(' Completed: ' + stats.completedItems);console.log(' In progress: ' + stats.inProgressItems);console.log(' Size: ' + size);if (aliases.length > 0) { console.log('Aliases: ' + aliases.map(a => a.name).join(', '));}" "$ARGUMENTS"List Aliases
Show all session aliases.
/sessions aliases # List all aliasesScript:
node -e "const _r = (()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();const aa = require(_r + '/scripts/lib/session-aliases');
const aliases = aa.listAliases();console.log('Session Aliases (' + aliases.length + '):');console.log('');
if (aliases.length === 0) { console.log('No aliases found.');} else { console.log('Name Session File Title'); console.log('─────────────────────────────────────────────────────────────'); for (const a of aliases) { const name = a.name.padEnd(12); const file = (a.sessionPath.length > 30 ? a.sessionPath.slice(0, 27) + '...' : a.sessionPath).padEnd(30); const title = a.title || ''; console.log(name + ' ' + file + ' ' + title); }}"Operator Notes
- Session files persist
Project,Branch, andWorktreein the header so/sessions infocan disambiguate parallel tmux/worktree runs. - For command-center style monitoring, combine
/sessions info,git diff --stat, and the cost metrics emitted byscripts/hooks/cost-tracker.js.
Arguments
$ARGUMENTS:
list [options]- List sessions--limit <n>- Max sessions to show (default: 50)--date <YYYY-MM-DD>- Filter by date--search <pattern>- Search in session ID
load <id|alias>- Load session contentalias <id> <name>- Create alias for sessionalias --remove <name>- Remove aliasunalias <name>- Same as--removeinfo <id|alias>- Show session statisticsaliases- List all aliaseshelp- Show this help
Examples
# List all sessions/sessions list
# Create an alias for today's session/sessions alias 2026-02-01 today
# Load session by alias/sessions load today
# Show session info/sessions info today
# Remove alias/sessions alias --remove today
# List all aliases/sessions aliasesNotes
- Sessions are stored as markdown files in
~/.claude/session-data/with legacy reads from~/.claude/sessions/ - Aliases are stored in
~/.claude/session-aliases.json - Session IDs can be shortened (first 4-8 characters usually unique enough)
- Use aliases for frequently referenced sessions