myclaude-code 8.8.12 → 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.
@@ -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',
@@ -1011,7 +1010,7 @@ async function askModelChoice(
1011
1010
  { language },
1012
1011
  )
1013
1012
 
1014
- if (choice === null || choice === 'abort') {
1013
+ if (choice === null) {
1015
1014
  return null
1016
1015
  }
1017
1016
 
@@ -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(),
@@ -3026,17 +3030,6 @@ function formatCurrentConfigurationSummary(language) {
3026
3030
  ]
3027
3031
  }
3028
3032
 
3029
- async function askQuestion(rl, prompt) {
3030
- try {
3031
- return await rl.question(prompt)
3032
- } catch (error) {
3033
- if (error instanceof Error && error.name === 'AbortError') {
3034
- return null
3035
- }
3036
- throw error
3037
- }
3038
- }
3039
-
3040
3033
  async function askText(
3041
3034
  rl,
3042
3035
  label,
@@ -3046,11 +3039,7 @@ async function askText(
3046
3039
  const messages = getMessages(language)
3047
3040
  while (true) {
3048
3041
  const suffix = initialValue ? ` [${initialValue}]` : ''
3049
- const rawAnswer = await askQuestion(rl, `${label}${suffix}: `)
3050
- if (rawAnswer === null) {
3051
- return null
3052
- }
3053
- const answer = rawAnswer.trim()
3042
+ const answer = (await rl.question(`${label}${suffix}: `)).trim()
3054
3043
  const value = answer || initialValue
3055
3044
  if (required && !value) {
3056
3045
  printLine(messages.requiredField)
@@ -3084,11 +3073,7 @@ async function askSelect(
3084
3073
  if (allowCancel) {
3085
3074
  printLine(`0. ${messages.cancelOption}`)
3086
3075
  }
3087
- const rawAnswer = await askQuestion(rl, 'Choose: ')
3088
- if (rawAnswer === null) {
3089
- return allowCancel ? null : 'abort'
3090
- }
3091
- const answer = rawAnswer.trim()
3076
+ const answer = (await rl.question('Choose: ')).trim()
3092
3077
  if (allowCancel && (answer === '0' || answer.toLowerCase() === 'q')) {
3093
3078
  return null
3094
3079
  }
@@ -3112,27 +3097,24 @@ async function chooseLanguage(rl, options = {}) {
3112
3097
  return savedLanguage
3113
3098
  }
3114
3099
 
3115
- const selectedLanguage = await askSelect(
3116
- rl,
3117
- getMessages('en').chooseLanguage,
3118
- [
3119
- {
3120
- label: getMessages('zh').languageChinese,
3121
- description: '使用中文进行配置',
3122
- value: 'zh',
3123
- },
3124
- {
3125
- label: getMessages('en').languageEnglish,
3126
- description: 'Use English for setup',
3127
- value: 'en',
3128
- },
3129
- ],
3130
- { allowCancel: false, language: 'en' },
3131
- )
3132
-
3133
- if (selectedLanguage === 'abort') {
3134
- return 'en'
3135
- }
3100
+ const selectedLanguage =
3101
+ (await askSelect(
3102
+ rl,
3103
+ getMessages('en').chooseLanguage,
3104
+ [
3105
+ {
3106
+ label: getMessages('zh').languageChinese,
3107
+ description: '使用中文进行配置',
3108
+ value: 'zh',
3109
+ },
3110
+ {
3111
+ label: getMessages('en').languageEnglish,
3112
+ description: 'Use English for setup',
3113
+ value: 'en',
3114
+ },
3115
+ ],
3116
+ { allowCancel: false, language: 'en' },
3117
+ )) || 'en'
3136
3118
 
3137
3119
  saveLanguage(selectedLanguage)
3138
3120
  return selectedLanguage
@@ -3219,14 +3201,11 @@ async function configureProfile(
3219
3201
  }
3220
3202
  }
3221
3203
 
3222
- const name = await askText(rl, messages.providerName, {
3204
+ draft.name = await askText(rl, messages.providerName, {
3223
3205
  initialValue: draft.name,
3224
3206
  required: true,
3225
3207
  }, language)
3226
- if (name === null) return null
3227
- draft.name = name
3228
-
3229
- const baseUrl = await askText(rl, messages.apiUrl, {
3208
+ draft.baseUrl = await askText(rl, messages.apiUrl, {
3230
3209
  initialValue: draft.baseUrl,
3231
3210
  required: true,
3232
3211
  validate(value) {
@@ -3235,15 +3214,10 @@ async function configureProfile(
3235
3214
  : messages.invalidApiUrl
3236
3215
  },
3237
3216
  }, language)
3238
- if (baseUrl === null) return null
3239
- draft.baseUrl = baseUrl
3240
-
3241
- const credential = await askText(rl, getCredentialLabel(draft.authType), {
3217
+ draft.credential = await askText(rl, getCredentialLabel(draft.authType), {
3242
3218
  initialValue: draft.credential,
3243
3219
  required: true,
3244
3220
  }, language)
3245
- if (credential === null) return null
3246
- draft.credential = credential
3247
3221
  draft.providerId = inferProviderPresetId(draft.baseUrl)
3248
3222
 
3249
3223
  const routingPresetId = await askSelect(
@@ -3306,7 +3280,7 @@ async function configureProfile(
3306
3280
  printLine()
3307
3281
  printLine(messages.confirmProviderSetup)
3308
3282
  printLine(`${messages.provider}: ${draft.name}`)
3309
- printLine(`${messages.preset}: ${draft.providerId}`)
3283
+ printLine(`${messages.preset}: ${getProviderPreset(draft.providerId).name}`)
3310
3284
  printLine(`${messages.auth}: ${getCredentialLabel(draft.authType)}`)
3311
3285
  printLine(`${messages.apiUrl}: ${draft.baseUrl}`)
3312
3286
  printLine(`${getCredentialLabel(draft.authType)}: ${maskCredential(draft.credential)}`)
@@ -3503,7 +3477,7 @@ export async function runMyclaudeProviderSetup(options = {}) {
3503
3477
  },
3504
3478
  ], { allowCancel: false, language })
3505
3479
 
3506
- if (selection === 'abort' || selection === 'skip') return false
3480
+ if (selection === 'skip') return false
3507
3481
  if (selection === 'add' && (await handleAdd(rl, language))) return true
3508
3482
  if (selection === 'edit' && (await handleEditOrCopy(rl, 'edit', language))) {
3509
3483
  return true
@@ -3569,10 +3543,6 @@ export async function runMyclaudeStartupChooser(options = {}) {
3569
3543
  { allowCancel: false, language },
3570
3544
  )
3571
3545
 
3572
- if (selection === 'abort') {
3573
- return false
3574
- }
3575
-
3576
3546
  if (selection === 'use-current') {
3577
3547
  const currentProfile = getResolvedCurrentProviderProfile()
3578
3548
  const repairResult = await attemptAutoRepairProviderProfile(currentProfile, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myclaude-code",
3
- "version": "8.8.12",
3
+ "version": "8.8.13",
4
4
  "description": "myclaude: fast-start AI coding CLI with no Claude Code login and quick third-party API setup",
5
5
  "keywords": [
6
6
  "myclaude",
@@ -15,6 +15,7 @@
15
15
  ],
16
16
  "type": "module",
17
17
  "bin": {
18
+ "myclaude-code": "dist/cli.js",
18
19
  "myclaude": "dist/cli.js",
19
20
  "mycode": "dist/cli.js"
20
21
  },
@@ -36,11 +37,14 @@
36
37
  "access": "public"
37
38
  },
38
39
  "scripts": {
39
- "prepare-src": "node scripts/prepare-src.mjs",
40
- "build": "npm run prepare-src && node scripts/build.mjs",
41
- "check": "npm run prepare-src && tsc --noEmit",
40
+ "build": "npm run check && npm pack --dry-run",
41
+ "check": "npm run validate:repo && npm run verify:dist && npm test",
42
42
  "start": "node dist/cli.js",
43
- "package:release": "node scripts/package-release.mjs",
43
+ "test": "node --test tests/*.test.mjs",
44
+ "validate:repo": "node scripts/validate-release.mjs",
45
+ "verify:dist": "node scripts/verify-dist.mjs",
46
+ "package:release": "npm run check && node scripts/package-release.mjs",
47
+ "rebuild:experimental": "node scripts/build.mjs",
44
48
  "verify:provider": "node scripts/verify-provider-route.mjs"
45
49
  },
46
50
  "engines": {