@vibeapi/cli 0.0.47 → 0.0.50

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.
@@ -31,6 +31,7 @@ export interface ClaudeCodeSettingsConfig {
31
31
  ANTHROPIC_REASONING_MODEL?: string;
32
32
  API_TIMEOUT_MS?: string;
33
33
  CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC?: number;
34
+ CLAUDE_CODE_AUTO_MODE_SERVER?: string;
34
35
  [key: string]: any;
35
36
  };
36
37
  [key: string]: any;
@@ -1 +1 @@
1
- import{existsSync as e,mkdirSync as t,readFileSync as n,writeFileSync as s,renameSync as o,unlinkSync as r}from"fs";import{join as i,dirname as a}from"path";import{homedir as l}from"os";import{logger as c}from"../utils/logger.js";import{configManager as g,DEFAULT_MODELS as C}from"./config.js";import{loadSettingsTemplate as d}from"./settings-template.js";import{cleanupAnthropicEnvVars as O}from"./env-cleanup.js";import{getClaudeCodeTierChains as h}from"./model-registry.js";import{baseModelId as _}from"./model-catalog.js";export const MODEL_ENV_VARS=["ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_FABLE_MODEL","ANTHROPIC_MODEL","ANTHROPIC_REASONING_MODEL"];const f={opus:"ANTHROPIC_DEFAULT_OPUS_MODEL",sonnet:"ANTHROPIC_DEFAULT_SONNET_MODEL",haiku:"ANTHROPIC_DEFAULT_HAIKU_MODEL",fable:"ANTHROPIC_DEFAULT_FABLE_MODEL"};export function resolveTierFallbacks(e){if(!e||0===e.length)return[];const t=new Set(e.map(_)),n=[];for(const[e,s]of Object.entries(h())){const o=f[e],[r,...i]=s;if(!o||!r||t.has(r))continue;const a=i.find(e=>t.has(e));a&&n.push({tier:e,envVar:o,from:r,to:a})}return n}export class ClaudeCodeManager{static instance;settingsPath;mcpConfigPath;lastTierFallbacks=[];constructor(){this.settingsPath=i(l(),".claude","settings.json"),this.mcpConfigPath=i(l(),".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 i=`${t}.tmp`;try{s(i,n,"utf-8"),o(i,t)}catch(t){if(e(i))try{r(i)}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,n){this.ensureOnboardingCompleted(),O();const s=d(),o=s.env||{},{env:r,...i}=s,a=this.getSettings(),{ANTHROPIC_API_KEY:l,...c}=a.env||{},h={...c};for(const e of MODEL_ENV_VARS)delete h[e];const _={},f=e=>{const n=(t[e]||"").trim();return n&&n!==C[e]?n:null},u=f("haiku"),E=f("sonnet"),m=f("opus"),T=new Set([u&&"haiku",E&&"sonnet",m&&"opus"].filter(Boolean));this.lastTierFallbacks=resolveTierFallbacks(n).filter(e=>!T.has(e.tier));for(const e of this.lastTierFallbacks)_[e.envVar]=e.to;u&&(_.ANTHROPIC_DEFAULT_HAIKU_MODEL=u),E&&(_.ANTHROPIC_DEFAULT_SONNET_MODEL=E),m&&(_.ANTHROPIC_DEFAULT_OPUS_MODEL=m,_.ANTHROPIC_MODEL=m);const A={...a};for(const[e,t]of Object.entries(i))e in A||(A[e]=t);A.showThinkingSummaries=!0;const P={...A,env:{...h,...Object.fromEntries(Object.entries(o).filter(([e])=>!(e in h))),ANTHROPIC_AUTH_TOKEN:e,ANTHROPIC_BASE_URL:g.getBaseUrl(),..._}};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,...r}=e.env,i={...r};for(const e of MODEL_ENV_VARS)delete i[e];const a={...e,env:i};delete a.model,a.env&&0===Object.keys(a.env).length&&delete a.env,this.saveSettings(a)}clearPinnedModels(e){const t=this.getSettings(),n=t.env,s=n?.ANTHROPIC_AUTH_TOKEN?Object.fromEntries(resolveTierFallbacks(e).map(e=>[e.envVar,e.to])):{},o=[];for(const e of MODEL_ENV_VARS)n&&e in n&&n[e]!==s[e]&&o.push(e);void 0!==t.model&&o.push("model");const r=Object.entries(s).some(([e,t])=>n?.[e]!==t);if(0===o.length&&!r)return[];const i={...t};if(delete i.model,n){const e={...n};for(const t of MODEL_ENV_VARS)delete e[t];Object.assign(e,s),0===Object.keys(e).length?delete i.env:i.env=e}return this.saveSettings(i),o}getLastTierFallbacks(){return[...this.lastTierFallbacks]}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();
1
+ import{existsSync as e,mkdirSync as t,readFileSync as n,writeFileSync as s,renameSync as o,unlinkSync as r}from"fs";import{join as i,dirname as a}from"path";import{homedir as l}from"os";import{logger as c}from"../utils/logger.js";import{configManager as g,DEFAULT_MODELS as C}from"./config.js";import{loadSettingsTemplate as O}from"./settings-template.js";import{cleanupAnthropicEnvVars as d}from"./env-cleanup.js";import{getClaudeCodeTierChains as h}from"./model-registry.js";import{baseModelId as _}from"./model-catalog.js";export const MODEL_ENV_VARS=["ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_FABLE_MODEL","ANTHROPIC_MODEL","ANTHROPIC_REASONING_MODEL"];const E={opus:"ANTHROPIC_DEFAULT_OPUS_MODEL",sonnet:"ANTHROPIC_DEFAULT_SONNET_MODEL",haiku:"ANTHROPIC_DEFAULT_HAIKU_MODEL",fable:"ANTHROPIC_DEFAULT_FABLE_MODEL"};export function resolveTierFallbacks(e){if(!e||0===e.length)return[];const t=new Set(e.map(_)),n=[];for(const[e,s]of Object.entries(h())){const o=E[e],[r,...i]=s;if(!o||!r||t.has(r))continue;const a=i.find(e=>t.has(e));a&&n.push({tier:e,envVar:o,from:r,to:a})}return n}export class ClaudeCodeManager{static instance;settingsPath;mcpConfigPath;lastTierFallbacks=[];constructor(){this.settingsPath=i(l(),".claude","settings.json"),this.mcpConfigPath=i(l(),".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 i=`${t}.tmp`;try{s(i,n,"utf-8"),o(i,t)}catch(t){if(e(i))try{r(i)}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,n){this.ensureOnboardingCompleted(),d();const s=O(),o=s.env||{},{env:r,...i}=s,a=this.getSettings(),{ANTHROPIC_API_KEY:l,...c}=a.env||{},h={...c};for(const e of MODEL_ENV_VARS)delete h[e];const _={},E=e=>{const n=(t[e]||"").trim();return n&&n!==C[e]?n:null},f=E("haiku"),u=E("sonnet"),m=E("opus"),T=new Set([f&&"haiku",u&&"sonnet",m&&"opus"].filter(Boolean));this.lastTierFallbacks=resolveTierFallbacks(n).filter(e=>!T.has(e.tier));for(const e of this.lastTierFallbacks)_[e.envVar]=e.to;f&&(_.ANTHROPIC_DEFAULT_HAIKU_MODEL=f),u&&(_.ANTHROPIC_DEFAULT_SONNET_MODEL=u),m&&(_.ANTHROPIC_DEFAULT_OPUS_MODEL=m,_.ANTHROPIC_MODEL=m);const A={...a};for(const[e,t]of Object.entries(i))e in A||(A[e]=t);A.showThinkingSummaries=!0;const P={...A,env:{...h,...Object.fromEntries(Object.entries(o).filter(([e])=>!(e in h))),ANTHROPIC_AUTH_TOKEN:e,ANTHROPIC_BASE_URL:g.getBaseUrl(),..._}};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,CLAUDE_CODE_AUTO_MODE_SERVER:r,...i}=e.env,a={...i};for(const e of MODEL_ENV_VARS)delete a[e];const l={...e,env:a};delete l.model,l.env&&0===Object.keys(l.env).length&&delete l.env,this.saveSettings(l)}clearPinnedModels(e){const t=this.getSettings(),n=t.env,s=n?.ANTHROPIC_AUTH_TOKEN?Object.fromEntries(resolveTierFallbacks(e).map(e=>[e.envVar,e.to])):{},o=[];for(const e of MODEL_ENV_VARS)n&&e in n&&n[e]!==s[e]&&o.push(e);void 0!==t.model&&o.push("model");const r=Object.entries(s).some(([e,t])=>n?.[e]!==t);if(0===o.length&&!r)return[];const i={...t};if(delete i.model,n){const e={...n};for(const t of MODEL_ENV_VARS)delete e[t];Object.assign(e,s),0===Object.keys(e).length?delete i.env:i.env=e}return this.saveSettings(i),o}getLastTierFallbacks(){return[...this.lastTierFallbacks]}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();
@@ -3,7 +3,8 @@
3
3
  "ENABLE_TOOL_SEARCH": "true",
4
4
  "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1",
5
5
  "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
6
- "API_TIMEOUT_MS": "3000000"
6
+ "API_TIMEOUT_MS": "3000000",
7
+ "CLAUDE_CODE_AUTO_MODE_SERVER": "0"
7
8
  },
8
9
  "attribution": {
9
10
  "commit": "",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeapi/cli",
3
- "version": "0.0.47",
3
+ "version": "0.0.50",
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",
@@ -3,7 +3,8 @@
3
3
  "ENABLE_TOOL_SEARCH": "true",
4
4
  "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1",
5
5
  "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
6
- "API_TIMEOUT_MS": "3000000"
6
+ "API_TIMEOUT_MS": "3000000",
7
+ "CLAUDE_CODE_AUTO_MODE_SERVER": "0"
7
8
  },
8
9
  "attribution": {
9
10
  "commit": "",