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.
@@ -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 auth login\n如果你只是想检查当前供应商与模型是否可用,可以执行:/provider validate\n如果你想自动修复无效的模型路由,可以执行:/provider repair',
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 auth login\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',
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
  }
@@ -24,16 +24,16 @@ function getRoutingDisplayValue(value, fallback) {
24
24
 
25
25
  function formatProviderSummary(profile) {
26
26
  return [
27
- `Name: ${profile.name}`,
27
+ `Profile: ${profile.name}`,
28
28
  `API URL: ${profile.baseUrl}`,
29
29
  `${getCredentialLabel(profile.authType)}: ${maskCredential(profile.credential)}`,
30
- `Primary model: ${getRoutingDisplayValue(
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 primary model',
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
- 'Quick provider switching for myclaude.',
50
- 'For full setup, restart myclaude and choose reconfigure, or run: myclaude auth login',
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. Restart myclaude and choose reconfigure, or run: myclaude auth login'
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
- `Current active configuration:\n${formatProviderSummary(currentProfile)}`,
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 primary, subagent, and fast helper work.',
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 routes are degraded here. Restart myclaude and choose reconfigure to switch all roles to gpt-5.4.',
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 auth login`, to adjust the provider and model route.',
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
- value: currentProfile
220
- ? `Current provider configuration:\n${formatProviderSummary(
219
+ value: currentProfile
220
+ ? `Active profile:\n${formatProviderSummary(
221
221
  currentProfile,
222
222
  )}`
223
- : 'No active provider configuration is set.',
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 provider matched '${profileQuery}'. Run /provider list to inspect saved names.`,
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 providers matched '${profileQuery}'. Be more specific:\n${formatMatchList(
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 configuration is set.',
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 provider matched '${profileQuery}'. Run /provider list to inspect saved names.`,
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 providers matched '${profileQuery}'. Be more specific:\n${formatMatchList(
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 configuration is set.',
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 provider matched '${profileQuery}'. Run /provider list to inspect saved names.`,
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 providers matched '${profileQuery}'. Be more specific:\n${formatMatchList(
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 configuration is set.',
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 provider ${repairResult.profile.name}:`,
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
- 'Restart myclaude and choose reconfigure, or run `myclaude auth login` in the shell to open the full provider setup wizard.',
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 provider matched '${profileQuery}'. Run /provider list to inspect saved names.`,
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 providers matched '${profileQuery}'. Be more specific:\n${formatMatchList(
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: `Provider '${matches[0].name}' is no longer available.`,
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 provider ${activatedProfile.name}\n${formatProviderSummary(
423
+ value: `Activated profile ${activatedProfile.name}\n${formatProviderSummary(
424
424
  activatedProfile,
425
425
  )}`,
426
426
  }
@@ -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.11'
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 myclaude on provider-native defaults and only override models manually when needed',
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
- 'Use GPT-5.4 for the main thread and planning, with GPT-5.3 Codex for subagents and execution on Anthropic-compatible GPT gateways',
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 everywhere when a gateway does not fully expose GPT-5.4 or GPT-5.3 Codex reliably',
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
- 'Use GPT-5.3 Codex for the main thread, subagents, and fast helper requests',
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 your own primary, subagent, and helper models while keeping the rest derived automatically',
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: 'myclaude 配置向导',
272
- apiConfigTitle: '2. API 配置 [3]',
273
- apiConfigSubtitle: '一键配置兼容 Anthropic 的 API URL、密钥与模型路由',
274
- firstRunHint: '检测到首次运行。请先配置 API 供应商后再启动 myclaude。',
271
+ setupTitle: '/provider',
272
+ apiConfigTitle: '供应商档案',
273
+ apiConfigSubtitle: '配置供应商档案、API URL、凭证和路由角色。',
274
+ firstRunHint: '检测到首次运行。请先配置一个供应商档案后再启动 myclaude。',
275
275
  normalHint:
276
- 'myclaude 使用直连 API 供应商,不需要 Claude Code 官方账号登录;当前运行时要求 Anthropic 兼容接口或对应网关。',
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: '新建一个可复用的 API 配置并立即启用',
286
- editProvider: '编辑供应商',
287
- editProviderDesc: '修改一个已保存的供应商配置',
288
- copyProvider: '复制供应商',
289
- copyProviderDesc: '复制现有配置,再改 API URL 或密钥',
290
- deleteProvider: '删除供应商',
291
- deleteProviderDesc: '删除本地已保存的供应商配置',
292
- skip: '跳过',
293
- skipDesc: '退出,不修改当前 API 配置',
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 => `已保存并启用供应商:${name}`,
323
- deletedProvider: name => `已删除供应商:${name}`,
321
+ cancelDraftDesc: '放弃这次草稿并返回档案列表',
322
+ savedAndActivatedProvider: name => `已保存并启用档案:${name}`,
323
+ deletedProvider: name => `已删除档案:${name}`,
324
324
  currentApiCleared: '当前 API 配置已清空。',
325
- chooseApiProvider: '请选择 API 供应商',
326
- deleteConfirm: name => `确认删除 “${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: '使用当前 API URL、密钥和模型配置启动 myclaude',
335
- startupConfigure: '重新配置模型与 API',
336
- startupConfigureDesc: '修改供应商、API URL、密钥或模型路由',
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: 'myclaude provider setup',
365
- apiConfigTitle: '2. API Configuration [3]',
364
+ setupTitle: '/provider',
365
+ apiConfigTitle: 'Provider profiles',
366
366
  apiConfigSubtitle:
367
- 'One-step setup for Anthropic-compatible API URL, credential, and model routing',
368
- firstRunHint: 'First run detected. Configure a provider before starting myclaude.',
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, and currently expects Anthropic-compatible providers or gateways.',
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: 'Choose an action',
378
- addProvider: 'Add provider',
378
+ chooseAction: 'Profiles',
379
+ addProvider: 'Add profile',
379
380
  addProviderDesc: 'Create a reusable provider profile and activate it now',
380
- editProvider: 'Edit provider',
381
- editProviderDesc: 'Update an existing provider profile',
382
- copyProvider: 'Copy provider',
383
- copyProviderDesc: 'Duplicate an existing profile and change URL or credential',
384
- deleteProvider: 'Delete provider',
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: 'Skip',
387
- skipDesc: 'Exit without changing API configuration',
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 provider to edit',
390
- chooseProviderToCopy: 'Choose a provider to copy',
391
- chooseProviderToDelete: 'Choose a provider to delete',
392
- chooseAuthType: 'Choose authentication type',
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: 'Provider name',
398
+ providerName: 'Profile name',
398
399
  apiUrl: 'API URL',
399
400
  invalidApiUrl: 'API URL must start with http:// or https://',
400
- chooseModelRouting: 'Choose model routing',
401
- primaryModel: 'Primary model',
401
+ chooseModelRouting: 'Routing preset',
402
+ primaryModel: 'Main thread model',
402
403
  subagentModel: 'Subagent model',
403
404
  fastHelperModel: 'Fast helper model',
404
- confirmProviderSetup: 'Confirm provider setup',
405
- provider: 'Provider',
406
- preset: 'Preset',
405
+ confirmProviderSetup: 'Review and activate',
406
+ provider: 'Profile',
407
+ preset: 'Provider preset',
407
408
  auth: 'Auth',
408
- modelRouting: 'Model routing',
409
+ modelRouting: 'Routing preset',
409
410
  providerDefault: 'Provider default',
410
411
  inheritFromMain: 'Inherit from main thread',
411
- saveProviderNow: 'Save this provider now?',
412
+ saveProviderNow: 'Save and activate this profile now?',
412
413
  saveAndActivate: 'Save and activate',
413
- saveAndActivateDesc: 'Write local settings and use this provider immediately',
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 provider: ${name}`,
417
- deletedProvider: name => `Deleted provider: ${name}`,
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: 'Choose API provider',
420
- deleteConfirm: name => `Delete "${name}"?`,
421
- deleteProviderConfirm: 'Delete provider',
422
- deleteProviderConfirmDesc: 'Remove this local provider configuration',
423
- keepUnchanged: 'Cancel',
424
- keepUnchangedDesc: 'Keep the current provider list unchanged',
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 configuration',
428
+ startupUseCurrent: 'Use current profile',
428
429
  startupUseCurrentDesc:
429
- 'Start myclaude with the current API URL, credential, and model routing',
430
- startupConfigure: 'Configure model and API',
430
+ 'Start myclaude with the current provider profile, API URL, credential, and routing roles',
431
+ startupConfigure: 'Open /provider setup',
431
432
  startupConfigureDesc:
432
- 'Change provider, API URL, credential, or model routing before starting',
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 configuration',
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
- 'The current model routing is degraded. Choose how to proceed.',
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 'primary'
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 createProviderDraftFromPreset(presetId) {
2400
- const preset =
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}" --force
46
+ npm install -g "${PACKAGE}@${version}"
47
47
 
48
48
  printf 'Installed %s@%s\n' "$PACKAGE" "$version"
49
- printf 'Available commands: myclaude, mycode, claude\n'
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