hop-claude 1.0.0 → 1.0.1
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/CHANGELOG.md +18 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/prompts.js +57 -57
- package/dist/ui/prompts.js.map +1 -1
- package/dist/utils/claude-launcher.js +4 -4
- package/dist/utils/claude-launcher.js.map +1 -1
- package/dist/utils/migration.js +56 -56
- package/dist/utils/migration.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 1860e33: 修正环境变量并完全中文化界面
|
|
8
|
+
|
|
9
|
+
**修正**:
|
|
10
|
+
|
|
11
|
+
- 环境变量从 `ANTHROPIC_API_KEY` 改为 `ANTHROPIC_AUTH_TOKEN`(与 Claude Code 官方一致)
|
|
12
|
+
|
|
13
|
+
**改进**:
|
|
14
|
+
|
|
15
|
+
- 完全中文化所有用户界面文本
|
|
16
|
+
- 交互提示、错误消息、迁移工具全部使用中文
|
|
17
|
+
- 明确标注 API Key 对应的环境变量名称
|
|
18
|
+
|
|
19
|
+
**面向受众**:主要为中国用户优化体验
|
|
20
|
+
|
|
3
21
|
## 1.0.0
|
|
4
22
|
|
|
5
23
|
### Major Changes
|
package/dist/types/index.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ export interface DecryptedProfile extends Omit<ProfileConfig, 'apiKey'> {
|
|
|
25
25
|
apiKey: string;
|
|
26
26
|
}
|
|
27
27
|
export interface EnvironmentVariables {
|
|
28
|
-
|
|
28
|
+
ANTHROPIC_AUTH_TOKEN?: string;
|
|
29
29
|
ANTHROPIC_BASE_URL?: string;
|
|
30
30
|
HTTP_PROXY?: string;
|
|
31
31
|
HTTPS_PROXY?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC,CAAC,EAAE,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
package/dist/ui/prompts.js
CHANGED
|
@@ -16,26 +16,26 @@ export class InteractiveUI {
|
|
|
16
16
|
*/
|
|
17
17
|
async showCurrentAndAsk() {
|
|
18
18
|
const current = await this.configManager.getCurrentProfile();
|
|
19
|
-
displayTitle('🔧 Claude Code
|
|
19
|
+
displayTitle('🔧 Claude Code 配置管理工具');
|
|
20
20
|
if (current) {
|
|
21
|
-
console.log(chalk.cyan('
|
|
22
|
-
displayInfo('
|
|
21
|
+
console.log(chalk.cyan('当前配置:'));
|
|
22
|
+
displayInfo('域名/配置名', chalk.green(current.domain));
|
|
23
23
|
displayInfo('Base URL', current.baseUrl);
|
|
24
|
-
displayInfo('
|
|
25
|
-
displayInfo('
|
|
24
|
+
displayInfo('代理', current.proxy, '(无)');
|
|
25
|
+
displayInfo('禁用非必要流量', current.disableNonessentialTraffic ? '是' : '否');
|
|
26
26
|
console.log();
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
29
|
-
displayWarning('
|
|
29
|
+
displayWarning('尚未配置。\n');
|
|
30
30
|
}
|
|
31
31
|
const { action } = await prompts({
|
|
32
32
|
type: 'select',
|
|
33
33
|
name: 'action',
|
|
34
|
-
message: '
|
|
34
|
+
message: '请选择操作:',
|
|
35
35
|
choices: [
|
|
36
|
-
{ title: '
|
|
37
|
-
{ title: '
|
|
38
|
-
{ title: '
|
|
36
|
+
{ title: '使用当前配置继续', value: 'continue', disabled: !current },
|
|
37
|
+
{ title: '修改配置', value: 'modify' },
|
|
38
|
+
{ title: '退出', value: 'exit' },
|
|
39
39
|
],
|
|
40
40
|
initial: current ? 0 : 1,
|
|
41
41
|
});
|
|
@@ -55,15 +55,15 @@ export class InteractiveUI {
|
|
|
55
55
|
const { action } = await prompts({
|
|
56
56
|
type: 'select',
|
|
57
57
|
name: 'action',
|
|
58
|
-
message: '
|
|
58
|
+
message: '配置管理',
|
|
59
59
|
choices: [
|
|
60
|
-
{ title: '
|
|
61
|
-
{ title: '
|
|
62
|
-
{ title: '
|
|
63
|
-
{ title: '
|
|
64
|
-
{ title: '
|
|
65
|
-
{ title: '
|
|
66
|
-
{ title: '
|
|
60
|
+
{ title: '选择已有配置', value: 'select', disabled: profiles.length === 0 },
|
|
61
|
+
{ title: '创建新配置', value: 'create' },
|
|
62
|
+
{ title: '编辑已有配置', value: 'edit', disabled: profiles.length === 0 },
|
|
63
|
+
{ title: '删除配置', value: 'delete', disabled: profiles.length === 0 },
|
|
64
|
+
{ title: '导出配置', value: 'export' },
|
|
65
|
+
{ title: '导入配置', value: 'import' },
|
|
66
|
+
{ title: '返回', value: 'back' },
|
|
67
67
|
],
|
|
68
68
|
});
|
|
69
69
|
switch (action) {
|
|
@@ -94,7 +94,7 @@ export class InteractiveUI {
|
|
|
94
94
|
const { domain } = await prompts({
|
|
95
95
|
type: 'select',
|
|
96
96
|
name: 'domain',
|
|
97
|
-
message: '
|
|
97
|
+
message: '选择配置:',
|
|
98
98
|
choices: profiles.map(p => ({
|
|
99
99
|
title: `${p.domain} (${p.maskedApiKey})`,
|
|
100
100
|
value: p.domain,
|
|
@@ -102,7 +102,7 @@ export class InteractiveUI {
|
|
|
102
102
|
});
|
|
103
103
|
if (domain) {
|
|
104
104
|
await this.configManager.setCurrentProfile(domain);
|
|
105
|
-
displaySuccess(
|
|
105
|
+
displaySuccess(`已切换到:${domain}`);
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
/**
|
|
@@ -113,61 +113,61 @@ export class InteractiveUI {
|
|
|
113
113
|
{
|
|
114
114
|
type: 'text',
|
|
115
115
|
name: 'domain',
|
|
116
|
-
message: '
|
|
117
|
-
validate: value => value.trim() ? true : '
|
|
116
|
+
message: '域名/配置名:',
|
|
117
|
+
validate: value => value.trim() ? true : '域名不能为空',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
120
|
type: 'password',
|
|
121
121
|
name: 'apiKey',
|
|
122
|
-
message: 'API Key
|
|
123
|
-
validate: value => value.trim() ? true : 'API Key
|
|
122
|
+
message: 'API Key (ANTHROPIC_AUTH_TOKEN):',
|
|
123
|
+
validate: value => value.trim() ? true : 'API Key 不能为空',
|
|
124
124
|
},
|
|
125
125
|
{
|
|
126
126
|
type: 'text',
|
|
127
127
|
name: 'baseUrl',
|
|
128
|
-
message: 'Base URL (
|
|
128
|
+
message: 'Base URL (可选,用于中转站):',
|
|
129
129
|
},
|
|
130
130
|
{
|
|
131
131
|
type: 'text',
|
|
132
132
|
name: 'proxy',
|
|
133
|
-
message: '
|
|
133
|
+
message: '代理 (可选):',
|
|
134
134
|
},
|
|
135
135
|
{
|
|
136
136
|
type: 'confirm',
|
|
137
137
|
name: 'disableNonessentialTraffic',
|
|
138
|
-
message: '
|
|
138
|
+
message: '禁用非必要流量?',
|
|
139
139
|
initial: false,
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
type: 'confirm',
|
|
143
143
|
name: 'validate',
|
|
144
|
-
message: '
|
|
144
|
+
message: '验证 API Key 有效性?',
|
|
145
145
|
initial: false,
|
|
146
146
|
},
|
|
147
147
|
]);
|
|
148
148
|
if (!answers.domain || !answers.apiKey) {
|
|
149
|
-
displayWarning('
|
|
149
|
+
displayWarning('已取消');
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
152
152
|
// 验证 API Key(如果用户选择)
|
|
153
153
|
if (answers.validate) {
|
|
154
|
-
console.log(chalk.gray('
|
|
154
|
+
console.log(chalk.gray('正在验证 API Key...'));
|
|
155
155
|
const result = await validateApiKey(answers.apiKey, answers.baseUrl);
|
|
156
156
|
if (!result.valid) {
|
|
157
|
-
displayError(`API Key
|
|
157
|
+
displayError(`API Key 验证失败:${result.error}`);
|
|
158
158
|
const { continueAnyway } = await prompts({
|
|
159
159
|
type: 'confirm',
|
|
160
160
|
name: 'continueAnyway',
|
|
161
|
-
message: '
|
|
161
|
+
message: '仍然继续?',
|
|
162
162
|
initial: false,
|
|
163
163
|
});
|
|
164
164
|
if (!continueAnyway) {
|
|
165
|
-
displayWarning('
|
|
165
|
+
displayWarning('已取消');
|
|
166
166
|
return;
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
else {
|
|
170
|
-
displaySuccess('API Key
|
|
170
|
+
displaySuccess('API Key 有效');
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
const profile = {
|
|
@@ -181,7 +181,7 @@ export class InteractiveUI {
|
|
|
181
181
|
};
|
|
182
182
|
await this.configManager.saveProfile(profile);
|
|
183
183
|
await this.configManager.setCurrentProfile(profile.domain);
|
|
184
|
-
displaySuccess(
|
|
184
|
+
displaySuccess(`配置 "${profile.domain}" 已创建并激活`);
|
|
185
185
|
}
|
|
186
186
|
/**
|
|
187
187
|
* 编辑 profile
|
|
@@ -190,7 +190,7 @@ export class InteractiveUI {
|
|
|
190
190
|
const { domain } = await prompts({
|
|
191
191
|
type: 'select',
|
|
192
192
|
name: 'domain',
|
|
193
|
-
message: '
|
|
193
|
+
message: '选择要编辑的配置:',
|
|
194
194
|
choices: profiles.map(p => ({
|
|
195
195
|
title: `${p.domain} (${p.maskedApiKey})`,
|
|
196
196
|
value: p.domain,
|
|
@@ -205,24 +205,24 @@ export class InteractiveUI {
|
|
|
205
205
|
{
|
|
206
206
|
type: 'password',
|
|
207
207
|
name: 'apiKey',
|
|
208
|
-
message: 'API Key (
|
|
208
|
+
message: 'API Key (留空保持不变):',
|
|
209
209
|
},
|
|
210
210
|
{
|
|
211
211
|
type: 'text',
|
|
212
212
|
name: 'baseUrl',
|
|
213
|
-
message: 'Base URL
|
|
213
|
+
message: 'Base URL:',
|
|
214
214
|
initial: existing.baseUrl,
|
|
215
215
|
},
|
|
216
216
|
{
|
|
217
217
|
type: 'text',
|
|
218
218
|
name: 'proxy',
|
|
219
|
-
message: '
|
|
219
|
+
message: '代理:',
|
|
220
220
|
initial: existing.proxy,
|
|
221
221
|
},
|
|
222
222
|
{
|
|
223
223
|
type: 'confirm',
|
|
224
224
|
name: 'disableNonessentialTraffic',
|
|
225
|
-
message: '
|
|
225
|
+
message: '禁用非必要流量?',
|
|
226
226
|
initial: existing.disableNonessentialTraffic,
|
|
227
227
|
},
|
|
228
228
|
]);
|
|
@@ -234,7 +234,7 @@ export class InteractiveUI {
|
|
|
234
234
|
disableNonessentialTraffic: answers.disableNonessentialTraffic,
|
|
235
235
|
};
|
|
236
236
|
await this.configManager.saveProfile(updated);
|
|
237
|
-
displaySuccess(
|
|
237
|
+
displaySuccess(`配置 "${domain}" 已更新`);
|
|
238
238
|
}
|
|
239
239
|
/**
|
|
240
240
|
* 删除 profile
|
|
@@ -243,7 +243,7 @@ export class InteractiveUI {
|
|
|
243
243
|
const { domain } = await prompts({
|
|
244
244
|
type: 'select',
|
|
245
245
|
name: 'domain',
|
|
246
|
-
message: '
|
|
246
|
+
message: '选择要删除的配置:',
|
|
247
247
|
choices: profiles.map(p => ({
|
|
248
248
|
title: `${p.domain} (${p.maskedApiKey})`,
|
|
249
249
|
value: p.domain,
|
|
@@ -254,12 +254,12 @@ export class InteractiveUI {
|
|
|
254
254
|
const { confirm } = await prompts({
|
|
255
255
|
type: 'confirm',
|
|
256
256
|
name: 'confirm',
|
|
257
|
-
message:
|
|
257
|
+
message: `确定要删除 "${domain}" 吗?`,
|
|
258
258
|
initial: false,
|
|
259
259
|
});
|
|
260
260
|
if (confirm) {
|
|
261
261
|
await this.configManager.deleteProfile(domain);
|
|
262
|
-
displaySuccess(
|
|
262
|
+
displaySuccess(`配置 "${domain}" 已删除`);
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
265
|
/**
|
|
@@ -268,9 +268,9 @@ export class InteractiveUI {
|
|
|
268
268
|
async listConfigurations() {
|
|
269
269
|
const profiles = await this.configManager.listProfiles();
|
|
270
270
|
const config = await this.configManager.getConfig();
|
|
271
|
-
displayTitle('📋
|
|
271
|
+
displayTitle('📋 所有配置:');
|
|
272
272
|
if (profiles.length === 0) {
|
|
273
|
-
console.log(chalk.gray('
|
|
273
|
+
console.log(chalk.gray(' 未找到任何配置\n'));
|
|
274
274
|
return;
|
|
275
275
|
}
|
|
276
276
|
profiles.forEach(p => {
|
|
@@ -279,8 +279,8 @@ export class InteractiveUI {
|
|
|
279
279
|
console.log(`${marker} ${chalk.bold(p.domain)}`);
|
|
280
280
|
displayInfo('API Key', p.maskedApiKey);
|
|
281
281
|
displayInfo('Base URL', p.baseUrl);
|
|
282
|
-
displayInfo('
|
|
283
|
-
displayInfo('
|
|
282
|
+
displayInfo('代理', p.proxy, '(无)');
|
|
283
|
+
displayInfo('禁用非必要流量', p.disableNonessentialTraffic ? '是' : '否');
|
|
284
284
|
console.log();
|
|
285
285
|
});
|
|
286
286
|
}
|
|
@@ -291,18 +291,18 @@ export class InteractiveUI {
|
|
|
291
291
|
const { outputPath } = await prompts({
|
|
292
292
|
type: 'text',
|
|
293
293
|
name: 'outputPath',
|
|
294
|
-
message: '
|
|
295
|
-
initial: './
|
|
294
|
+
message: '导出到文件:',
|
|
295
|
+
initial: './hop-claude-backup.json',
|
|
296
296
|
});
|
|
297
297
|
if (!outputPath)
|
|
298
298
|
return;
|
|
299
299
|
try {
|
|
300
300
|
await backupConfig(this.configManager, outputPath);
|
|
301
|
-
displaySuccess(
|
|
301
|
+
displaySuccess(`配置已导出到:${outputPath}`);
|
|
302
302
|
}
|
|
303
303
|
catch (error) {
|
|
304
304
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
305
|
-
displayError(
|
|
305
|
+
displayError(`导出失败:${err.message}`);
|
|
306
306
|
}
|
|
307
307
|
}
|
|
308
308
|
/**
|
|
@@ -312,27 +312,27 @@ export class InteractiveUI {
|
|
|
312
312
|
const { inputPath } = await prompts({
|
|
313
313
|
type: 'text',
|
|
314
314
|
name: 'inputPath',
|
|
315
|
-
message: '
|
|
315
|
+
message: '从文件导入:',
|
|
316
316
|
});
|
|
317
317
|
if (!inputPath)
|
|
318
318
|
return;
|
|
319
319
|
const { confirm } = await prompts({
|
|
320
320
|
type: 'confirm',
|
|
321
321
|
name: 'confirm',
|
|
322
|
-
message: '
|
|
322
|
+
message: '这将替换所有现有配置。是否继续?',
|
|
323
323
|
initial: false,
|
|
324
324
|
});
|
|
325
325
|
if (!confirm) {
|
|
326
|
-
displayWarning('
|
|
326
|
+
displayWarning('已取消');
|
|
327
327
|
return;
|
|
328
328
|
}
|
|
329
329
|
try {
|
|
330
330
|
await restoreConfig(this.configManager, inputPath);
|
|
331
|
-
displaySuccess('
|
|
331
|
+
displaySuccess('配置导入成功');
|
|
332
332
|
}
|
|
333
333
|
catch (error) {
|
|
334
334
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
335
|
-
displayError(
|
|
335
|
+
displayError(`导入失败:${err.message}`);
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
338
|
}
|
package/dist/ui/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvG;;GAEG;AACH,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAE7D,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,7 @@ export async function launchClaude(profile, args = []) {
|
|
|
34
34
|
// 构建环境变量
|
|
35
35
|
const env = {
|
|
36
36
|
...process.env,
|
|
37
|
-
|
|
37
|
+
ANTHROPIC_AUTH_TOKEN: profile.apiKey,
|
|
38
38
|
};
|
|
39
39
|
if (profile.baseUrl) {
|
|
40
40
|
env.ANTHROPIC_BASE_URL = profile.baseUrl;
|
|
@@ -59,9 +59,9 @@ export async function launchClaude(profile, args = []) {
|
|
|
59
59
|
});
|
|
60
60
|
// 处理错误
|
|
61
61
|
claude.on('error', (error) => {
|
|
62
|
-
console.error('
|
|
63
|
-
console.error('\
|
|
64
|
-
console.error('
|
|
62
|
+
console.error('启动 Claude 失败:', error.message);
|
|
63
|
+
console.error('\n请确保 Claude CLI 已安装并在 PATH 中可用。');
|
|
64
|
+
console.error('安装地址:https://github.com/anthropics/claude-code');
|
|
65
65
|
process.exit(1);
|
|
66
66
|
});
|
|
67
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-launcher.js","sourceRoot":"","sources":["../../src/utils/claude-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;GAGG;AACH,SAAS,eAAe;IACtB,uBAAuB;IACvB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAExD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAyB,EACzB,OAAiB,EAAE;IAEnB,SAAS;IACT,MAAM,GAAG,GAAyB;QAChC,GAAG,OAAO,CAAC,GAAG;QACd,
|
|
1
|
+
{"version":3,"file":"claude-launcher.js","sourceRoot":"","sources":["../../src/utils/claude-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;GAGG;AACH,SAAS,eAAe;IACtB,uBAAuB;IACvB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAExD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAyB,EACzB,OAAiB,EAAE;IAEnB,SAAS;IACT,MAAM,GAAG,GAAyB;QAChC,GAAG,OAAO,CAAC,GAAG;QACd,oBAAoB,EAAE,OAAO,CAAC,MAAM;KACrC,CAAC;IAEF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAC/B,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,0BAA0B,EAAE,CAAC;QACvC,GAAG,CAAC,wCAAwC,GAAG,GAAG,CAAC;IACrD,CAAC;IAED,gBAAgB;IAChB,+BAA+B;IAC/B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QAClC,GAAG,EAAE,GAAwB;QAC7B,KAAK,EAAE,SAAS,EAAE,eAAe;KAClC,CAAC,CAAC;IAEH,OAAO;IACP,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/utils/migration.js
CHANGED
|
@@ -14,14 +14,14 @@ export class EncryptionMigration {
|
|
|
14
14
|
* 执行加密模式迁移
|
|
15
15
|
*/
|
|
16
16
|
async migrate() {
|
|
17
|
-
displayMessage('\n===
|
|
17
|
+
displayMessage('\n=== 加密模式迁移 ===\n');
|
|
18
18
|
// 获取当前加密模式
|
|
19
19
|
const currentMode = await this.configManager.getEncryptionMode();
|
|
20
|
-
displayMessage(
|
|
20
|
+
displayMessage(`当前加密模式:${currentMode}`);
|
|
21
21
|
if (currentMode === 'legacy') {
|
|
22
|
-
displayWarning('\nLegacy
|
|
23
|
-
displayWarning('
|
|
24
|
-
displayMessage('\
|
|
22
|
+
displayWarning('\nLegacy 模式使用机器绑定加密。');
|
|
23
|
+
displayWarning('导出的配置无法在其他机器上恢复。');
|
|
24
|
+
displayMessage('\n建议:迁移到更安全和可移植的模式。\n');
|
|
25
25
|
}
|
|
26
26
|
// 检查 keychain 是否可用
|
|
27
27
|
const keychainAvailable = await KeychainManager.isAvailable();
|
|
@@ -29,38 +29,38 @@ export class EncryptionMigration {
|
|
|
29
29
|
const choices = [];
|
|
30
30
|
if (keychainAvailable) {
|
|
31
31
|
choices.push({
|
|
32
|
-
title: 'Keychain
|
|
32
|
+
title: 'Keychain(推荐)',
|
|
33
33
|
value: 'keychain',
|
|
34
|
-
description: '
|
|
34
|
+
description: '将密钥存储在系统 keychain - 最安全,无需记住密码',
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
|
-
displayWarning('
|
|
38
|
+
displayWarning('注意:本系统不支持 OS Keychain。');
|
|
39
39
|
}
|
|
40
40
|
choices.push({
|
|
41
|
-
title: 'Passphrase',
|
|
41
|
+
title: 'Passphrase(密码)',
|
|
42
42
|
value: 'passphrase',
|
|
43
|
-
description: '
|
|
43
|
+
description: '使用密码加密 - 可跨机器移植,每次需要输入密码',
|
|
44
44
|
});
|
|
45
45
|
if (currentMode !== 'legacy') {
|
|
46
46
|
choices.push({
|
|
47
|
-
title: 'Legacy
|
|
47
|
+
title: 'Legacy(不推荐)',
|
|
48
48
|
value: 'legacy',
|
|
49
|
-
description: '
|
|
49
|
+
description: '机器绑定加密 - 无法在其他机器上恢复',
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
const { newMode } = await prompts({
|
|
53
53
|
type: 'select',
|
|
54
54
|
name: 'newMode',
|
|
55
|
-
message: '
|
|
55
|
+
message: '选择新的加密模式:',
|
|
56
56
|
choices,
|
|
57
57
|
});
|
|
58
58
|
if (!newMode) {
|
|
59
|
-
displayWarning('
|
|
59
|
+
displayWarning('已取消迁移');
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
if (newMode === currentMode) {
|
|
63
|
-
displayMessage('
|
|
63
|
+
displayMessage('已在使用此模式,无需迁移。');
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
// 如果选择 passphrase 模式,需要输入密码
|
|
@@ -69,20 +69,20 @@ export class EncryptionMigration {
|
|
|
69
69
|
const { pwd1 } = await prompts({
|
|
70
70
|
type: 'password',
|
|
71
71
|
name: 'pwd1',
|
|
72
|
-
message: '
|
|
73
|
-
validate: (value) => value.length >= 8 ? true : '
|
|
72
|
+
message: '输入新密码用于加密:',
|
|
73
|
+
validate: (value) => value.length >= 8 ? true : '密码至少需要 8 个字符',
|
|
74
74
|
});
|
|
75
75
|
if (!pwd1) {
|
|
76
|
-
displayWarning('
|
|
76
|
+
displayWarning('已取消迁移');
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
const { pwd2 } = await prompts({
|
|
80
80
|
type: 'password',
|
|
81
81
|
name: 'pwd2',
|
|
82
|
-
message: '
|
|
82
|
+
message: '确认密码:',
|
|
83
83
|
});
|
|
84
84
|
if (pwd1 !== pwd2) {
|
|
85
|
-
displayError('
|
|
85
|
+
displayError('两次密码输入不一致');
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
passphrase = pwd1;
|
|
@@ -91,49 +91,49 @@ export class EncryptionMigration {
|
|
|
91
91
|
const { confirm } = await prompts({
|
|
92
92
|
type: 'confirm',
|
|
93
93
|
name: 'confirm',
|
|
94
|
-
message:
|
|
94
|
+
message: `确认从 ${currentMode} 迁移到 ${newMode} 模式?`,
|
|
95
95
|
initial: false,
|
|
96
96
|
});
|
|
97
97
|
if (!confirm) {
|
|
98
|
-
displayWarning('
|
|
98
|
+
displayWarning('已取消迁移');
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
101
|
try {
|
|
102
|
-
displayMessage('\
|
|
102
|
+
displayMessage('\n正在备份当前配置...');
|
|
103
103
|
// 创建备份
|
|
104
104
|
const backupPath = `${this.configManager.getConfigPath()}.backup-${Date.now()}`;
|
|
105
105
|
const configData = await this.configManager.exportConfig();
|
|
106
106
|
const fs = await import('fs/promises');
|
|
107
107
|
await fs.writeFile(backupPath, configData, 'utf8');
|
|
108
|
-
displaySuccess(
|
|
109
|
-
displayMessage('\
|
|
108
|
+
displaySuccess(`备份已创建:${backupPath}`);
|
|
109
|
+
displayMessage('\n正在迁移加密模式...');
|
|
110
110
|
// 执行迁移
|
|
111
111
|
await this.configManager.switchEncryptionMode(newMode, passphrase);
|
|
112
|
-
displaySuccess(`\
|
|
113
|
-
displayMessage(`\
|
|
112
|
+
displaySuccess(`\n迁移完成!`);
|
|
113
|
+
displayMessage(`\n加密模式已更改:${currentMode} → ${newMode}`);
|
|
114
114
|
if (newMode === 'keychain') {
|
|
115
|
-
displayMessage('\
|
|
116
|
-
displayMessage('
|
|
115
|
+
displayMessage('\n您的 API 密钥现在存储在系统 keychain 中。');
|
|
116
|
+
displayMessage('配置文件仅包含非敏感数据。');
|
|
117
117
|
}
|
|
118
118
|
else if (newMode === 'passphrase') {
|
|
119
|
-
displayWarning('\
|
|
120
|
-
displayWarning('
|
|
119
|
+
displayWarning('\n重要:请记住您的密码!');
|
|
120
|
+
displayWarning('每次使用 hop-claude 时都需要输入密码。');
|
|
121
121
|
if (passphrase) {
|
|
122
122
|
this.configManager.setSessionPassphrase(passphrase);
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
|
-
displayMessage(`\
|
|
126
|
-
displayMessage('
|
|
125
|
+
displayMessage(`\n备份文件:${backupPath}`);
|
|
126
|
+
displayMessage('验证迁移成功后可以删除备份文件。\n');
|
|
127
127
|
}
|
|
128
128
|
catch (error) {
|
|
129
129
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
130
|
-
displayError(
|
|
130
|
+
displayError(`迁移失败:${err.message}`);
|
|
131
131
|
if (process.env.DEBUG) {
|
|
132
|
-
console.error('\
|
|
132
|
+
console.error('\n堆栈跟踪:');
|
|
133
133
|
console.error(err.stack);
|
|
134
134
|
}
|
|
135
|
-
displayWarning('\
|
|
136
|
-
displayWarning('
|
|
135
|
+
displayWarning('\n您的配置已备份。');
|
|
136
|
+
displayWarning('如有需要请从备份恢复。');
|
|
137
137
|
process.exit(1);
|
|
138
138
|
}
|
|
139
139
|
}
|
|
@@ -143,33 +143,33 @@ export class EncryptionMigration {
|
|
|
143
143
|
async showEncryptionInfo() {
|
|
144
144
|
const mode = await this.configManager.getEncryptionMode();
|
|
145
145
|
const keychainAvailable = await KeychainManager.isAvailable();
|
|
146
|
-
displayMessage('\n===
|
|
147
|
-
displayMessage(
|
|
146
|
+
displayMessage('\n=== 加密模式信息 ===\n');
|
|
147
|
+
displayMessage(`当前模式:${mode}`);
|
|
148
148
|
switch (mode) {
|
|
149
149
|
case 'legacy':
|
|
150
|
-
displayMessage('\nLegacy
|
|
151
|
-
displayMessage(' -
|
|
152
|
-
displayMessage(' -
|
|
153
|
-
displayMessage(' -
|
|
154
|
-
displayWarning('\n
|
|
155
|
-
displayMessage('
|
|
150
|
+
displayMessage('\nLegacy 模式:');
|
|
151
|
+
displayMessage(' - 使用机器绑定加密(hostname + username)');
|
|
152
|
+
displayMessage(' - 密钥已加密但绑定到本机');
|
|
153
|
+
displayMessage(' - 导出的配置无法在其他机器上恢复');
|
|
154
|
+
displayWarning('\n 警告:此模式已弃用且安全性较低。');
|
|
155
|
+
displayMessage(' 建议迁移到 keychain 或 passphrase 模式。');
|
|
156
156
|
break;
|
|
157
157
|
case 'keychain':
|
|
158
|
-
displayMessage('\nKeychain
|
|
159
|
-
displayMessage(' -
|
|
160
|
-
displayMessage(' -
|
|
161
|
-
displayMessage(' -
|
|
162
|
-
displayWarning('\n
|
|
158
|
+
displayMessage('\nKeychain 模式:');
|
|
159
|
+
displayMessage(' - 密钥存储在系统 keychain(最安全)');
|
|
160
|
+
displayMessage(' - 日常使用无需输入密码');
|
|
161
|
+
displayMessage(' - 密钥永不写入磁盘');
|
|
162
|
+
displayWarning('\n 注意:无法跨机器导出/导入密钥。');
|
|
163
163
|
break;
|
|
164
164
|
case 'passphrase':
|
|
165
|
-
displayMessage('\nPassphrase
|
|
166
|
-
displayMessage(' -
|
|
167
|
-
displayMessage(' -
|
|
168
|
-
displayMessage(' -
|
|
165
|
+
displayMessage('\nPassphrase 模式:');
|
|
166
|
+
displayMessage(' - 使用密码加密密钥');
|
|
167
|
+
displayMessage(' - 完全可跨机器移植');
|
|
168
|
+
displayMessage(' - 每次操作需要输入密码');
|
|
169
169
|
break;
|
|
170
170
|
}
|
|
171
|
-
displayMessage(`\
|
|
172
|
-
displayMessage('\
|
|
171
|
+
displayMessage(`\n系统 Keychain 可用:${keychainAvailable ? '是' : '否'}`);
|
|
172
|
+
displayMessage('\n要迁移到不同模式,请运行:');
|
|
173
173
|
displayMessage(' hop-claude --migrate-encryption\n');
|
|
174
174
|
}
|
|
175
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGhG;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACtB,aAAa,CAAgB;IAErC,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"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"}
|