UNPKG

zcf

Version:

Zero-Config Code Flow - One-click configuration tool for Code Cli

406 lines (403 loc) 12.1 kB
import { pathExists } from 'fs-extra'; import { join } from 'pathe'; import { j as CODEX_DIR, k as CODEX_CONFIG_FILE, al as i18n, l as CODEX_AUTH_FILE, n as CODEX_AGENTS_FILE, p as CODEX_PROMPTS_DIR } from './simple-config.mjs'; import { m as moveToTrash } from '../shared/zcf.DGjQxTq_.mjs'; import 'node:fs'; import 'node:process'; import 'ansis'; import 'inquirer'; import 'node:child_process'; import 'node:os'; import 'node:util'; import 'dayjs'; import 'node:url'; import 'inquirer-toggle'; import 'ora'; import 'tinyexec'; import 'semver'; import 'smol-toml'; import 'node:fs/promises'; import 'i18next'; import 'i18next-fs-backend'; import 'trash'; class CodexUninstaller { _lang; conflictResolution = /* @__PURE__ */ new Map(); CODEX_BACKUP_DIR = join(CODEX_DIR, "backup"); constructor(lang = "en") { this._lang = lang; this.conflictResolution.set("cli-package", ["config", "auth"]); this.conflictResolution.set("config", ["api-config", "mcp-config"]); void this._lang; } /** * Remove config file (config.toml) */ async removeConfig() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(CODEX_CONFIG_FILE)) { const trashResult = await moveToTrash(CODEX_CONFIG_FILE); if (!trashResult[0]?.success) { result.warnings.push(trashResult[0]?.error || "Failed to move to trash"); } result.removed.push("config.toml"); result.success = true; } else { result.warnings.push(i18n.t("codex:configNotFound")); result.success = true; } } catch (error) { result.errors.push(`Failed to remove config: ${error.message}`); } return result; } /** * Remove auth file (auth.json) */ async removeAuth() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(CODEX_AUTH_FILE)) { const trashResult = await moveToTrash(CODEX_AUTH_FILE); if (!trashResult[0]?.success) { result.warnings.push(trashResult[0]?.error || "Failed to move to trash"); } result.removed.push("auth.json"); result.success = true; } else { result.warnings.push(i18n.t("codex:authNotFound")); result.success = true; } } catch (error) { result.errors.push(`Failed to remove auth: ${error.message}`); } return result; } /** * Remove system prompt file (AGENTS.md) */ async removeSystemPrompt() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(CODEX_AGENTS_FILE)) { const trashResult = await moveToTrash(CODEX_AGENTS_FILE); if (!trashResult[0]?.success) { result.warnings.push(trashResult[0]?.error || "Failed to move to trash"); } result.removed.push("AGENTS.md"); result.success = true; } else { result.warnings.push(i18n.t("codex:systemPromptNotFound")); result.success = true; } } catch (error) { result.errors.push(`Failed to remove system prompt: ${error.message}`); } return result; } /** * Remove workflow directory (prompts/) */ async removeWorkflow() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(CODEX_PROMPTS_DIR)) { const trashResult = await moveToTrash(CODEX_PROMPTS_DIR); if (!trashResult[0]?.success) { result.warnings.push(trashResult[0]?.error || "Failed to move to trash"); } result.removed.push("prompts/"); result.success = true; } else { result.warnings.push(i18n.t("codex:workflowNotFound")); result.success = true; } } catch (error) { result.errors.push(`Failed to remove workflow: ${error.message}`); } return result; } /** * Uninstall Codex CLI package */ async uninstallCliPackage() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { const { uninstallCodeTool } = await import('./simple-config.mjs').then(function (n) { return n.bo; }); const success = await uninstallCodeTool("codex"); if (success) { result.removed.push("@openai/codex"); result.success = true; } else { result.errors.push(i18n.t("uninstall:uninstallFailed", { codeType: i18n.t("common:codex"), message: "" })); } } catch (error) { if (error.message.includes("not found") || error.message.includes("not installed")) { result.warnings.push(i18n.t("codex:packageNotFound")); result.success = true; } else { result.errors.push(i18n.t("uninstall:uninstallFailed", { codeType: i18n.t("common:codex"), message: `: ${error.message}` })); } } return result; } /** * Remove API configuration from config.toml */ async removeApiConfig() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(CODEX_CONFIG_FILE)) { const { readFileSync, writeFileSync } = await import('node:fs'); const content = readFileSync(CODEX_CONFIG_FILE, "utf-8"); const lines = content.split("\n"); const newLines = []; let inProviderSection = false; let configModified = false; for (const line of lines) { if (line.trim().match(/^\[model_providers\./)) { inProviderSection = true; configModified = true; continue; } if (inProviderSection && line.trim().startsWith("[") && !line.trim().match(/^\[model_providers\./)) { inProviderSection = false; } if (inProviderSection) { continue; } if (line.trim().startsWith("model_provider")) { configModified = true; continue; } newLines.push(line); } if (configModified) { writeFileSync(CODEX_CONFIG_FILE, newLines.join("\n")); result.removedConfigs.push(i18n.t("codex:apiConfigRemoved")); } result.success = true; } else { result.warnings.push(i18n.t("codex:configNotFound")); result.success = true; } } catch (error) { result.errors.push(`Failed to remove API config: ${error.message}`); } return result; } /** * Remove backup directory (~/.codex/backup/) */ async removeBackups() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(this.CODEX_BACKUP_DIR)) { const trashResult = await moveToTrash(this.CODEX_BACKUP_DIR); if (!trashResult[0]?.success) { result.warnings.push(trashResult[0]?.error || "Failed to move backup directory to trash"); } result.removed.push("backup/"); result.success = true; } else { result.warnings.push(i18n.t("codex:backupNotFound")); result.success = true; } } catch (error) { result.errors.push(`Failed to remove backups: ${error.message}`); } return result; } /** * Remove MCP configuration from config.toml */ async removeMcpConfig() { const result = { success: false, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(CODEX_CONFIG_FILE)) { const { readFileSync, writeFileSync } = await import('node:fs'); const content = readFileSync(CODEX_CONFIG_FILE, "utf-8"); const lines = content.split("\n"); const newLines = []; let inMcpSection = false; let configModified = false; for (const line of lines) { if (line.trim().match(/^\[mcp_servers\./)) { inMcpSection = true; configModified = true; continue; } if (inMcpSection && line.trim().startsWith("[") && !line.trim().match(/^\[mcp_servers\./)) { inMcpSection = false; } if (inMcpSection) { continue; } newLines.push(line); } if (configModified) { writeFileSync(CODEX_CONFIG_FILE, newLines.join("\n")); result.removedConfigs.push(i18n.t("codex:mcpConfigRemoved")); } result.success = true; } else { result.warnings.push(i18n.t("codex:configNotFound")); result.success = true; } } catch (error) { result.errors.push(`Failed to remove MCP config: ${error.message}`); } return result; } /** * Complete uninstall - remove all directories and packages */ async completeUninstall() { const result = { success: true, removed: [], removedConfigs: [], errors: [], warnings: [] }; try { if (await pathExists(CODEX_DIR)) { const trashResult = await moveToTrash(CODEX_DIR); if (!trashResult[0]?.success) { result.warnings.push(`Failed to move ~/.codex/ to trash: ${trashResult[0]?.error || "Unknown error"}`); } result.removed.push("~/.codex/"); } const cliUninstallResult = await this.uninstallCliPackage(); result.removed.push(...cliUninstallResult.removed); result.removedConfigs.push(...cliUninstallResult.removedConfigs); result.errors.push(...cliUninstallResult.errors); result.warnings.push(...cliUninstallResult.warnings); result.success = result.success && cliUninstallResult.success; } catch (error) { result.errors.push(`Complete uninstall failed: ${error.message}`); result.success = false; } return result; } /** * Custom uninstall with conflict resolution */ async customUninstall(selectedItems) { const resolvedItems = this.resolveConflicts(selectedItems); const results = []; for (const item of resolvedItems) { try { const result = await this.executeUninstallItem(item); results.push(result); } catch (error) { results.push({ success: false, removed: [], removedConfigs: [], errors: [`Failed to execute ${item}: ${error.message}`], warnings: [] }); } } return results; } /** * Resolve conflicts between uninstall items */ resolveConflicts(items) { const resolved = [...items]; for (const [primary, conflicts] of this.conflictResolution) { if (resolved.includes(primary)) { conflicts.forEach((conflict) => { const index = resolved.indexOf(conflict); if (index > -1) { resolved.splice(index, 1); } }); } } return resolved; } /** * Execute uninstall for a specific item */ async executeUninstallItem(item) { switch (item) { case "config": return await this.removeConfig(); case "auth": return await this.removeAuth(); case "system-prompt": return await this.removeSystemPrompt(); case "workflow": return await this.removeWorkflow(); case "cli-package": return await this.uninstallCliPackage(); case "api-config": return await this.removeApiConfig(); case "mcp-config": return await this.removeMcpConfig(); case "backups": return await this.removeBackups(); default: return { success: false, removed: [], removedConfigs: [], errors: [`Unknown uninstall item: ${item}`], warnings: [] }; } } } export { CodexUninstaller };