Skip to main content
Kodelyth ECC
Command

/sessions

Manage Claude Code session history, aliases, and session metadata.

Run:/sessions

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 ID

Script:

node -e "
const sm = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/scripts/lib/session-manager');
const aa = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/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 name

Script:

node -e "
const sm = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/scripts/lib/session-manager');
const aa = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/scripts/lib/session-aliases');
const id = process.argv[1];

// First try to resolve as alias 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: ' + 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 sm = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/scripts/lib/session-manager');
const aa = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/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 filename const 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 above

Script:

node -e "
const aa = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/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 details

Script:

node -e "
const sm = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/scripts/lib/session-manager');
const aa = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/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 aliases

Script:

node -e "
const aa = require((()=>{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;try{var b=p.join(d,'plugins','cache','kodelyth-ecc');for(var o of f.readdirSync(b))for(var v of f.readdirSync(p.join(b,o))){var c=p.join(b,o,v);if(f.existsSync(p.join(c,q)))return c}}catch(x){}return d})()+'/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, and Worktree in the header so /sessions info can disambiguate parallel tmux/worktree runs.
  • For command-center style monitoring, combine /sessions info, git diff --stat, and the cost metrics emitted by scripts/hooks/cost-tracker.js.

Arguments

$ARGUMENTS:

  • list [options] - List sessions
- --limit - Max sessions to show (default: 50) - --date - Filter by date - --search - Search in session ID
  • load - Load session content
  • alias - Create alias for session
  • alias --remove - Remove alias
  • unalias - Same as --remove
  • info - Show session statistics
  • aliases - List all aliases
  • help - 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 aliases

Notes

  • 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