myclaude-code 8.8.11 → 8.8.13
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 +44 -10
- package/dist/cli.js +83 -83
- package/dist/login-redirect-command.js +2 -2
- package/dist/provider-command.js +30 -30
- package/dist/provider-setup.js +107 -103
- package/install.sh +4 -2
- package/package.json +10 -7
|
@@ -24,13 +24,13 @@ export async function call() {
|
|
|
24
24
|
return {
|
|
25
25
|
type: 'text',
|
|
26
26
|
value:
|
|
27
|
-
'当前版本的 /login 已改为启动前配置流。\n请先退出当前会话,然后重新运行 myclaude;启动时会先让你选择“直接使用当前配置”或“重新配置模型与 API”。\n如果你想立刻进入配置,也可以直接在终端执行:myclaude
|
|
27
|
+
'当前版本的 /login 已改为启动前配置流。\n请先退出当前会话,然后重新运行 myclaude;启动时会先让你选择“直接使用当前配置”或“重新配置模型与 API”。\n如果你想立刻进入配置,也可以直接在终端执行:myclaude setup-token\n如果你只是想检查当前供应商与模型是否可用,可以执行:/provider validate\n如果你想自动修复无效的模型路由,可以执行:/provider repair',
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
return {
|
|
32
32
|
type: 'text',
|
|
33
33
|
value:
|
|
34
|
-
'The /login flow has been moved to the pre-launch configuration path.\nExit the current session and start myclaude again; before chat starts you will be able to choose between using the current configuration or reconfiguring model and API settings.\nIf you want to open setup immediately from the shell, run: myclaude
|
|
34
|
+
'The /login flow has been moved to the pre-launch configuration path.\nExit the current session and start myclaude again; before chat starts you will be able to choose between using the current configuration or reconfiguring model and API settings.\nIf you want to open setup immediately from the shell, run: myclaude setup-token\nIf you only want to test the current provider and model route, run: /provider validate\nIf you want myclaude to auto-repair an invalid model route, run: /provider repair',
|
|
35
35
|
}
|
|
36
36
|
}
|
package/dist/provider-command.js
CHANGED
|
@@ -24,16 +24,16 @@ function getRoutingDisplayValue(value, fallback) {
|
|
|
24
24
|
|
|
25
25
|
function formatProviderSummary(profile) {
|
|
26
26
|
return [
|
|
27
|
-
`
|
|
27
|
+
`Profile: ${profile.name}`,
|
|
28
28
|
`API URL: ${profile.baseUrl}`,
|
|
29
29
|
`${getCredentialLabel(profile.authType)}: ${maskCredential(profile.credential)}`,
|
|
30
|
-
`
|
|
30
|
+
`Main thread model: ${getRoutingDisplayValue(
|
|
31
31
|
profile.modelRouting?.primaryModel,
|
|
32
32
|
'provider default',
|
|
33
33
|
)}`,
|
|
34
34
|
`Subagent model: ${getRoutingDisplayValue(
|
|
35
35
|
profile.modelRouting?.subagentModel,
|
|
36
|
-
'inherit from
|
|
36
|
+
'inherit from main thread model',
|
|
37
37
|
)}`,
|
|
38
38
|
`Fast helper model: ${getRoutingDisplayValue(
|
|
39
39
|
profile.modelRouting?.smallFastModel,
|
|
@@ -46,8 +46,8 @@ function buildHelpText() {
|
|
|
46
46
|
return [
|
|
47
47
|
'Usage: /provider [list|current|clear|validate [profile]|matrix [profile]|repair [profile]|use <profile>|<profile>]',
|
|
48
48
|
'',
|
|
49
|
-
'
|
|
50
|
-
'
|
|
49
|
+
'Manage saved provider profiles and routing roles for myclaude.',
|
|
50
|
+
'Use `myclaude setup-token` outside the session to open the full /provider setup flow.',
|
|
51
51
|
'',
|
|
52
52
|
'Examples:',
|
|
53
53
|
' /provider list',
|
|
@@ -67,7 +67,7 @@ function formatListOutput() {
|
|
|
67
67
|
const currentProfile = getDisplayCurrentProfile()
|
|
68
68
|
|
|
69
69
|
if (profiles.length === 0 && !currentProfile) {
|
|
70
|
-
return 'No provider profiles are configured yet.
|
|
70
|
+
return 'No provider profiles are configured yet. Run `myclaude setup-token` outside the session to create one.'
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
const sections = [buildHelpText()]
|
|
@@ -78,7 +78,7 @@ function formatListOutput() {
|
|
|
78
78
|
'Saved provider profiles:',
|
|
79
79
|
...profiles.map(profile => {
|
|
80
80
|
const suffix = activeProfileId === profile.id ? ' (active)' : ''
|
|
81
|
-
return `- ${profile.name}${suffix} · ${profile.baseUrl} · Main ${getRoutingDisplayValue(
|
|
81
|
+
return `- ${profile.name}${suffix} · ${profile.baseUrl} · Main thread ${getRoutingDisplayValue(
|
|
82
82
|
profile.modelRouting?.primaryModel,
|
|
83
83
|
'provider default',
|
|
84
84
|
)}`
|
|
@@ -89,7 +89,7 @@ function formatListOutput() {
|
|
|
89
89
|
|
|
90
90
|
if (currentProfile) {
|
|
91
91
|
sections.push(
|
|
92
|
-
`
|
|
92
|
+
`Active profile:\n${formatProviderSummary(currentProfile)}`,
|
|
93
93
|
)
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -142,7 +142,7 @@ function buildValidationGuidance(profile, validation, routeMatrix) {
|
|
|
142
142
|
if (gpt54Route?.status === 'recommended') {
|
|
143
143
|
const guidance = [
|
|
144
144
|
'Guidance:',
|
|
145
|
-
'- This provider is currently best routed as gpt-5.4 for
|
|
145
|
+
'- This provider is currently best routed as gpt-5.4 for the main thread, subagent, and fast helper roles.',
|
|
146
146
|
]
|
|
147
147
|
|
|
148
148
|
if (gpt54Route.effortLevels.includes('max')) {
|
|
@@ -181,7 +181,7 @@ function buildValidationGuidance(profile, validation, routeMatrix) {
|
|
|
181
181
|
return [
|
|
182
182
|
'Guidance:',
|
|
183
183
|
'- This gateway is currently verified for native myclaude workflows on gpt-5.4.',
|
|
184
|
-
'- One or more secondary
|
|
184
|
+
'- One or more secondary routing roles are degraded here. Restart myclaude and choose reconfigure to switch all roles to gpt-5.4.',
|
|
185
185
|
]
|
|
186
186
|
}
|
|
187
187
|
|
|
@@ -189,7 +189,7 @@ function buildValidationGuidance(profile, validation, routeMatrix) {
|
|
|
189
189
|
return [
|
|
190
190
|
'Guidance:',
|
|
191
191
|
'- The provider can answer chat requests, but some native workflows may still degrade on the current routing.',
|
|
192
|
-
'- Restart myclaude and choose reconfigure, or run `myclaude
|
|
192
|
+
'- Restart myclaude and choose reconfigure, or run `myclaude setup-token`, to adjust the active profile and model route.',
|
|
193
193
|
]
|
|
194
194
|
}
|
|
195
195
|
|
|
@@ -216,11 +216,11 @@ export async function call(args, context) {
|
|
|
216
216
|
const currentProfile = getDisplayCurrentProfile()
|
|
217
217
|
return {
|
|
218
218
|
type: 'text',
|
|
219
|
-
|
|
220
|
-
? `
|
|
219
|
+
value: currentProfile
|
|
220
|
+
? `Active profile:\n${formatProviderSummary(
|
|
221
221
|
currentProfile,
|
|
222
222
|
)}`
|
|
223
|
-
: 'No active provider
|
|
223
|
+
: 'No active provider profile is set.',
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
226
|
|
|
@@ -229,7 +229,7 @@ export async function call(args, context) {
|
|
|
229
229
|
syncLiveSession(context, null)
|
|
230
230
|
return {
|
|
231
231
|
type: 'text',
|
|
232
|
-
value: 'Cleared the active provider configuration.',
|
|
232
|
+
value: 'Cleared the active provider profile configuration.',
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
|
|
@@ -243,13 +243,13 @@ export async function call(args, context) {
|
|
|
243
243
|
if (matches.length === 0) {
|
|
244
244
|
return {
|
|
245
245
|
type: 'text',
|
|
246
|
-
value: `No saved
|
|
246
|
+
value: `No saved profile matched '${profileQuery}'. Run /provider list to inspect saved names.`,
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
249
|
if (matches.length > 1) {
|
|
250
250
|
return {
|
|
251
251
|
type: 'text',
|
|
252
|
-
value: `Multiple
|
|
252
|
+
value: `Multiple profiles matched '${profileQuery}'. Be more specific:\n${formatMatchList(
|
|
253
253
|
matches,
|
|
254
254
|
)}`,
|
|
255
255
|
}
|
|
@@ -262,7 +262,7 @@ export async function call(args, context) {
|
|
|
262
262
|
if (!profile) {
|
|
263
263
|
return {
|
|
264
264
|
type: 'text',
|
|
265
|
-
value: 'No active provider
|
|
265
|
+
value: 'No active provider profile is set.',
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
268
|
|
|
@@ -282,13 +282,13 @@ export async function call(args, context) {
|
|
|
282
282
|
if (matches.length === 0) {
|
|
283
283
|
return {
|
|
284
284
|
type: 'text',
|
|
285
|
-
value: `No saved
|
|
285
|
+
value: `No saved profile matched '${profileQuery}'. Run /provider list to inspect saved names.`,
|
|
286
286
|
}
|
|
287
287
|
}
|
|
288
288
|
if (matches.length > 1) {
|
|
289
289
|
return {
|
|
290
290
|
type: 'text',
|
|
291
|
-
value: `Multiple
|
|
291
|
+
value: `Multiple profiles matched '${profileQuery}'. Be more specific:\n${formatMatchList(
|
|
292
292
|
matches,
|
|
293
293
|
)}`,
|
|
294
294
|
}
|
|
@@ -301,7 +301,7 @@ export async function call(args, context) {
|
|
|
301
301
|
if (!profile) {
|
|
302
302
|
return {
|
|
303
303
|
type: 'text',
|
|
304
|
-
value: 'No active provider
|
|
304
|
+
value: 'No active provider profile is set.',
|
|
305
305
|
}
|
|
306
306
|
}
|
|
307
307
|
|
|
@@ -334,13 +334,13 @@ export async function call(args, context) {
|
|
|
334
334
|
if (matches.length === 0) {
|
|
335
335
|
return {
|
|
336
336
|
type: 'text',
|
|
337
|
-
value: `No saved
|
|
337
|
+
value: `No saved profile matched '${profileQuery}'. Run /provider list to inspect saved names.`,
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
340
|
if (matches.length > 1) {
|
|
341
341
|
return {
|
|
342
342
|
type: 'text',
|
|
343
|
-
value: `Multiple
|
|
343
|
+
value: `Multiple profiles matched '${profileQuery}'. Be more specific:\n${formatMatchList(
|
|
344
344
|
matches,
|
|
345
345
|
)}`,
|
|
346
346
|
}
|
|
@@ -353,7 +353,7 @@ export async function call(args, context) {
|
|
|
353
353
|
if (!profile) {
|
|
354
354
|
return {
|
|
355
355
|
type: 'text',
|
|
356
|
-
value: 'No active provider
|
|
356
|
+
value: 'No active provider profile is set.',
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
359
|
|
|
@@ -363,7 +363,7 @@ export async function call(args, context) {
|
|
|
363
363
|
return {
|
|
364
364
|
type: 'text',
|
|
365
365
|
value: [
|
|
366
|
-
`Auto-repaired
|
|
366
|
+
`Auto-repaired profile ${repairResult.profile.name}:`,
|
|
367
367
|
...repairResult.repairLines,
|
|
368
368
|
...repairResult.validation.lines,
|
|
369
369
|
`Status: ${repairResult.validation.status}`,
|
|
@@ -385,7 +385,7 @@ export async function call(args, context) {
|
|
|
385
385
|
return {
|
|
386
386
|
type: 'text',
|
|
387
387
|
value:
|
|
388
|
-
'
|
|
388
|
+
'Run `myclaude setup-token` in the shell, or restart and choose reconfigure, to open the full /provider setup flow.',
|
|
389
389
|
}
|
|
390
390
|
}
|
|
391
391
|
|
|
@@ -396,14 +396,14 @@ export async function call(args, context) {
|
|
|
396
396
|
if (matches.length === 0) {
|
|
397
397
|
return {
|
|
398
398
|
type: 'text',
|
|
399
|
-
value: `No saved
|
|
399
|
+
value: `No saved profile matched '${profileQuery}'. Run /provider list to inspect saved names.`,
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
402
|
|
|
403
403
|
if (matches.length > 1) {
|
|
404
404
|
return {
|
|
405
405
|
type: 'text',
|
|
406
|
-
value: `Multiple
|
|
406
|
+
value: `Multiple profiles matched '${profileQuery}'. Be more specific:\n${formatMatchList(
|
|
407
407
|
matches,
|
|
408
408
|
)}`,
|
|
409
409
|
}
|
|
@@ -413,14 +413,14 @@ export async function call(args, context) {
|
|
|
413
413
|
if (!activatedProfile) {
|
|
414
414
|
return {
|
|
415
415
|
type: 'text',
|
|
416
|
-
value: `
|
|
416
|
+
value: `Profile '${matches[0].name}' is no longer available.`,
|
|
417
417
|
}
|
|
418
418
|
}
|
|
419
419
|
|
|
420
420
|
syncLiveSession(context, activatedProfile)
|
|
421
421
|
return {
|
|
422
422
|
type: 'text',
|
|
423
|
-
value: `Activated
|
|
423
|
+
value: `Activated profile ${activatedProfile.name}\n${formatProviderSummary(
|
|
424
424
|
activatedProfile,
|
|
425
425
|
)}`,
|
|
426
426
|
}
|
package/dist/provider-setup.js
CHANGED
|
@@ -5,7 +5,7 @@ import { dirname, join } from 'node:path'
|
|
|
5
5
|
import { createInterface } from 'node:readline/promises'
|
|
6
6
|
import { stdin, stdout } from 'node:process'
|
|
7
7
|
|
|
8
|
-
const APP_VERSION = '8.8.
|
|
8
|
+
const APP_VERSION = '8.8.13'
|
|
9
9
|
const CURRENT_PROVIDER_PROFILE_ID = '__current_provider__'
|
|
10
10
|
const SUPPORTED_LANGUAGES = new Set(['en', 'zh'])
|
|
11
11
|
const PROVIDER_CAPABILITY_CACHE_TTL_MS = 60 * 60 * 1000
|
|
@@ -62,7 +62,7 @@ const PROVIDER_MODEL_ROUTING_PRESETS = [
|
|
|
62
62
|
id: 'provider_default',
|
|
63
63
|
name: 'Provider defaults',
|
|
64
64
|
description:
|
|
65
|
-
'Keep
|
|
65
|
+
'Keep the provider defaults for all roles. Override individual models only when needed.',
|
|
66
66
|
routing: {
|
|
67
67
|
presetId: 'provider_default',
|
|
68
68
|
primaryModel: '',
|
|
@@ -79,7 +79,7 @@ const PROVIDER_MODEL_ROUTING_PRESETS = [
|
|
|
79
79
|
id: 'gpt_5_4_codex',
|
|
80
80
|
name: 'GPT-5.4 + GPT-5.3 Codex',
|
|
81
81
|
description:
|
|
82
|
-
'
|
|
82
|
+
'Main thread on GPT-5.4. Subagent and fast helper roles on GPT-5.3 Codex.',
|
|
83
83
|
routing: {
|
|
84
84
|
presetId: 'gpt_5_4_codex',
|
|
85
85
|
primaryModel: 'gpt-5.4',
|
|
@@ -96,7 +96,7 @@ const PROVIDER_MODEL_ROUTING_PRESETS = [
|
|
|
96
96
|
id: 'gpt_5_1_stable',
|
|
97
97
|
name: 'GPT-5.1 stable',
|
|
98
98
|
description:
|
|
99
|
-
'Use GPT-5.1
|
|
99
|
+
'Use GPT-5.1 for every role when GPT-5.4 or Codex routes are not reliable.',
|
|
100
100
|
routing: {
|
|
101
101
|
presetId: 'gpt_5_1_stable',
|
|
102
102
|
primaryModel: 'gpt-5.1',
|
|
@@ -113,7 +113,7 @@ const PROVIDER_MODEL_ROUTING_PRESETS = [
|
|
|
113
113
|
id: 'gpt_5_3_codex',
|
|
114
114
|
name: 'GPT-5.3 Codex everywhere',
|
|
115
115
|
description:
|
|
116
|
-
'
|
|
116
|
+
'Run the main thread, subagents, and fast helper role on GPT-5.3 Codex.',
|
|
117
117
|
routing: {
|
|
118
118
|
presetId: 'gpt_5_3_codex',
|
|
119
119
|
primaryModel: 'gpt-5.3-codex',
|
|
@@ -130,7 +130,7 @@ const PROVIDER_MODEL_ROUTING_PRESETS = [
|
|
|
130
130
|
id: 'custom',
|
|
131
131
|
name: 'Custom model routing',
|
|
132
132
|
description:
|
|
133
|
-
'Set
|
|
133
|
+
'Set main thread, subagent, and fast helper models yourself. Derived roles update automatically.',
|
|
134
134
|
routing: {
|
|
135
135
|
presetId: 'custom',
|
|
136
136
|
primaryModel: '',
|
|
@@ -268,75 +268,75 @@ function getMessages(language) {
|
|
|
268
268
|
const lang = normalizeLanguage(language)
|
|
269
269
|
if (lang === 'zh') {
|
|
270
270
|
return {
|
|
271
|
-
setupTitle: '
|
|
272
|
-
apiConfigTitle: '
|
|
273
|
-
apiConfigSubtitle: '
|
|
274
|
-
firstRunHint: '
|
|
271
|
+
setupTitle: '/provider',
|
|
272
|
+
apiConfigTitle: '供应商档案',
|
|
273
|
+
apiConfigSubtitle: '配置供应商档案、API URL、凭证和路由角色。',
|
|
274
|
+
firstRunHint: '检测到首次运行。请先配置一个供应商档案后再启动 myclaude。',
|
|
275
275
|
normalHint:
|
|
276
|
-
'myclaude
|
|
276
|
+
'myclaude 使用直接供应商配置,不需要 Claude Code 官方账号登录。使用 /provider 管理兼容 Anthropic 的供应商或网关档案。',
|
|
277
277
|
requiredField: '此项为必填。',
|
|
278
278
|
invalidChoice: '无效选择,请输入列表中的数字。',
|
|
279
279
|
cancelOption: '取消',
|
|
280
280
|
chooseLanguage: '请选择语言',
|
|
281
281
|
languageChinese: '中文',
|
|
282
282
|
languageEnglish: 'English',
|
|
283
|
-
chooseAction: '
|
|
284
|
-
addProvider: '
|
|
285
|
-
addProviderDesc: '
|
|
286
|
-
editProvider: '
|
|
287
|
-
editProviderDesc: '
|
|
288
|
-
copyProvider: '
|
|
289
|
-
copyProviderDesc: '
|
|
290
|
-
deleteProvider: '
|
|
291
|
-
deleteProviderDesc: '
|
|
292
|
-
skip: '
|
|
293
|
-
skipDesc: '
|
|
294
|
-
noSavedProviders: '
|
|
295
|
-
chooseProviderToEdit: '
|
|
296
|
-
chooseProviderToCopy: '
|
|
297
|
-
chooseProviderToDelete: '
|
|
298
|
-
chooseAuthType: '
|
|
283
|
+
chooseAction: '档案',
|
|
284
|
+
addProvider: '新增档案',
|
|
285
|
+
addProviderDesc: '新建一个可复用的供应商档案并立即启用',
|
|
286
|
+
editProvider: '编辑档案',
|
|
287
|
+
editProviderDesc: '更新已保存的供应商档案或直接切换到它',
|
|
288
|
+
copyProvider: '复制档案',
|
|
289
|
+
copyProviderDesc: '复制一个已保存的档案,再调整 URL、凭证或路由',
|
|
290
|
+
deleteProvider: '删除档案',
|
|
291
|
+
deleteProviderDesc: '从本地移除一个已保存的供应商档案',
|
|
292
|
+
skip: '退出配置',
|
|
293
|
+
skipDesc: '暂时离开。之后可通过 /provider 或 `myclaude setup-token` 重新打开。',
|
|
294
|
+
noSavedProviders: '当前还没有已保存的供应商档案。',
|
|
295
|
+
chooseProviderToEdit: '请选择要编辑的档案',
|
|
296
|
+
chooseProviderToCopy: '请选择要复制的档案',
|
|
297
|
+
chooseProviderToDelete: '请选择要删除的档案',
|
|
298
|
+
chooseAuthType: '认证方式',
|
|
299
299
|
apiKey: 'API Key',
|
|
300
300
|
apiKeyDesc: '使用 ANTHROPIC_API_KEY',
|
|
301
301
|
accessToken: 'Access Token',
|
|
302
302
|
accessTokenDesc: '使用 ANTHROPIC_AUTH_TOKEN',
|
|
303
|
-
providerName: '
|
|
303
|
+
providerName: '档案名称',
|
|
304
304
|
apiUrl: 'API URL',
|
|
305
305
|
invalidApiUrl: 'API URL 必须以 http:// 或 https:// 开头',
|
|
306
|
-
chooseModelRouting: '
|
|
307
|
-
primaryModel: '
|
|
306
|
+
chooseModelRouting: '路由预设',
|
|
307
|
+
primaryModel: '主线程模型',
|
|
308
308
|
subagentModel: '子代理模型',
|
|
309
309
|
fastHelperModel: '快速辅助模型',
|
|
310
|
-
confirmProviderSetup: '
|
|
311
|
-
provider: '
|
|
312
|
-
preset: '
|
|
310
|
+
confirmProviderSetup: '检查并启用',
|
|
311
|
+
provider: '档案',
|
|
312
|
+
preset: '供应商预设',
|
|
313
313
|
auth: '认证方式',
|
|
314
|
-
modelRouting: '
|
|
314
|
+
modelRouting: '路由预设',
|
|
315
315
|
providerDefault: '供应商默认',
|
|
316
316
|
inheritFromMain: '继承主线程模型',
|
|
317
|
-
saveProviderNow: '
|
|
317
|
+
saveProviderNow: '现在保存并启用这个档案吗?',
|
|
318
318
|
saveAndActivate: '保存并立即启用',
|
|
319
|
-
saveAndActivateDesc: '
|
|
319
|
+
saveAndActivateDesc: '写入本地设置,并马上切换到这个档案',
|
|
320
320
|
cancelDraft: '取消',
|
|
321
|
-
cancelDraftDesc: '
|
|
322
|
-
savedAndActivatedProvider: name =>
|
|
323
|
-
deletedProvider: name =>
|
|
321
|
+
cancelDraftDesc: '放弃这次草稿并返回档案列表',
|
|
322
|
+
savedAndActivatedProvider: name => `已保存并启用档案:${name}`,
|
|
323
|
+
deletedProvider: name => `已删除档案:${name}`,
|
|
324
324
|
currentApiCleared: '当前 API 配置已清空。',
|
|
325
|
-
chooseApiProvider: '
|
|
326
|
-
deleteConfirm: name =>
|
|
327
|
-
deleteProviderConfirm: '
|
|
328
|
-
deleteProviderConfirmDesc: '
|
|
329
|
-
keepUnchanged: '
|
|
330
|
-
keepUnchangedDesc: '
|
|
325
|
+
chooseApiProvider: '供应商预设',
|
|
326
|
+
deleteConfirm: name => `要从本地供应商档案中移除 “${name}” 吗?`,
|
|
327
|
+
deleteProviderConfirm: '删除档案',
|
|
328
|
+
deleteProviderConfirmDesc: '移除此已保存档案',
|
|
329
|
+
keepUnchanged: '返回',
|
|
330
|
+
keepUnchangedDesc: '回到档案列表',
|
|
331
331
|
activeSuffix: ' (当前启用)',
|
|
332
332
|
startupPrompt: '请选择启动方式',
|
|
333
|
-
startupUseCurrent: '
|
|
334
|
-
startupUseCurrentDesc: '
|
|
335
|
-
startupConfigure: '
|
|
336
|
-
startupConfigureDesc: '
|
|
333
|
+
startupUseCurrent: '直接使用当前档案',
|
|
334
|
+
startupUseCurrentDesc: '使用当前供应商档案、API URL、凭证和路由角色启动 myclaude',
|
|
335
|
+
startupConfigure: '打开 /provider 配置',
|
|
336
|
+
startupConfigureDesc: '启动前修改当前档案、API URL、凭证或路由角色',
|
|
337
337
|
startupExit: '退出',
|
|
338
338
|
startupExitDesc: '先不进入 myclaude',
|
|
339
|
-
currentConfiguration: '
|
|
339
|
+
currentConfiguration: '当前档案',
|
|
340
340
|
manualModel: '手动输入模型 ID',
|
|
341
341
|
manualModelDesc: '直接填写原始模型 ID,例如 gpt-5.4',
|
|
342
342
|
validatingModels: '正在验证当前供应商与模型路由...',
|
|
@@ -344,9 +344,9 @@ function getMessages(language) {
|
|
|
344
344
|
validationWarn: '模型验证返回警告,可能会影响部分能力。',
|
|
345
345
|
validationError: '模型验证失败,请重新配置供应商或模型路由。',
|
|
346
346
|
validationReconfigure: '将进入重新配置流程。',
|
|
347
|
-
validationWarnPrompt: '
|
|
348
|
-
validationErrorPrompt: '
|
|
349
|
-
warningContinue: '
|
|
347
|
+
validationWarnPrompt: '当前路由存在退化。请选择下一步。',
|
|
348
|
+
validationErrorPrompt: '当前路由不可用。请选择下一步。',
|
|
349
|
+
warningContinue: '继续使用当前路由',
|
|
350
350
|
warningContinueDesc: '继续启动,但某些原生工作流可能退化或不可靠',
|
|
351
351
|
warningReconfigure: '返回并重新配置',
|
|
352
352
|
warningReconfigureDesc: '修改供应商、密钥或模型路由后再继续',
|
|
@@ -361,78 +361,79 @@ function getMessages(language) {
|
|
|
361
361
|
}
|
|
362
362
|
|
|
363
363
|
return {
|
|
364
|
-
setupTitle: '
|
|
365
|
-
apiConfigTitle: '
|
|
364
|
+
setupTitle: '/provider',
|
|
365
|
+
apiConfigTitle: 'Provider profiles',
|
|
366
366
|
apiConfigSubtitle:
|
|
367
|
-
'
|
|
368
|
-
firstRunHint:
|
|
367
|
+
'Configure a provider profile, API URL, credential, and routing roles.',
|
|
368
|
+
firstRunHint:
|
|
369
|
+
'First run detected. Configure a provider profile before starting myclaude.',
|
|
369
370
|
normalHint:
|
|
370
|
-
'myclaude uses direct provider setup instead of Claude Code account login
|
|
371
|
+
'myclaude uses direct provider setup instead of Claude Code account login. Use /provider to manage Anthropic-compatible provider or gateway profiles.',
|
|
371
372
|
requiredField: 'This field is required.',
|
|
372
373
|
invalidChoice: 'Invalid choice. Enter one of the listed numbers.',
|
|
373
374
|
cancelOption: 'Cancel',
|
|
374
375
|
chooseLanguage: 'Choose language',
|
|
375
376
|
languageChinese: '中文',
|
|
376
377
|
languageEnglish: 'English',
|
|
377
|
-
chooseAction: '
|
|
378
|
-
addProvider: 'Add
|
|
378
|
+
chooseAction: 'Profiles',
|
|
379
|
+
addProvider: 'Add profile',
|
|
379
380
|
addProviderDesc: 'Create a reusable provider profile and activate it now',
|
|
380
|
-
editProvider: 'Edit
|
|
381
|
-
editProviderDesc: 'Update
|
|
382
|
-
copyProvider: 'Copy
|
|
383
|
-
copyProviderDesc: 'Duplicate
|
|
384
|
-
deleteProvider: 'Delete
|
|
381
|
+
editProvider: 'Edit profile',
|
|
382
|
+
editProviderDesc: 'Update a saved profile or make it active',
|
|
383
|
+
copyProvider: 'Copy profile',
|
|
384
|
+
copyProviderDesc: 'Duplicate a saved profile and adjust URL, auth, or routing',
|
|
385
|
+
deleteProvider: 'Delete profile',
|
|
385
386
|
deleteProviderDesc: 'Remove a saved provider profile from local storage',
|
|
386
|
-
skip: '
|
|
387
|
-
skipDesc: '
|
|
387
|
+
skip: 'Exit setup',
|
|
388
|
+
skipDesc: 'Leave setup now. Reopen it from `/provider` or `myclaude setup-token`.',
|
|
388
389
|
noSavedProviders: 'No saved provider profiles are available yet.',
|
|
389
|
-
chooseProviderToEdit: 'Choose a
|
|
390
|
-
chooseProviderToCopy: 'Choose a
|
|
391
|
-
chooseProviderToDelete: 'Choose a
|
|
392
|
-
chooseAuthType: '
|
|
390
|
+
chooseProviderToEdit: 'Choose a profile to edit',
|
|
391
|
+
chooseProviderToCopy: 'Choose a profile to copy',
|
|
392
|
+
chooseProviderToDelete: 'Choose a profile to delete',
|
|
393
|
+
chooseAuthType: 'Authentication',
|
|
393
394
|
apiKey: 'API Key',
|
|
394
395
|
apiKeyDesc: 'Use ANTHROPIC_API_KEY',
|
|
395
396
|
accessToken: 'Access Token',
|
|
396
397
|
accessTokenDesc: 'Use ANTHROPIC_AUTH_TOKEN',
|
|
397
|
-
providerName: '
|
|
398
|
+
providerName: 'Profile name',
|
|
398
399
|
apiUrl: 'API URL',
|
|
399
400
|
invalidApiUrl: 'API URL must start with http:// or https://',
|
|
400
|
-
chooseModelRouting: '
|
|
401
|
-
primaryModel: '
|
|
401
|
+
chooseModelRouting: 'Routing preset',
|
|
402
|
+
primaryModel: 'Main thread model',
|
|
402
403
|
subagentModel: 'Subagent model',
|
|
403
404
|
fastHelperModel: 'Fast helper model',
|
|
404
|
-
confirmProviderSetup: '
|
|
405
|
-
provider: '
|
|
406
|
-
preset: '
|
|
405
|
+
confirmProviderSetup: 'Review and activate',
|
|
406
|
+
provider: 'Profile',
|
|
407
|
+
preset: 'Provider preset',
|
|
407
408
|
auth: 'Auth',
|
|
408
|
-
modelRouting: '
|
|
409
|
+
modelRouting: 'Routing preset',
|
|
409
410
|
providerDefault: 'Provider default',
|
|
410
411
|
inheritFromMain: 'Inherit from main thread',
|
|
411
|
-
saveProviderNow: 'Save this
|
|
412
|
+
saveProviderNow: 'Save and activate this profile now?',
|
|
412
413
|
saveAndActivate: 'Save and activate',
|
|
413
|
-
saveAndActivateDesc: 'Write local settings and
|
|
414
|
+
saveAndActivateDesc: 'Write local settings and switch to this profile now',
|
|
414
415
|
cancelDraft: 'Cancel',
|
|
415
|
-
cancelDraftDesc: 'Discard this draft and return',
|
|
416
|
-
savedAndActivatedProvider: name => `Saved and activated
|
|
417
|
-
deletedProvider: name => `Deleted
|
|
416
|
+
cancelDraftDesc: 'Discard this draft and return to profiles',
|
|
417
|
+
savedAndActivatedProvider: name => `Saved and activated profile: ${name}`,
|
|
418
|
+
deletedProvider: name => `Deleted profile: ${name}`,
|
|
418
419
|
currentApiCleared: 'Current API configuration was cleared.',
|
|
419
|
-
chooseApiProvider: '
|
|
420
|
-
deleteConfirm: name => `
|
|
421
|
-
deleteProviderConfirm: 'Delete
|
|
422
|
-
deleteProviderConfirmDesc: 'Remove this
|
|
423
|
-
keepUnchanged: '
|
|
424
|
-
keepUnchangedDesc: '
|
|
420
|
+
chooseApiProvider: 'Provider preset',
|
|
421
|
+
deleteConfirm: name => `Remove "${name}" from local provider profiles?`,
|
|
422
|
+
deleteProviderConfirm: 'Delete profile',
|
|
423
|
+
deleteProviderConfirmDesc: 'Remove this saved profile',
|
|
424
|
+
keepUnchanged: 'Go back',
|
|
425
|
+
keepUnchangedDesc: 'Return to the profile list',
|
|
425
426
|
activeSuffix: ' (active)',
|
|
426
427
|
startupPrompt: 'Choose how to start',
|
|
427
|
-
startupUseCurrent: 'Use current
|
|
428
|
+
startupUseCurrent: 'Use current profile',
|
|
428
429
|
startupUseCurrentDesc:
|
|
429
|
-
'Start myclaude with the current API URL, credential, and
|
|
430
|
-
startupConfigure: '
|
|
430
|
+
'Start myclaude with the current provider profile, API URL, credential, and routing roles',
|
|
431
|
+
startupConfigure: 'Open /provider setup',
|
|
431
432
|
startupConfigureDesc:
|
|
432
|
-
'Change
|
|
433
|
+
'Change the active profile, API URL, credential, or routing roles before starting',
|
|
433
434
|
startupExit: 'Exit',
|
|
434
435
|
startupExitDesc: 'Do not enter myclaude right now',
|
|
435
|
-
currentConfiguration: 'Current
|
|
436
|
+
currentConfiguration: 'Current profile',
|
|
436
437
|
manualModel: 'Enter raw model ID',
|
|
437
438
|
manualModelDesc: 'Type an exact model ID such as gpt-5.4',
|
|
438
439
|
validatingModels: 'Validating the selected provider and model routing...',
|
|
@@ -442,10 +443,8 @@ function getMessages(language) {
|
|
|
442
443
|
validationError:
|
|
443
444
|
'Model validation failed. Reconfigure the provider or model routing.',
|
|
444
445
|
validationReconfigure: 'Opening reconfiguration now.',
|
|
445
|
-
validationWarnPrompt:
|
|
446
|
-
|
|
447
|
-
validationErrorPrompt:
|
|
448
|
-
'The current model routing is not usable. Choose the next step.',
|
|
446
|
+
validationWarnPrompt: 'The current routing is degraded. Choose how to proceed.',
|
|
447
|
+
validationErrorPrompt: 'The current routing is not usable. Choose the next step.',
|
|
449
448
|
warningContinue: 'Continue with current routing',
|
|
450
449
|
warningContinueDesc:
|
|
451
450
|
'Start anyway, even though some native workflows may be degraded',
|
|
@@ -1036,9 +1035,9 @@ function getValidationRoleLabel(role, language) {
|
|
|
1036
1035
|
if (role === 'subagent') return '子代理'
|
|
1037
1036
|
return '快速辅助'
|
|
1038
1037
|
}
|
|
1039
|
-
if (role === 'primary') return '
|
|
1038
|
+
if (role === 'primary') return 'main thread'
|
|
1040
1039
|
if (role === 'subagent') return 'subagent'
|
|
1041
|
-
return 'fast'
|
|
1040
|
+
return 'fast helper'
|
|
1042
1041
|
}
|
|
1043
1042
|
|
|
1044
1043
|
function formatValidationRoles(roles, language) {
|
|
@@ -2396,10 +2395,15 @@ async function resolveValidationDecision(
|
|
|
2396
2395
|
return selection === 'continue' ? 'continue' : 'reconfigure'
|
|
2397
2396
|
}
|
|
2398
2397
|
|
|
2399
|
-
function
|
|
2400
|
-
|
|
2398
|
+
function getProviderPreset(presetId) {
|
|
2399
|
+
return (
|
|
2401
2400
|
PROVIDER_PRESETS.find(candidate => candidate.id === presetId) ||
|
|
2402
2401
|
PROVIDER_PRESETS[0]
|
|
2402
|
+
)
|
|
2403
|
+
}
|
|
2404
|
+
|
|
2405
|
+
function createProviderDraftFromPreset(presetId) {
|
|
2406
|
+
const preset = getProviderPreset(presetId)
|
|
2403
2407
|
const now = Date.now()
|
|
2404
2408
|
return {
|
|
2405
2409
|
id: randomUUID(),
|
|
@@ -3276,7 +3280,7 @@ async function configureProfile(
|
|
|
3276
3280
|
printLine()
|
|
3277
3281
|
printLine(messages.confirmProviderSetup)
|
|
3278
3282
|
printLine(`${messages.provider}: ${draft.name}`)
|
|
3279
|
-
printLine(`${messages.preset}: ${draft.providerId}`)
|
|
3283
|
+
printLine(`${messages.preset}: ${getProviderPreset(draft.providerId).name}`)
|
|
3280
3284
|
printLine(`${messages.auth}: ${getCredentialLabel(draft.authType)}`)
|
|
3281
3285
|
printLine(`${messages.apiUrl}: ${draft.baseUrl}`)
|
|
3282
3286
|
printLine(`${getCredentialLabel(draft.authType)}: ${maskCredential(draft.credential)}`)
|
package/install.sh
CHANGED
|
@@ -43,11 +43,13 @@ main() {
|
|
|
43
43
|
fi
|
|
44
44
|
|
|
45
45
|
printf 'Installing %s@%s from npm...\n' "$PACKAGE" "$version"
|
|
46
|
-
npm install -g "${PACKAGE}@${version}"
|
|
46
|
+
npm install -g "${PACKAGE}@${version}"
|
|
47
47
|
|
|
48
48
|
printf 'Installed %s@%s\n' "$PACKAGE" "$version"
|
|
49
|
-
printf 'Available commands: myclaude, mycode
|
|
49
|
+
printf 'Available commands after npm install: myclaude, mycode\n'
|
|
50
|
+
printf 'Running native launcher setup so the claude command is configured without npm bin conflicts...\n'
|
|
50
51
|
|
|
52
|
+
myclaude install --force
|
|
51
53
|
myclaude --version || true
|
|
52
54
|
}
|
|
53
55
|
|