@vibeapi/cli 0.0.86 → 0.0.87

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 CHANGED
@@ -46,7 +46,7 @@ npx --yes --registry https://npm.cnb.cool/vibeapi/npm/-/packages/ @vibeapi/cli@l
46
46
  vibecli setup --key sk-xxx
47
47
  ```
48
48
 
49
- `--key` 会按令牌能访问的模型分组自动配置:有 Claude 模型配 Claude Code(机器上装了 Claude Desktop 也一并配好)、有 GPT 模型配 Codex、有 Grok 模型配 Grok Build、机器上装了 Antigravity CLI(`agy`)且有 Gemini 模型就配 agy。拿到的是多个分组的令牌(如 Claude 分组 + GPT 分组 + Grok 分组),就各配各的:
49
+ `--key` 会按令牌能访问的模型分组自动配置:有 Claude 模型配 Claude Code(机器上装了 Claude Desktop 也一并配好)、有 GPT 模型配 Codex、有 Grok 模型配 Grok Build、有 Gemini 模型配 Antigravity CLI(`agy`)。没装的工具也会先写好配置,并给出安装命令(Claude Desktop 除外,要先装好)。拿到的是多个分组的令牌(如 Claude 分组 + GPT 分组 + Grok 分组),就各配各的:
50
50
 
51
51
  ```bash
52
52
  vibecli setup --claudekey sk-a --codexkey sk-b --grokkey sk-c --desktopkey sk-d
