@2api-store/activate 0.4.4 → 0.4.6

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/lib/cmds.mjs CHANGED
@@ -245,18 +245,29 @@ async function cmdRestore(argv) {
245
245
  const group = byTime[ts]
246
246
  const files = group.map((b) => path.basename(b.origPath)).join(', ')
247
247
  const tsDisplay = fmtTime(group[0].mtime)
248
- // 从备份内容提取 key 前缀(帮助用户区分不同激活)
249
- let keyHint = ''
248
+ // 从备份内容提取关键信息(key 尾号 + base_url + model),一行展示
249
+ const parts = []
250
250
  for (const b of group) {
251
251
  try {
252
252
  const content = fs.readFileSync(b.bakPath, 'utf8')
253
- const m = content.match(/sk-[a-f0-9]{6,8}/i)
254
- if (m) { keyHint = `sk-…${m[0].slice(-6)}`; break }
255
- const m2 = content.match(/(?:api_key|API_KEY|OPENAI_API_KEY)["':\s]+(["']?)(sk-[a-f0-9]{6,8})/i)
256
- if (m2) { keyHint = `sk-…${m2[2].slice(-6)}`; break }
253
+ // key:sk- 开头,取尾 6 位(放宽正则:sk-后任意字母数字,至少 10 字符)
254
+ if (!parts.find((p) => p.startsWith('sk-'))) {
255
+ const m = content.match(/sk-([a-zA-Z0-9]{10,})/)
256
+ if (m) parts.push(`sk-…${m[1].slice(-6)}`)
257
+ }
258
+ // base_url / apiBase
259
+ if (!parts.find((p) => p.startsWith('http'))) {
260
+ const m2 = content.match(/(https?:\/\/[^\s"'`}]+)/)
261
+ if (m2) parts.push(m2[1].replace(/\/+$/, ''))
262
+ }
263
+ // model(如果有)
264
+ if (!parts.find((p) => p.startsWith('model'))) {
265
+ const m3 = content.match(/(?:^|\n)\s*model\s*[=:]\s*["']?([a-zA-Z0-9][\w.-]+)/)
266
+ if (m3) parts.push(`model:${m3[1]}`)
267
+ }
257
268
  } catch { /* ignore */ }
258
269
  }
259
- const hint = keyHint ? ` ${chalk.yellow(keyHint)}` : ''
270
+ const hint = parts.length > 0 ? ` ${chalk.yellow(parts.join(' | '))}` : ''
260
271
  return { label: `${chalk.dim(tsDisplay)}(${group.length} 文件:${files})${hint}`, ts, group }
261
272
  })
262
273
  const timeIdx = await select('选择时间点(回车=最新)', timeItems, { defaultIndex: 0 })
@@ -675,6 +686,16 @@ async function cmdReconfig(argv) {
675
686
  return 2
676
687
  }
677
688
 
689
+ // 打印启动/使用指南(与默认激活一致)
690
+ const guideItems = selectedItems
691
+ .filter((item) => item.meta)
692
+ .map((item) => ({
693
+ name: item.meta.name || item.clientType,
694
+ startCmd: item.meta.startCmd || '',
695
+ usage: item.meta.usage || '',
696
+ }))
697
+ guide(guideItems)
698
+
678
699
  return failed.length > 0 ? 3 : 0
679
700
  }
680
701
 
package/lib/platforms.mjs CHANGED
@@ -62,7 +62,21 @@ export const CLI_META = {
62
62
  startCmd: 'claude',
63
63
  detectBin: 'claude',
64
64
  configFiles: ['~/.claude/', '~/.claude.json'],
65
- usage: '运行 `claude` 开始;`claude --help` 查看选项;在项目根放 CLAUDE.md 让 Claude 了解你的代码库',
65
+ usage: [
66
+ '常用命令:',
67
+ ' claude 交互模式',
68
+ ' claude "你的问题" 带初始问题启动',
69
+ ' claude -p "问题" 非交互模式(输出后退出,适合脚本)',
70
+ ' claude -c 继续最近会话',
71
+ ' claude -r 恢复历史会话(选择器)',
72
+ ' claude --model sonnet 指定模型(sonnet/opus/haiku/fable)',
73
+ ' claude mcp 管理 MCP 服务器',
74
+ ' claude doctor 诊断安装/配置',
75
+ ' claude update 更新到最新版',
76
+ '权限模式(Shift+Tab 切换):default / acceptEdits / plan / auto / bypassPermissions',
77
+ ' claude --dangerously-skip-permissions 跳过所有权限提示(=bypassPermissions,谨慎用)',
78
+ '项目根放 CLAUDE.md 让 Claude 了解你的代码库',
79
+ ].join('\n'),
66
80
  isPrimary: true,
67
81
  },
68
82
  'gemini-cli': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@2api-store/activate",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
4
4
  "description": "TokenShop CLI 一键激活:配置本地 codex/claude/gemini/grok/opencode 指向 2api.store 中转(彩色输出 + 自动安装 CLI)",
5
5
  "type": "module",
6
6
  "bin": {