發佈 0.2.0:改名 telegram-bot,新增 Claude Code 引擎(新增 bot 時可選 Codex / Claude),start 自動從 0.1.x 遷移
This commit is contained in:
+57
-10
@@ -1,5 +1,5 @@
|
||||
'use strict';
|
||||
// 環境檢查:start 前確認 codex CLI、pm2、git 等工具是否就緒。
|
||||
// 環境檢查:start 前確認 AI CLI(codex / claude 至少一個)、pm2、git 等工具是否就緒。
|
||||
const { execSync } = require('child_process');
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
@@ -13,6 +13,27 @@ function tryExec(cmd) {
|
||||
}
|
||||
}
|
||||
|
||||
function codexVersion() {
|
||||
return tryExec('codex --version');
|
||||
}
|
||||
|
||||
function claudeVersion() {
|
||||
const { resolveClaudeCommand } = require('./engines/claude');
|
||||
const { cmd } = resolveClaudeCommand({});
|
||||
const out = tryExec(`"${cmd}" --version`) || tryExec('claude --version');
|
||||
return out ? out.split('\n')[0] : null;
|
||||
}
|
||||
|
||||
function claudeLoggedIn() {
|
||||
if (fs.existsSync(path.join(os.homedir(), '.claude', '.credentials.json'))) return true;
|
||||
try {
|
||||
const j = JSON.parse(fs.readFileSync(path.join(os.homedir(), '.claude.json'), 'utf-8'));
|
||||
return !!j.oauthAccount;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 回傳 [{ name, ok, required, message }]
|
||||
function runChecks() {
|
||||
const checks = [];
|
||||
@@ -25,22 +46,48 @@ function runChecks() {
|
||||
message: nodeMajor >= 18 ? process.version : `${process.version}(需要 ≥ 18)`,
|
||||
});
|
||||
|
||||
const codexVer = tryExec('codex --version');
|
||||
const codexVer = codexVersion();
|
||||
checks.push({
|
||||
name: 'Codex CLI',
|
||||
ok: !!codexVer,
|
||||
required: true,
|
||||
message: codexVer || '找不到 codex,請安裝:npm install -g @openai/codex',
|
||||
required: false,
|
||||
group: 'engine',
|
||||
message: codexVer || '找不到 codex(要用 Codex 引擎才需要):npm install -g @openai/codex',
|
||||
});
|
||||
|
||||
if (codexVer) {
|
||||
const authFile = path.join(os.homedir(), '.codex', 'auth.json');
|
||||
const loggedIn = fs.existsSync(authFile);
|
||||
const loggedIn = fs.existsSync(path.join(os.homedir(), '.codex', 'auth.json'));
|
||||
checks.push({
|
||||
name: 'Codex 登入',
|
||||
ok: loggedIn,
|
||||
required: false,
|
||||
message: loggedIn ? '已登入' : '尚未登入,請先執行:codex login(bot 啟動後才需要)',
|
||||
message: loggedIn ? '已登入' : '尚未登入,請先執行:codex login(Codex bot 啟動後才需要)',
|
||||
});
|
||||
}
|
||||
|
||||
const claudeVer = claudeVersion();
|
||||
checks.push({
|
||||
name: 'Claude Code CLI',
|
||||
ok: !!claudeVer,
|
||||
required: false,
|
||||
group: 'engine',
|
||||
message: claudeVer || '找不到 claude(要用 Claude 引擎才需要):npm install -g @anthropic-ai/claude-code',
|
||||
});
|
||||
if (claudeVer) {
|
||||
const loggedIn = claudeLoggedIn();
|
||||
checks.push({
|
||||
name: 'Claude 登入',
|
||||
ok: loggedIn,
|
||||
required: false,
|
||||
message: loggedIn ? '已登入' : '尚未登入,請先執行:claude(首次啟動會引導登入)',
|
||||
});
|
||||
}
|
||||
|
||||
if (!codexVer && !claudeVer) {
|
||||
checks.push({
|
||||
name: 'AI 引擎',
|
||||
ok: false,
|
||||
required: true,
|
||||
message: 'codex 與 claude 都找不到,至少要裝一個',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -57,7 +104,7 @@ function runChecks() {
|
||||
name: 'git',
|
||||
ok: !!gitVer,
|
||||
required: false,
|
||||
message: gitVer || '找不到 git(非必要:bot 以 --skip-git-repo-check 執行,但 Codex 要做版控操作時會需要)',
|
||||
message: gitVer || '找不到 git(非必要:AI 要做版控操作時會需要)',
|
||||
});
|
||||
|
||||
return checks;
|
||||
@@ -74,4 +121,4 @@ function hasBlocker(checks) {
|
||||
return checks.some((c) => c.required && !c.ok);
|
||||
}
|
||||
|
||||
module.exports = { runChecks, printChecks, hasBlocker };
|
||||
module.exports = { runChecks, printChecks, hasBlocker, codexVersion, claudeVersion };
|
||||
|
||||
Reference in New Issue
Block a user