@@ -1 +1 @@
1
- import e from"chalk";import{getAdapter as o}from"../lib/tools/registry.js";import{postApplyPrompts as t}from"../lib/post-apply.js";import{ensureReachableGatewayAddress as s}from"./base.js";import{i18n as i}from"../lib/i18n.js";import{configManager as a}from"../lib/config.js";import{toolManager as l,SUPPORTED_TOOLS as n}from"../lib/tool-manager.js";import{validateApiKey as d,fetchModels as r}from"../lib/api-validator.js";import{CODEX_ONE_MILLION_CONTEXT_SETTING as p,setCodexOneMillionContext as c}from"../lib/tools/codex.js";import{resolveModelCatalog as u}from"../lib/model-catalog.js";import{CLAUDE_DESKTOP_FORCE_REGISTRY_SETTING as f,CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING as m}from"../lib/tools/claude-desktop.js";async function g(e){const o=await r(e);if(!o.ok)return{hasClaude:!0,hasGpt:!0,hasGrok:!0,hasGemini:!0,probed:!1};const t=o.models.map(e=>e.toLowerCase());return{hasClaude:t.some(e=>e.includes("claude")),hasGpt:t.some(e=>e.startsWith("gpt")||e.includes("gpt-")||/^o\d/.test(e)),hasGrok:t.some(e=>e.includes("grok")),hasGemini:t.some(e=>e.startsWith("gemini")),probed:!0}}function k(e,o){return"claude"===o?e.hasClaude:"gpt"===o?e.hasGpt:e.hasGrok}export function parseOnOff(e){const o=(e??"").trim().toLowerCase();return!!["on","true","show","1","yes","y"].includes(o)||!["off","false","hide","0","no","n"].includes(o)&&void 0}function y(o){console.log(e.green(o))}function _(o){console.log(e.yellow(o))}function b(o){console.error(e.red(o))}async function h(o,t){console.log(e.gray(i.t("setup.validating",{label:o})));const s=await d(t);return!!s.valid||(b(i.t("setup.invalid_key",{label:o,reason:s.message||s.error||"invalid"})),"network_error"===s.error&&_(i.t("base.network_hint")),!1)}async function x(o,t,s={}){const{oneMillion:d,officialLogin:r,desktopRegistry:c,force:u}=s,g=n[o];try{"claude-desktop"===o&&void 0!==c&&a.setToolSetting("claude-desktop",f,c),"codex"===o&&void 0!==d&&a.setToolSetting("codex",p,d),"claude-desktop"===o&&void 0!==r&&a.setToolSetting("claude-desktop",m,!r),await l.applyPrivateConfig(o,t,a.getModelsForTool(o),{force:u})}catch(e){const o=(e instanceof Error?e.message:String(e)).replace(/\s+/g," ").trim();return b("× "+i.t("setup.apply_failed",{tool:g.displayName,reason:o})),!1}return l.printApplied(o),u&&console.log(e.gray(" "+i.t("config.force_done",{tool:g.displayName}))),"codex"===o&&void 0!==d&&console.log(e.gray(" "+i.t(d?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))),l.isToolInstalled(o)||console.log(e.yellow(" ! "+i.t("setup.install_hint",{tool:g.displayName,install:g.installCommand}))),!0}export async function setupCommand(e){const d=e.key?.trim(),r=e.claudekey?.trim(),f=e.codexkey?.trim(),m=e.grokkey?.trim(),v=e.desktopkey?.trim(),w=void 0!==e.oneMillion,C=void 0!==e.claudeOfficial;let G;if(C&&(G=parseOnOff(e.claudeOfficial),void 0===G))return b(i.t("setup.claude_official_invalid",{value:String(e.claudeOfficial)})),void(process.exitCode=1);const M=void 0!==e.desktopRegistry;let K;if(M&&(K=parseOnOff(e.desktopRegistry),void 0===K))return b(i.t("setup.desktop_registry_invalid",{value:String(e.desktopRegistry)})),void(process.exitCode=1);const T=C||M,j=Boolean(d||r||f||m||v),S={oneMillion:e.oneMillion,officialLogin:G,desktopRegistry:K,force:e.force};if(!j&&(w||T)){if(w){const o=a.getApiKeyForTool("codex");if(o)try{const t=!0===e.oneMillion;a.setToolSetting("codex",p,t);const s=await u(o);c(t,s??void 0),y(i.t(t?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))}catch(e){b(i.t("setup.apply_failed",{tool:n.codex.displayName,reason:e instanceof Error?e.message:String(e)})),process.exitCode=1}else b(i.t("setup.codex_1m_missing_key")),process.exitCode=1}if(T){const e=a.getApiKeyForTool("claude-desktop");e?await x("claude-desktop",e,{...S,oneMillion:void 0})?await t(["claude-desktop"]):process.exitCode=1:(b(i.t("setup.desktop_official_login_missing_key")),process.exitCode=1)}return}if(!j)return b(i.t("setup.usage")),void(process.exitCode=1);await s(d||r||f||m||v);let O=0,A=0;const I=new Set,N=[];r&&N.push({tool:"claude-code",label:"--claudekey",apiKey:r,need:"claude"}),f&&N.push({tool:"codex",label:"--codexkey",apiKey:f,need:"gpt"}),m&&N.push({tool:"grok",label:"--grokkey",apiKey:m,need:"grok"}),v&&N.push({tool:"claude-desktop",label:"--desktopkey",apiKey:v,need:"claude"});for(const e of N){if(!await h(e.label,e.apiKey)){A+=1;continue}const o=await g(e.apiKey);!o.probed||k(o,e.need)?(o.probed||_(i.t("setup.probe_failed",{label:e.label})),a.setToolApiKey(e.tool,e.apiKey),await x(e.tool,e.apiKey,S)?(O+=1,I.add(e.tool)):A+=1):(b(i.t(`setup.key_no_${e.need}`,{label:e.label,tool:n[e.tool].displayName})),A+=1)}if(d){if(!await h("--key",d))return void(process.exitCode=1);a.setApiKey(d);const e=await g(d);if(e.probed||_(i.t("setup.probe_failed",{label:"--key"})),e.probed&&!e.hasClaude&&!e.hasGpt&&!e.hasGrok)return b(i.t("setup.key_no_family")),void(process.exitCode=1);const o=[{tool:"claude-code",capable:e.hasClaude,skipMsg:i.t("setup.skip_no_claude")},{tool:"codex",capable:e.hasGpt,skipMsg:i.t("setup.skip_no_gpt")},{tool:"grok",capable:e.hasGrok,skipMsg:i.t("setup.skip_no_grok")},{tool:"claude-desktop",capable:e.hasClaude&&l.isToolInstalled("claude-desktop"),skipMsg:i.t("setup.skip_desktop_not_installed"),quiet:!e.hasClaude},{tool:"agy",capable:e.hasGemini&&l.isToolInstalled("agy"),skipMsg:i.t("setup.skip_no_gemini"),quiet:!l.isToolInstalled("agy")}];for(const e of o)I.has(e.tool)||(e.capable?await x(e.tool,d,S)?(O+=1,I.add(e.tool)):A+=1:e.quiet||_(e.skipMsg))}if(O>0){const e=[...I].filter(e=>!o(e)?.isInstalled).map(e=>n[e]?.command).filter(Boolean).join(" / "),t=i.t("setup.done",{count:String(O)});y("\n"+(e?`${t}${i.t("setup.done_commands",{commands:e})}`:t))}A>0&&b(i.t("setup.failed_summary",{count:String(A)})),await t([...I]),(A>0||0===O)&&(process.exitCode=1)}
1
+ import e from"chalk";import{getAdapter as o}from"../lib/tools/registry.js";import{postApplyPrompts as t}from"../lib/post-apply.js";import{ensureReachableGatewayAddress as s}from"./base.js";import{i18n as i}from"../lib/i18n.js";import{configManager as a}from"../lib/config.js";import{toolManager as l,SUPPORTED_TOOLS as n}from"../lib/tool-manager.js";import{validateApiKey as d,fetchModels as r}from"../lib/api-validator.js";import{CODEX_ONE_MILLION_CONTEXT_SETTING as p,setCodexOneMillionContext as c}from"../lib/tools/codex.js";import{resolveModelCatalog as u}from"../lib/model-catalog.js";import{CLAUDE_DESKTOP_FORCE_REGISTRY_SETTING as f,CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING as m}from"../lib/tools/claude-desktop.js";async function g(e){const o=await r(e);if(!o.ok)return{hasClaude:!0,hasGpt:!0,hasGrok:!0,hasGemini:!0,probed:!1};const t=o.models.map(e=>e.toLowerCase());return{hasClaude:t.some(e=>e.includes("claude")),hasGpt:t.some(e=>e.startsWith("gpt")||e.includes("gpt-")||/^o\d/.test(e)),hasGrok:t.some(e=>e.includes("grok")),hasGemini:t.some(e=>e.startsWith("gemini")),probed:!0}}function k(e,o){return"claude"===o?e.hasClaude:"gpt"===o?e.hasGpt:e.hasGrok}export function parseOnOff(e){const o=(e??"").trim().toLowerCase();return!!["on","true","show","1","yes","y"].includes(o)||!["off","false","hide","0","no","n"].includes(o)&&void 0}function y(o){console.log(e.green(o))}function _(o){console.log(e.yellow(o))}function b(o){console.error(e.red(o))}async function h(o,t){console.log(e.gray(i.t("setup.validating",{label:o})));const s=await d(t);return!!s.valid||(b(i.t("setup.invalid_key",{label:o,reason:s.message||s.error||"invalid"})),"network_error"===s.error&&_(i.t("base.network_hint")),!1)}async function x(o,t,s={}){const{oneMillion:d,officialLogin:r,desktopRegistry:c,force:u}=s,g=n[o];try{"claude-desktop"===o&&void 0!==c&&a.setToolSetting("claude-desktop",f,c),"codex"===o&&void 0!==d&&a.setToolSetting("codex",p,d),"claude-desktop"===o&&void 0!==r&&a.setToolSetting("claude-desktop",m,!r),await l.applyPrivateConfig(o,t,a.getModelsForTool(o),{force:u})}catch(e){const o=(e instanceof Error?e.message:String(e)).replace(/\s+/g," ").trim();return b("× "+i.t("setup.apply_failed",{tool:g.displayName,reason:o})),!1}return l.printApplied(o),u&&console.log(e.gray(" "+i.t("config.force_done",{tool:g.displayName}))),"codex"===o&&void 0!==d&&console.log(e.gray(" "+i.t(d?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))),l.isToolInstalled(o)||console.log(e.yellow(" ! "+i.t("setup.install_hint",{tool:g.displayName,install:g.installCommand}))),!0}export async function setupCommand(e){const d=e.key?.trim(),r=e.claudekey?.trim(),f=e.codexkey?.trim(),m=e.grokkey?.trim(),v=e.desktopkey?.trim(),w=void 0!==e.oneMillion,C=void 0!==e.claudeOfficial;let G;if(C&&(G=parseOnOff(e.claudeOfficial),void 0===G))return b(i.t("setup.claude_official_invalid",{value:String(e.claudeOfficial)})),void(process.exitCode=1);const M=void 0!==e.desktopRegistry;let K;if(M&&(K=parseOnOff(e.desktopRegistry),void 0===K))return b(i.t("setup.desktop_registry_invalid",{value:String(e.desktopRegistry)})),void(process.exitCode=1);const j=C||M,S=Boolean(d||r||f||m||v),T={oneMillion:e.oneMillion,officialLogin:G,desktopRegistry:K,force:e.force};if(!S&&(w||j)){if(w){const o=a.getApiKeyForTool("codex");if(o)try{const t=!0===e.oneMillion;a.setToolSetting("codex",p,t);const s=await u(o);c(t,s??void 0),y(i.t(t?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))}catch(e){b(i.t("setup.apply_failed",{tool:n.codex.displayName,reason:e instanceof Error?e.message:String(e)})),process.exitCode=1}else b(i.t("setup.codex_1m_missing_key")),process.exitCode=1}if(j){const e=a.getApiKeyForTool("claude-desktop");e?await x("claude-desktop",e,{...T,oneMillion:void 0})?await t(["claude-desktop"]):process.exitCode=1:(b(i.t("setup.desktop_official_login_missing_key")),process.exitCode=1)}return}if(!S)return b(i.t("setup.usage")),void(process.exitCode=1);await s(d||r||f||m||v);let O=0,A=0;const N=new Set,R=[];r&&R.push({tool:"claude-code",label:"--claudekey",apiKey:r,need:"claude"}),f&&R.push({tool:"codex",label:"--codexkey",apiKey:f,need:"gpt"}),m&&R.push({tool:"grok",label:"--grokkey",apiKey:m,need:"grok"}),v&&R.push({tool:"claude-desktop",label:"--desktopkey",apiKey:v,need:"claude"});for(const e of R){if(!await h(e.label,e.apiKey)){A+=1;continue}const o=await g(e.apiKey);!o.probed||k(o,e.need)?(o.probed||_(i.t("setup.probe_failed",{label:e.label})),a.setToolApiKey(e.tool,e.apiKey),await x(e.tool,e.apiKey,T)?(O+=1,N.add(e.tool)):A+=1):(b(i.t(`setup.key_no_${e.need}`,{label:e.label,tool:n[e.tool].displayName})),A+=1)}if(d){if(!await h("--key",d))return void(process.exitCode=1);a.setApiKey(d);const e=await g(d);if(e.probed||_(i.t("setup.probe_failed",{label:"--key"})),e.probed&&!e.hasClaude&&!e.hasGpt&&!e.hasGrok)return b(i.t("setup.key_no_family")),void(process.exitCode=1);const o=[{tool:"claude-code",capable:e.hasClaude,skipMsg:i.t("setup.skip_no_claude")},{tool:"codex",capable:e.hasGpt,skipMsg:i.t("setup.skip_no_gpt")},{tool:"grok",capable:e.hasGrok,skipMsg:i.t("setup.skip_no_grok")},{tool:"claude-desktop",capable:e.hasClaude&&l.isToolInstalled("claude-desktop"),skipMsg:i.t("setup.skip_desktop_not_installed"),quiet:!e.hasClaude},{tool:"agy",capable:e.hasGemini,skipMsg:i.t("setup.skip_no_gemini")}];for(const e of o)N.has(e.tool)||(e.capable?await x(e.tool,d,T)?(O+=1,N.add(e.tool)):A+=1:e.quiet||_(e.skipMsg))}if(O>0){const e=[...N].filter(e=>!o(e)?.isInstalled).map(e=>n[e]?.command).filter(Boolean).join(" / "),t=i.t("setup.done",{count:String(O)});y("\n"+(e?`${t}${i.t("setup.done_commands",{commands:e})}`:t))}A>0&&b(i.t("setup.failed_summary",{count:String(A)})),await t([...N]),(A>0||0===O)&&(process.exitCode=1)}
@@ -556,7 +556,7 @@
556
556
  "claude": "Claude Code (plus Claude Desktop if installed)",
