# Sessions 指令

管理、列出及檢索過往的會話歷史。

## 使用方式

`/sessions [list|load|alias|info|aliases|help] [arguments]`

## 子指令

### 列出會話 (List Sessions)

顯示最近會話的列表。

```bash
/sessions list                        # 顯示最近 50 個會話
/sessions list --limit 10             # 僅顯示最近 10 個會話
/sessions list --date 2026-02-01      # 篩選特定日期的會話
```

**腳本：**
```bash
node -e "
const sm = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-manager');
const aa = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-aliases');

const result = sm.listSessions();
const aliasMap = aa.getAliasMap();

console.log('會話列表 (最近 ' + result.sessions.length + ' 個)：');
console.log('');
console.log('ID        日期        時間     大小     行數   別名 (Alias)');
console.log('────────────────────────────────────────────────────');

for (const s of result.sessions) {
  const alias = aliasMap[s.filename] || '';
  const size = sm.getSessionSize(s.sessionPath);
  const stats = sm.getSessionStats(s.sessionPath);
  const id = s.shortId === 'no-id' ? '(無)' : s.shortId.slice(0, 8);
  const time = s.modifiedTime.toTimeString().slice(0, 5);

  console.log(id.padEnd(8) + ' ' + s.date + '  ' + time + '   ' + size.padEnd(7) + '  ' + String(stats.lineCount).padEnd(5) + '  ' + alias);
}
"
```

### 載入會話 (Load Session)

載入並顯示會話內容 (透過 ID 或別名)。

```bash
/sessions load <id|alias>             # 載入會話
/sessions load 2026-02-01             # 依日期 (針對無 ID 的會話)
/sessions load a1b2c3d4               # 依短 ID
/sessions load my-alias               # 依別名
```

**腳本：**
```bash
node -e "
const sm = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-manager');
const aa = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/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('找不到會話：' + 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.filename);
console.log('路徑：~/.claude/sessions/' + session.filename);
console.log('');
console.log('統計數據：');
console.log('  行數：' + stats.lineCount);
console.log('  總項目數：' + stats.totalItems);
console.log('  已完成：' + stats.completedItems);
console.log('  進行中：' + stats.inProgressItems);
console.log('  大小：' + size);
console.log('');

if (aliases.length > 0) {
  console.log('別名：' + aliases.map(a => a.name).join(', '));
  console.log('');
}

if (session.metadata.title) {
  console.log('標題：' + session.metadata.title);
  console.log('');
}

if (session.metadata.started) {
  console.log('開始時間：' + session.metadata.started);
}

if (session.metadata.lastUpdated) {
  console.log('最後更新：' + session.metadata.lastUpdated);
}
" \"$ARGUMENTS\"
```

### 建立別名 (Create Alias)

為會話建立一個好記的別名。

```bash
/sessions alias <id> <name>           # 建立別名
/sessions alias 2026-02-01 today-work # 建立名為 \"today-work\" 的別名
```

**腳本：**
```bash
node -e "
const sm = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-manager');
const aa = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-aliases');

const sessionId = process.argv[1];
const aliasName = process.argv[2];

if (!sessionId || !aliasName) {
  console.log('用法：/sessions alias <id> <名稱>');
  process.exit(1);
}

// 獲取會話檔名
const session = sm.getSessionById(sessionId);
if (!session) {
  console.log('找不到會話：' + sessionId);
  process.exit(1);
}

const result = aa.setAlias(aliasName, session.filename);
if (result.success) {
  console.log('✓ 別名已建立：' + aliasName + ' → ' + session.filename);
} else {
  console.log('✗ 錯誤：' + result.error);
  process.exit(1);
}
" \"$ARGUMENTS\"
```

### 移除別名 (Remove Alias)

刪除現有的別名。

```bash
/sessions alias --remove <名稱>        # 移除別名
/sessions unalias <名稱>               # 同上
```

**腳本：**
```bash
node -e "
const aa = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-aliases');

const aliasName = process.argv[1];
if (!aliasName) {
  console.log('用法：/sessions alias --remove <名稱>');
  process.exit(1);
}

const result = aa.deleteAlias(aliasName);
if (result.success) {
  console.log('✓ 別名已移除：' + aliasName);
} else {
  console.log('✗ 錯誤：' + result.error);
  process.exit(1);
}
" \"$ARGUMENTS\"
```

### 會話資訊 (Session Info)

顯示關於會話的詳細資訊。

```bash
/sessions info <id|alias>              # 顯示會話詳情
```

**腳本：**
```bash
node -e "
const sm = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-manager');
const aa = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/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('找不到會話：' + id);
  process.exit(1);
}

const stats = sm.getSessionStats(session.sessionPath);
const size = sm.getSessionSize(session.sessionPath);
const aliases = aa.getAliasesForSession(session.filename);

console.log('會話資訊');
console.log('════════════════════');
console.log('ID:          ' + (session.shortId === 'no-id' ? '(無)' : session.shortId));
console.log('檔案名稱:    ' + session.filename);
console.log('日期:        ' + session.date);
console.log('修改時間:    ' + session.modifiedTime.toISOString().slice(0, 19).replace('T', ' '));
console.log('');
console.log('內容：');
console.log('  行數：         ' + stats.lineCount);
console.log('  總項目數：     ' + stats.totalItems);
console.log('  已完成：       ' + stats.completedItems);
console.log('  進行中：       ' + stats.inProgressItems);
console.log('  大小：         ' + size);
if (aliases.length > 0) {
  console.log('別名：         ' + aliases.map(a => a.name).join(', '));
}
" \"$ARGUMENTS\"
```

### 列出別名 (List Aliases)

顯示所有會話別名。

```bash
/sessions aliases                      # 列出所有別名
```

**腳本：**
```bash
node -e "
const aa = require((process.env.CLAUDE_PLUGIN_ROOT||require('path').join(require('os').homedir(),'.claude'))+'/scripts/lib/session-aliases');

const aliases = aa.listAliases();
console.log('會話別名 (' + aliases.length + ')：');
console.log('');

if (aliases.length === 0) {
  console.log('找不到別名。');
} else {
  console.log('名稱          會話檔案                        標題');
  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);
  }
}
"
```

## 參數說明 (Arguments)

$ARGUMENTS：
- `list [options]` - 列出會話
  - `--limit <n>` - 顯示的最大會話數 (預設：50)
  - `--date <YYYY-MM-DD>` - 依日期篩選
  - `--search <pattern>` - 在會話 ID 中搜尋
- `load <id|alias>` - 載入會話內容
- `alias <id> <名稱>` - 為會話建立別名
- `alias --remove <名稱>` - 移除別名
- `unalias <名稱>` - 同 `--remove`
- `info <id|alias>` - 顯示會話統計數據
- `aliases` - 列出所有別名
- `help` - 顯示此說明

## 範例

```bash
# 列出所有會話
/sessions list

# 為今天的會話建立別名
/sessions alias 2026-02-01 today

# 透過別名載入會話
/sessions load today

# 顯示會話資訊
/sessions info today

# 移除別名
/sessions alias --remove today

# 列出所有別名
/sessions aliases
```

## 注意事項

- 會話以 Markdown 檔案形式儲存在 `~/.claude/sessions/`。
- 別名儲存在 `~/.claude/session-aliases.json`。
- 會話 ID 可以縮短 (前 4-8 個字元通常已足夠唯一)。
- 對於頻繁參考的會話，請使用別名。
