xx-ai-cli 0.1.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/dist/commands/agent.d.ts +12 -0
  4. package/dist/commands/agent.d.ts.map +1 -0
  5. package/dist/commands/agent.js +311 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/ask.d.ts +7 -0
  8. package/dist/commands/ask.d.ts.map +1 -0
  9. package/dist/commands/ask.js +52 -0
  10. package/dist/commands/ask.js.map +1 -0
  11. package/dist/commands/chat.d.ts +9 -0
  12. package/dist/commands/chat.d.ts.map +1 -0
  13. package/dist/commands/chat.js +129 -0
  14. package/dist/commands/chat.js.map +1 -0
  15. package/dist/commands/cmd.d.ts +6 -0
  16. package/dist/commands/cmd.d.ts.map +1 -0
  17. package/dist/commands/cmd.js +52 -0
  18. package/dist/commands/cmd.js.map +1 -0
  19. package/dist/commands/code.d.ts +8 -0
  20. package/dist/commands/code.d.ts.map +1 -0
  21. package/dist/commands/code.js +75 -0
  22. package/dist/commands/code.js.map +1 -0
  23. package/dist/commands/file.d.ts +7 -0
  24. package/dist/commands/file.d.ts.map +1 -0
  25. package/dist/commands/file.js +66 -0
  26. package/dist/commands/file.js.map +1 -0
  27. package/dist/commands/history.d.ts +5 -0
  28. package/dist/commands/history.d.ts.map +1 -0
  29. package/dist/commands/history.js +159 -0
  30. package/dist/commands/history.js.map +1 -0
  31. package/dist/commands/init.d.ts +2 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +144 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/install.d.ts +24 -0
  36. package/dist/commands/install.d.ts.map +1 -0
  37. package/dist/commands/install.js +328 -0
  38. package/dist/commands/install.js.map +1 -0
  39. package/dist/commands/model.d.ts +6 -0
  40. package/dist/commands/model.d.ts.map +1 -0
  41. package/dist/commands/model.js +128 -0
  42. package/dist/commands/model.js.map +1 -0
  43. package/dist/commands/pkg.d.ts +12 -0
  44. package/dist/commands/pkg.d.ts.map +1 -0
  45. package/dist/commands/pkg.js +132 -0
  46. package/dist/commands/pkg.js.map +1 -0
  47. package/dist/commands/run.d.ts +9 -0
  48. package/dist/commands/run.d.ts.map +1 -0
  49. package/dist/commands/run.js +185 -0
  50. package/dist/commands/run.js.map +1 -0
  51. package/dist/core/agentTask.d.ts +20 -0
  52. package/dist/core/agentTask.d.ts.map +1 -0
  53. package/dist/core/agentTask.js +81 -0
  54. package/dist/core/agentTask.js.map +1 -0
  55. package/dist/core/config.d.ts +41 -0
  56. package/dist/core/config.d.ts.map +1 -0
  57. package/dist/core/config.js +153 -0
  58. package/dist/core/config.js.map +1 -0
  59. package/dist/core/executor.d.ts +20 -0
  60. package/dist/core/executor.d.ts.map +1 -0
  61. package/dist/core/executor.js +68 -0
  62. package/dist/core/executor.js.map +1 -0
  63. package/dist/core/files.d.ts +24 -0
  64. package/dist/core/files.d.ts.map +1 -0
  65. package/dist/core/files.js +95 -0
  66. package/dist/core/files.js.map +1 -0
  67. package/dist/core/github.d.ts +32 -0
  68. package/dist/core/github.d.ts.map +1 -0
  69. package/dist/core/github.js +82 -0
  70. package/dist/core/github.js.map +1 -0
  71. package/dist/core/prompt.d.ts +9 -0
  72. package/dist/core/prompt.d.ts.map +1 -0
  73. package/dist/core/prompt.js +44 -0
  74. package/dist/core/prompt.js.map +1 -0
  75. package/dist/core/router.d.ts +16 -0
  76. package/dist/core/router.d.ts.map +1 -0
  77. package/dist/core/router.js +182 -0
  78. package/dist/core/router.js.map +1 -0
  79. package/dist/core/search.d.ts +14 -0
  80. package/dist/core/search.d.ts.map +1 -0
  81. package/dist/core/search.js +179 -0
  82. package/dist/core/search.js.map +1 -0
  83. package/dist/core/session.d.ts +38 -0
  84. package/dist/core/session.d.ts.map +1 -0
  85. package/dist/core/session.js +172 -0
  86. package/dist/core/session.js.map +1 -0
  87. package/dist/core/stream.d.ts +15 -0
  88. package/dist/core/stream.d.ts.map +1 -0
  89. package/dist/core/stream.js +102 -0
  90. package/dist/core/stream.js.map +1 -0
  91. package/dist/core/tools.d.ts +343 -0
  92. package/dist/core/tools.d.ts.map +1 -0
  93. package/dist/core/tools.js +293 -0
  94. package/dist/core/tools.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +372 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/ui/renderer.d.ts +17 -0
  100. package/dist/ui/renderer.d.ts.map +1 -0
  101. package/dist/ui/renderer.js +69 -0
  102. package/dist/ui/renderer.js.map +1 -0
  103. package/package.json +73 -0