557
557
  "gpt": "Codex",
558
558
  "grok": "Grok Build",
559
- "gemini": "Antigravity CLI (only if installed)"
559
+ "gemini": "Antigravity CLI"
560
560
  },
561
561
  "ex": {
562
562
  "key": "Configure every tool one key can serve",
@@ -566,7 +566,7 @@
566
566
  "base": "Configure on a backup address"
567
567
  },
568
568
  "when": "First setup after you get a key, or to change the key or repair broken configs.",
569
- "needs": "A VibeAPI API key (create one on the Tokens page of the console)\nClaude Code, Codex and Grok Build can be installed later: they still get their config, plus the install command; Claude Desktop and Antigravity CLI are configured only once installed",
569
+ "needs": "A VibeAPI API key (create one on the Tokens page of the console)\nClaude Code, Codex, Grok Build and Antigravity CLI can be installed later: they still get their config, plus the install command; Claude Desktop is configured only once installed (or forced with --desktopkey)",
570
570
  "alt": {
571
571
  "init": "Choose tools and models step by step",
572
572
  "config": "Change one tool only",
@@ -556,7 +556,7 @@
556
556
  "claude": "Claude Code(装了 Claude Desktop 也一起配)",
557
557
  "gpt": "Codex",
558
558
  "grok": "Grok Build",
559
- "gemini": "Antigravity CLI(装了才配)"
559
+ "gemini": "Antigravity CLI"
560
560
  },
