分享一个 AI CLI 自动更新脚本
脚本是 AI 搓的,没看具体内容。
每天上班第一件事就是先运行一下脚本
运行结果:
脚本如下:
// update_ai_tools.js const { execSync } = require('child_process');
const os = require('os');
console.log('\n======================================');
console.log(' AI CLI 工具更新助手');
console.log('======================================\n');
// 1. 权限检查 function isRunningAsAdmin() {
if (os.platform() === 'win32') {
try {
execSync('net session', { stdio: 'ignore' });
return true;
} catch (e) {
return false;
}
}
return process.geteuid && process.geteuid() === 0;
}
if (!isRunningAsAdmin()) {
console.error('❌ 请以管理员身份运行此脚本。\n');
process.stdin.once('data', () => process.exit());
return;
}
const packages = [
{ name: 'Gemini CLI', npm: '@google/gemini-cli' },
{ name: 'GitHub Copilot', npm: '@github/copilot' },
{ name: 'Codex CLI', npm: '@openai/codex' },
{ name: 'Claude Code', npm: '@anthropic-ai/claude-code' },
{ name: 'Qwen Code', npm: '@qwen-code/qwen-code' }
];
// 2. 获取本地版本 (这一步很快) let localVersions = {};
try {
const res = execSync('npm list -g --depth=0 --json', {
encoding: 'utf8',
stdio: ['ignore', 'pipe', 'ignore']
});
const parsed = JSON.parse(res);
if (parsed.dependencies) {
for (const key in parsed.dependencies) {
localVersions[key] = parsed.dependencies[key].version;
}
}
} catch (e) {
if (e.stdout) {
try {
const parsed = JSON.parse(e.stdout);
if (parsed.dependencies) Object.assign(localVersions, parsed.dependencies);
} catch (err) {}
}
}
// 3. 核心逻辑:逐个检查并立即打印结果 console.log('正在检查版本状态...\n');
const tasks = [];
packages.forEach(pkg => {
const localVer = localVersions[pkg.npm];
let remoteVer = null;
try {
// 联网查询,可能会慢
remoteVer = execSync(`npm view ${pkg.npm} version`, { encoding: 'utf8' }).trim();
} catch (e) {
console.log(`⚠️ [${pkg.name}] 查询失败,跳过。`);
return; // 跳过当前循环
}
// 立即打印结果,提供实时反馈 if (!localVer) {
console.log(`⚪ [${pkg.name}] 未安装 -> 🆕 ${remoteVer}`);
tasks.push({ ...pkg, action: 'install' });
} else if (localVer !== remoteVer) {
console.log(`🔻 [${pkg.name}] 本地 ${localVer} -> 🆙 ${remoteVer}`);
tasks.push({ ...pkg, action: 'update' });
} else {
console.log(`✅ [${pkg.name}] ${localVer} (已是最新)`);
}
});
// 4. 执行更新 if (tasks.length === 0) {
console.log('\n✨ 所有工具已是最新。');
} else {
console.log();
console.log(`🚀 开始更新 ${tasks.length} 个工具...`);
console.log();
tasks.forEach((task, index) => {
process.stdout.write(`[${index + 1}/${tasks.length}] 更新 ${task.name}... `);
try {
execSync(`npm install -g ${task.npm}@latest`, { stdio: 'pipe' });
console.log(`✔ 成功`);
} catch (e) {
console.log(`✖ 失败`);
if (e.stderr) console.error(' ' + e.stderr.toString().split('\n')[0]);
}
});
console.log('\n✨ 全部完成。');
}
console.log('\n(按任意键退出)');
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on('data', () => process.exit());