package/dist/index.js ADDED
@@ -0,0 +1,372 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { chatCommand } from './commands/chat.js';
4
+ import { askCommand } from './commands/ask.js';
5
+ import { codeCommand } from './commands/code.js';
6
+ import { fileCommand } from './commands/file.js';
7
+ import { cmdCommand } from './commands/cmd.js';
8
+ import { modelList, modelUse, modelSetKey, configShow, configSet, } from './commands/model.js';
9
+ import { installCommand, listTools } from './commands/install.js';
10
+ import { agentCommand } from './commands/agent.js';
11
+ import { pkgSearch, pkgInfo, pkgInstall, pkgUninstall, pkgList } from './commands/pkg.js';
12
+ import { runCommand } from './commands/run.js';
13
+ import { initCommand } from './commands/init.js';
14
+ import { historyListCommand, historyShowCommand, historyResumeCommand, historyClearCommand, } from './commands/history.js';
15
+ import { printBanner } from './ui/renderer.js';
16
+ import { config as appConfig } from './core/config.js';
17
+ import ora from 'ora';
18
+ import chalk from 'chalk';
19
+ import { theme } from './ui/renderer.js';
20
+ const program = new Command();
21
+ program
22
+ .name('xxcli')
23
+ .description('🤖 XX-AI-CLI - 国内主流大模型命令行工具')
24
+ .version('0.1.0')
25
+ .hook('preAction', () => {
26
+ // 全局 hook
27
+ });
28
+ // ─── chat 命令 ───────────────────────────────────────────────
29
+ program
30
+ .command('chat')
31
+ .description('进入交互式对话模式')
32
+ .option('-m, --model <provider>', '指定模型 (deepseek/qwen/glm/doubao/moonshot)')
33
+ .option('-s, --system <prompt>', '自定义系统提示词')
34
+ .action(async (options) => {
35
+ printBanner();
36
+ await chatCommand({
37
+ model: options.model,
38
+ system: options.system,
39
+ });
40
+ });
41
+ // ─── ask 命令 ────────────────────────────────────────────────
42
+ program
43
+ .command('ask <question>')
44
+ .description('单次提问,快速获取答案')
45
+ .option('-m, --model <provider>', '指定模型')
46
+ .option('--no-stream', '禁用流式输出')
47
+ .action(async (question, options) => {
48
+ await askCommand(question, {
49
+ model: options.model,
50
+ noStream: !options.stream,
51
+ });
52
+ });
53
+ // ─── code 命令 ───────────────────────────────────────────────
54
+ const codeCmd = program.command('code').description('代码相关操作');
55
+ codeCmd
56
+ .command('gen <task>')
57
+ .description('生成代码')
58
+ .option('-m, --model <provider>', '指定模型')
59
+ .action(async (task, options) => {
60
+ await codeCommand('generate', task, { model: options.model });
61
+ });
62
+ codeCmd
63
+ .command('explain <file-or-code>')
64
+ .description('解释代码或文件')
65
+ .option('-m, --model <provider>', '指定模型')
66
+ .action(async (input, options) => {
67
+ await codeCommand('explain', input, { model: options.model });
68
+ });
69
+ codeCmd
70
+ .command('optimize <file-or-code>')
71
+ .description('优化代码')
72
+ .option('-m, --model <provider>', '指定模型')
73
+ .action(async (input, options) => {
74
+ await codeCommand('optimize', input, { model: options.model });
75
+ });
76
+ codeCmd
77
+ .command('review <file-or-code>')
78
+ .description('Code Review')
79
+ .option('-m, --model <provider>', '指定模型')
80
+ .action(async (input, options) => {
81
+ await codeCommand('review', input, { model: options.model });
82
+ });
83
+ // ─── file 命令 ───────────────────────────────────────────────
84
+ program
85
+ .command('file <path> <question>')
86
+ .description('读取文件并提问')
87
+ .option('-m, --model <provider>', '指定模型')
88
+ .action(async (filePath, question, options) => {
89
+ await fileCommand(filePath, question, {
90
+ model: options.model,
91
+ });
92
+ });
93
+ // ─── cmd 命令 ────────────────────────────────────────────────
94
+ program
95
+ .command('cmd <task>')
96
+ .description('获取 Shell 命令建议')
97
+ .option('-m, --model <provider>', '指定模型')
98
+ .action(async (task, options) => {
99
+ await cmdCommand(task, { model: options.model });
100
+ });
101
+ // ─── model 命令 ──────────────────────────────────────────────
102
+ const modelCmd = program.command('model').description('模型管理');
103
+ modelCmd
104
+ .command('list')
105
+ .description('查看所有支持的模型')
106
+ .action(() => modelList());
107
+ modelCmd
108
+ .command('use <provider>')
109
+ .description('切换默认模型 (deepseek/qwen/glm/doubao/moonshot)')
110
+ .action((provider) => modelUse(provider));
111
+ modelCmd
112
+ .command('set-key <provider> [apiKey]')
113
+ .description('设置指定模型的 API Key(不传 key 则进入隐藏输入模式,更安全)')
114
+ .option('--model-name <model>', '自定义模型名称')
115
+ .option('--base-url <url>', '自定义 API BaseURL(专属/代理地址)')
116
+ .action(async (provider, apiKey, options) => {
117
+ await modelSetKey(provider, apiKey ?? '-', options.modelName, options.baseUrl);
118
+ });
119
+ // ─── agent 命令 ──────────────────────────────────────────────
120
+ program
121
+ .command('agent [task]')
122
+ .description('🤖 Agent 模式 - AI 自主完成复杂任务,支持中断续接')
123
+ .option('-m, --model <model>', '指定模型')
124
+ .option('-y, --auto-confirm', '自动确认所有操作(危险)')
125
+ .option('--max-steps <n>', '最大执行步骤数', '15')
126
+ .option('--list', '列出所有已保存的任务')
127
+ .option('--resume <id>', '续接指定任务(从中断处继续)')
128
+ .option('--delete <id>', '删除指定任务')
129
+ .action(async (task, options) => {
130
+ await agentCommand(task, {
131
+ model: options.model,
132
+ autoConfirm: options.autoConfirm,
133
+ maxSteps: parseInt(options.maxSteps, 10),
134
+ list: options.list,
135
+ resume: options.resume,
136
+ delete: options.delete,
137
+ });
138
+ });
139
+ // ─── search 命令 ─────────────────────────────────────────────
140
+ program
141
+ .command('search <query>')
142
+ .description('🔍 联网搜索')
143
+ .option('-n, --num <count>', '返回结果数', '5')
144
+ .action(async (query, options) => {
145
+ const spinner = ora({ text: '搜索中...', spinner: 'dots' }).start();
146
+ try {
147
+ const { webSearch: ws, formatSearchResults: fmt } = await import('./core/search.js');
148
+ const resp = await ws(query, parseInt(options.num, 10));
149
+ spinner.stop();
150
+ const searchCfg = appConfig.get('search');
151
+ console.log(`\n${theme.info(`搜索结果 (${resp.provider}): ${chalk.bold(query)}`)}\n`);
152
+ if (!resp.results.length) {
153
+ console.log(theme.warning('未找到相关结果'));
154
+ }
155
+ else {
156
+ resp.results.forEach((r, i) => {
157
+ console.log(`${chalk.cyan(`[${i + 1}]`)} ${chalk.bold(r.title)}`);
158
+ if (r.url)
159
+ console.log(` ${chalk.dim(r.url)}`);
160
+ console.log(` ${r.snippet}\n`);
161
+ });
162
+ }
163
+ }
164
+ catch (err) {
165
+ spinner.fail(`搜索失败: ${err.message}`);
166
+ }
167
+ });
168
+ // ─── pkg 命令 ────────────────────────────────────────────────
169
+ const pkgCmd = program.command('pkg').description('📦 包管理(npm/brew/pip)');
170
+ pkgCmd
171
+ .command('search <query>')
172
+ .description('搜索 npm 包')
173
+ .action((query) => pkgSearch(query));
174
+ pkgCmd
175
+ .command('info <package>')
176
+ .description('查看 npm 包详情')
177
+ .action((pkg) => pkgInfo(pkg));
178
+ pkgCmd
179
+ .command('install <package>')
180
+ .description('安装包')
181
+ .option('-g, --global', '全局安装')
182
+ .option('-D, --dev', '安装为开发依赖')
183
+ .option('--manager <mgr>', '包管理器 (npm/brew/pip)', 'npm')
184
+ .action(async (pkg, options) => {
185
+ await pkgInstall(pkg, {
186
+ global: options.global,
187
+ dev: options.dev,
188
+ manager: options.manager,
189
+ });
190
+ });
191
+ pkgCmd
192
+ .command('uninstall <package>')
193
+ .description('卸载包')
194
+ .option('-g, --global', '全局卸载')
195
+ .action(async (pkg, options) => {
196
+ await pkgUninstall(pkg, options.global);
197
+ });
198
+ pkgCmd
199
+ .command('list')
200
+ .description('列出已安装的包')
201
+ .option('-g, --global', '列出全局安装的包')
202
+ .action(async (options) => {
203
+ await pkgList(options.global);
204
+ });
205
+ // ─── install 命令 ────────────────────────────────────────────
206
+ program
207
+ .command('install [tool]')
208
+ .description('安装 AI 工具(如 openclaw 等)。不带参数时列出可用工具')
209
+ .option('-m, --method <method>', '指定安装方式 (npm/brew/github/auto)', 'auto')
210
+ .option('--version <ver>', '指定安装版本')
211
+ .option('--force', '强制重新安装')
212
+ .option('--dry-run', '模拟运行,只打印命令不实际执行')
213
+ .action(async (tool, options) => {
214
+ if (!tool) {
215
+ listTools();
216
+ return;
217
+ }
218
+ await installCommand(tool, {
219
+ method: options.method,
220
+ version: options.version,
221
+ force: options.force,
222
+ dryRun: options.dryRun,
223
+ });
224
+ });
225
+ // ─── config 命令 ─────────────────────────────────────────────
226
+ const configCmd = program.command('config').description('配置管理');
227
+ configCmd
228
+ .command('show')
229
+ .description('查看当前配置')
230
+ .action(() => configShow());
231
+ configCmd
232
+ .command('set <key> <value>')
233
+ .description('设置配置项 (stream/historySize/agentAutoConfirm)')
234
+ .action((key, value) => configSet(key, value));
235
+ // ─── search config 命令 ──────────────────────────────────────
236
+ const searchConfigCmd = program.command('search-config').description('搜索引擎配置');
237
+ searchConfigCmd
238
+ .command('set <provider>')
239
+ .description('设置搜索引擎 (duckduckgo/serper/tavily)')
240
+ .option('--key <apiKey>', '搜索引擎 API Key')
241
+ .action((provider, options) => {
242
+ appConfig.setSearch(provider, options.key);
243
+ console.log(theme.success(`搜索引擎已设置为: ${provider}`));
244
+ if (['serper', 'tavily'].includes(provider) && !options.key) {
245
+ console.log(theme.warning(`${provider} 需要 API Key,请使用 --key 参数`));
246
+ }
247
+ });
248
+ searchConfigCmd
249
+ .command('show')
250
+ .description('查看当前搜索配置')
251
+ .action(() => {
252
+ const sc = appConfig.get('search');
253
+ console.log(`\n搜索引擎: ${chalk.cyan(sc.provider)}`);
254
+ console.log(`API Key: ${sc.apiKey ? chalk.green('已配置') : chalk.dim('未配置')}`);
255
+ console.log(`最大结果: ${sc.maxResults}\n`);
256
+ });
257
+ // ─── init 命令 ───────────────────────────────────────────────
258
+ program
259
+ .command('init')
260
+ .description('🎯 交互式初始化向导,快速完成首次配置')
261
+ .action(async () => {
262
+ await initCommand();
263
+ });
264
+ // ─── history 命令 ─────────────────────────────────────────────
265
+ const historyCmd = program.command('history').description('📚 查看和管理历史会话');
266
+ historyCmd
267
+ .command('list')
268
+ .description('列出最近的历史会话')
269
+ .option('-n, --num <count>', '显示条数', '20')
270
+ .action((options) => historyListCommand(parseInt(options.num, 10)));
271
+ historyCmd
272
+ .command('show <id>')
273
+ .description('查看某条历史会话的详细内容')
274
+ .action((id) => historyShowCommand(id));
275
+ historyCmd
276
+ .command('resume <id>')
277
+ .description('从某条历史会话继续对话')
278
+ .action(async (id) => {
279
+ await historyResumeCommand(id);
280
+ });
281
+ historyCmd
282
+ .command('clear')
283
+ .description('清空所有历史会话')
284
+ .action(async () => {
285
+ await historyClearCommand();
286
+ });
287
+ // 无子命令时 → 自动进入 Agent 模式
288
+ program.action(async () => {
289
+ // ── stdin 管道检测 ──────────────────────────────────────────
290
+ if (!process.stdin.isTTY) {
291
+ const chunks = [];
292
+ process.stdin.on('data', (chunk) => chunks.push(chunk));
293
+ await new Promise((resolve) => process.stdin.on('end', resolve));
294
+ const stdinContent = Buffer.concat(chunks).toString('utf-8').trim();
295
+ if (stdinContent) {
296
+ const extraArgs = process.argv.slice(2).join(' ').trim();
297
+ const question = extraArgs
298
+ ? `${extraArgs}\n\n以下是相关内容:\n\`\`\`\n${stdinContent}\n\`\`\``
299
+ : `请分析以下内容:\n\`\`\`\n${stdinContent}\n\`\`\``;
300
+ await runCommand(question, { verbose: true });
301
+ return;
302
+ }
303
+ }
304
+ // ── 首次使用检测 ────────────────────────────────────────────
305
+ const providers = appConfig.get('providers');
306
+ const hasAnyKey = Object.values(providers).some((p) => p?.apiKey);
307
+ if (!hasAnyKey) {
308
+ printBanner();
309
+ console.log(theme.warning('👋 看起来你是第一次使用 XX-AI-CLI!\n'));
310
+ console.log(theme.info('请先运行初始化向导完成配置:'));
311
+ console.log(chalk.cyan.bold('\n xxcli init\n'));
312
+ console.log(theme.dim('或手动设置 API Key:'));
313
+ console.log(theme.dim(' xxcli model set-key deepseek sk-xxxxxxxx\n'));
314
+ return;
315
+ }
316
+ // ── 进入 Agent 模式,询问是否开启自动确认 ──────────────────
317
+ printBanner();
318
+ const { confirm } = await import('@inquirer/prompts');
319
+ console.log('\n' + chalk.bold.cyan(' 🤖 即将进入 Agent 自主模式'));
320
+ console.log(theme.dim(' Agent 可以联网搜索、读写文件、执行 Shell 命令'));
321
+ console.log();
322
+ // 风险提示框
323
+ console.log(chalk.bgYellow.black.bold(' ⚠️ 关于「自动确认」模式的风险说明 '));
324
+ console.log(chalk.yellow([
325
+ '',
326
+ ' 开启后,Agent 执行以下操作将 无需 你逐一确认:',
327
+ ' · 写入或覆盖本地文件',
328
+ ' · 执行 Shell 命令(npm install、curl 等)',
329
+ ' · 删除文件(如 Agent 认为必要)',
330
+ '',
331
+ ' 以下操作无论是否开启,都会被拒绝执行:',
332
+ ' · rm -rf / 或 sudo rm 等系统级删除',
333
+ ' · mkfs、dd 等磁盘操作',
334
+ ' · curl/wget 管道直接执行脚本',
335
+ '',
336
+ ' 建议:首次使用或对任务不熟悉时,选「否」逐步确认。',
337
+ '',
338
+ ].join('\n')));
339
+ let autoConfirm = false;
340
+ try {
341
+ autoConfirm = await confirm({
342
+ message: '是否开启自动确认?(Agent 将自主完成任务,无需逐步审批)',
343
+ default: false,
344
+ });
345
+ }
346
+ catch {
347
+ // Ctrl+C 取消
348
+ console.log('\n' + theme.dim('已取消'));
349
+ return;
350
+ }
351
+ if (autoConfirm) {
352
+ console.log(chalk.yellow('\n ⚡ 已开启自动确认,Agent 将自主执行所有操作'));
353
+ console.log(theme.dim(' 随时按 Ctrl+C 中断,任务会自动保存\n'));
354
+ }
355
+ else {
356
+ console.log(chalk.green('\n ✔ 手动确认模式,每次关键操作都会询问你\n'));
357
+ }
358
+ appConfig.set('agentAutoConfirm', autoConfirm);
359
+ await agentCommand(undefined, {
360
+ autoConfirm,
361
+ maxSteps: 15,
362
+ });
363
+ });
364
+ // ─── stdin 管道支持(作为子命令的补充)──────────────────────
365
+ // 让 `cat file | xx ask "问题"` 这类写法生效
366
+ // Commander 解析后如果有子命令会走子命令,这里只处理无子命令+pipe 的情况
367
+ if (!process.stdin.isTTY && process.argv.length > 2) {
368
+ // 有子命令时,将 stdin 注入环境变量供子命令读取
369
+ // 实际通过 program.action 中的逻辑处理,此处占位
370
+ }
371
+ program.parse(process.argv);
372
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const theme: {
2
+ brand: (text: string) => string;
3
+ userLabel: () => string;
4
+ aiLabel: (model: string) => string;
5
+ userBubble: (text: string) => string;
6
+ info: (text: string) => string;
7
+ success: (text: string) => string;
8
+ warning: (text: string) => string;
9
+ error: (text: string) => string;
10
+ dim: (text: string) => string;
11
+ bold: (text: string) => string;
12
+ divider: () => string;
13
+ markdown: (text: string) => string;
14
+ };
15
+ export declare function printBanner(): void;
16
+ export declare function printHelp(): void;
17
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ui/renderer.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,KAAK;kBAEF,MAAM;;qBAIH,MAAM;uBAGJ,MAAM;iBASZ,MAAM;oBACH,MAAM;oBACN,MAAM;kBACR,MAAM;gBACR,MAAM;iBACL,MAAM;;qBAMF,MAAM,KAAG,MAAM;CACjC,CAAC;AAEF,wBAAgB,WAAW,IAAI,IAAI,CAUlC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAwBhC"}
@@ -0,0 +1,69 @@
1
+ import chalk from 'chalk';
2
+ import { marked } from 'marked';
3
+ import { markedTerminal } from 'marked-terminal';
4
+ import boxen from 'boxen';
5
+ import gradient from 'gradient-string';
6
+ // 配置 marked 使用终端渲染器
7
+ marked.use(markedTerminal());
8
+ export const theme = {
9
+ // 品牌色
10
+ brand: (text) => gradient(['#6366f1', '#8b5cf6', '#a78bfa'])(text),
11
+ // 角色标签
12
+ userLabel: () => chalk.bold.cyan(' 你 '),
13
+ aiLabel: (model) => chalk.bold.green(` 🤖 ${model} `),
14
+ // 消息气泡
15
+ userBubble: (text) => boxen(chalk.white(text), {
16
+ padding: { top: 0, bottom: 0, left: 1, right: 1 },
17
+ borderStyle: 'round',
18
+ borderColor: 'cyan',
19
+ dimBorder: false,
20
+ }),
21
+ // 普通信息
22
+ info: (text) => chalk.blue(`ℹ ${text}`),
23
+ success: (text) => chalk.green(`✔ ${text}`),
24
+ warning: (text) => chalk.yellow(`⚠ ${text}`),
25
+ error: (text) => chalk.red(`✖ ${text}`),
26
+ dim: (text) => chalk.dim(text),
27
+ bold: (text) => chalk.bold(text),
28
+ // 分隔线
29
+ divider: () => chalk.dim('─'.repeat(process.stdout.columns || 60)),
30
+ // 渲染 Markdown
31
+ markdown: (text) => marked(text),
32
+ };
33
+ export function printBanner() {
34
+ const banner = `
35
+ ╔═══════════════════════════════════╗
36
+ ║ ║
37
+ ║ AI-CLI v0.1.0 ║
38
+ ║ 国内大模型命令行工具 ║
39
+ ║ ║
40
+ ╚═══════════════════════════════════╝
41
+ `;
42
+ console.log(theme.brand(banner));
43
+ }
44
+ export function printHelp() {
45
+ console.log(`
46
+ ${theme.brand('AI-CLI')} - 国内大模型命令行工具
47
+
48
+ ${chalk.bold('使用方式:')}
49
+ ${chalk.cyan('ai chat')} 进入交互式对话
50
+ ${chalk.cyan('ai ask')} <问题> 单次提问
51
+ ${chalk.cyan('ai code')} <需求> 生成代码
52
+ ${chalk.cyan('ai file')} <文件> <问题> 分析文件
53
+ ${chalk.cyan('ai cmd')} <任务> 获取 Shell 命令建议
54
+ ${chalk.cyan('ai config')} 配置管理
55
+
56
+ ${chalk.bold('模型管理:')}
57
+ ${chalk.cyan('ai model list')} 查看支持的模型
58
+ ${chalk.cyan('ai model use')} <name> 切换默认模型
59
+ ${chalk.cyan('ai model set-key')} <name> <key> 设置 API Key
60
+
61
+ ${chalk.bold('示例:')}
62
+ ${chalk.dim('ai ask "解释什么是快速排序"')}
63
+ ${chalk.dim('ai code "用 TypeScript 写一个防抖函数"')}
64
+ ${chalk.dim('ai file ./src/index.ts "帮我优化这段代码"')}
65
+ ${chalk.dim('ai cmd "查找所有大于 1MB 的文件"')}
66
+ ${chalk.dim('ai chat --model deepseek')}
67
+ `);
68
+ }
69
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/ui/renderer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "xx-ai-cli",
3
+ "version": "0.1.0",
4
+ "description": "🤖 支持国内主流大模型的 AI 命令行工具,内置 Agent 模式、历史会话、管道输入",
5
+ "type": "module",
6
+ "bin": {
7
+ "xxcli": "./dist/index.js",
8
+ "xx": "./dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "watch": "tsc -w",
15
+ "lint": "eslint src/**/*.ts",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "keywords": [
24
+ "ai",
25
+ "cli",
26
+ "deepseek",
27
+ "qwen",
28
+ "glm",
29
+ "llm",
30
+ "chatgpt",
31
+ "agent",
32
+ "terminal",
33
+ "command-line",
34
+ "chinese-ai"
35
+ ],
36
+ "author": "hzxiongxu",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/xxyj/xx-ai-cli.git"
41
+ },
42
+ "homepage": "https://github.com/xxyj/xx-ai-cli#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/xxyj/xx-ai-cli/issues"
45
+ },
46
+ "dependencies": {
47
+ "@inquirer/prompts": "^7.0.0",
48
+ "boxen": "^8.0.1",
49
+ "chalk": "^5.3.0",
50
+ "cli-highlight": "^2.1.11",
51
+ "commander": "^12.1.0",
52
+ "conf": "^13.0.1",
53
+ "eventsource-parser": "^3.0.0",
54
+ "figures": "^6.1.0",
55
+ "gradient-string": "^2.0.2",
56
+ "inquirer": "^10.1.0",
57
+ "marked": "^13.0.0",
58
+ "marked-terminal": "^7.1.0",
59
+ "node-fetch": "^3.3.2",
60
+ "ora": "^8.1.0"
61
+ },
62
+ "devDependencies": {
63
+ "@types/gradient-string": "^1.1.6",
64
+ "@types/inquirer": "^9.0.7",
65
+ "@types/marked-terminal": "^6.0.0",
66
+ "@types/node": "^22.0.0",
67
+ "tsx": "^4.16.0",
68
+ "typescript": "^5.5.0"
69
+ },
70
+ "engines": {
71
+ "node": ">=18.0.0"
72
+ }
73
+ }