561
561
  "ex": {
562
562
  "key": "用一把 Key 配好它能用的所有工具",
@@ -566,7 +566,7 @@
566
566
  "base": "在备用地址上配置"
567
567
  },
568
568
  "when": "拿到 Key 后第一次配置,或者换 Key、修复被改坏的配置时。",
569
- "needs": "一把 VibeAPI 的 API Key(在控制台的「令牌」页创建)\nClaude Code、Codex、Grok Build 可以之后再装:没装也会先写好配置,并给出安装命令;Claude Desktop 和 Antigravity CLI 要先装好才会配置",
569
+ "needs": "一把 VibeAPI 的 API Key(在控制台的「令牌」页创建)\nClaude Code、Codex、Grok Build、Antigravity CLI 可以之后再装:没装也会先写好配置,并给出安装命令;Claude Desktop 要先装好才会配置(或用 --desktopkey 强制写入)",
570
570
  "alt": {
571
571
  "init": "想一步步选工具和模型",
572
572
  "config": "只改一个工具",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeapi/cli",
3
- "version": "0.0.86",
3
+ "version": "0.0.87",
4
4
  "description": "CLI tool for managing AI coding assistants (Claude Code, Codex, OpenClaw, Hermes, AtomCode, Grok Build) with one unified config",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",