302 lines
9.1 KiB
Markdown
302 lines
9.1 KiB
Markdown
# 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 個字元通常已足夠唯一)。
|
||
- 對於頻繁參考的會話,請使用別名。
|