@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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/dist/cli.d.ts +4 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +213 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/completion.d.ts +7 -0
  8. package/dist/completion.d.ts.map +1 -0
  9. package/dist/completion.js +227 -0
  10. package/dist/completion.js.map +1 -0
  11. package/dist/core/parser.d.ts +12 -0
  12. package/dist/core/parser.d.ts.map +1 -0
  13. package/dist/core/parser.js +178 -0
  14. package/dist/core/parser.js.map +1 -0
  15. package/dist/core/scanner.d.ts +9 -0
  16. package/dist/core/scanner.d.ts.map +1 -0
  17. package/dist/core/scanner.js +109 -0
  18. package/dist/core/scanner.js.map +1 -0
  19. package/dist/exporters/html.d.ts +3 -0
  20. package/dist/exporters/html.d.ts.map +1 -0
  21. package/dist/exporters/html.js +288 -0
  22. package/dist/exporters/html.js.map +1 -0
  23. package/dist/exporters/index.d.ts +7 -0
  24. package/dist/exporters/index.d.ts.map +1 -0
  25. package/dist/exporters/index.js +40 -0
  26. package/dist/exporters/index.js.map +1 -0
  27. package/dist/exporters/json.d.ts +3 -0
  28. package/dist/exporters/json.d.ts.map +1 -0
  29. package/dist/exporters/json.js +45 -0
  30. package/dist/exporters/json.js.map +1 -0
  31. package/dist/exporters/markdown.d.ts +3 -0
  32. package/dist/exporters/markdown.d.ts.map +1 -0
  33. package/dist/exporters/markdown.js +87 -0
  34. package/dist/exporters/markdown.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +14 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/interactive.d.ts +2 -0
  40. package/dist/interactive.d.ts.map +1 -0
  41. package/dist/interactive.js +348 -0
  42. package/dist/interactive.js.map +1 -0
  43. package/dist/models/types.d.ts +158 -0
  44. package/dist/models/types.d.ts.map +1 -0
  45. package/dist/models/types.js +2 -0
  46. package/dist/models/types.js.map +1 -0
  47. package/dist/utils/format.d.ts +13 -0
  48. package/dist/utils/format.d.ts.map +1 -0
  49. package/dist/utils/format.js +104 -0
  50. package/dist/utils/format.js.map +1 -0
  51. package/dist/utils/path.d.ts +10 -0
  52. package/dist/utils/path.d.ts.map +1 -0
  53. package/dist/utils/path.js +37 -0
  54. package/dist/utils/path.js.map +1 -0
  55. 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,4 @@
1
+ import { Command } from 'commander';
2
+ declare const program: Command;
3
+ export { program };
4
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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"}