cc-code-status 2.0.4 → 2.0.5
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/README.md +38 -64
- package/dist/cli-legacy.d.ts +0 -1
- package/dist/cli-legacy.d.ts.map +1 -1
- package/dist/cli-legacy.js +0 -200
- package/dist/cli-legacy.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +90 -322
- package/dist/cli.js.map +1 -1
- package/dist/config/manager.d.ts +121 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +273 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/validator.d.ts +17 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +39 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/launcher.d.ts +27 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +149 -0
- package/dist/launcher.js.map +1 -0
- package/dist/ui/prompts.js +3 -3
- package/dist/ui/prompts.js.map +1 -1
- package/dist/ui/welcome.d.ts.map +1 -1
- package/dist/ui/welcome.js +6 -7
- package/dist/ui/welcome.js.map +1 -1
- package/dist/utils/installer.d.ts +20 -0
- package/dist/utils/installer.d.ts.map +1 -0
- package/dist/utils/installer.js +68 -0
- package/dist/utils/installer.js.map +1 -0
- package/package.json +3 -3
- package/dist/config/extended-manager.d.ts +0 -26
- package/dist/config/extended-manager.d.ts.map +0 -1
- package/dist/config/extended-manager.js +0 -42
- package/dist/config/extended-manager.js.map +0 -1
- package/dist/launcher/extended-launcher.d.ts +0 -27
- package/dist/launcher/extended-launcher.d.ts.map +0 -1
- package/dist/launcher/extended-launcher.js +0 -87
- package/dist/launcher/extended-launcher.js.map +0 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 配置管理器
|
|
4
|
+
* 负责读取、保存、验证 API 配置信息
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.ConfigManager = void 0;
|
|
44
|
+
const conf_1 = __importDefault(require("conf"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
const constants_1 = require("./constants");
|
|
48
|
+
class ConfigManager {
|
|
49
|
+
constructor() {
|
|
50
|
+
this.config = new conf_1.default({
|
|
51
|
+
projectName: constants_1.CONFIG_NAME,
|
|
52
|
+
cwd: path.join(os.homedir(), '.config', constants_1.CONFIG_NAME)
|
|
53
|
+
});
|
|
54
|
+
// 迁移旧配置(如果存在)
|
|
55
|
+
this.migrateOldConfig();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 迁移旧版本的单配置到新的多配置结构
|
|
59
|
+
*/
|
|
60
|
+
migrateOldConfig() {
|
|
61
|
+
const oldApi = this.config.get('api');
|
|
62
|
+
// 如果存在旧配置但没有 profiles,进行迁移
|
|
63
|
+
if (oldApi && !this.config.has('profiles')) {
|
|
64
|
+
const profileName = 'default';
|
|
65
|
+
this.config.set('profiles', {
|
|
66
|
+
[profileName]: {
|
|
67
|
+
apiKey: oldApi.apiKey,
|
|
68
|
+
baseUrl: oldApi.baseUrl,
|
|
69
|
+
model: oldApi.model,
|
|
70
|
+
smallFastModel: oldApi.smallFastModel,
|
|
71
|
+
configuredAt: oldApi.configuredAt,
|
|
72
|
+
version: oldApi.version
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
this.config.delete('api');
|
|
76
|
+
}
|
|
77
|
+
// 清理旧的 defaultProfile 字段
|
|
78
|
+
if (this.config.has('defaultProfile')) {
|
|
79
|
+
this.config.delete('defaultProfile');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 检查是否有任何配置
|
|
84
|
+
*/
|
|
85
|
+
hasAnyProfile() {
|
|
86
|
+
const profiles = this.config.get('profiles', {});
|
|
87
|
+
return Object.keys(profiles).length > 0;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 检查是否已配置 API Key(向后兼容)
|
|
91
|
+
*/
|
|
92
|
+
hasApiKey() {
|
|
93
|
+
return this.hasAnyProfile();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 获取所有配置名称
|
|
97
|
+
*/
|
|
98
|
+
getProfileNames() {
|
|
99
|
+
const profiles = this.config.get('profiles', {});
|
|
100
|
+
return Object.keys(profiles);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取配置数量
|
|
104
|
+
*/
|
|
105
|
+
getProfileCount() {
|
|
106
|
+
return this.getProfileNames().length;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 检查配置是否存在
|
|
110
|
+
*/
|
|
111
|
+
hasProfile(name) {
|
|
112
|
+
return this.config.has(`profiles.${name}`);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 获取指定配置
|
|
116
|
+
*/
|
|
117
|
+
getProfile(name) {
|
|
118
|
+
return this.config.get(`profiles.${name}`);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 获取当前激活的配置(仅当只有一个配置时返回)
|
|
122
|
+
*/
|
|
123
|
+
getCurrentProfile() {
|
|
124
|
+
const names = this.getProfileNames();
|
|
125
|
+
if (names.length === 0) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
// 只有一个配置时,直接使用
|
|
129
|
+
if (names.length === 1) {
|
|
130
|
+
const name = names[0];
|
|
131
|
+
const config = this.getProfile(name);
|
|
132
|
+
return config ? { name, config } : undefined;
|
|
133
|
+
}
|
|
134
|
+
// 多个配置时,返回 undefined(需要用户选择)
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 获取 API Key(向后兼容)
|
|
139
|
+
*/
|
|
140
|
+
getApiKey() {
|
|
141
|
+
const current = this.getCurrentProfile();
|
|
142
|
+
return current?.config.apiKey;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 获取 Base URL(向后兼容)
|
|
146
|
+
*/
|
|
147
|
+
getBaseUrl() {
|
|
148
|
+
const current = this.getCurrentProfile();
|
|
149
|
+
return current?.config.baseUrl;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 获取模型名称(可选)
|
|
153
|
+
*/
|
|
154
|
+
getModel() {
|
|
155
|
+
const current = this.getCurrentProfile();
|
|
156
|
+
return current?.config.model;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 获取小快速模型(可选)
|
|
160
|
+
*/
|
|
161
|
+
getSmallFastModel() {
|
|
162
|
+
const current = this.getCurrentProfile();
|
|
163
|
+
return current?.config.smallFastModel;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 添加或更新配置
|
|
167
|
+
*/
|
|
168
|
+
saveProfile(name, config) {
|
|
169
|
+
const fullConfig = {
|
|
170
|
+
...config,
|
|
171
|
+
configuredAt: new Date().toISOString(),
|
|
172
|
+
version: '2.0.0'
|
|
173
|
+
};
|
|
174
|
+
const profiles = this.config.get('profiles', {});
|
|
175
|
+
profiles[name] = fullConfig;
|
|
176
|
+
this.config.set('profiles', profiles);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 删除配置
|
|
180
|
+
*/
|
|
181
|
+
removeProfile(name) {
|
|
182
|
+
if (!this.hasProfile(name)) {
|
|
183
|
+
throw new Error(`配置 "${name}" 不存在`);
|
|
184
|
+
}
|
|
185
|
+
const profiles = this.config.get('profiles', {});
|
|
186
|
+
delete profiles[name];
|
|
187
|
+
this.config.set('profiles', profiles);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* 保存 API 配置(向后兼容,保存为 default)
|
|
191
|
+
*/
|
|
192
|
+
saveApiConfig(config, name = 'default') {
|
|
193
|
+
this.saveProfile(name, config);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 获取所有配置(含配置名称)
|
|
197
|
+
*/
|
|
198
|
+
getAllProfiles() {
|
|
199
|
+
const profiles = this.config.get('profiles', {});
|
|
200
|
+
return Object.entries(profiles).map(([name, config]) => ({
|
|
201
|
+
name,
|
|
202
|
+
...config
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 获取同步配置
|
|
207
|
+
*/
|
|
208
|
+
getSyncConfig() {
|
|
209
|
+
const defaultConfig = constants_1.DEFAULT_SYNC_CONFIG;
|
|
210
|
+
return {
|
|
211
|
+
apiUrl: this.config.get('sync.apiUrl', defaultConfig.apiUrl),
|
|
212
|
+
syncInterval: this.config.get('sync.syncInterval', defaultConfig.syncInterval),
|
|
213
|
+
enabled: this.config.get('sync.enabled', defaultConfig.enabled),
|
|
214
|
+
excludedProjects: this.config.get('sync.excludedProjects', [])
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 保存同步配置
|
|
219
|
+
*/
|
|
220
|
+
saveSyncConfig(config) {
|
|
221
|
+
const current = this.getSyncConfig();
|
|
222
|
+
this.config.set('sync', {
|
|
223
|
+
...current,
|
|
224
|
+
...config
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 重置所有配置
|
|
229
|
+
*/
|
|
230
|
+
reset() {
|
|
231
|
+
this.config.clear();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* 获取所有配置
|
|
235
|
+
*/
|
|
236
|
+
getAll() {
|
|
237
|
+
return this.config.store;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 获取配置文件路径
|
|
241
|
+
*/
|
|
242
|
+
getConfigPath() {
|
|
243
|
+
return this.config.path;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* 获取安全的配置信息(隐藏 API Key)
|
|
247
|
+
*/
|
|
248
|
+
getSafeApiConfig(name) {
|
|
249
|
+
let apiConfig;
|
|
250
|
+
if (name) {
|
|
251
|
+
apiConfig = this.getProfile(name);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
const current = this.getCurrentProfile();
|
|
255
|
+
apiConfig = current?.config;
|
|
256
|
+
}
|
|
257
|
+
if (!apiConfig)
|
|
258
|
+
return undefined;
|
|
259
|
+
const safeConfig = { ...apiConfig };
|
|
260
|
+
if (safeConfig.apiKey) {
|
|
261
|
+
const key = safeConfig.apiKey;
|
|
262
|
+
if (key.length > 12) {
|
|
263
|
+
safeConfig.apiKey = `${key.substring(0, 8)}...${key.substring(key.length - 4)}`;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
safeConfig.apiKey = '***';
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return safeConfig;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exports.ConfigManager = ConfigManager;
|
|
273
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置验证器
|
|
3
|
+
* 验证 API Key 和 Base URL 的格式
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 验证 API Key 格式
|
|
7
|
+
* @param apiKey API Key
|
|
8
|
+
* @returns 是否有效
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateApiKeyFormat(apiKey: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* 验证 URL 格式
|
|
13
|
+
* @param url URL 地址
|
|
14
|
+
* @returns 是否有效
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateUrl(url: string): boolean;
|
|
17
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/config/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWhD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 配置验证器
|
|
4
|
+
* 验证 API Key 和 Base URL 的格式
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.validateApiKeyFormat = validateApiKeyFormat;
|
|
8
|
+
exports.validateUrl = validateUrl;
|
|
9
|
+
/**
|
|
10
|
+
* 验证 API Key 格式
|
|
11
|
+
* @param apiKey API Key
|
|
12
|
+
* @returns 是否有效
|
|
13
|
+
*/
|
|
14
|
+
function validateApiKeyFormat(apiKey) {
|
|
15
|
+
if (!apiKey || typeof apiKey !== 'string') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const trimmed = apiKey.trim();
|
|
19
|
+
// API Key 通常在 20-200 个字符之间
|
|
20
|
+
return trimmed.length >= 20 && trimmed.length <= 200;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 验证 URL 格式
|
|
24
|
+
* @param url URL 地址
|
|
25
|
+
* @returns 是否有效
|
|
26
|
+
*/
|
|
27
|
+
function validateUrl(url) {
|
|
28
|
+
if (!url || typeof url !== 'string') {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const parsedUrl = new URL(url);
|
|
33
|
+
return parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:';
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/config/validator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,oDAQC;AAOD,kCAWC;AA/BD;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,MAAc;IACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,2BAA2B;IAC3B,OAAO,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code 启动器
|
|
3
|
+
* 核心功能:启动 Claude Code 并注入环境变量
|
|
4
|
+
*/
|
|
5
|
+
import { ConfigManager } from './config/manager';
|
|
6
|
+
export interface LaunchOptions {
|
|
7
|
+
args?: string[];
|
|
8
|
+
skipPermissions?: boolean;
|
|
9
|
+
showStats?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class ClaudeLauncher {
|
|
12
|
+
private config;
|
|
13
|
+
private profileName?;
|
|
14
|
+
constructor(config: ConfigManager, profileName?: string | undefined);
|
|
15
|
+
/**
|
|
16
|
+
* 启动 Claude Code
|
|
17
|
+
*/
|
|
18
|
+
launch(options?: LaunchOptions): Promise<{
|
|
19
|
+
exitCode: number;
|
|
20
|
+
hasApiError: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* 显示今日统计(如果有的话)
|
|
24
|
+
*/
|
|
25
|
+
private showTodayStats;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IAEvB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW,CAAC;gBADZ,MAAM,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,MAAM,YAAA;IAG9B;;OAEG;IACG,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IAuF9F;;OAEG;YACW,cAAc;CAkB7B"}
|
package/dist/launcher.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code 启动器
|
|
4
|
+
* 核心功能:启动 Claude Code 并注入环境变量
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.ClaudeLauncher = void 0;
|
|
44
|
+
const child_process_1 = require("child_process");
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const logger_1 = require("./utils/logger");
|
|
47
|
+
const welcome_1 = require("./ui/welcome");
|
|
48
|
+
const installer_1 = require("./utils/installer");
|
|
49
|
+
class ClaudeLauncher {
|
|
50
|
+
constructor(config, profileName) {
|
|
51
|
+
this.config = config;
|
|
52
|
+
this.profileName = profileName;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 启动 Claude Code
|
|
56
|
+
*/
|
|
57
|
+
async launch(options = {}) {
|
|
58
|
+
const { args = [], skipPermissions = true, showStats = false } = options;
|
|
59
|
+
// 如果指定了 profileName,使用指定的配置;否则使用当前配置
|
|
60
|
+
const profile = this.profileName
|
|
61
|
+
? this.config.getProfile(this.profileName)
|
|
62
|
+
: this.config.getCurrentProfile()?.config;
|
|
63
|
+
const apiKey = profile?.apiKey;
|
|
64
|
+
const baseUrl = profile?.baseUrl;
|
|
65
|
+
if (!apiKey) {
|
|
66
|
+
logger_1.Logger.error('未找到 API Key 配置');
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log(chalk_1.default.gray('请先运行配置命令:'));
|
|
69
|
+
console.log(chalk_1.default.cyan(' ccs config'));
|
|
70
|
+
console.log('');
|
|
71
|
+
return { exitCode: 1, hasApiError: true };
|
|
72
|
+
}
|
|
73
|
+
// 显示启动欢迎信息
|
|
74
|
+
(0, welcome_1.showLaunchWelcome)();
|
|
75
|
+
// 如果需要显示统计信息
|
|
76
|
+
if (showStats) {
|
|
77
|
+
await this.showTodayStats();
|
|
78
|
+
}
|
|
79
|
+
// 设置环境变量(核心功能)
|
|
80
|
+
const env = {
|
|
81
|
+
...process.env,
|
|
82
|
+
ANTHROPIC_API_KEY: apiKey, // Claude Code 使用这个环境变量
|
|
83
|
+
ANTHROPIC_BASE_URL: baseUrl || 'https://api.anthropic.com'
|
|
84
|
+
};
|
|
85
|
+
// 如果配置了可选的模型参数,也注入环境变量
|
|
86
|
+
const model = profile?.model;
|
|
87
|
+
const smallFastModel = profile?.smallFastModel;
|
|
88
|
+
if (model) {
|
|
89
|
+
env.ANTHROPIC_MODEL = model;
|
|
90
|
+
}
|
|
91
|
+
if (smallFastModel) {
|
|
92
|
+
env.ANTHROPIC_SMALL_FAST_MODEL = smallFastModel;
|
|
93
|
+
}
|
|
94
|
+
// 构建 Claude 参数
|
|
95
|
+
const claudeArgs = [...args];
|
|
96
|
+
if (skipPermissions && !claudeArgs.includes('--dangerously-skip-permissions')) {
|
|
97
|
+
claudeArgs.unshift('--dangerously-skip-permissions');
|
|
98
|
+
}
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
// 启动 Claude Code(跨平台支持)
|
|
101
|
+
const claudeCmd = (0, installer_1.getClaudeCommand)();
|
|
102
|
+
const isWindows = process.platform === 'win32';
|
|
103
|
+
const claude = (0, child_process_1.spawn)(claudeCmd, claudeArgs, {
|
|
104
|
+
stdio: 'inherit',
|
|
105
|
+
env,
|
|
106
|
+
shell: isWindows // Windows 需要 shell: true 以支持 .cmd 文件和 Git Bash
|
|
107
|
+
});
|
|
108
|
+
claude.on('error', (error) => {
|
|
109
|
+
logger_1.Logger.error('启动 Claude Code 失败');
|
|
110
|
+
console.error(chalk_1.default.red(error.message));
|
|
111
|
+
reject(error);
|
|
112
|
+
});
|
|
113
|
+
claude.on('exit', (code) => {
|
|
114
|
+
const exitCode = code || 0;
|
|
115
|
+
const hasApiError = exitCode === 1;
|
|
116
|
+
// 如果检测到可能的 API 错误,显示友好提示
|
|
117
|
+
if (hasApiError) {
|
|
118
|
+
console.log('\n' + chalk_1.default.yellow('─'.repeat(70)));
|
|
119
|
+
console.log(chalk_1.default.yellow.bold('💡 提示:') + chalk_1.default.white('如果遇到 API 认证问题,可以运行以下命令重新配置:'));
|
|
120
|
+
console.log(chalk_1.default.green.bold(' ccs config'));
|
|
121
|
+
console.log(chalk_1.default.yellow('─'.repeat(70) + '\n'));
|
|
122
|
+
}
|
|
123
|
+
resolve({ exitCode, hasApiError });
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 显示今日统计(如果有的话)
|
|
129
|
+
*/
|
|
130
|
+
async showTodayStats() {
|
|
131
|
+
try {
|
|
132
|
+
// 动态导入 StatusLinePlugin 以获取统计信息
|
|
133
|
+
const { StatusLinePlugin } = await Promise.resolve().then(() => __importStar(require('./index')));
|
|
134
|
+
const plugin = new StatusLinePlugin();
|
|
135
|
+
// 获取今日统计
|
|
136
|
+
const stats = await plugin.getTodayStats();
|
|
137
|
+
if (stats) {
|
|
138
|
+
const { showTodayStats } = await Promise.resolve().then(() => __importStar(require('./ui/welcome')));
|
|
139
|
+
showTodayStats(stats);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
// 静默失败,不影响启动
|
|
144
|
+
logger_1.Logger.debug(`获取统计信息失败: ${error}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.ClaudeLauncher = ClaudeLauncher;
|
|
149
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/prompts.js
CHANGED
|
@@ -15,7 +15,7 @@ exports.confirmLaunch = confirmLaunch;
|
|
|
15
15
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
16
16
|
const chalk_1 = __importDefault(require("chalk"));
|
|
17
17
|
const boxen_1 = __importDefault(require("boxen"));
|
|
18
|
-
const
|
|
18
|
+
const validator_1 = require("../config/validator");
|
|
19
19
|
/**
|
|
20
20
|
* 显示配置引导
|
|
21
21
|
*/
|
|
@@ -73,7 +73,7 @@ async function showConfigPrompts(defaultName) {
|
|
|
73
73
|
if (!input) {
|
|
74
74
|
return '❌ Base URL 不能为空';
|
|
75
75
|
}
|
|
76
|
-
if (!(0,
|
|
76
|
+
if (!(0, validator_1.validateUrl)(input)) {
|
|
77
77
|
return '❌ 请输入有效的 HTTP/HTTPS URL';
|
|
78
78
|
}
|
|
79
79
|
return true;
|
|
@@ -91,7 +91,7 @@ async function showConfigPrompts(defaultName) {
|
|
|
91
91
|
if (!input) {
|
|
92
92
|
return '❌ API Key 不能为空';
|
|
93
93
|
}
|
|
94
|
-
if (!(0,
|
|
94
|
+
if (!(0, validator_1.validateApiKeyFormat)(input)) {
|
|
95
95
|
return '❌ API Key 格式不正确(长度应在 20-200 个字符之间)';
|
|
96
96
|
}
|
|
97
97
|
return true;
|
package/dist/ui/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAUH,0CAsBC;AAKD,8CAgHC;AAKD,sCAmBC;AAKD,gDAWC;AAKD,sCAWC;AA3MD,wDAAgC;AAChC,kDAA0B;AAC1B,kDAA0B;AAC1B
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/welcome.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAYlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAUxC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAKP;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAYlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAUxC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAKP;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAsC/B"}
|
package/dist/ui/welcome.js
CHANGED
|
@@ -63,13 +63,13 @@ function showHelp() {
|
|
|
63
63
|
console.log(chalk_1.default.cyan.bold('\nCC Code Status v' + packageJson.version));
|
|
64
64
|
console.log(chalk_1.default.gray('一个增强的 Claude Code 启动器 + 状态栏插件\n'));
|
|
65
65
|
console.log(chalk_1.default.white('用法:'));
|
|
66
|
-
console.log(chalk_1.default.gray(' ccs ') + '启动 Claude Code
|
|
66
|
+
console.log(chalk_1.default.gray(' ccs ') + '通过内置 ccgo 启动 Claude Code');
|
|
67
|
+
console.log(chalk_1.default.gray(' ccs -p "任务" ') + '无头模式执行任务(行为同 ccgo -p)');
|
|
67
68
|
console.log(chalk_1.default.gray(' ccs --statusline ') + '仅运行状态栏插件');
|
|
68
69
|
console.log('');
|
|
69
|
-
console.log(chalk_1.default.white('
|
|
70
|
-
console.log(chalk_1.default.gray(' ccs
|
|
71
|
-
console.log(chalk_1.default.gray(' ccs config
|
|
72
|
-
console.log(chalk_1.default.gray(' ccs config --reset ') + '重置所有配置');
|
|
70
|
+
console.log(chalk_1.default.white('启动与配置:'));
|
|
71
|
+
console.log(chalk_1.default.gray(' ccs init ') + '初始化 ~/.claude.json(跳过 onboarding)');
|
|
72
|
+
console.log(chalk_1.default.gray(' ccs config ') + '调用内置 ccgo config(查看配置文件说明)');
|
|
73
73
|
console.log('');
|
|
74
74
|
console.log(chalk_1.default.white('数据同步:'));
|
|
75
75
|
console.log(chalk_1.default.gray(' ccs sync ') + '手动同步数据');
|
|
@@ -79,8 +79,7 @@ function showHelp() {
|
|
|
79
79
|
console.log(chalk_1.default.gray(' ccs custom-sync ') + '自定义数据上报');
|
|
80
80
|
console.log('');
|
|
81
81
|
console.log(chalk_1.default.white('统计:'));
|
|
82
|
-
console.log(chalk_1.default.gray(' ccs
|
|
83
|
-
console.log(chalk_1.default.gray(' ccs stats today ') + '查看今日统计');
|
|
82
|
+
console.log(chalk_1.default.gray(' ccs today ') + '查看今日统计');
|
|
84
83
|
console.log('');
|
|
85
84
|
console.log(chalk_1.default.white('项目排除:'));
|
|
86
85
|
console.log(chalk_1.default.gray(' ccs exclude add <项目名称> ') + '添加排除项目');
|
package/dist/ui/welcome.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAUH,kCAYC;AAKD,8CAUC;AAKD,8CAIC;AAKD,wCAUC;AAKD,
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"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"}
|