@vamdawn/cconvo 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +213 -0
- package/dist/cli.js.map +1 -0
- package/dist/completion.d.ts +7 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +227 -0
- package/dist/completion.js.map +1 -0
- package/dist/core/parser.d.ts +12 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +178 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/scanner.d.ts +9 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +109 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/exporters/html.d.ts +3 -0
- package/dist/exporters/html.d.ts.map +1 -0
- package/dist/exporters/html.js +288 -0
- package/dist/exporters/html.js.map +1 -0
- package/dist/exporters/index.d.ts +7 -0
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +40 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/json.d.ts +3 -0
- package/dist/exporters/json.d.ts.map +1 -0
- package/dist/exporters/json.js +45 -0
- package/dist/exporters/json.js.map +1 -0
- package/dist/exporters/markdown.d.ts +3 -0
- package/dist/exporters/markdown.d.ts.map +1 -0
- package/dist/exporters/markdown.js +87 -0
- package/dist/exporters/markdown.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +2 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +348 -0
- package/dist/interactive.js.map +1 -0
- package/dist/models/types.d.ts +158 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +2 -0
- package/dist/models/types.js.map +1 -0
- package/dist/utils/format.d.ts +13 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +104 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/path.d.ts +10 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +37 -0
- package/dist/utils/path.js.map +1 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 vamdawn
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# CConvo
|
|
2
|
+
|
|
3
|
+
交互式 CLI 工具,用于浏览和导出 Claude Code 本地保存的对话记录。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 扫描并列出所有项目和对话
|
|
8
|
+
- 支持导出为 Markdown、JSON、HTML 格式
|
|
9
|
+
- 交互式菜单界面,支持项目浏览和搜索
|
|
10
|
+
- 统计视图,显示 Token 使用量和文件大小
|
|
11
|
+
- 支持子代理 (subagent) 对话
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 安装依赖
|
|
17
|
+
pnpm install
|
|
18
|
+
|
|
19
|
+
# 构建
|
|
20
|
+
pnpm build
|
|
21
|
+
|
|
22
|
+
# 全局安装
|
|
23
|
+
pnpm link --global
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 使用方法
|
|
27
|
+
|
|
28
|
+
### 交互式模式
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
cconvo
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
进入交互式界面,可以:
|
|
35
|
+
- 浏览项目列表
|
|
36
|
+
- 搜索对话
|
|
37
|
+
- 预览对话内容
|
|
38
|
+
- 选择导出格式和选项
|
|
39
|
+
|
|
40
|
+
### 命令行模式
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 列出所有项目和对话
|
|
44
|
+
cconvo list
|
|
45
|
+
|
|
46
|
+
# 按项目名筛选
|
|
47
|
+
cconvo list --project "my-project"
|
|
48
|
+
|
|
49
|
+
# 导出对话为 Markdown
|
|
50
|
+
cconvo export <session-id> -o output.md
|
|
51
|
+
|
|
52
|
+
# 导出为 HTML
|
|
53
|
+
cconvo export <session-id> --format html -o output.html
|
|
54
|
+
|
|
55
|
+
# 导出为 JSON
|
|
56
|
+
cconvo export <session-id> --format json -o output.json
|
|
57
|
+
|
|
58
|
+
# 导出选项
|
|
59
|
+
cconvo export <session-id> -o output.md \
|
|
60
|
+
--no-thinking # 不包含思考过程
|
|
61
|
+
--no-tools # 不包含工具调用
|
|
62
|
+
--subagents # 包含子代理对话
|
|
63
|
+
|
|
64
|
+
# 查看统计信息
|
|
65
|
+
cconvo stats
|
|
66
|
+
cconvo stats --project "my-project"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 开发模式
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
pnpm dev # 交互式模式
|
|
73
|
+
pnpm dev list # 列出对话
|
|
74
|
+
pnpm dev export <id> # 导出对话
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 导出格式
|
|
78
|
+
|
|
79
|
+
| 格式 | 说明 |
|
|
80
|
+
|------|------|
|
|
81
|
+
| Markdown | 适合阅读和二次编辑,支持折叠显示思考过程和工具调用 |
|
|
82
|
+
| JSON | 完整数据导出,保留所有元信息 |
|
|
83
|
+
| HTML | 带暗色主题样式的可视化页面,支持交互式展开/折叠 |
|
|
84
|
+
|
|
85
|
+
## 数据源
|
|
86
|
+
|
|
87
|
+
工具读取 `~/.claude/projects` 目录下的对话数据:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
~/.claude/
|
|
91
|
+
├── history.jsonl # 全局对话历史
|
|
92
|
+
└── projects/
|
|
93
|
+
└── -Users-xxx-Repository-xxx/ # 项目目录
|
|
94
|
+
├── {sessionId}.jsonl # 主对话文件
|
|
95
|
+
└── {sessionId}/
|
|
96
|
+
└── subagents/
|
|
97
|
+
└── agent-{id}.jsonl # 子代理对话
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 项目结构
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
cconvo/
|
|
104
|
+
├── src/
|
|
105
|
+
│ ├── index.ts # 入口文件
|
|
106
|
+
│ ├── cli.ts # CLI 命令定义
|
|
107
|
+
│ ├── interactive.ts # 交互式界面
|
|
108
|
+
│ ├── core/
|
|
109
|
+
│ │ ├── scanner.ts # 扫描对话目录
|
|
110
|
+
│ │ └── parser.ts # 解析 JSONL 文件
|
|
111
|
+
│ ├── models/
|
|
112
|
+
│ │ └── types.ts # TypeScript 类型定义
|
|
113
|
+
│ ├── exporters/
|
|
114
|
+
│ │ ├── markdown.ts # Markdown 导出
|
|
115
|
+
│ │ ├── json.ts # JSON 导出
|
|
116
|
+
│ │ └── html.ts # HTML 导出
|
|
117
|
+
│ └── utils/
|
|
118
|
+
│ ├── path.ts # 路径工具
|
|
119
|
+
│ └── format.ts # 格式化工具
|
|
120
|
+
├── package.json
|
|
121
|
+
└── tsconfig.json
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 技术栈
|
|
125
|
+
|
|
126
|
+
- TypeScript
|
|
127
|
+
- Commander.js - CLI 框架
|
|
128
|
+
- Inquirer.js - 交互式提示
|
|
129
|
+
- Chalk - 终端颜色
|
|
130
|
+
- Ora - 加载动画
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAiP9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import Table from 'cli-table3';
|
|
5
|
+
import { scanProjects, findConversation } from './core/scanner.js';
|
|
6
|
+
import { parseConversation } from './core/parser.js';
|
|
7
|
+
import { exportConversation, getFileExtension } from './exporters/index.js';
|
|
8
|
+
import { formatDateTime, formatSize } from './utils/format.js';
|
|
9
|
+
import { generateCompletion } from './completion.js';
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('cconvo')
|
|
13
|
+
.description('Interactive CLI tool to browse and export Claude Code conversations')
|
|
14
|
+
.version('1.0.0');
|
|
15
|
+
// list 命令
|
|
16
|
+
program
|
|
17
|
+
.command('list')
|
|
18
|
+
.description('List all projects and conversations')
|
|
19
|
+
.option('-p, --project <name>', 'Filter by project name')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
const spinner = ora('Scanning conversations...').start();
|
|
22
|
+
try {
|
|
23
|
+
const result = await scanProjects();
|
|
24
|
+
spinner.stop();
|
|
25
|
+
if (result.projects.length === 0) {
|
|
26
|
+
console.log(chalk.yellow('No conversations found.'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// 过滤项目
|
|
30
|
+
let projects = result.projects;
|
|
31
|
+
if (options.project) {
|
|
32
|
+
projects = projects.filter(p => p.name.toLowerCase().includes(options.project.toLowerCase()) ||
|
|
33
|
+
p.originalPath.toLowerCase().includes(options.project.toLowerCase()));
|
|
34
|
+
}
|
|
35
|
+
if (projects.length === 0) {
|
|
36
|
+
console.log(chalk.yellow(`No projects matching "${options.project}"`));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// 显示概览
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(chalk.bold(`Found ${chalk.cyan(result.totalConversations)} conversations in ${chalk.cyan(projects.length)} projects`));
|
|
42
|
+
console.log(chalk.gray(`Total size: ${formatSize(result.totalSize)}`));
|
|
43
|
+
console.log();
|
|
44
|
+
// 显示每个项目
|
|
45
|
+
for (const project of projects) {
|
|
46
|
+
console.log(chalk.bold.blue(`📁 ${project.name}`));
|
|
47
|
+
console.log(chalk.gray(` ${project.originalPath}`));
|
|
48
|
+
console.log(chalk.gray(` ${project.totalConversations} conversations, ${formatSize(project.totalSize)}`));
|
|
49
|
+
console.log();
|
|
50
|
+
// 显示对话列表
|
|
51
|
+
const table = new Table({
|
|
52
|
+
head: [
|
|
53
|
+
chalk.gray('Session ID'),
|
|
54
|
+
chalk.gray('Slug'),
|
|
55
|
+
chalk.gray('Time'),
|
|
56
|
+
chalk.gray('Messages'),
|
|
57
|
+
chalk.gray('Size'),
|
|
58
|
+
],
|
|
59
|
+
style: { head: [], border: [] },
|
|
60
|
+
colWidths: [40, 30, 22, 10, 12],
|
|
61
|
+
});
|
|
62
|
+
for (const conv of project.conversations.slice(0, 10)) {
|
|
63
|
+
table.push([
|
|
64
|
+
conv.sessionId.slice(0, 36),
|
|
65
|
+
conv.slug ? conv.slug.slice(0, 28) : '-',
|
|
66
|
+
formatDateTime(conv.startTime).slice(0, 19),
|
|
67
|
+
conv.messageCount.toString(),
|
|
68
|
+
formatSize(conv.fileSize),
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
console.log(table.toString());
|
|
72
|
+
if (project.conversations.length > 10) {
|
|
73
|
+
console.log(chalk.gray(` ... and ${project.conversations.length - 10} more conversations`));
|
|
74
|
+
}
|
|
75
|
+
console.log();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
spinner.fail('Failed to scan conversations');
|
|
80
|
+
console.error(chalk.red(error.message));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// export 命令
|
|
85
|
+
program
|
|
86
|
+
.command('export <sessionId>')
|
|
87
|
+
.description('Export a conversation')
|
|
88
|
+
.option('-f, --format <format>', 'Export format (markdown, json, html)', 'markdown')
|
|
89
|
+
.option('-o, --output <path>', 'Output file path')
|
|
90
|
+
.option('--no-thinking', 'Exclude thinking blocks')
|
|
91
|
+
.option('--no-tools', 'Exclude tool calls')
|
|
92
|
+
.option('--subagents', 'Include subagent conversations')
|
|
93
|
+
.action(async (sessionId, options) => {
|
|
94
|
+
const spinner = ora('Finding conversation...').start();
|
|
95
|
+
try {
|
|
96
|
+
const found = await findConversation(sessionId);
|
|
97
|
+
if (!found) {
|
|
98
|
+
spinner.fail(`Conversation not found: ${sessionId}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
spinner.text = 'Parsing conversation...';
|
|
102
|
+
const conversation = await parseConversation(found.conversation.filePath, found.project.originalPath);
|
|
103
|
+
spinner.text = 'Exporting...';
|
|
104
|
+
const outputPath = options.output ||
|
|
105
|
+
`${conversation.slug || conversation.sessionId}${getFileExtension(options.format)}`;
|
|
106
|
+
const exportOptions = {
|
|
107
|
+
format: options.format,
|
|
108
|
+
includeThinking: options.thinking !== false,
|
|
109
|
+
includeToolCalls: options.tools !== false,
|
|
110
|
+
includeSubagents: options.subagents || false,
|
|
111
|
+
outputPath,
|
|
112
|
+
};
|
|
113
|
+
await exportConversation(conversation, exportOptions);
|
|
114
|
+
spinner.succeed(`Exported to ${chalk.green(outputPath)}`);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
spinner.fail('Export failed');
|
|
118
|
+
console.error(chalk.red(error.message));
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// stats 命令
|
|
123
|
+
program
|
|
124
|
+
.command('stats')
|
|
125
|
+
.description('Show conversation statistics')
|
|
126
|
+
.option('-p, --project <name>', 'Filter by project name')
|
|
127
|
+
.action(async (options) => {
|
|
128
|
+
const spinner = ora('Calculating statistics...').start();
|
|
129
|
+
try {
|
|
130
|
+
const result = await scanProjects();
|
|
131
|
+
spinner.stop();
|
|
132
|
+
// 过滤项目
|
|
133
|
+
let projects = result.projects;
|
|
134
|
+
if (options.project) {
|
|
135
|
+
projects = projects.filter(p => p.name.toLowerCase().includes(options.project.toLowerCase()));
|
|
136
|
+
}
|
|
137
|
+
console.log();
|
|
138
|
+
console.log(chalk.bold('📊 Statistics'));
|
|
139
|
+
console.log();
|
|
140
|
+
// 总体统计
|
|
141
|
+
const totalConversations = projects.reduce((sum, p) => sum + p.totalConversations, 0);
|
|
142
|
+
const totalSize = projects.reduce((sum, p) => sum + p.totalSize, 0);
|
|
143
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
144
|
+
console.log(`${chalk.bold('Projects:')} ${chalk.cyan(projects.length)}`);
|
|
145
|
+
console.log(`${chalk.bold('Conversations:')} ${chalk.cyan(totalConversations)}`);
|
|
146
|
+
console.log(`${chalk.bold('Total Size:')} ${chalk.cyan(formatSize(totalSize))}`);
|
|
147
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
148
|
+
console.log();
|
|
149
|
+
// 项目统计表
|
|
150
|
+
const table = new Table({
|
|
151
|
+
head: [
|
|
152
|
+
chalk.gray('Project'),
|
|
153
|
+
chalk.gray('Conversations'),
|
|
154
|
+
chalk.gray('Size'),
|
|
155
|
+
],
|
|
156
|
+
style: { head: [], border: [] },
|
|
157
|
+
colWidths: [35, 15, 15],
|
|
158
|
+
});
|
|
159
|
+
for (const project of projects.slice(0, 20)) {
|
|
160
|
+
table.push([
|
|
161
|
+
project.name.slice(0, 33),
|
|
162
|
+
project.totalConversations.toString(),
|
|
163
|
+
formatSize(project.totalSize),
|
|
164
|
+
]);
|
|
165
|
+
}
|
|
166
|
+
console.log(table.toString());
|
|
167
|
+
if (projects.length > 20) {
|
|
168
|
+
console.log(chalk.gray(`\n... and ${projects.length - 20} more projects`));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
spinner.fail('Failed to calculate statistics');
|
|
173
|
+
console.error(chalk.red(error.message));
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
// completion 命令
|
|
178
|
+
program
|
|
179
|
+
.command('completion [shell]')
|
|
180
|
+
.description('Generate shell completion script (bash, zsh, fish)')
|
|
181
|
+
.action((shell) => {
|
|
182
|
+
const validShells = ['bash', 'zsh', 'fish'];
|
|
183
|
+
if (!shell) {
|
|
184
|
+
console.log(chalk.bold('Usage: cconvo completion <shell>'));
|
|
185
|
+
console.log();
|
|
186
|
+
console.log('Generate shell completion scripts for cconvo.');
|
|
187
|
+
console.log();
|
|
188
|
+
console.log(chalk.bold('Supported shells:'));
|
|
189
|
+
console.log(' bash Bash shell completion');
|
|
190
|
+
console.log(' zsh Zsh shell completion');
|
|
191
|
+
console.log(' fish Fish shell completion');
|
|
192
|
+
console.log();
|
|
193
|
+
console.log(chalk.bold('Examples:'));
|
|
194
|
+
console.log(chalk.gray(' # Bash'));
|
|
195
|
+
console.log(' cconvo completion bash >> ~/.bashrc');
|
|
196
|
+
console.log();
|
|
197
|
+
console.log(chalk.gray(' # Zsh'));
|
|
198
|
+
console.log(' cconvo completion zsh > ~/.zsh/completions/_cconvo');
|
|
199
|
+
console.log();
|
|
200
|
+
console.log(chalk.gray(' # Fish'));
|
|
201
|
+
console.log(' cconvo completion fish > ~/.config/fish/completions/cconvo.fish');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (!validShells.includes(shell)) {
|
|
205
|
+
console.error(chalk.red(`Error: Unsupported shell "${shell}"`));
|
|
206
|
+
console.error(`Supported shells: ${validShells.join(', ')}`);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
const completionScript = generateCompletion(shell);
|
|
210
|
+
console.log(completionScript);
|
|
211
|
+
});
|
|
212
|
+
export { program };
|
|
213
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function generateBashCompletion(): string;
|
|
2
|
+
export declare function generateZshCompletion(): string;
|
|
3
|
+
export declare function generateFishCompletion(): string;
|
|
4
|
+
export type ShellType = 'bash' | 'zsh' | 'fish';
|
|
5
|
+
export declare function generateCompletion(shell: ShellType): string;
|
|
6
|
+
export declare function getInstallInstructions(shell: ShellType): string;
|
|
7
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AAMA,wBAAgB,sBAAsB,IAAI,MAAM,CAqF/C;AAGD,wBAAgB,qBAAqB,IAAI,MAAM,CAoE9C;AAGD,wBAAgB,sBAAsB,IAAI,MAAM,CA6B/C;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEhD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAW3D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAsB/D"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// Shell 自动补全脚本生成器
|
|
2
|
+
const COMMANDS = ['list', 'export', 'stats', 'completion'];
|
|
3
|
+
const FORMATS = ['markdown', 'json', 'html'];
|
|
4
|
+
// Bash 补全脚本
|
|
5
|
+
export function generateBashCompletion() {
|
|
6
|
+
return `# cconvo bash completion
|
|
7
|
+
# 安装方法: cconvo completion bash >> ~/.bashrc && source ~/.bashrc
|
|
8
|
+
|
|
9
|
+
_cconvo_completions() {
|
|
10
|
+
local cur prev words cword
|
|
11
|
+
_init_completion || return
|
|
12
|
+
|
|
13
|
+
local commands="list export stats completion"
|
|
14
|
+
local formats="markdown json html"
|
|
15
|
+
|
|
16
|
+
case "$prev" in
|
|
17
|
+
cconvo)
|
|
18
|
+
COMPREPLY=($(compgen -W "$commands" -- "$cur"))
|
|
19
|
+
return
|
|
20
|
+
;;
|
|
21
|
+
-f|--format)
|
|
22
|
+
COMPREPLY=($(compgen -W "$formats" -- "$cur"))
|
|
23
|
+
return
|
|
24
|
+
;;
|
|
25
|
+
-p|--project)
|
|
26
|
+
# 动态获取项目列表
|
|
27
|
+
local projects
|
|
28
|
+
projects=$(cconvo list 2>/dev/null | grep "^📁" | sed 's/^📁 //' || echo "")
|
|
29
|
+
COMPREPLY=($(compgen -W "$projects" -- "$cur"))
|
|
30
|
+
return
|
|
31
|
+
;;
|
|
32
|
+
-o|--output)
|
|
33
|
+
# 文件路径补全
|
|
34
|
+
_filedir
|
|
35
|
+
return
|
|
36
|
+
;;
|
|
37
|
+
list)
|
|
38
|
+
COMPREPLY=($(compgen -W "-p --project" -- "$cur"))
|
|
39
|
+
return
|
|
40
|
+
;;
|
|
41
|
+
export)
|
|
42
|
+
if [[ "$cur" == -* ]]; then
|
|
43
|
+
COMPREPLY=($(compgen -W "-f --format -o --output --no-thinking --no-tools --subagents" -- "$cur"))
|
|
44
|
+
fi
|
|
45
|
+
return
|
|
46
|
+
;;
|
|
47
|
+
stats)
|
|
48
|
+
COMPREPLY=($(compgen -W "-p --project" -- "$cur"))
|
|
49
|
+
return
|
|
50
|
+
;;
|
|
51
|
+
completion)
|
|
52
|
+
COMPREPLY=($(compgen -W "bash zsh fish" -- "$cur"))
|
|
53
|
+
return
|
|
54
|
+
;;
|
|
55
|
+
esac
|
|
56
|
+
|
|
57
|
+
# 根据当前命令补全选项
|
|
58
|
+
local cmd=""
|
|
59
|
+
for word in "\${words[@]}"; do
|
|
60
|
+
case "$word" in
|
|
61
|
+
list|export|stats|completion)
|
|
62
|
+
cmd="$word"
|
|
63
|
+
break
|
|
64
|
+
;;
|
|
65
|
+
esac
|
|
66
|
+
done
|
|
67
|
+
|
|
68
|
+
case "$cmd" in
|
|
69
|
+
list|stats)
|
|
70
|
+
if [[ "$cur" == -* ]]; then
|
|
71
|
+
COMPREPLY=($(compgen -W "-p --project" -- "$cur"))
|
|
72
|
+
fi
|
|
73
|
+
;;
|
|
74
|
+
export)
|
|
75
|
+
if [[ "$cur" == -* ]]; then
|
|
76
|
+
COMPREPLY=($(compgen -W "-f --format -o --output --no-thinking --no-tools --subagents" -- "$cur"))
|
|
77
|
+
fi
|
|
78
|
+
;;
|
|
79
|
+
completion)
|
|
80
|
+
COMPREPLY=($(compgen -W "bash zsh fish" -- "$cur"))
|
|
81
|
+
;;
|
|
82
|
+
*)
|
|
83
|
+
COMPREPLY=($(compgen -W "$commands" -- "$cur"))
|
|
84
|
+
;;
|
|
85
|
+
esac
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
complete -F _cconvo_completions cconvo
|
|
89
|
+
`;
|
|
90
|
+
}
|
|
91
|
+
// Zsh 补全脚本
|
|
92
|
+
export function generateZshCompletion() {
|
|
93
|
+
return `#compdef cconvo
|
|
94
|
+
# cconvo zsh completion
|
|
95
|
+
# 安装方法: cconvo completion zsh > ~/.zsh/completions/_cconvo
|
|
96
|
+
# 确保 fpath 包含 ~/.zsh/completions 并运行 autoload -Uz compinit && compinit
|
|
97
|
+
|
|
98
|
+
_cconvo() {
|
|
99
|
+
local -a commands formats shells
|
|
100
|
+
commands=(
|
|
101
|
+
'list:List all projects and conversations'
|
|
102
|
+
'export:Export a conversation'
|
|
103
|
+
'stats:Show conversation statistics'
|
|
104
|
+
'completion:Generate shell completion script'
|
|
105
|
+
)
|
|
106
|
+
formats=(markdown json html)
|
|
107
|
+
shells=(bash zsh fish)
|
|
108
|
+
|
|
109
|
+
_arguments -C \\
|
|
110
|
+
'1: :->command' \\
|
|
111
|
+
'*:: :->args'
|
|
112
|
+
|
|
113
|
+
case $state in
|
|
114
|
+
command)
|
|
115
|
+
_describe -t commands 'cconvo commands' commands
|
|
116
|
+
;;
|
|
117
|
+
args)
|
|
118
|
+
case $words[1] in
|
|
119
|
+
list)
|
|
120
|
+
_arguments \\
|
|
121
|
+
'(-p --project)'{-p,--project}'[Filter by project name]:project name:_cconvo_projects'
|
|
122
|
+
;;
|
|
123
|
+
export)
|
|
124
|
+
_arguments \\
|
|
125
|
+
'1:session id:_cconvo_sessions' \\
|
|
126
|
+
'(-f --format)'{-f,--format}'[Export format]:format:(markdown json html)' \\
|
|
127
|
+
'(-o --output)'{-o,--output}'[Output file path]:output file:_files' \\
|
|
128
|
+
'--no-thinking[Exclude thinking blocks]' \\
|
|
129
|
+
'--no-tools[Exclude tool calls]' \\
|
|
130
|
+
'--subagents[Include subagent conversations]'
|
|
131
|
+
;;
|
|
132
|
+
stats)
|
|
133
|
+
_arguments \\
|
|
134
|
+
'(-p --project)'{-p,--project}'[Filter by project name]:project name:_cconvo_projects'
|
|
135
|
+
;;
|
|
136
|
+
completion)
|
|
137
|
+
_arguments '1:shell:(bash zsh fish)'
|
|
138
|
+
;;
|
|
139
|
+
esac
|
|
140
|
+
;;
|
|
141
|
+
esac
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
# 动态获取项目列表
|
|
145
|
+
_cconvo_projects() {
|
|
146
|
+
local -a projects
|
|
147
|
+
projects=(\${(f)"$(cconvo list 2>/dev/null | grep '^📁' | sed 's/^📁 //')"})
|
|
148
|
+
_describe -t projects 'projects' projects 2>/dev/null
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# 动态获取 session ID 列表
|
|
152
|
+
_cconvo_sessions() {
|
|
153
|
+
local -a sessions
|
|
154
|
+
sessions=(\${(f)"$(cconvo list 2>/dev/null | grep -oE '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')"})
|
|
155
|
+
_describe -t sessions 'session ids' sessions 2>/dev/null
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
compdef _cconvo cconvo
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
// Fish 补全脚本
|
|
162
|
+
export function generateFishCompletion() {
|
|
163
|
+
return `# cconvo fish completion
|
|
164
|
+
# 安装方法: cconvo completion fish > ~/.config/fish/completions/cconvo.fish
|
|
165
|
+
|
|
166
|
+
# 禁用默认文件补全
|
|
167
|
+
complete -c cconvo -f
|
|
168
|
+
|
|
169
|
+
# 子命令
|
|
170
|
+
complete -c cconvo -n "__fish_use_subcommand" -a "list" -d "List all projects and conversations"
|
|
171
|
+
complete -c cconvo -n "__fish_use_subcommand" -a "export" -d "Export a conversation"
|
|
172
|
+
complete -c cconvo -n "__fish_use_subcommand" -a "stats" -d "Show conversation statistics"
|
|
173
|
+
complete -c cconvo -n "__fish_use_subcommand" -a "completion" -d "Generate shell completion script"
|
|
174
|
+
|
|
175
|
+
# list 命令选项
|
|
176
|
+
complete -c cconvo -n "__fish_seen_subcommand_from list" -s p -l project -d "Filter by project name" -xa "(cconvo list 2>/dev/null | grep '^📁' | sed 's/^📁 //')"
|
|
177
|
+
|
|
178
|
+
# export 命令选项
|
|
179
|
+
complete -c cconvo -n "__fish_seen_subcommand_from export" -s f -l format -d "Export format" -xa "markdown json html"
|
|
180
|
+
complete -c cconvo -n "__fish_seen_subcommand_from export" -s o -l output -d "Output file path" -r
|
|
181
|
+
complete -c cconvo -n "__fish_seen_subcommand_from export" -l no-thinking -d "Exclude thinking blocks"
|
|
182
|
+
complete -c cconvo -n "__fish_seen_subcommand_from export" -l no-tools -d "Exclude tool calls"
|
|
183
|
+
complete -c cconvo -n "__fish_seen_subcommand_from export" -l subagents -d "Include subagent conversations"
|
|
184
|
+
|
|
185
|
+
# stats 命令选项
|
|
186
|
+
complete -c cconvo -n "__fish_seen_subcommand_from stats" -s p -l project -d "Filter by project name" -xa "(cconvo list 2>/dev/null | grep '^📁' | sed 's/^📁 //')"
|
|
187
|
+
|
|
188
|
+
# completion 命令选项
|
|
189
|
+
complete -c cconvo -n "__fish_seen_subcommand_from completion" -a "bash zsh fish" -d "Shell type"
|
|
190
|
+
`;
|
|
191
|
+
}
|
|
192
|
+
export function generateCompletion(shell) {
|
|
193
|
+
switch (shell) {
|
|
194
|
+
case 'bash':
|
|
195
|
+
return generateBashCompletion();
|
|
196
|
+
case 'zsh':
|
|
197
|
+
return generateZshCompletion();
|
|
198
|
+
case 'fish':
|
|
199
|
+
return generateFishCompletion();
|
|
200
|
+
default:
|
|
201
|
+
throw new Error(`Unsupported shell: ${shell}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export function getInstallInstructions(shell) {
|
|
205
|
+
switch (shell) {
|
|
206
|
+
case 'bash':
|
|
207
|
+
return `# 将以下内容添加到 ~/.bashrc 或 ~/.bash_profile:
|
|
208
|
+
cconvo completion bash >> ~/.bashrc
|
|
209
|
+
source ~/.bashrc`;
|
|
210
|
+
case 'zsh':
|
|
211
|
+
return `# 方法 1: 添加到 ~/.zshrc
|
|
212
|
+
cconvo completion zsh >> ~/.zshrc
|
|
213
|
+
source ~/.zshrc
|
|
214
|
+
|
|
215
|
+
# 方法 2: 使用补全目录 (推荐)
|
|
216
|
+
mkdir -p ~/.zsh/completions
|
|
217
|
+
cconvo completion zsh > ~/.zsh/completions/_cconvo
|
|
218
|
+
# 在 ~/.zshrc 中添加: fpath=(~/.zsh/completions $fpath)
|
|
219
|
+
# 然后运行: autoload -Uz compinit && compinit`;
|
|
220
|
+
case 'fish':
|
|
221
|
+
return `# 保存到 fish 补全目录:
|
|
222
|
+
cconvo completion fish > ~/.config/fish/completions/cconvo.fish`;
|
|
223
|
+
default:
|
|
224
|
+
return '';
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AAC3D,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7C,YAAY;AACZ,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFR,CAAC;AACF,CAAC;AAED,WAAW;AACX,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC;AAED,YAAY;AACZ,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BR,CAAC;AACF,CAAC;AAID,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IACjD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,sBAAsB,EAAE,CAAC;QAClC,KAAK,KAAK;YACR,OAAO,qBAAqB,EAAE,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,sBAAsB,EAAE,CAAC;QAClC;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAgB;IACrD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO;;iBAEI,CAAC;QACd,KAAK,KAAK;YACR,OAAO;;;;;;;;0CAQ6B,CAAC;QACvC,KAAK,MAAM;YACT,OAAO;gEACmD,CAAC;QAC7D;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MessageRecord, Conversation } from '../models/types.js';
|
|
2
|
+
interface ConversationMeta {
|
|
3
|
+
slug?: string;
|
|
4
|
+
startTime: Date;
|
|
5
|
+
endTime: Date;
|
|
6
|
+
messageCount: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseConversationMeta(filePath: string): Promise<ConversationMeta>;
|
|
9
|
+
export declare function parseConversation(filePath: string, projectPath: string): Promise<Conversation>;
|
|
10
|
+
export declare function buildMessageTree(messages: MessageRecord[]): MessageRecord[];
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EAKb,MAAM,oBAAoB,CAAC;AAG5B,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAGD,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6CvF;AAGD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAyEpG;AA0DD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAS3E"}
|