@vibeapi/cli 0.0.34 → 0.0.35

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
@@ -22,7 +22,7 @@ npmjs.com 不可用时,可直接从 CNB 备用制品库启动:
22
22
  npx --yes --registry https://npm.cnb.cool/vibeapi/npm/-/packages/ @vibeapi/cli@latest
23
23
  ```
24
24
 
25
- 全局安装的 `vibecli` 每次启动都会进入自动更新预检(6 小时内复用缓存),固定按 **CNB → npmjs → npmmirror → 华为云** 查询和安装;检测到新版会自动升级并重新执行当前命令。网络或权限错误不会阻断原命令,每个安装源最长等待 45 秒,安装失败后 1 小时内不重复打扰。设置 `VIBECLI_DISABLE_AUTO_UPDATE=1` 可关闭启动更新。`npx @latest` 在 CLI 启动前由 npm 解析,因此首次下载失败时请使用上面的 CNB 命令。
25
+ 全局安装的 `vibecli` 每次启动都会进入自动更新预检(6 小时内复用缓存),固定按 **CNB → npmjs → npmmirror → Yarn registry** 查询和安装;检测到新版会自动升级并重新执行当前命令。网络或权限错误不会阻断原命令,每个安装源最长等待 45 秒,安装失败后 1 小时内不重复打扰。设置 `VIBECLI_DISABLE_AUTO_UPDATE=1` 可关闭启动更新。`npx @latest` 在 CLI 启动前由 npm 解析,因此首次下载失败时请使用上面的 CNB 命令。
26
26
 
27
27
  ## 快速开始
28
28
 
@@ -4,7 +4,7 @@ export interface LocalPackageInfo {
4
4
  version: string;
5
5
  root: string;
6
6
  }
7
- export type UpdateSourceId = 'cnb' | 'npm' | 'npmmirror' | 'huawei';
7
+ export type UpdateSourceId = 'cnb' | 'npm' | 'npmmirror' | 'yarn';
8
8
  export interface UpdateSource {
9
9
  id: UpdateSourceId;
10
10
  registry: string;
@@ -1 +1 @@
1
- import r from"chalk";import{readFileSync as t}from"fs";import{join as e,dirname as o}from"path";import{fileURLToPath as n}from"url";import{i18n as a}from"../lib/i18n.js";import{isJsonMode as s,emitJson as i,isColorEnabled as c}from"../lib/runtime-options.js";const l="@vibeapi/api-helper";export const UPDATE_TIMEOUT_MS=1500;const p=(r,t,e="")=>`${r}${encodeURIComponent(t)}${e}`,u=r=>{const t=r["dist-tags"];if(!t||"object"!=typeof t)return null;const e=t.latest;return"string"==typeof e?e:null};export const UPDATE_SOURCES=[{id:"cnb",registry:"https://npm.cnb.cool/vibeapi/npm/-/packages/",metadataUrl:r=>p("https://npm.cnb.cool/vibeapi/npm/-/packages/",r),readVersion:u},{id:"npm",registry:"https://registry.npmjs.org/",metadataUrl:r=>p("https://registry.npmjs.org/",r),readVersion:u},{id:"npmmirror",registry:"https://registry.npmmirror.com/",metadataUrl:r=>p("https://registry.npmmirror.com/",r),readVersion:u},{id:"huawei",registry:"https://repo.huaweicloud.com/repository/npm/",metadataUrl:r=>p("https://repo.huaweicloud.com/repository/npm/",r),readVersion:u}];function m(r){return c()?r:r=>r}export function readLocalPackage(){const r=n(import.meta.url),a=o(r),s=e(a,"..","..");try{const r=JSON.parse(t(e(s,"package.json"),"utf-8"));return{name:r.name||l,version:r.version||"0.0.0",root:s}}catch{return{name:l,version:"0.0.0",root:s}}}function g(r){const[t,...e]=r.split("-"),o=e.length?e.join("-").split("."):[];return{main:t.split(".").map(r=>Number.parseInt(r,10)||0),pre:o}}function d(r,t){const e=Number.parseInt(r,10),o=Number.parseInt(t,10),n=Number.isFinite(e)&&String(e)===r,a=Number.isFinite(o)&&String(o)===t;return n&&a?e-o:n?-1:a?1:r<t?-1:r>t?1:0}export function compareSemver(r,t){const e=g(r),o=g(t),n=Math.max(e.main.length,o.main.length);for(let r=0;r<n;r+=1){const t=(e.main[r]||0)-(o.main[r]||0);if(0!==t)return t}if(0===e.pre.length&&0===o.pre.length)return 0;if(0===e.pre.length)return 1;if(0===o.pre.length)return-1;const a=Math.max(e.pre.length,o.pre.length);for(let r=0;r<a;r+=1){const t=e.pre[r],n=o.pre[r];if(void 0===t)return-1;if(void 0===n)return 1;const a=d(t,n);if(0!==a)return a}return 0}async function f(r,t,e,o){const n=new AbortController,a=setTimeout(()=>n.abort(),o);try{const o=await e(r.metadataUrl(t),{headers:{Accept:"application/json"},signal:n.signal});if(!o.ok)throw new Error(`HTTP ${o.status}`);const a=await o.json(),s=r.readVersion(a);if(!s)throw new Error("invalid registry metadata");return s}catch(r){if(n.signal.aborted)throw new Error(`timeout after ${o}ms`);throw r}finally{clearTimeout(a)}}export async function checkForUpdate(r={}){const t=r.localPackage||readLocalPackage(),e=r.localVersion||t.version,o=r.packageName||t.name,n=r.fetchFn||fetch,a=r.timeoutMs||1500,s=r.sources||UPDATE_SOURCES,i=[];for(const r of s)try{const t=await f(r,o,n,a);return{current:e,latest:t,up_to_date:compareSemver(e,t)>=0,source:r.id,registry:r.registry,errors:i,error:null}}catch(t){i.push({source:r.id,error:t instanceof Error?t.message:String(t)})}return{current:e,latest:null,up_to_date:null,source:null,registry:null,errors:i,error:i.map(r=>`${r.source}: ${r.error}`).join("; ")||"unknown"}}export async function updateCommand(t={}){const e=t.localPackage||readLocalPackage();s()||console.log(m(r.gray)(a.t("update.checking")));const o=await checkForUpdate({...t,localPackage:e});if(s())i(o);else if(console.log(` ${m(r.cyan)(a.t("update.current",{version:o.current}))}`),o.latest)if(console.log(` ${m(r.cyan)(a.t("update.latest",{version:o.latest}))}`),console.log(` ${m(r.cyan)(a.t("update.source",{source:o.source||"unknown"}))}`),o.up_to_date)console.log(" "+m(r.green)(a.t("update.up_to_date")));else{const t="npm"===o.source?"":` --registry ${o.registry}`,n=`npm install -g ${e.name}@latest${t}`;console.log(" "+m(r.yellow)(a.t("update.available"))),console.log(" "+m(r.gray)(a.t("update.command_hint",{command:n})))}else console.log(" "+m(r.yellow)(a.t("update.fetch_failed",{error:o.error||"unknown"})))}
1
+ import r from"chalk";import{readFileSync as t}from"fs";import{join as e,dirname as o}from"path";import{fileURLToPath as n}from"url";import{i18n as a}from"../lib/i18n.js";import{isJsonMode as s,emitJson as i,isColorEnabled as c}from"../lib/runtime-options.js";const l="@vibeapi/api-helper";export const UPDATE_TIMEOUT_MS=1500;const p=(r,t,e="")=>`${r}${encodeURIComponent(t)}${e}`,m=r=>{const t=r["dist-tags"];if(!t||"object"!=typeof t)return null;const e=t.latest;return"string"==typeof e?e:null};export const UPDATE_SOURCES=[{id:"cnb",registry:"https://npm.cnb.cool/vibeapi/npm/-/packages/",metadataUrl:r=>p("https://npm.cnb.cool/vibeapi/npm/-/packages/",r),readVersion:m},{id:"npm",registry:"https://registry.npmjs.org/",metadataUrl:r=>p("https://registry.npmjs.org/",r),readVersion:m},{id:"npmmirror",registry:"https://registry.npmmirror.com/",metadataUrl:r=>p("https://registry.npmmirror.com/",r),readVersion:m},{id:"yarn",registry:"https://registry.yarnpkg.com/",metadataUrl:r=>p("https://registry.yarnpkg.com/",r),readVersion:m}];function u(r){return c()?r:r=>r}export function readLocalPackage(){const r=n(import.meta.url),a=o(r),s=e(a,"..","..");try{const r=JSON.parse(t(e(s,"package.json"),"utf-8"));return{name:r.name||l,version:r.version||"0.0.0",root:s}}catch{return{name:l,version:"0.0.0",root:s}}}function g(r){const[t,...e]=r.split("-"),o=e.length?e.join("-").split("."):[];return{main:t.split(".").map(r=>Number.parseInt(r,10)||0),pre:o}}function d(r,t){const e=Number.parseInt(r,10),o=Number.parseInt(t,10),n=Number.isFinite(e)&&String(e)===r,a=Number.isFinite(o)&&String(o)===t;return n&&a?e-o:n?-1:a?1:r<t?-1:r>t?1:0}export function compareSemver(r,t){const e=g(r),o=g(t),n=Math.max(e.main.length,o.main.length);for(let r=0;r<n;r+=1){const t=(e.main[r]||0)-(o.main[r]||0);if(0!==t)return t}if(0===e.pre.length&&0===o.pre.length)return 0;if(0===e.pre.length)return 1;if(0===o.pre.length)return-1;const a=Math.max(e.pre.length,o.pre.length);for(let r=0;r<a;r+=1){const t=e.pre[r],n=o.pre[r];if(void 0===t)return-1;if(void 0===n)return 1;const a=d(t,n);if(0!==a)return a}return 0}async function f(r,t,e,o){const n=new AbortController,a=setTimeout(()=>n.abort(),o);try{const o=await e(r.metadataUrl(t),{headers:{Accept:"application/json"},signal:n.signal});if(!o.ok)throw new Error(`HTTP ${o.status}`);const a=await o.json(),s=r.readVersion(a);if(!s)throw new Error("invalid registry metadata");return s}catch(r){if(n.signal.aborted)throw new Error(`timeout after ${o}ms`);throw r}finally{clearTimeout(a)}}export async function checkForUpdate(r={}){const t=r.localPackage||readLocalPackage(),e=r.localVersion||t.version,o=r.packageName||t.name,n=r.fetchFn||fetch,a=r.timeoutMs||1500,s=r.sources||UPDATE_SOURCES,i=[];for(const r of s)try{const t=await f(r,o,n,a);return{current:e,latest:t,up_to_date:compareSemver(e,t)>=0,source:r.id,registry:r.registry,errors:i,error:null}}catch(t){i.push({source:r.id,error:t instanceof Error?t.message:String(t)})}return{current:e,latest:null,up_to_date:null,source:null,registry:null,errors:i,error:i.map(r=>`${r.source}: ${r.error}`).join("; ")||"unknown"}}export async function updateCommand(t={}){const e=t.localPackage||readLocalPackage();s()||console.log(u(r.gray)(a.t("update.checking")));const o=await checkForUpdate({...t,localPackage:e});if(s())i(o);else if(console.log(` ${u(r.cyan)(a.t("update.current",{version:o.current}))}`),o.latest)if(console.log(` ${u(r.cyan)(a.t("update.latest",{version:o.latest}))}`),console.log(` ${u(r.cyan)(a.t("update.source",{source:o.source||"unknown"}))}`),o.up_to_date)console.log(" "+u(r.green)(a.t("update.up_to_date")));else{const t="npm"===o.source?"":` --registry ${o.registry}`,n=`npm install -g ${e.name}@latest${t}`;console.log(" "+u(r.yellow)(a.t("update.available"))),console.log(" "+u(r.gray)(a.t("update.command_hint",{command:n})))}else console.log(" "+u(r.yellow)(a.t("update.fetch_failed",{error:o.error||"unknown"})))}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeapi/cli",
3
- "version": "0.0.34",
3
+ "version": "0.0.35",
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",