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
@@ -0,0 +1,153 @@
1
+ import Conf from 'conf';
2
+ // 各模型默认配置
3
+ export const MODEL_DEFAULTS = {
4
+ deepseek: {
5
+ provider: 'deepseek',
6
+ model: 'deepseek-chat',
7
+ baseURL: 'https://api.deepseek.com/v1',
8
+ maxTokens: 4096,
9
+ temperature: 0.7,
10
+ },
11
+ qwen: {
12
+ provider: 'qwen',
13
+ model: 'qwen-turbo',
14
+ baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
15
+ maxTokens: 4096,
16
+ temperature: 0.7,
17
+ },
18
+ glm: {
19
+ provider: 'glm',
20
+ model: 'glm-4-flash',
21
+ baseURL: 'https://open.bigmodel.cn/api/paas/v4',
22
+ maxTokens: 4096,
23
+ temperature: 0.7,
24
+ },
25
+ doubao: {
26
+ provider: 'doubao',
27
+ model: 'doubao-pro-4k',
28
+ baseURL: 'https://ark.cn-beijing.volces.com/api/v3',
29
+ maxTokens: 4096,
30
+ temperature: 0.7,
31
+ },
32
+ moonshot: {
33
+ provider: 'moonshot',
34
+ model: 'moonshot-v1-8k',
35
+ baseURL: 'https://api.moonshot.cn/v1',
36
+ maxTokens: 4096,
37
+ temperature: 0.7,
38
+ },
39
+ minimax: {
40
+ provider: 'minimax',
41
+ model: 'abab6.5s-chat',
42
+ baseURL: 'https://api.minimax.chat/v1',
43
+ maxTokens: 4096,
44
+ temperature: 0.7,
45
+ },
46
+ hunyuan: {
47
+ provider: 'hunyuan',
48
+ model: 'hunyuan-pro',
49
+ baseURL: 'https://api.hunyuan.cloud.tencent.com/v1',
50
+ maxTokens: 4096,
51
+ temperature: 0.7,
52
+ },
53
+ ernie: {
54
+ provider: 'ernie',
55
+ model: 'ernie-4.0-8k',
56
+ baseURL: 'https://qianfan.baidubce.com/v2',
57
+ maxTokens: 4096,
58
+ temperature: 0.7,
59
+ },
60
+ };
61
+ export const PROVIDER_LABELS = {
62
+ deepseek: 'DeepSeek',
63
+ qwen: '通义千问 (Qwen)',
64
+ glm: '智谱 GLM',
65
+ doubao: '豆包 (Doubao)',
66
+ moonshot: '月之暗面 (Kimi)',
67
+ minimax: 'MiniMax (海螺)',
68
+ hunyuan: '腾讯混元 (Hunyuan)',
69
+ ernie: '百度文心一言 (ERNIE)',
70
+ };
71
+ // ─── 环境变量名映射 ───────────────────────────────────────────
72
+ // 支持从环境变量读取 API Key,避免将 key 写死在命令行历史中
73
+ // 用法: export DEEPSEEK_API_KEY=sk-xxx && xxcli chat
74
+ export const PROVIDER_ENV_VARS = {
75
+ deepseek: 'DEEPSEEK_API_KEY',
76
+ qwen: 'QWEN_API_KEY',
77
+ glm: 'GLM_API_KEY',
78
+ doubao: 'DOUBAO_API_KEY',
79
+ moonshot: 'MOONSHOT_API_KEY',
80
+ minimax: 'MINIMAX_API_KEY',
81
+ hunyuan: 'HUNYUAN_API_KEY',
82
+ ernie: 'ERNIE_API_KEY',
83
+ };
84
+ /** 从环境变量读取指定 provider 的 API Key,不存在则返回 undefined */
85
+ export function getEnvApiKey(provider) {
86
+ return process.env[PROVIDER_ENV_VARS[provider]] || undefined;
87
+ }
88
+ const defaultConfig = {
89
+ defaultProvider: 'deepseek',
90
+ providers: {},
91
+ theme: 'dark',
92
+ stream: true,
93
+ historySize: 50,
94
+ search: {
95
+ provider: 'duckduckgo',
96
+ maxResults: 5,
97
+ },
98
+ agentAutoConfirm: false,
99
+ };
100
+ const conf = new Conf({
101
+ projectName: 'ai-cli',
102
+ defaults: defaultConfig,
103
+ });
104
+ export const config = {
105
+ get(key) {
106
+ return conf.get(key);
107
+ },
108
+ set(key, value) {
109
+ conf.set(key, value);
110
+ },
111
+ getAll() {
112
+ return conf.store;
113
+ },
114
+ getProvider(provider) {
115
+ const p = provider ?? conf.get('defaultProvider');
116
+ // 优先使用环境变量中的 key(不落盘,更安全)
117
+ const envKey = getEnvApiKey(p);
118
+ const saved = conf.get('providers')[p];
119
+ const apiKey = envKey ?? saved?.apiKey;
120
+ if (!apiKey)
121
+ return null;
122
+ return { ...MODEL_DEFAULTS[p], ...saved, apiKey };
123
+ },
124
+ setProvider(provider, apiKey, model, baseURL) {
125
+ const providers = conf.get('providers');
126
+ providers[provider] = {
127
+ ...MODEL_DEFAULTS[provider],
128
+ ...providers[provider],
129
+ provider,
130
+ apiKey,
131
+ ...(model ? { model } : {}),
132
+ ...(baseURL ? { baseURL } : {}),
133
+ };
134
+ conf.set('providers', providers);
135
+ },
136
+ setDefault(provider) {
137
+ conf.set('defaultProvider', provider);
138
+ },
139
+ setSearch(provider, apiKey) {
140
+ conf.set('search', {
141
+ ...conf.get('search'),
142
+ provider,
143
+ ...(apiKey ? { apiKey } : {}),
144
+ });
145
+ },
146
+ clear() {
147
+ conf.clear();
148
+ },
149
+ get path() {
150
+ return conf.path;
151
+ },
152
+ };
153
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export type OSType = 'macos' | 'linux' | 'windows' | 'unknown';
2
+ export type Arch = 'x64' | 'arm64' | 'unknown';
3
+ export interface EnvInfo {
4
+ os: OSType;
5
+ arch: Arch;
6
+ hasBrew: boolean;
7
+ hasNpm: boolean;
8
+ hasCurl: boolean;
9
+ hasWget: boolean;
10
+ nodeVersion: string;
11
+ }
12
+ /** 执行命令,返回 stdout */
13
+ export declare function run(cmd: string): Promise<string>;
14
+ /** 执行命令,检测是否存在(不抛错) */
15
+ export declare function commandExists(cmd: string): Promise<boolean>;
16
+ /** 流式执行命令,实时输出 */
17
+ export declare function runStream(cmd: string, args: string[], onData?: (data: string) => void, onError?: (data: string) => void): Promise<number>;
18
+ /** 获取当前运行环境信息 */
19
+ export declare function detectEnv(): Promise<EnvInfo>;
20
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/D,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAqB;AACrB,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtD;AAED,uBAAuB;AACvB,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjE;AAED,kBAAkB;AAClB,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC/B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,iBAAiB;AACjB,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAkClD"}
@@ -0,0 +1,68 @@
1
+ import { exec, spawn } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import os from 'os';
4
+ const execAsync = promisify(exec);
5
+ /** 执行命令,返回 stdout */
6
+ export async function run(cmd) {
7
+ const { stdout } = await execAsync(cmd, { shell: '/bin/zsh' });
8
+ return stdout.trim();
9
+ }
10
+ /** 执行命令,检测是否存在(不抛错) */
11
+ export async function commandExists(cmd) {
12
+ try {
13
+ await execAsync(`which ${cmd}`);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ /** 流式执行命令,实时输出 */
21
+ export function runStream(cmd, args, onData, onError) {
22
+ return new Promise((resolve, reject) => {
23
+ const child = spawn(cmd, args, {
24
+ stdio: ['inherit', 'pipe', 'pipe'],
25
+ shell: true,
26
+ });
27
+ child.stdout?.on('data', (data) => {
28
+ onData?.(data.toString());
29
+ });
30
+ child.stderr?.on('data', (data) => {
31
+ onError?.(data.toString());
32
+ });
33
+ child.on('close', (code) => {
34
+ resolve(code ?? 0);
35
+ });
36
+ child.on('error', reject);
37
+ });
38
+ }
39
+ /** 获取当前运行环境信息 */
40
+ export async function detectEnv() {
41
+ const platform = os.platform();
42
+ const arch = os.arch();
43
+ const osType = platform === 'darwin'
44
+ ? 'macos'
45
+ : platform === 'linux'
46
+ ? 'linux'
47
+ : platform === 'win32'
48
+ ? 'windows'
49
+ : 'unknown';
50
+ const archType = arch === 'x64' ? 'x64' : arch === 'arm64' ? 'arm64' : 'unknown';
51
+ const [hasBrew, hasNpm, hasCurl, hasWget] = await Promise.all([
52
+ commandExists('brew'),
53
+ commandExists('npm'),
54
+ commandExists('curl'),
55
+ commandExists('wget'),
56
+ ]);
57
+ const nodeVersion = process.version;
58
+ return {
59
+ os: osType,
60
+ arch: archType,
61
+ hasBrew,
62
+ hasNpm,
63
+ hasCurl,
64
+ hasWget,
65
+ nodeVersion,
66
+ };
67
+ }
68
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface FileInfo {
2
+ name: string;
3
+ path: string;
4
+ type: 'file' | 'directory';
5
+ size?: number;
6
+ modified?: string;
7
+ }
8
+ /** 读取文件内容 */
9
+ export declare function readFile(filePath: string, maxLines?: number): string;
10
+ /** 写入文件(自动创建目录) */
11
+ export declare function writeFile(filePath: string, content: string): void;
12
+ /** 追加内容到文件 */
13
+ export declare function appendFile(filePath: string, content: string): void;
14
+ /** 列出目录内容 */
15
+ export declare function listDir(dirPath?: string, showHidden?: boolean): FileInfo[];
16
+ /** 在文件中搜索内容(类 grep) */
17
+ export declare function grepFiles(pattern: string, dirPath?: string, fileGlob?: string): Promise<string>;
18
+ /** 获取项目结构(树形)*/
19
+ export declare function getProjectTree(dirPath?: string, depth?: number): Promise<string>;
20
+ /** 替换文件中的指定内容 */
21
+ export declare function replaceInFile(filePath: string, search: string, replace: string): boolean;
22
+ /** 格式化文件大小 */
23
+ export declare function formatFileSize(bytes: number): string;
24
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,aAAa;AACb,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUpE;AAED,mBAAmB;AACnB,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjE;AAED,cAAc;AACd,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,aAAa;AACb,wBAAgB,OAAO,CAAC,OAAO,SAAM,EAAE,UAAU,UAAQ,GAAG,QAAQ,EAAE,CA0BrE;AAED,uBAAuB;AACvB,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,SAAM,EACb,QAAQ,SAAM,GACb,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,gBAAgB;AAChB,wBAAsB,cAAc,CAAC,OAAO,SAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9E;AAED,iBAAiB;AACjB,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAUxF;AAED,cAAc;AACd,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD"}
@@ -0,0 +1,95 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { run } from './executor.js';
4
+ /** 读取文件内容 */
5
+ export function readFile(filePath, maxLines) {
6
+ const resolved = path.resolve(filePath);
7
+ if (!fs.existsSync(resolved))
8
+ throw new Error(`文件不存在: ${resolved}`);
9
+ const content = fs.readFileSync(resolved, 'utf-8');
10
+ if (!maxLines)
11
+ return content;
12
+ const lines = content.split('\n');
13
+ if (lines.length <= maxLines)
14
+ return content;
15
+ return lines.slice(0, maxLines).join('\n') + `\n\n... (共 ${lines.length} 行,只显示前 ${maxLines} 行)`;
16
+ }
17
+ /** 写入文件(自动创建目录) */
18
+ export function writeFile(filePath, content) {
19
+ const resolved = path.resolve(filePath);
20
+ const dir = path.dirname(resolved);
21
+ if (!fs.existsSync(dir))
22
+ fs.mkdirSync(dir, { recursive: true });
23
+ fs.writeFileSync(resolved, content, 'utf-8');
24
+ }
25
+ /** 追加内容到文件 */
26
+ export function appendFile(filePath, content) {
27
+ const resolved = path.resolve(filePath);
28
+ fs.appendFileSync(resolved, content, 'utf-8');
29
+ }
30
+ /** 列出目录内容 */
31
+ export function listDir(dirPath = '.', showHidden = false) {
32
+ const resolved = path.resolve(dirPath);
33
+ if (!fs.existsSync(resolved))
34
+ throw new Error(`目录不存在: ${resolved}`);
35
+ const entries = fs.readdirSync(resolved, { withFileTypes: true });
36
+ const results = [];
37
+ for (const entry of entries) {
38
+ if (!showHidden && entry.name.startsWith('.'))
39
+ continue;
40
+ const fullPath = path.join(resolved, entry.name);
41
+ const stat = fs.statSync(fullPath);
42
+ results.push({
43
+ name: entry.name,
44
+ path: fullPath,
45
+ type: entry.isDirectory() ? 'directory' : 'file',
46
+ size: entry.isFile() ? stat.size : undefined,
47
+ modified: stat.mtime.toISOString().split('T')[0],
48
+ });
49
+ }
50
+ return results.sort((a, b) => {
51
+ if (a.type !== b.type)
52
+ return a.type === 'directory' ? -1 : 1;
53
+ return a.name.localeCompare(b.name);
54
+ });
55
+ }
56
+ /** 在文件中搜索内容(类 grep) */
57
+ export async function grepFiles(pattern, dirPath = '.', fileGlob = '*') {
58
+ try {
59
+ const result = await run(`grep -r --include="${fileGlob}" -n "${pattern}" "${path.resolve(dirPath)}" 2>/dev/null | head -50`);
60
+ return result || '未找到匹配内容';
61
+ }
62
+ catch {
63
+ return '未找到匹配内容';
64
+ }
65
+ }
66
+ /** 获取项目结构(树形)*/
67
+ export async function getProjectTree(dirPath = '.', depth = 3) {
68
+ try {
69
+ return await run(`find "${path.resolve(dirPath)}" -maxdepth ${depth} ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.DS_Store" | sort | head -100`);
70
+ }
71
+ catch {
72
+ return '无法获取项目结构';
73
+ }
74
+ }
75
+ /** 替换文件中的指定内容 */
76
+ export function replaceInFile(filePath, search, replace) {
77
+ const resolved = path.resolve(filePath);
78
+ if (!fs.existsSync(resolved))
79
+ throw new Error(`文件不存在: ${resolved}`);
80
+ const content = fs.readFileSync(resolved, 'utf-8');
81
+ if (!content.includes(search))
82
+ return false;
83
+ const newContent = content.replace(search, replace);
84
+ fs.writeFileSync(resolved, newContent, 'utf-8');
85
+ return true;
86
+ }
87
+ /** 格式化文件大小 */
88
+ export function formatFileSize(bytes) {
89
+ if (bytes < 1024)
90
+ return `${bytes}B`;
91
+ if (bytes < 1024 * 1024)
92
+ return `${(bytes / 1024).toFixed(1)}KB`;
93
+ return `${(bytes / 1024 / 1024).toFixed(1)}MB`;
94
+ }
95
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface GitHubRelease {
2
+ tag_name: string;
3
+ name: string;
4
+ published_at: string;
5
+ html_url: string;
6
+ assets: GitHubAsset[];
7
+ body: string;
8
+ }
9
+ export interface GitHubAsset {
10
+ name: string;
11
+ browser_download_url: string;
12
+ size: number;
13
+ content_type: string;
14
+ }
15
+ export interface GitHubRepo {
16
+ full_name: string;
17
+ description: string;
18
+ html_url: string;
19
+ stargazers_count: number;
20
+ language: string;
21
+ }
22
+ /** 获取仓库最新 Release */
23
+ export declare function getLatestRelease(owner: string, repo: string): Promise<GitHubRelease>;
24
+ /** 获取所有 Releases */
25
+ export declare function getReleases(owner: string, repo: string, perPage?: number): Promise<GitHubRelease[]>;
26
+ /** 搜索 GitHub 仓库 */
27
+ export declare function searchRepo(query: string): Promise<GitHubRepo[]>;
28
+ /** 根据 OS 和 Arch 匹配合适的 Asset */
29
+ export declare function matchAsset(assets: GitHubAsset[], osType: string, arch: string): GitHubAsset | null;
30
+ /** 格式化文件大小 */
31
+ export declare function formatSize(bytes: number): string;
32
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/core/github.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD,qBAAqB;AACrB,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,CAiBxB;AAED,oBAAoB;AACpB,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,SAAI,GACV,OAAO,CAAC,aAAa,EAAE,CAAC,CAS1B;AAED,mBAAmB;AACnB,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAUrE;AAED,+BAA+B;AAC/B,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,WAAW,GAAG,IAAI,CAiCpB;AAED,cAAc;AACd,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD"}
@@ -0,0 +1,82 @@
1
+ /** 构建 GitHub API 请求头(自动读取 GITHUB_TOKEN 环境变量) */
2
+ function buildHeaders() {
3
+ const headers = { 'User-Agent': 'xx-ai-cli' };
4
+ const token = process.env.GITHUB_TOKEN;
5
+ if (token) {
6
+ headers['Authorization'] = `Bearer ${token}`;
7
+ }
8
+ return headers;
9
+ }
10
+ /** 获取仓库最新 Release */
11
+ export async function getLatestRelease(owner, repo) {
12
+ const url = `https://api.github.com/repos/${owner}/${repo}/releases/latest`;
13
+ const res = await fetch(url, { headers: buildHeaders() });
14
+ if (res.status === 404) {
15
+ // 仓库存在但没有发布任何 Release
16
+ throw new Error(`NO_RELEASE:${owner}/${repo}`);
17
+ }
18
+ if (res.status === 403 || res.status === 429) {
19
+ // 限流,尝试获取 releases 列表作为兜底
20
+ throw new Error(`RATE_LIMITED:${owner}/${repo}`);
21
+ }
22
+ if (!res.ok) {
23
+ throw new Error(`获取 Release 失败 [${res.status}]: ${owner}/${repo}`);
24
+ }
25
+ return res.json();
26
+ }
27
+ /** 获取所有 Releases */
28
+ export async function getReleases(owner, repo, perPage = 5) {
29
+ const url = `https://api.github.com/repos/${owner}/${repo}/releases?per_page=${perPage}`;
30
+ const res = await fetch(url, { headers: buildHeaders() });
31
+ if (!res.ok) {
32
+ throw new Error(`获取 Releases 失败 [${res.status}]`);
33
+ }
34
+ return res.json();
35
+ }
36
+ /** 搜索 GitHub 仓库 */
37
+ export async function searchRepo(query) {
38
+ const url = `https://api.github.com/search/repositories?q=${encodeURIComponent(query)}&sort=stars&per_page=5`;
39
+ const res = await fetch(url, { headers: buildHeaders() });
40
+ if (!res.ok) {
41
+ throw new Error(`搜索失败 [${res.status}]`);
42
+ }
43
+ const data = (await res.json());
44
+ return data.items;
45
+ }
46
+ /** 根据 OS 和 Arch 匹配合适的 Asset */
47
+ export function matchAsset(assets, osType, arch) {
48
+ const osKeywords = {
49
+ macos: ['darwin', 'macos', 'mac', 'osx'],
50
+ linux: ['linux'],
51
+ windows: ['windows', 'win'],
52
+ };
53
+ const archKeywords = {
54
+ arm64: ['arm64', 'aarch64'],
55
+ x64: ['x86_64', 'amd64', 'x64'],
56
+ };
57
+ const osKws = osKeywords[osType] ?? [];
58
+ const archKws = archKeywords[arch] ?? [];
59
+ // 优先找同时匹配 OS 和 arch 的
60
+ let matched = assets.find((a) => {
61
+ const name = a.name.toLowerCase();
62
+ return (osKws.some((k) => name.includes(k)) &&
63
+ archKws.some((k) => name.includes(k)));
64
+ });
65
+ // 退而求其次,只匹配 OS
66
+ if (!matched) {
67
+ matched = assets.find((a) => {
68
+ const name = a.name.toLowerCase();
69
+ return osKws.some((k) => name.includes(k));
70
+ });
71
+ }
72
+ return matched ?? null;
73
+ }
74
+ /** 格式化文件大小 */
75
+ export function formatSize(bytes) {
76
+ if (bytes < 1024)
77
+ return `${bytes} B`;
78
+ if (bytes < 1024 * 1024)
79
+ return `${(bytes / 1024).toFixed(1)} KB`;
80
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
81
+ }
82
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/core/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const PROMPTS: {
2
+ code: (task: string) => string;
3
+ explain: (code: string) => string;
4
+ optimize: (code: string) => string;
5
+ file: (content: string, question: string) => string;
6
+ cmd: (task: string) => string;
7
+ review: (code: string) => string;
8
+ };
9
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;iBACL,MAAM;oBAQH,MAAM;qBAOL,MAAM;oBAOP,MAAM,YAAY,MAAM;gBAS5B,MAAM;mBAWH,MAAM;CAUtB,CAAC"}
@@ -0,0 +1,44 @@
1
+ export const PROMPTS = {
2
+ code: (task) => `你是一个资深程序员。请根据需求生成高质量代码,要求:
3
+ 1. 代码简洁清晰,有必要的注释
4
+ 2. 遵循最佳实践
5
+ 3. 如有需要,说明使用方式
6
+
7
+ 需求:${task}`,
8
+ explain: (code) => `请详细解释以下代码的功能、逻辑和关键点:
9
+
10
+ \`\`\`
11
+ ${code}
12
+ \`\`\``,
13
+ optimize: (code) => `请分析以下代码,指出问题并给出优化建议和改进后的代码:
14
+
15
+ \`\`\`
16
+ ${code}
17
+ \`\`\``,
18
+ file: (content, question) => `以下是文件内容:
19
+
20
+ \`\`\`
21
+ ${content}
22
+ \`\`\`
23
+
24
+ 问题:${question}`,
25
+ cmd: (task) => `你是一个 Shell 命令专家(macOS/Linux 环境)。
26
+ 用户需求:${task}
27
+
28
+ 请提供:
29
+ 1. 推荐的命令(直接可运行)
30
+ 2. 命令说明
31
+ 3. 注意事项(如有)
32
+
33
+ 只输出命令和简短说明,不要废话。`,
34
+ review: (code) => `请对以下代码进行 Code Review,从以下维度分析:
35
+ - 代码质量和可读性
36
+ - 潜在 Bug 或安全问题
37
+ - 性能问题
38
+ - 改进建议
39
+
40
+ \`\`\`
41
+ ${code}
42
+ \`\`\``,
43
+ };
44
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CACrB;;;;;KAKC,IAAI,EAAE;IAET,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CACxB;;;EAGF,IAAI;OACC;IAEL,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CACzB;;;EAGF,IAAI;OACC;IAEL,IAAI,EAAE,CAAC,OAAe,EAAE,QAAgB,EAAE,EAAE,CAC1C;;;EAGF,OAAO;;;KAGJ,QAAQ,EAAE;IAEb,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CACpB;OACG,IAAI;;;;;;;iBAOM;IAEf,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CACvB;;;;;;;EAOF,IAAI;OACC;CACN,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type ModelProvider } from '../core/config.js';
2
+ export type Intent = 'search' | 'code_gen' | 'code_explain' | 'code_review' | 'file' | 'shell' | 'pkg_install' | 'agent' | 'chat';
3
+ export interface IntentResult {
4
+ intent: Intent;
5
+ confidence: number;
6
+ extractedArgs: {
7
+ filePath?: string;
8
+ packageName?: string;
9
+ query?: string;
10
+ };
11
+ }
12
+ export declare function detectIntent(input: string): IntentResult;
13
+ export declare const INTENT_LABELS: Record<Intent, string>;
14
+ export declare function selectBestModel(intent: Intent): ModelProvider;
15
+ export declare function printRouteDecision(input: string, intentResult: IntentResult, selectedModel: ModelProvider): void;
16
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIhG,MAAM,MAAM,MAAM,GACd,QAAQ,GACR,UAAU,GACV,cAAc,GACd,aAAa,GACb,MAAM,GACN,OAAO,GACP,aAAa,GACb,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAiHD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAkCxD;AAGD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUhD,CAAC;AAgBF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAW7D;AAGD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,GAC3B,IAAI,CAYN"}