@vibeapi/api-helper 0.0.36 → 0.0.37
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
|
@@ -70,7 +70,7 @@ vibecli config claude-code clear-model # 模型选择被钉住时,交还给
|
|
|
70
70
|
|
|
71
71
|
- **多工具一键配置**:把当前 API Key / 模型注入 Claude Code、Codex、OpenClaw、Hermes、AtomCode(OpenCode 暂时下架,`vibecli config opencode` 仍可用)。
|
|
72
72
|
- **按工具选模型**:使用默认 / 实时从 API 拉取 / 内置预设 / 手动输入;每个工具可用不同模型。
|
|
73
|
-
- Claude Code
|
|
73
|
+
- Claude Code 用默认模型时不写 `ANTHROPIC_*_MODEL` 环境变量,顶层 `model` 由 `settings-template.json` 提供(当前为 `opus[1m]`);显式选择其它模型时会覆盖该模板值。Codex 默认 `gpt-5.6-sol`,其余工具默认 `gpt-5.5`。
|
|
74
74
|
- **不动你的其它配置**:只改本工具的 provider 字段,你的 hooks、MCP、插件、权限设置原样保留。
|
|
75
75
|
- **改前自动备份 + 一键还原**:覆盖配置前先快照(每文件留 10 份),`vibecli config <tool> restore` 随时回退;还原本身也可再撤销。
|
|
76
76
|
- **多 Profile + 可迁移凭据**:work/personal 各自独立;API Key 存在权限为 `0600` 的 `~/.vibecli/config.yaml`,与 Claude/Codex 本身的明文凭据方式一致,换机不会被主机绑定加密阻断。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as e,mkdirSync as t,readFileSync as n,writeFileSync as s,renameSync as
|
|
1
|
+
import{existsSync as e,mkdirSync as t,readFileSync as n,writeFileSync as s,renameSync as o,unlinkSync as i}from"fs";import{join as r,dirname as a}from"path";import{homedir as g}from"os";import{logger as c}from"../utils/logger.js";import{configManager as l,DEFAULT_MODELS as C}from"./config.js";import{loadSettingsTemplate as d}from"./settings-template.js";import{cleanupAnthropicEnvVars as h}from"./env-cleanup.js";export const MODEL_ENV_VARS=["ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_MODEL","ANTHROPIC_REASONING_MODEL"];export class ClaudeCodeManager{static instance;settingsPath;mcpConfigPath;constructor(){this.settingsPath=r(g(),".claude","settings.json"),this.mcpConfigPath=r(g(),".claude.json")}static getInstance(){return ClaudeCodeManager.instance||(ClaudeCodeManager.instance=new ClaudeCodeManager),ClaudeCodeManager.instance}ensureConfigDir(n){const s=a(n);e(s)||t(s,{recursive:!0})}atomicWrite(t,n){const r=`${t}.tmp`;try{s(r,n,"utf-8"),o(r,t)}catch(t){if(e(r))try{i(r)}catch{}throw t}}getSettings(){try{if(e(this.settingsPath)){const e=n(this.settingsPath,"utf-8");return JSON.parse(e)}}catch(e){c.warn("Failed to read Claude Code settings:",e),c.logError("ClaudeCodeManager.getSettings",e)}return{}}saveSettings(e){try{this.ensureConfigDir(this.settingsPath),this.atomicWrite(this.settingsPath,JSON.stringify(e,null,2))}catch(e){throw new Error(`Failed to save Claude Code settings: ${e}`)}}getMCPConfig(){try{if(e(this.mcpConfigPath)){const e=n(this.mcpConfigPath,"utf-8");return JSON.parse(e)}}catch(e){c.warn("Failed to read Claude Code MCP config:",e),c.logError("ClaudeCodeManager.getMCPConfig",e)}return{}}saveMCPConfig(e){try{this.ensureConfigDir(this.mcpConfigPath),this.atomicWrite(this.mcpConfigPath,JSON.stringify(e,null,2))}catch(e){throw new Error(`Failed to save Claude Code MCP config: ${e}`)}}loadPrivateConfig(e,t){this.ensureOnboardingCompleted(),h();const n=d(),s=n.env||{},{env:o,...i}=n,r=this.getSettings(),{ANTHROPIC_API_KEY:a,...g}=r.env||{},c={...g};for(const e of MODEL_ENV_VARS)delete c[e];const u={},O=e=>{const n=(t[e]||"").trim();return n&&n!==C[e]?n:null},f=O("haiku"),_=O("sonnet"),m=O("opus");f&&(u.ANTHROPIC_DEFAULT_HAIKU_MODEL=f),_&&(u.ANTHROPIC_DEFAULT_SONNET_MODEL=_),m&&(u.ANTHROPIC_DEFAULT_OPUS_MODEL=m,u.ANTHROPIC_MODEL=m);const E={...r};for(const[e,t]of Object.entries(i))e in E||(E[e]=t);E.showThinkingSummaries=!0;const P={...E,env:{...c,...Object.fromEntries(Object.entries(s).filter(([e])=>!(e in c))),ANTHROPIC_AUTH_TOKEN:e,ANTHROPIC_BASE_URL:l.getBaseUrl(),...u}};m?P.model=m:Object.prototype.hasOwnProperty.call(i,"model")?P.model=i.model:delete P.model,this.saveSettings(P)}ensureOnboardingCompleted(){try{const e=this.getMCPConfig();e.hasCompletedOnboarding||this.saveMCPConfig({...e,hasCompletedOnboarding:!0})}catch(e){c.warn("Failed to ensure onboarding completed:",e),c.logError("ClaudeCodeManager.ensureOnboardingCompleted",e)}}unloadPrivateConfig(){const e=this.getSettings();if(!e.env){if(void 0!==e.model){const{model:t,...n}=e;this.saveSettings(n)}return}const{ANTHROPIC_AUTH_TOKEN:t,ANTHROPIC_BASE_URL:n,API_TIMEOUT_MS:s,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:o,...i}=e.env,r={...i};for(const e of MODEL_ENV_VARS)delete r[e];const a={...e,env:r};delete a.model,a.env&&0===Object.keys(a.env).length&&delete a.env,this.saveSettings(a)}clearPinnedModels(){const e=this.getSettings(),t=e.env,n=[];for(const e of MODEL_ENV_VARS)t&&e in t&&n.push(e);if(void 0!==e.model&&n.push("model"),0===n.length)return[];const s={...e};if(delete s.model,t){const e={...t};for(const t of MODEL_ENV_VARS)delete e[t];0===Object.keys(e).length?delete s.env:s.env=e}return this.saveSettings(s),n}detectCurrentConfig(){try{const e=this.getSettings();return e.env&&e.env.ANTHROPIC_AUTH_TOKEN?{apiKey:e.env.ANTHROPIC_AUTH_TOKEN}:{apiKey:null}}catch{return{apiKey:null}}}getExperimentalFeature(e){const t=this.getSettings();return t.env?.[e]}setExperimentalFeature(e,t){const n=this.getSettings(),s=n.env||{},o={...n,env:{...s,[e]:t}};this.saveSettings(o)}removeExperimentalFeature(e){const t=this.getSettings();if(!t.env)return;const{[e]:n,...s}=t.env,o={...t,env:s};this.saveSettings(o)}}export const claudeCodeManager=ClaudeCodeManager.getInstance();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeapi/api-helper",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.37",
|
|
4
4
|
"description": "CLI tool for managing AI coding assistants (Claude Code, Codex, OpenClaw, Hermes, AtomCode) with one unified config",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|