@vibeapi/cli 0.0.53 → 0.0.54
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.
|
@@ -37,6 +37,11 @@ export declare function humanizeModelId(base: string): string;
|
|
|
37
37
|
* Order: the profile's main model first (Claude Desktop treats the first entry
|
|
38
38
|
* as the default), then by family (opus, fable, sonnet, haiku) newest-first.
|
|
39
39
|
* Each family's default is the model the profile slot points at, else its newest.
|
|
40
|
+
*
|
|
41
|
+
* Claude only: the desktop drops any `inferenceModels` entry whose name matches its
|
|
42
|
+
* built-in list of non-Anthropic vendors (deepseek, glm, kimi, qwen, minimax, …) and
|
|
43
|
+
* shows a "configuration may need attention" warning, so domestic models stay in
|
|
44
|
+
* Claude Code's `/model` menu.
|
|
40
45
|
*/
|
|
41
46
|
export declare function buildInferenceModels(models: VibecliModels, catalog?: ModelCatalog): InferenceModel[];
|
|
42
47
|
type RegRunner = (args: string[]) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{chmodSync as e,existsSync as t,mkdirSync as o,readdirSync as n,readFileSync as r,rmSync as s}from"fs";import{dirname as i}from"path";import{join as a}from"path";import{randomUUID as l}from"crypto";import{execFileSync as c}from"child_process";import{userInfo as p}from"os";import{logger as d}from"../../utils/logger.js";import{i18n as u}from"../i18n.js";import{BRAND_NAME as f}from"../brand.js";import{backupBeforeWrite as m,atomicWriteFile as g}from"./backup.js";import{toolHome as h}from"./types.js";import{baseModelId as y,isClaudeModel as b}from"../model-catalog.js";import{gatewayModelSpecs as C,prettyModelName as k}from"../gateway-models.js";const A=f;export const CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING="hide_official_login";const w=["Claude_pzs8sxrjxfjjc","AnthropicPBC.Claude_fnn82j28hfe8t"],_=/^[a-f0-9-]{36}$/;function D(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}export function claudeDesktopUserDataDir(){const e=process.env.CLAUDE_USER_DATA_DIR?.trim();if(e)return e;const o=h(),n=Boolean(process.env.VIBECLI_TEST_HOME?.trim());switch(process.platform){case"darwin":return a(o,"Library","Application Support","Claude-3p");case"win32":{const e=!n&&process.env.LOCALAPPDATA?process.env.LOCALAPPDATA:a(o,"AppData","Local");return w.map(t=>a(e,"Packages",t,"LocalCache","Local","Claude-3p")).find(e=>t(e))??a(e,"Claude-3p")}default:{const e=!n&&process.env.XDG_CONFIG_HOME?process.env.XDG_CONFIG_HOME:a(o,".config");return a(e,"Claude-3p")}}}const E=()=>a(claudeDesktopUserDataDir(),"configLibrary"),M=()=>a(E(),"_meta.json"),v=e=>a(E(),`${e}.json`),O=()=>a(claudeDesktopUserDataDir(),"claude_desktop_config.json");function P(e){if(!t(e))return null;const o=r(e,"utf-8");if(!o.trim())return null;try{const e=JSON.parse(o);return D(e)?e:null}catch(t){throw new Error(`Existing ${e} cannot be parsed, back it up and fix it first: ${t instanceof Error?t.message:String(t)}`)}}function S(n,r){const s=i(n);t(s)||o(s,{recursive:!0,mode:448}),m(n),g(n,JSON.stringify(r,null,2)+"\n");try{e(n,384)}catch(e){d.logError("claude-desktop.writeJson.chmod",e)}}function j(){const e=P(M());if(!e)return null;const t=Array.isArray(e.entries)?e.entries.filter(e=>D(e)&&"string"==typeof e.id&&"string"==typeof e.name):[];return{...e,appliedId:"string"==typeof e.appliedId?e.appliedId:"",entries:t}}function x(e){return e?.entries.find(e=>e.name===A&&_.test(e.id))}const I={opus:0,fable:1,sonnet:2,haiku:3};function L(e){let t=/^claude-(opus|sonnet|haiku|fable)-(\d+(?:-\d+)*)/i.exec(e);return t?{family:t[1].toLowerCase(),version:t[2].split("-").map(Number)}:(t=/^claude-(\d+(?:-\d+)*)-(opus|sonnet|haiku)/i.exec(e),t?{family:t[2].toLowerCase(),version:t[1].split("-").map(Number)}:null)}export function humanizeModelId(e){const t=L(e);return t?`${t.family[0].toUpperCase()+t.family.slice(1)} ${t.version.filter(e=>e<1e7).slice(0,2).join(".")}`:e}function T(e){return L(e)?.family}export function buildInferenceModels(e,t){const{primary:o,bySlot:n}=function(e){const t=["opus","sonnet","haiku","reasoning"].map(t=>y(e[t]||"")).filter(Boolean);return{primary:t[0]??"",bySlot:t}}(e),r=new Set,s=t?.labels??{};let i;if(t&&t.models.some(b)){i=[...new Set(t.models.filter(b).map(y))];for(const e of t.oneMillion)r.add(e)}else{i=[];for(const t of["opus","sonnet","haiku","reasoning"]){const o=(e[t]||"").trim(),n=y(o);n&&(i.includes(n)||i.push(n),/\[1m\]/i.test(o)&&r.add(n))}}const a=e=>I[T(e)??""]??9;i.sort((e,t)=>{if(e===o)return-1;if(t===o)return 1;const n=a(e)-a(t);if(0!==n)return n;const r=L(e),s=L(t);return r&&s?function(e,t){const o=Math.max(e.length,t.length);for(let n=0;n<o;n++){const o=(t[n]??0)-(e[n]??0);if(0!==o)return o}return 0}(r.version,s.version):e.localeCompare(t)});const l=new Set,c=new Map;for(const e of n){const t=T(e);t&&i.includes(e)&&!c.has(t)&&c.set(t,e)}const p=[...i.map(e=>{const t=T(e),o={name:e,labelOverride:s[e]||humanizeModelId(e)};if(r.has(e)&&(o.supports1m=!0,o.prefer1m=!0),t){o.anthropicFamilyTier=t;const n=c.get(t);n&&n!==e||l.has(t)||(o.isFamilyDefault=!0,l.add(t))}return o}),...$(t)],d=p.findIndex(e=>e.name===o);return d>0&&p.unshift(...p.splice(d,1)),p}function $(e){if(!e)return[];const t=new Set(e.models.map(y));return C("claude-code",e.clientModels).filter(e=>t.has(e.id)).map(e=>{const t={name:e.id,labelOverride:e.name||k(e.id)};return(e.contextWindow??0)>=1e6&&(t.supports1m=!0,t.prefer1m=!0),t})}let G=null,N=null;function U(e){return{inferenceProvider:"gateway",inferenceCredentialKind:"static",inferenceGatewayBaseUrl:(e.baseUrl||"").trim().replace(/\/+$/,""),inferenceGatewayApiKey:e.apiKey,inferenceModels:buildInferenceModels(e.models,e.catalog),disableDeploymentModeChooser:!1!==e.settings?.hide_official_login,chatTabEnabled:!0,chatAdvancedFileAnalysisEnabled:!0,autoModeEnabled:!0,coworkEgressAllowedHosts:["*"],disableEssentialTelemetry:!0,disableNonessentialTelemetry:!0,disableNonessentialServices:!1}}const F={modelPrefer1mContext:!0,skipWebFetchPreflight:!0,toolSearchEnabled:!0,builtinBrowserEnabled:!0,isDesktopExtensionEnabled:!0,sshHostAllowlist:["*"],claudeAiImport:{enabled:!0,automatic3pImport:!0,exportEnabled:!0},coworkVmIpv6Enabled:!0,mcpToolTimeoutSec:3600,updateViaUpdatesHost:!0};function R(e){return Object.fromEntries(Object.entries(F).filter(([t])=>!e(t)))}const K="HKCU\\SOFTWARE\\Policies\\Claude",H="HKLM\\SOFTWARE\\Policies\\Claude",B="vibecli-claude-policy.reg",W=e=>c("reg",e,{stdio:["ignore","pipe","pipe"]}).toString();let V=W;export function setRegRunnerForTests(e){V=e??W}function z(){return"win32"===process.platform}function J(e){let t;try{t=V(["query",e])}catch{return null}const o=new Map;for(const e of t.split(/\r?\n/)){const t=/^\s{2,}(\S+)\s+(REG_[A-Z_]+)\s*(.*)$/.exec(e);t&&o.set(t[1],t[3])}return o}function Z(){if(null===J(K))return;const e=a(claudeDesktopUserDataDir(),B);try{t(i(e))||o(i(e),{recursive:!0,mode:448}),m(e),V(["export",K,e,"/y"])}catch(e){d.logError("claude-desktop.snapshotPolicy",e)}}const X=[...Object.keys(U({apiKey:"",baseUrl:"",models:{haiku:"",sonnet:"",opus:"",reasoning:""}})),...Object.keys(F)];export function detectManagedConfig(){try{if("darwin"===process.platform){let e="";try{e=p().username}catch{}return[e?`/Library/Managed Preferences/${e}/com.anthropic.claudefordesktop.plist`:"","/Library/Managed Preferences/com.anthropic.claudefordesktop.plist"].filter(Boolean).find(e=>t(e))??null}if("win32"===process.platform)return J(H)?H:null;const e="/etc/claude-desktop/managed-settings.json";return t(e)?e:null}catch(e){return d.logError("claude-desktop.detectManagedConfig",e),null}}const q=/\d+\.\d+\.\d+/;function Q(e){const t=e=>e.split(".").map(Number);return e.sort((e,o)=>{const[n,r]=[t(e),t(o)];for(let e=0;e<3;e++)if(n[e]!==r[e])return r[e]-n[e];return 0})[0]??null}const Y="darwin"===process.platform?"open -a Claude":"win32"===process.platform?"Claude":"claude-desktop",ee="darwin"===process.platform||"win32"===process.platform?"https://cnb.cool/vibeapi/claude-desktop/-/releases/latest":"https://claude.ai/download",te="darwin"===process.platform?`open ${ee}`:"win32"===process.platform?`start ${ee}`:`xdg-open ${ee}`;export const claudeDesktopAdapter={name:"claude-desktop",displayName:"Claude Desktop",command:Y,installCommand:te,configPath:M(),isInstalled:function(){const e=h();let o;switch(process.platform){case"darwin":o=["/Applications/Claude.app",a(e,"Applications","Claude.app")];break;case"win32":{const t=process.env.LOCALAPPDATA||a(e,"AppData","Local");o=[a(t,"AnthropicClaude"),a(t,"Programs","Claude"),...w.map(e=>a(t,"Packages",e))];break}default:o=["/usr/lib/claude-desktop","/opt/Claude","/usr/bin/claude-desktop",a(e,".local","bin","claude-desktop")]}return o.push(claudeDesktopUserDataDir(),a(claudeDesktopUserDataDir(),"..","Claude")),o.some(e=>t(e))},installedVersion:function(){if("darwin"===process.platform){for(const e of["/Applications/Claude.app",a(h(),"Applications","Claude.app")]){const o=a(e,"Contents","Info.plist");if(!t(o))continue;const n=/<key>CFBundleShortVersionString<\/key>\s*<string>([^<]+)<\/string>/.exec(r(o,"utf-8")),s=n?q.exec(n[1])?.[0]:void 0;if(s)return s}return null}if("win32"===process.platform){const e=a(process.env.LOCALAPPDATA||a(h(),"AppData","Local"),"AnthropicClaude");if(t(e)){const t=n(e).map(e=>/^app-(\d+\.\d+\.\d+)$/.exec(e)?.[1]).filter(e=>!!e);if(t.length>0)return Q(t)}const o=w.map(e=>`'${e}'`).join(",");return Q(c("powershell.exe",["-NoProfile","-Command",`Get-AppxPackage | Where-Object { @(${o}) -contains $_.PackageFamilyName } | ForEach-Object { $_.Version.ToString() }`],{encoding:"utf-8",timeout:15e3,windowsHide:!0,stdio:["ignore","pipe","ignore"]}).split(/\r?\n/).flatMap(e=>q.exec(e)?.[0]??[]))}return null},wantsModelCatalog:!0,loadPrivateConfig(e){const t=j()??{appliedId:"",entries:[]};let o=x(t);o||(o={id:l(),name:A},t.entries.push(o));const n=U(e);N=!0===n.disableDeploymentModeChooser,G={models:n.inferenceModels,source:e.catalog?e.catalog.oneMillionSource:"slots",groups:e.catalog?.matchedGroups??[]};const r=P(v(o.id))??{};S(v(o.id),{...R(e=>e in r),...r,...n}),t.appliedId=o.id,S(M(),t);const s=P(O())??{};if("3p"!==s.deploymentMode&&S(O(),{...s,deploymentMode:"3p"}),z()){const e=J(K);!function(e){Z();for(const[t,o]of Object.entries(e)){const[e,n]="boolean"==typeof o?["REG_DWORD",o?"1":"0"]:"number"==typeof o?["REG_DWORD",String(o)]:"string"==typeof o?["REG_SZ",o]:["REG_SZ",JSON.stringify(o)];V(["add",K,"/v",t,"/t",e,"/d",n,"/f"])}}({...R(t=>e?.has(t)??!1),...n})}},unloadPrivateConfig(){z()&&function(e){const t=J(K);if(!t)return;Z();let o=t.size;for(const n of e)t.has(n)&&(V(["delete",K,"/v",n,"/f"]),o-=1);o<=0&&V(["delete",K,"/f"])}(X);const e=j(),t=x(e);if(!e||!t)return;m(v(t.id)),s(v(t.id),{force:!0});const o=e.entries.filter(e=>e.id!==t.id);0===o.length?(m(M()),s(M(),{force:!0})):S(M(),{...e,entries:o,appliedId:e.appliedId===t.id?o[0].id:e.appliedId})},detectCurrentConfig(){try{if(z()){const e=J(K)?.get("inferenceGatewayApiKey");if(e)return{apiKey:e}}const e=x(j());if(!e)return{apiKey:null};const t=P(v(e.id)),o=t?.inferenceGatewayApiKey;return{apiKey:"string"==typeof o&&o?o:null}}catch(e){return d.logError("claude-desktop.detectCurrentConfig",e),{apiKey:null}}},getConfig(){try{const e=j(),t=x(e);return{meta:e,applied:t?P(v(t.id)):null,desktop:P(O()),...z()?{policy:Object.fromEntries(J(K)??[])}:{}}}catch(e){return d.logError("claude-desktop.getConfig",e),null}},clearPinnedModels(){let e=!1;z()&&J(K)?.has("inferenceModels")&&(Z(),V(["delete",K,"/v","inferenceModels","/f"]),e=!0);const t=x(j()),o=t?P(v(t.id)):null;if(t&&o&&void 0!==o.inferenceModels){const{inferenceModels:n,...r}=o;S(v(t.id),r),e=!0}return e?["inferenceModels"]:[]},applyNotes(){const e=[];if(G){const t=G.models.map(e=>`${e.labelOverride}${e.supports1m?" (1M)":""}`).join(", ");e.push(u.t(`tools.claude_desktop.models_written_${G.source}`,{count:String(G.models.length),list:t,groups:G.groups.join(" / ")}))}null!==N&&e.push(u.t(N?"tools.claude_desktop.official_login_hidden":"tools.claude_desktop.official_login_shown")),e.push(u.t("tools.claude_desktop.restart_hint")),z()&&e.push(u.t("tools.claude_desktop.registry_written",{key:K}));const t=detectManagedConfig();return t&&e.push(u.t("tools.claude_desktop.managed_conflict",{path:t})),e},forceResetPaths(){const e=[M(),O()];try{const t=x(j());t&&e.push(v(t.id))}catch{}return e},backupPaths(){const e=[M(),O()];z()&&e.push(a(claudeDesktopUserDataDir(),B));try{const t=x(j());t&&e.push(v(t.id))}catch{}return e}};
|
|
1
|
+
import{chmodSync as e,existsSync as t,mkdirSync as o,readdirSync as n,readFileSync as r,rmSync as s}from"fs";import{dirname as i}from"path";import{join as a}from"path";import{randomUUID as l}from"crypto";import{execFileSync as c}from"child_process";import{userInfo as p}from"os";import{logger as d}from"../../utils/logger.js";import{i18n as u}from"../i18n.js";import{BRAND_NAME as f}from"../brand.js";import{backupBeforeWrite as m,atomicWriteFile as g}from"./backup.js";import{toolHome as h}from"./types.js";import{baseModelId as y,isClaudeModel as b}from"../model-catalog.js";const C=f;export const CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING="hide_official_login";const k=["Claude_pzs8sxrjxfjjc","AnthropicPBC.Claude_fnn82j28hfe8t"],A=/^[a-f0-9-]{36}$/;function _(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}export function claudeDesktopUserDataDir(){const e=process.env.CLAUDE_USER_DATA_DIR?.trim();if(e)return e;const o=h(),n=Boolean(process.env.VIBECLI_TEST_HOME?.trim());switch(process.platform){case"darwin":return a(o,"Library","Application Support","Claude-3p");case"win32":{const e=!n&&process.env.LOCALAPPDATA?process.env.LOCALAPPDATA:a(o,"AppData","Local");return k.map(t=>a(e,"Packages",t,"LocalCache","Local","Claude-3p")).find(e=>t(e))??a(e,"Claude-3p")}default:{const e=!n&&process.env.XDG_CONFIG_HOME?process.env.XDG_CONFIG_HOME:a(o,".config");return a(e,"Claude-3p")}}}const D=()=>a(claudeDesktopUserDataDir(),"configLibrary"),w=()=>a(D(),"_meta.json"),E=e=>a(D(),`${e}.json`),M=()=>a(claudeDesktopUserDataDir(),"claude_desktop_config.json");function v(e){if(!t(e))return null;const o=r(e,"utf-8");if(!o.trim())return null;try{const e=JSON.parse(o);return _(e)?e:null}catch(t){throw new Error(`Existing ${e} cannot be parsed, back it up and fix it first: ${t instanceof Error?t.message:String(t)}`)}}function P(n,r){const s=i(n);t(s)||o(s,{recursive:!0,mode:448}),m(n),g(n,JSON.stringify(r,null,2)+"\n");try{e(n,384)}catch(e){d.logError("claude-desktop.writeJson.chmod",e)}}function O(){const e=v(w());if(!e)return null;const t=Array.isArray(e.entries)?e.entries.filter(e=>_(e)&&"string"==typeof e.id&&"string"==typeof e.name):[];return{...e,appliedId:"string"==typeof e.appliedId?e.appliedId:"",entries:t}}function S(e){return e?.entries.find(e=>e.name===C&&A.test(e.id))}const j={opus:0,fable:1,sonnet:2,haiku:3};function I(e){let t=/^claude-(opus|sonnet|haiku|fable)-(\d+(?:-\d+)*)/i.exec(e);return t?{family:t[1].toLowerCase(),version:t[2].split("-").map(Number)}:(t=/^claude-(\d+(?:-\d+)*)-(opus|sonnet|haiku)/i.exec(e),t?{family:t[2].toLowerCase(),version:t[1].split("-").map(Number)}:null)}export function humanizeModelId(e){const t=I(e);return t?`${t.family[0].toUpperCase()+t.family.slice(1)} ${t.version.filter(e=>e<1e7).slice(0,2).join(".")}`:e}function x(e){return I(e)?.family}export function buildInferenceModels(e,t){const{primary:o,bySlot:n}=function(e){const t=["opus","sonnet","haiku","reasoning"].map(t=>y(e[t]||"")).filter(Boolean);return{primary:t[0]??"",bySlot:t}}(e),r=new Set,s=t?.labels??{};let i;if(t&&t.models.some(b)){i=[...new Set(t.models.filter(b).map(y))];for(const e of t.oneMillion)r.add(e)}else{i=[];for(const t of["opus","sonnet","haiku","reasoning"]){const o=(e[t]||"").trim(),n=y(o);n&&(i.includes(n)||i.push(n),/\[1m\]/i.test(o)&&r.add(n))}}const a=e=>j[x(e)??""]??9;i.sort((e,t)=>{if(e===o)return-1;if(t===o)return 1;const n=a(e)-a(t);if(0!==n)return n;const r=I(e),s=I(t);return r&&s?function(e,t){const o=Math.max(e.length,t.length);for(let n=0;n<o;n++){const o=(t[n]??0)-(e[n]??0);if(0!==o)return o}return 0}(r.version,s.version):e.localeCompare(t)});const l=new Set,c=new Map;for(const e of n){const t=x(e);t&&i.includes(e)&&!c.has(t)&&c.set(t,e)}return i.map(e=>{const t=x(e),o={name:e,labelOverride:s[e]||humanizeModelId(e)};if(r.has(e)&&(o.supports1m=!0,o.prefer1m=!0),t){o.anthropicFamilyTier=t;const n=c.get(t);n&&n!==e||l.has(t)||(o.isFamilyDefault=!0,l.add(t))}return o})}let L=null,T=null;function $(e){return{inferenceProvider:"gateway",inferenceCredentialKind:"static",inferenceGatewayBaseUrl:(e.baseUrl||"").trim().replace(/\/+$/,""),inferenceGatewayApiKey:e.apiKey,inferenceModels:buildInferenceModels(e.models,e.catalog),disableDeploymentModeChooser:!1!==e.settings?.hide_official_login,chatTabEnabled:!0,chatAdvancedFileAnalysisEnabled:!0,autoModeEnabled:!0,coworkEgressAllowedHosts:["*"],disableEssentialTelemetry:!0,disableNonessentialTelemetry:!0,disableNonessentialServices:!1}}const G={modelPrefer1mContext:!0,skipWebFetchPreflight:!0,toolSearchEnabled:!0,builtinBrowserEnabled:!0,isDesktopExtensionEnabled:!0,sshHostAllowlist:["*"],claudeAiImport:{enabled:!0,automatic3pImport:!0,exportEnabled:!0},coworkVmIpv6Enabled:!0,mcpToolTimeoutSec:3600,updateViaUpdatesHost:!0};function N(e){return Object.fromEntries(Object.entries(G).filter(([t])=>!e(t)))}const U="HKCU\\SOFTWARE\\Policies\\Claude",F="HKLM\\SOFTWARE\\Policies\\Claude",R="vibecli-claude-policy.reg",K=e=>c("reg",e,{stdio:["ignore","pipe","pipe"]}).toString();let H=K;export function setRegRunnerForTests(e){H=e??K}function B(){return"win32"===process.platform}function V(e){let t;try{t=H(["query",e])}catch{return null}const o=new Map;for(const e of t.split(/\r?\n/)){const t=/^\s{2,}(\S+)\s+(REG_[A-Z_]+)\s*(.*)$/.exec(e);t&&o.set(t[1],t[3])}return o}function W(){if(null===V(U))return;const e=a(claudeDesktopUserDataDir(),R);try{t(i(e))||o(i(e),{recursive:!0,mode:448}),m(e),H(["export",U,e,"/y"])}catch(e){d.logError("claude-desktop.snapshotPolicy",e)}}const z=[...Object.keys($({apiKey:"",baseUrl:"",models:{haiku:"",sonnet:"",opus:"",reasoning:""}})),...Object.keys(G)];export function detectManagedConfig(){try{if("darwin"===process.platform){let e="";try{e=p().username}catch{}return[e?`/Library/Managed Preferences/${e}/com.anthropic.claudefordesktop.plist`:"","/Library/Managed Preferences/com.anthropic.claudefordesktop.plist"].filter(Boolean).find(e=>t(e))??null}if("win32"===process.platform)return V(F)?F:null;const e="/etc/claude-desktop/managed-settings.json";return t(e)?e:null}catch(e){return d.logError("claude-desktop.detectManagedConfig",e),null}}const J=/\d+\.\d+\.\d+/;function Z(e){const t=e=>e.split(".").map(Number);return e.sort((e,o)=>{const[n,r]=[t(e),t(o)];for(let e=0;e<3;e++)if(n[e]!==r[e])return r[e]-n[e];return 0})[0]??null}const X="darwin"===process.platform?"open -a Claude":"win32"===process.platform?"Claude":"claude-desktop",q="darwin"===process.platform||"win32"===process.platform?"https://cnb.cool/vibeapi/claude-desktop/-/releases/latest":"https://claude.ai/download",Q="darwin"===process.platform?`open ${q}`:"win32"===process.platform?`start ${q}`:`xdg-open ${q}`;export const claudeDesktopAdapter={name:"claude-desktop",displayName:"Claude Desktop",command:X,installCommand:Q,configPath:w(),isInstalled:function(){const e=h();let o;switch(process.platform){case"darwin":o=["/Applications/Claude.app",a(e,"Applications","Claude.app")];break;case"win32":{const t=process.env.LOCALAPPDATA||a(e,"AppData","Local");o=[a(t,"AnthropicClaude"),a(t,"Programs","Claude"),...k.map(e=>a(t,"Packages",e))];break}default:o=["/usr/lib/claude-desktop","/opt/Claude","/usr/bin/claude-desktop",a(e,".local","bin","claude-desktop")]}return o.push(claudeDesktopUserDataDir(),a(claudeDesktopUserDataDir(),"..","Claude")),o.some(e=>t(e))},installedVersion:function(){if("darwin"===process.platform){for(const e of["/Applications/Claude.app",a(h(),"Applications","Claude.app")]){const o=a(e,"Contents","Info.plist");if(!t(o))continue;const n=/<key>CFBundleShortVersionString<\/key>\s*<string>([^<]+)<\/string>/.exec(r(o,"utf-8")),s=n?J.exec(n[1])?.[0]:void 0;if(s)return s}return null}if("win32"===process.platform){const e=a(process.env.LOCALAPPDATA||a(h(),"AppData","Local"),"AnthropicClaude");if(t(e)){const t=n(e).map(e=>/^app-(\d+\.\d+\.\d+)$/.exec(e)?.[1]).filter(e=>!!e);if(t.length>0)return Z(t)}const o=k.map(e=>`'${e}'`).join(",");return Z(c("powershell.exe",["-NoProfile","-Command",`Get-AppxPackage | Where-Object { @(${o}) -contains $_.PackageFamilyName } | ForEach-Object { $_.Version.ToString() }`],{encoding:"utf-8",timeout:15e3,windowsHide:!0,stdio:["ignore","pipe","ignore"]}).split(/\r?\n/).flatMap(e=>J.exec(e)?.[0]??[]))}return null},wantsModelCatalog:!0,loadPrivateConfig(e){const t=O()??{appliedId:"",entries:[]};let o=S(t);o||(o={id:l(),name:C},t.entries.push(o));const n=$(e);T=!0===n.disableDeploymentModeChooser,L={models:n.inferenceModels,source:e.catalog?e.catalog.oneMillionSource:"slots",groups:e.catalog?.matchedGroups??[]};const r=v(E(o.id))??{};P(E(o.id),{...N(e=>e in r),...r,...n}),t.appliedId=o.id,P(w(),t);const s=v(M())??{};if("3p"!==s.deploymentMode&&P(M(),{...s,deploymentMode:"3p"}),B()){const e=V(U);!function(e){W();for(const[t,o]of Object.entries(e)){const[e,n]="boolean"==typeof o?["REG_DWORD",o?"1":"0"]:"number"==typeof o?["REG_DWORD",String(o)]:"string"==typeof o?["REG_SZ",o]:["REG_SZ",JSON.stringify(o)];H(["add",U,"/v",t,"/t",e,"/d",n,"/f"])}}({...N(t=>e?.has(t)??!1),...n})}},unloadPrivateConfig(){B()&&function(e){const t=V(U);if(!t)return;W();let o=t.size;for(const n of e)t.has(n)&&(H(["delete",U,"/v",n,"/f"]),o-=1);o<=0&&H(["delete",U,"/f"])}(z);const e=O(),t=S(e);if(!e||!t)return;m(E(t.id)),s(E(t.id),{force:!0});const o=e.entries.filter(e=>e.id!==t.id);0===o.length?(m(w()),s(w(),{force:!0})):P(w(),{...e,entries:o,appliedId:e.appliedId===t.id?o[0].id:e.appliedId})},detectCurrentConfig(){try{if(B()){const e=V(U)?.get("inferenceGatewayApiKey");if(e)return{apiKey:e}}const e=S(O());if(!e)return{apiKey:null};const t=v(E(e.id)),o=t?.inferenceGatewayApiKey;return{apiKey:"string"==typeof o&&o?o:null}}catch(e){return d.logError("claude-desktop.detectCurrentConfig",e),{apiKey:null}}},getConfig(){try{const e=O(),t=S(e);return{meta:e,applied:t?v(E(t.id)):null,desktop:v(M()),...B()?{policy:Object.fromEntries(V(U)??[])}:{}}}catch(e){return d.logError("claude-desktop.getConfig",e),null}},clearPinnedModels(){let e=!1;B()&&V(U)?.has("inferenceModels")&&(W(),H(["delete",U,"/v","inferenceModels","/f"]),e=!0);const t=S(O()),o=t?v(E(t.id)):null;if(t&&o&&void 0!==o.inferenceModels){const{inferenceModels:n,...r}=o;P(E(t.id),r),e=!0}return e?["inferenceModels"]:[]},applyNotes(){const e=[];if(L){const t=L.models.map(e=>`${e.labelOverride}${e.supports1m?" (1M)":""}`).join(", ");e.push(u.t(`tools.claude_desktop.models_written_${L.source}`,{count:String(L.models.length),list:t,groups:L.groups.join(" / ")}))}null!==T&&e.push(u.t(T?"tools.claude_desktop.official_login_hidden":"tools.claude_desktop.official_login_shown")),e.push(u.t("tools.claude_desktop.restart_hint")),B()&&e.push(u.t("tools.claude_desktop.registry_written",{key:U}));const t=detectManagedConfig();return t&&e.push(u.t("tools.claude_desktop.managed_conflict",{path:t})),e},forceResetPaths(){const e=[w(),M()];try{const t=S(O());t&&e.push(E(t.id))}catch{}return e},backupPaths(){const e=[w(),M()];B()&&e.push(a(claudeDesktopUserDataDir(),R));try{const t=S(O());t&&e.push(E(t.id))}catch{}return e}};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeapi/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.54",
|
|
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",
|