UNPKG

zcf

Version:

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

1,019 lines (989 loc) 154 kB
import { existsSync, mkdirSync, copyFileSync, writeFileSync, readFileSync, readdirSync, statSync } from 'node:fs'; import process from 'node:process'; import ansis from 'ansis'; import inquirer from 'inquirer'; import { join, dirname } from 'pathe'; import dayjs from 'dayjs'; import { exec as exec$1 } from 'node:child_process'; import { homedir, platform } from 'node:os'; import { join as join$1 } from 'node:path'; import { promisify } from 'node:util'; import { fileURLToPath } from 'node:url'; import ora from 'ora'; import semver from 'semver'; import { exec } from 'tinyexec'; import { rm, mkdir, copyFile as copyFile$1 } from 'node:fs/promises'; const version = "2.11.0"; const homepage = "https://github.com/UfoMiao/zcf"; const WORKFLOW_CONFIGS = [ { id: "commonTools", nameKey: "workflowOption.commonTools", descriptionKey: "workflowDescription.commonTools", defaultSelected: true, order: 1, commands: ["init-project.md"], agents: [ { id: "init-architect", filename: "init-architect.md", required: true }, { id: "get-current-datetime", filename: "get-current-datetime.md", required: true } ], autoInstallAgents: true, category: "common", outputDir: "common" }, { id: "sixStepsWorkflow", nameKey: "workflowOption.sixStepsWorkflow", descriptionKey: "workflowDescription.sixStepsWorkflow", defaultSelected: true, order: 2, commands: ["workflow.md"], agents: [], autoInstallAgents: false, category: "sixStep", outputDir: "workflow" }, { id: "featPlanUx", nameKey: "workflowOption.featPlanUx", descriptionKey: "workflowDescription.featPlanUx", defaultSelected: true, order: 3, commands: ["feat.md"], agents: [ { id: "planner", filename: "planner.md", required: true }, { id: "ui-ux-designer", filename: "ui-ux-designer.md", required: true } ], autoInstallAgents: true, category: "plan", outputDir: "feat" }, { id: "gitWorkflow", nameKey: "workflowOption.gitWorkflow", descriptionKey: "workflowDescription.gitWorkflow", defaultSelected: true, order: 4, commands: ["git-commit.md", "git-rollback.md", "git-cleanBranches.md", "git-worktree.md"], agents: [], autoInstallAgents: false, category: "git", outputDir: "git" }, { id: "bmadWorkflow", nameKey: "workflowOption.bmadWorkflow", descriptionKey: "workflowDescription.bmadWorkflow", defaultSelected: true, order: 5, commands: ["bmad-init.md"], agents: [], autoInstallAgents: false, category: "bmad", outputDir: "bmad" } ]; function getWorkflowConfig(workflowId) { return WORKFLOW_CONFIGS.find((config) => config.id === workflowId); } function getOrderedWorkflows() { return [...WORKFLOW_CONFIGS].sort((a, b) => a.order - b.order); } const api$1 = { // Basic API configuration configureApi: "Select API authentication method", useAuthToken: "Use Auth Token (OAuth authentication)", authTokenDesc: "For tokens obtained via OAuth or browser login", useApiKey: "Use API Key (Key authentication)", apiKeyDesc: "For API keys from Anthropic Console", useCcrProxy: "Use CCR Proxy", ccrProxyDesc: "Use multiple AI models via Claude Code Router", skipApi: "Skip (configure manually later)", enterApiUrl: "Enter API URL", enterAuthToken: "Enter Auth Token", enterApiKey: "Enter API Key", apiConfigSuccess: "API configured", // API modification existingApiConfig: "Existing API configuration detected:", apiConfigUrl: "URL", apiConfigKey: "Key", apiConfigAuthType: "Auth Type", selectApiAction: "Select API processing operation", keepExistingConfig: "Keep existing configuration", modifyAllConfig: "Modify all configuration", modifyPartialConfig: "Modify partial configuration", selectModifyItems: "Select items to modify", modifyApiUrl: "Modify API URL", modifyApiKey: "Modify API Key", modifyAuthType: "Modify auth type", continueModification: "Continue modifying other configurations?", modificationSaved: "Configuration saved", enterNewApiUrl: "Enter new API URL (current: {url})", enterNewApiKey: "Enter new API Key (current: {key})", selectNewAuthType: "Select new auth type (current: {type})", // API validation apiKeyValidation: { empty: "API Key cannot be empty", example: "Example format: sk-abcdef123456_789xyz" }, urlRequired: "URL is required", invalidUrl: "Invalid URL", keyRequired: "Key is required", invalidKeyFormat: "Invalid key format" }; const bmad$1 = { // BMad CLI command description: "Install BMad Method for AI-driven development", directoryOption: "Target directory for installation", forceOption: "Force reinstall even if already exists", versionOption: "Specific BMad version to install", // Installation messages checkingExisting: "Checking for existing BMad installation...", alreadyInstalled: "BMad is already installed (version: {version})", existingAction: "Choose an action:", actionUpdate: "Update to latest version", actionReinstall: "Reinstall", actionSkip: "Skip installation", installationSkipped: "BMad installation skipped", installing: "Installing BMad Method...", installSuccess: "\u2705 BMad Method installed successfully!", installFailed: "\u274C BMad Method installation failed", installError: "\u274C BMad installation error", nextSteps: "Next steps: Navigate to {directory} to start using BMad", // BMad workflow messages installingBmadWorkflow: "Installing BMAD workflow...", bmadWorkflowInstalled: "BMAD workflow installed", bmadWorkflowFailed: "Failed to install BMAD workflow", // BMad agent messages installingAgent: "Installing {agent} agent...", agentInstalled: "{agent} agent installed", agentFailed: "Failed to install {agent} agent", // BMad user prompts selectBmadOption: "Select BMAD option", confirmInstallBmad: "Confirm install BMAD workflow?", bmadInstallComplete: "BMAD installation complete", // BMad log messages checkingBmadDependencies: "Checking BMAD dependencies...", bmadDependenciesMet: "BMAD dependencies met", bmadDependenciesMissing: "Missing BMAD dependencies: {deps}", // BMad commands runningBmadCommand: "Running BMAD command: {command}", bmadCommandSuccess: "BMAD command executed successfully", bmadCommandFailed: "BMAD command failed: {error}", // BMad configuration configuringBmad: "Configuring BMAD settings...", bmadConfigured: "BMAD configured", bmadConfigFailed: "BMAD configuration failed" }; const ccrMessages$1 = { // Installation installingCcr: "Installing Claude Code Router...", ccrInstallSuccess: "Claude Code Router installed successfully", ccrInstallFailed: "Failed to install Claude Code Router", ccrAlreadyInstalled: "Claude Code Router is already installed", detectedIncorrectPackage: "Detected incorrect package claude-code-router, uninstalling...", uninstalledIncorrectPackage: "Successfully uninstalled incorrect package", failedToUninstallIncorrectPackage: "Failed to uninstall incorrect package, continuing with installation", // Configuration configureCcr: "Configure Model Proxy (CCR)", useCcrProxy: "Use CCR Proxy", ccrProxyDesc: "Connect to multiple AI models via Claude Code Router", fetchingPresets: "Fetching provider presets...", noPresetsAvailable: "No presets available", selectCcrPreset: "Select a provider preset:", keyRequired: "API key is required", // Existing config existingCcrConfig: "Existing CCR configuration found", overwriteCcrConfig: "Backup existing CCR configuration and reconfigure?", keepingExistingConfig: "Keeping existing configuration", backupCcrConfig: "Backing up existing CCR configuration...", ccrBackupSuccess: "CCR configuration backed up to: {path}", ccrBackupFailed: "Failed to backup CCR configuration", // Model selection selectDefaultModelForProvider: "Select default model for {provider}:", enterApiKeyForProvider: "Enter API key for {provider}:", // Skip option skipOption: "Skip, configure in CCR manually", skipConfiguring: "Skipping preset configuration, will create empty configuration framework", // Success/Error messages ccrConfigSuccess: "CCR configuration saved", proxyConfigSuccess: "Proxy settings configured", ccrConfigFailed: "Failed to configure CCR", ccrSetupComplete: "CCR setup complete", fetchPresetsError: "Failed to fetch provider presets", failedToStartCcrService: "Failed to start CCR service", errorStartingCcrService: "Error starting CCR service", // CCR service status ccrRestartSuccess: "CCR service restarted", ccrRestartFailed: "Failed to restart CCR service", // Configuration tips configTips: "Configuration Tips", useClaudeCommand: "Use the claude command to start Claude Code (not ccr code)", advancedConfigTip: "You can use the ccr ui command for advanced configuration", manualConfigTip: "After manually modifying the configuration file, run ccr restart to apply changes", // CCR Menu ccrMenuTitle: "CCR - Claude Code Router Management", ccrMenuOptions: { initCcr: "Initialize CCR", startUi: "Start CCR UI", checkStatus: "Check CCR Status", restart: "Restart CCR", start: "Start CCR", stop: "Stop CCR", back: "Back to Main Menu" }, ccrMenuDescriptions: { initCcr: "Install and configure CCR", startUi: "Open web interface to manage CCR", checkStatus: "View CCR service status", restart: "Restart CCR service", start: "Start CCR service", stop: "Stop CCR service" }, // Command execution messages startingCcrUi: "Starting CCR UI...", ccrUiStarted: "CCR UI started", checkingCcrStatus: "Checking CCR status...", ccrStatusTitle: "CCR Status:", restartingCcr: "Restarting CCR...", ccrRestarted: "CCR restarted", startingCcr: "Starting CCR...", ccrStarted: "CCR started", stoppingCcr: "Stopping CCR...", ccrStopped: "CCR stopped", ccrCommandFailed: "Failed to execute CCR command", // Configuration check messages ccrNotConfigured: "CCR is not configured yet. Please initialize CCR first.", pleaseInitFirst: "Please select option 1 to initialize CCR.", // UI API Key messages ccrUiApiKey: "CCR UI API Key", ccrUiApiKeyHint: "Use this API key to login to CCR UI" }; const cli$1 = { runFullInit: "Run full initialization directly", forceOverwrite: "Force overwrite existing configuration", initClaudeConfig: "Initialize Claude Code configuration", updatePromptsOnly: "Update Claude Code prompts only" }; const cometixMessages$1 = { // Installation installingCometix: "Installing CCometixLine...", cometixInstallSuccess: "CCometixLine installed successfully", cometixInstallFailed: "Failed to install CCometixLine", cometixAlreadyInstalled: "CCometixLine is already installed", statusLineConfigured: "Claude Code statusLine configured", statusLineConfigFailed: "Failed to configure statusLine", statusLineManualConfig: "Please manually add statusLine configuration to Claude Code settings", statusLineAlreadyConfigured: "Claude Code statusLine already configured", // Installation prompt in init installCometixPrompt: "Install CCometixLine - High-performance Claude Code statusline tool with Git integration and real-time usage tracking?", cometixSkipped: "CCometixLine installation skipped", // Commands installingOrUpdating: "Installing/updating CCometixLine...", installUpdateSuccess: "CCometixLine install/update completed", installUpdateFailed: "Failed to install/update CCometixLine", printingConfig: "Printing CCometixLine configuration...", printConfigSuccess: "Configuration printed successfully", printConfigFailed: "Failed to print configuration", enteringTuiConfig: "Entering CCometixLine TUI configuration mode...", tuiConfigSuccess: "TUI configuration completed successfully", tuiConfigFailed: "Failed to run TUI configuration", commandNotFound: "ccline command not found. Please install CCometixLine first.", // CCometixLine Menu cometixMenuTitle: "CCometixLine - High-performance Claude Code statusline tool with Git integration and real-time usage tracking", cometixMenuOptions: { installOrUpdate: "Install or Update", printConfig: "Print Default Configuration", customConfig: "Custom Config", back: "Back to Main Menu" }, cometixMenuDescriptions: { installOrUpdate: "Install or update CCometixLine using npm", printConfig: "Display current CCometixLine configuration", customConfig: "Enter TUI configuration mode for CCometixLine" } }; const common$1 = { // Basic multiSelectHint: " (Space to select, a to select all, i to invert, Enter to confirm)", yes: "Yes", no: "No", skip: "Skip", cancelled: "Operation cancelled", error: "Error", complete: "\u{1F389} Setup complete! Use 'claude' command to start.", none: "None", notConfigured: "Not configured", spaceToSelectReturn: "- Space to select. Return to submit", enterChoice: "Enter your choice and press enter (case-insensitive)", invalidChoice: "Invalid choice. Please enter a valid option.", goodbye: "\u{1F44B} Thanks for using ZCF! Goodbye!", returnToMenu: "Return to main menu?", back: "Back" }; const configuration$1 = { existingConfig: "Existing config detected. How to proceed?", backupAndOverwrite: "Backup and overwrite all", updateDocsOnly: "Update workflow-related md files only with backup", mergeConfig: "Merge config", backupSuccess: "All config files backed up to", copying: "Copying configuration files...", configSuccess: "Config files copied to", noExistingConfig: "No existing configuration found. Please run `zcf` first.", updatingPrompts: "Updating Claude Code memory documents...", // Model configuration selectDefaultModel: "Select default model", modelConfigSuccess: "Default model configured", existingModelConfig: "Existing model configuration detected", currentModel: "Current model", modifyModel: "Modify model configuration?", keepModel: "Keeping existing model configuration", defaultModelOption: "Default - Let Claude Code choose", opusModelOption: "Opus - Only use opus, high token consumption, use with caution", opusPlanModelOption: "OpusPlan - Use Opus for planning, write code with sonnet, recommended", modelConfigured: "Default model configured", // AI memory configuration selectMemoryOption: "Select configuration option", configureAiLanguage: "Configure AI output language", configureAiPersonality: "Configure AI personality", aiLanguageConfigured: "AI output language configured", existingLanguageConfig: "Existing AI output language configuration detected", currentLanguage: "Current language", modifyLanguage: "Modify AI output language?", keepLanguage: "Keeping existing language configuration", // AI personality selectAiPersonality: "Select AI personality", customPersonalityHint: "Define your own personality", enterCustomPersonality: "Enter custom personality description", personalityConfigured: "AI personality configured", existingPersonality: "Existing AI personality configuration", currentPersonality: "Current personality", modifyPersonality: "Modify AI personality?", keepPersonality: "Keeping existing personality", directiveCannotBeEmpty: "Directive cannot be empty", languageRequired: "Language is required", // Cache confirmClearCache: "Confirm clear all ZCF preference cache?", cacheCleared: "ZCF cache cleared", noCacheFound: "No cache file found", // Environment and permissions selectEnvPermissionOption: "Select configuration option", importRecommendedEnv: "Import ZCF recommended environment variables", importRecommendedEnvDesc: "Privacy protection variables, etc.", importRecommendedPermissions: "Import ZCF recommended permissions", importRecommendedPermissionsDesc: "Almost all permissions, reduce frequent permission requests, dangerous ops limited by rules", openSettingsJson: "Open settings.json for manual configuration", openSettingsJsonDesc: "Advanced user customization", envImportSuccess: "Environment variables imported", permissionsImportSuccess: "Permissions imported", openingSettingsJson: "Opening settings.json...", // JSON config related invalidConfiguration: "Invalid configuration", failedToParseJson: "Failed to parse JSON file:", failedToBackupConfig: "Failed to backup config", failedToReadTemplateSettings: "Failed to read template settings", failedToMergeSettings: "Failed to merge settings", preservingExistingSettings: "Preserving existing settings", memoryDirNotFound: "Memory directory not found", failedToSetOnboarding: "Failed to set onboarding flag", fixWindowsMcp: "Fix Windows MCP configuration?" }; const errors$1 = { // General errors failedToSetOnboarding: "Failed to set onboarding completion flag:", failedToWriteMcpConfig: "Failed to write MCP config:", templateDirNotFound: "Template directory not found:", failedToReadTemplateSettings: "Failed to read template settings.json:", failedToMergeSettings: "Failed to merge settings.json:", preservingExistingSettings: "Preserving existing settings.json due to merge error", // File system errors failedToReadFile: "Failed to read file:", failedToWriteFile: "Failed to write file:", failedToCopyFile: "Failed to copy file:", failedToRemoveFile: "Failed to remove file:", failedToReadDirectory: "Failed to read directory:", failedToGetStats: "Failed to get stats for:", sourceDirNotExist: "Source directory does not exist:", memoryDirNotFound: "Memory directory not found:", // JSON config errors invalidConfiguration: "Invalid configuration, using default value", failedToParseJson: "Failed to parse JSON file:", failedToBackupConfig: "Failed to backup config file:", invalidEnvConfig: "Invalid env configuration: expected object", invalidApiUrl: "Invalid ANTHROPIC_BASE_URL: expected string", invalidApiKey: "Invalid ANTHROPIC_API_KEY: expected string", invalidAuthToken: "Invalid ANTHROPIC_AUTH_TOKEN: expected string", invalidPermissionsConfig: "Invalid permissions configuration: expected object", invalidPermissionsAllow: "Invalid permissions.allow: expected array", // MCP errors failedToAddOnboardingFlag: "Failed to add hasCompletedOnboarding flag:", // AI personality errors failedToApplyPersonality: "Failed to apply personality directive:" }; const installation$1 = { installPrompt: "Claude Code not found. Install automatically?", installing: "Installing Claude Code...", installSuccess: "Claude Code installed successfully", alreadyInstalled: "Claude Code is already installed", installFailed: "Failed to install Claude Code", npmNotFound: "npm is not installed. Please install Node.js and npm first.", // Termux specific termuxDetected: "Termux environment detected", termuxInstallHint: "In Termux, please run first: pkg install nodejs or pkg install nodejs-lts", termuxPathInfo: "Using Termux path: {path}", termuxEnvironmentInfo: "Termux environment provides Node.js and npm through pkg manager", // Windows specific windowsDetected: "Windows detected, will configure compatible format" }; const language$1 = { selectScriptLang: "Select ZCF display language", selectConfigLang: "Select Claude Code configuration language", selectAiOutputLang: "Select AI output language", aiOutputLangHint: "AI will respond to you in this language", enterCustomLanguage: "Enter custom language (e.g., Japanese, French, etc.)", languageChanged: "Language changed", configLangHint: { "zh-CN": "easier for Chinese users to customize", "en": "recommended, lower token consumption" }, updateConfigLangPrompt: "Select configuration language", updateConfigLangChoice: { "zh-CN": "Chinese configuration", "en": "English configuration" } }; const mcp$1 = { configureMcp: "Configure MCP services?", selectMcpServices: "Select MCP services to install", allServices: "Install all", mcpServiceInstalled: "Selected MCP services", enterExaApiKey: "Enter Exa API Key (get from https://dashboard.exa.ai/api-keys)", skipMcp: "Skip MCP configuration", mcpConfigSuccess: "MCP services configured", mcpBackupSuccess: "Original MCP config backed up", fixWindowsMcp: "Fix Windows MCP Configuration", fixWindowsMcpDesc: "Fix Windows platform MCP command configuration issues", windowsMcpFixed: "Windows MCP configuration fixed", configureMcpServices: "Configure MCP Services", selectMcpOption: "Select MCP configuration option" }; const menu$1 = { selectFunction: "Select function", menuSections: { otherTools: "Other Tools" }, menuOptions: { fullInit: "Full initialization", importWorkflow: "Import workflow", configureApiOrCcr: "Configure API / CCR proxy", configureApi: "Configure API", configureMcp: "Configure MCP", configureModel: "Configure default model", configureAiMemory: "Configure Claude global memory", configureEnvPermission: "Import recommended environment variables and permissions", configureCcr: "Configure Model Proxy (CCR)", ccrManagement: "CCR", ccusage: "ccusage", cometixLine: "CCometixLine", installBmad: "Install BMad Method", clearCache: "Clear preference cache", checkUpdates: "Check updates", changeLanguage: "Select display language / \u66F4\u6539\u663E\u793A\u8BED\u8A00", exit: "Exit" }, menuDescriptions: { fullInit: "Install Claude Code + Import workflow + Configure API or CCR proxy + Configure MCP services", importWorkflow: "Import/update workflow-related files only", configureApiOrCcr: "Configure API URL, authentication or CCR proxy", configureApi: "Configure API URL and authentication", configureMcp: "Configure MCP services (includes Windows fix)", configureModel: "Set default model (opus/sonnet)", configureAiMemory: "Configure AI output language and personality", configureEnvPermission: "Import privacy protection environment variables and system permissions", configureCcr: "Configure Claude Code Router to use multiple AI models", ccrManagement: "Configure Claude Code Router to use multiple AI models", ccusage: "Claude Code usage analysis", cometixLine: "High-performance Claude Code statusline tool with Git integration and real-time usage tracking", installBmad: "AI-driven development methodology framework", clearCache: "Clear preference language and other caches", checkUpdates: "Check and update Claude Code, CCR and CCometixLine versions", changeLanguage: "Change ZCF interface language" } }; const tools$1 = { // CCUsage runningCcusage: "Running Claude Code usage analysis tool...", ccusageDescription: "Analyze token usage and costs - https://github.com/ryoppippi/ccusage", selectAnalysisMode: "Select analysis mode:", ccusageModes: { daily: "Daily usage", monthly: "Monthly usage", session: "Session statistics", blocks: "Block statistics", custom: "Custom parameters" }, enterCustomArgs: "Enter custom arguments (e.g., daily --json):", pressEnterToContinue: "Press Enter to continue...", ccusageFailed: "Failed to run ccusage", checkNetworkConnection: "Please check your network connection and try again", errorDetails: "Error details:" }; const updater$1 = { checkingVersion: "Checking version...", checkingTools: "Checking tool versions", ccrNotInstalled: "CCR is not installed", ccrUpToDate: "CCR is up to date (v{version})", claudeCodeNotInstalled: "Claude Code is not installed", claudeCodeUpToDate: "Claude Code is up to date (v{version})", cometixLineNotInstalled: "CCometixLine is not installed", cometixLineUpToDate: "CCometixLine is up to date (v{version})", cannotCheckVersion: "Cannot check latest version", currentVersion: "Current version: v{version}", latestVersion: "Latest version: v{version}", confirmUpdate: "Update {tool} to the latest version?", updateSkipped: "Update skipped", updating: "Updating {tool}...", updateSuccess: "{tool} updated successfully!", updateFailed: "{tool} update failed", checkFailed: "Version check failed" }; const workflow$1 = { selectWorkflowType: "Select workflow type to install", workflowOption: { commonTools: "Common Tools (Hierarchical Directory Initialization + General-purpose agents)", featPlanUx: "Feature Planning and UX Design (feat + planner + ui-ux-designer)", sixStepsWorkflow: "Six Steps Workflow (workflow)", bmadWorkflow: "BMAD-Method Extension Installer (Agile Development Workflow)", gitWorkflow: "Git Commands (commit + rollback + cleanBranches + worktree)" }, workflowDescription: { commonTools: "Provides project initialization and architecture analysis tools, including hierarchical directory initialization commands and intelligent architecture analysis agents", featPlanUx: "Feature planning and user experience design workflow with planning and UX design agents", sixStepsWorkflow: "Professional development assistant structured six-step workflow", bmadWorkflow: "BMAD-Method enterprise-grade agile development workflow extension", gitWorkflow: "Git version control related commands collection" }, // BMAD workflow bmadInitPrompt: "\u2728 Please run /bmad-init command in your project to initialize or update BMAD-Method extension", bmadInstallSuccess: "Successfully installed BMAD-Method installer", // General workflow installation installingWorkflow: "Installing workflow", installedCommand: "Installed command", installedAgent: "Installed agent", failedToInstallCommand: "Failed to install command", failedToInstallAgent: "Failed to install agent", workflowInstallSuccess: "workflow installed successfully", workflowInstallError: "workflow installation had errors", cleaningOldFiles: "Cleaning up old version files", removedOldFile: "Removed old file" }; const en = { common: common$1, language: language$1, installation: installation$1, api: api$1, configuration: configuration$1, mcp: mcp$1, menu: menu$1, workflow: workflow$1, cli: cli$1, bmad: bmad$1, errors: errors$1, tools: tools$1, ccr: ccrMessages$1, cometix: cometixMessages$1, updater: updater$1 }; const api = { // Basic API configuration configureApi: "\u9009\u62E9 API \u8BA4\u8BC1\u65B9\u5F0F", useAuthToken: "\u4F7F\u7528 Auth Token (OAuth \u8BA4\u8BC1)", authTokenDesc: "\u9002\u7528\u4E8E\u901A\u8FC7 OAuth \u6216\u6D4F\u89C8\u5668\u767B\u5F55\u83B7\u53D6\u7684\u4EE4\u724C", useApiKey: "\u4F7F\u7528 API Key (\u5BC6\u94A5\u8BA4\u8BC1)", apiKeyDesc: "\u9002\u7528\u4E8E\u4ECE Anthropic Console \u83B7\u53D6\u7684 API \u5BC6\u94A5", useCcrProxy: "\u4F7F\u7528 CCR \u4EE3\u7406", ccrProxyDesc: "\u901A\u8FC7 Claude Code Router \u4F7F\u7528\u591A\u4E2A AI \u6A21\u578B", skipApi: "\u8DF3\u8FC7\uFF08\u7A0D\u540E\u624B\u52A8\u914D\u7F6E\uFF09", enterApiUrl: "\u8BF7\u8F93\u5165 API URL", enterAuthToken: "\u8BF7\u8F93\u5165 Auth Token", enterApiKey: "\u8BF7\u8F93\u5165 API Key", apiConfigSuccess: "API \u914D\u7F6E\u5B8C\u6210", // API modification existingApiConfig: "\u68C0\u6D4B\u5230\u5DF2\u6709 API \u914D\u7F6E\uFF1A", apiConfigUrl: "URL", apiConfigKey: "Key", apiConfigAuthType: "\u8BA4\u8BC1\u7C7B\u578B", selectApiAction: "\u8BF7\u9009\u62E9API\u5904\u7406\u64CD\u4F5C", keepExistingConfig: "\u4FDD\u7559\u73B0\u6709\u914D\u7F6E", modifyAllConfig: "\u4FEE\u6539\u5168\u90E8\u914D\u7F6E", modifyPartialConfig: "\u4FEE\u6539\u90E8\u5206\u914D\u7F6E", selectModifyItems: "\u8BF7\u9009\u62E9\u8981\u4FEE\u6539\u7684\u9879", modifyApiUrl: "\u4FEE\u6539 API URL", modifyApiKey: "\u4FEE\u6539 API Key", modifyAuthType: "\u4FEE\u6539\u8BA4\u8BC1\u7C7B\u578B", continueModification: "\u662F\u5426\u7EE7\u7EED\u4FEE\u6539\u5176\u4ED6\u914D\u7F6E\uFF1F", modificationSaved: "\u914D\u7F6E\u5DF2\u4FDD\u5B58", enterNewApiUrl: "\u8BF7\u8F93\u5165\u65B0\u7684 API URL\uFF08\u5F53\u524D\uFF1A{url}\uFF09", enterNewApiKey: "\u8BF7\u8F93\u5165\u65B0\u7684 API Key\uFF08\u5F53\u524D\uFF1A{key}\uFF09", selectNewAuthType: "\u9009\u62E9\u65B0\u7684\u8BA4\u8BC1\u7C7B\u578B\uFF08\u5F53\u524D\uFF1A{type}\uFF09", // API validation apiKeyValidation: { empty: "API Key \u4E0D\u80FD\u4E3A\u7A7A", example: "\u793A\u4F8B\u683C\u5F0F: sk-abcdef123456_789xyz" }, urlRequired: "URL \u4E3A\u5FC5\u586B\u9879", invalidUrl: "\u65E0\u6548\u7684 URL", keyRequired: "\u5BC6\u94A5\u4E3A\u5FC5\u586B\u9879", invalidKeyFormat: "\u65E0\u6548\u7684\u5BC6\u94A5\u683C\u5F0F" }; const bmad = { // BMad CLI command description: "\u5B89\u88C5 BMad Method \u7528\u4E8E AI \u9A71\u52A8\u7684\u5F00\u53D1", directoryOption: "\u5B89\u88C5\u7684\u76EE\u6807\u76EE\u5F55", forceOption: "\u5F3A\u5236\u91CD\u65B0\u5B89\u88C5\uFF0C\u5373\u4F7F\u5DF2\u5B58\u5728", versionOption: "\u8981\u5B89\u88C5\u7684\u7279\u5B9A BMad \u7248\u672C", // Installation messages checkingExisting: "\u6B63\u5728\u68C0\u67E5\u73B0\u6709 BMad \u5B89\u88C5...", alreadyInstalled: "BMad \u5DF2\u5B89\u88C5\uFF08\u7248\u672C\uFF1A{version}\uFF09", existingAction: "\u9009\u62E9\u64CD\u4F5C\uFF1A", actionUpdate: "\u66F4\u65B0\u5230\u6700\u65B0\u7248\u672C", actionReinstall: "\u91CD\u65B0\u5B89\u88C5", actionSkip: "\u8DF3\u8FC7\u5B89\u88C5", installationSkipped: "\u5DF2\u8DF3\u8FC7 BMad \u5B89\u88C5", installing: "\u6B63\u5728\u5B89\u88C5 BMad Method...", installSuccess: "\u2705 BMad Method \u5B89\u88C5\u6210\u529F\uFF01", installFailed: "\u274C BMad Method \u5B89\u88C5\u5931\u8D25", installError: "\u274C BMad \u5B89\u88C5\u9519\u8BEF", nextSteps: "\u4E0B\u4E00\u6B65\uFF1A\u8FDB\u5165 {directory} \u76EE\u5F55\u5F00\u59CB\u4F7F\u7528 BMad", // BMad workflow messages installingBmadWorkflow: "\u6B63\u5728\u5B89\u88C5 BMAD \u5DE5\u4F5C\u6D41...", bmadWorkflowInstalled: "BMAD \u5DE5\u4F5C\u6D41\u5DF2\u5B89\u88C5", bmadWorkflowFailed: "\u5B89\u88C5 BMAD \u5DE5\u4F5C\u6D41\u5931\u8D25", // BMad agent messages installingAgent: "\u6B63\u5728\u5B89\u88C5 {agent} \u4EE3\u7406...", agentInstalled: "{agent} \u4EE3\u7406\u5DF2\u5B89\u88C5", agentFailed: "\u5B89\u88C5 {agent} \u4EE3\u7406\u5931\u8D25", // BMad user prompts selectBmadOption: "\u9009\u62E9 BMAD \u9009\u9879", confirmInstallBmad: "\u786E\u8BA4\u5B89\u88C5 BMAD \u5DE5\u4F5C\u6D41\uFF1F", bmadInstallComplete: "BMAD \u5B89\u88C5\u5B8C\u6210", // BMad log messages checkingBmadDependencies: "\u68C0\u67E5 BMAD \u4F9D\u8D56...", bmadDependenciesMet: "BMAD \u4F9D\u8D56\u6EE1\u8DB3", bmadDependenciesMissing: "\u7F3A\u5C11 BMAD \u4F9D\u8D56\uFF1A{deps}", // BMad commands runningBmadCommand: "\u6267\u884C BMAD \u547D\u4EE4\uFF1A{command}", bmadCommandSuccess: "BMAD \u547D\u4EE4\u6267\u884C\u6210\u529F", bmadCommandFailed: "BMAD \u547D\u4EE4\u6267\u884C\u5931\u8D25\uFF1A{error}", // BMad configuration configuringBmad: "\u914D\u7F6E BMAD \u8BBE\u7F6E...", bmadConfigured: "BMAD \u5DF2\u914D\u7F6E", bmadConfigFailed: "BMAD \u914D\u7F6E\u5931\u8D25" }; const ccrMessages = { // Installation installingCcr: "\u6B63\u5728\u5B89\u88C5 Claude Code Router...", ccrInstallSuccess: "Claude Code Router \u5B89\u88C5\u6210\u529F", ccrInstallFailed: "\u5B89\u88C5 Claude Code Router \u5931\u8D25", ccrAlreadyInstalled: "Claude Code Router \u5DF2\u5B89\u88C5", detectedIncorrectPackage: "\u68C0\u6D4B\u5230\u9519\u8BEF\u7684\u5305 claude-code-router\uFF0C\u6B63\u5728\u5378\u8F7D...", uninstalledIncorrectPackage: "\u6210\u529F\u5378\u8F7D\u9519\u8BEF\u7684\u5305", failedToUninstallIncorrectPackage: "\u5378\u8F7D\u9519\u8BEF\u7684\u5305\u5931\u8D25\uFF0C\u7EE7\u7EED\u5B89\u88C5", // Configuration configureCcr: "\u914D\u7F6E\u6A21\u578B\u4EE3\u7406 (CCR)", useCcrProxy: "\u4F7F\u7528 CCR \u4EE3\u7406", ccrProxyDesc: "\u901A\u8FC7 Claude Code Router \u8FDE\u63A5\u591A\u4E2A AI \u6A21\u578B", fetchingPresets: "\u6B63\u5728\u83B7\u53D6\u63D0\u4F9B\u5546\u9884\u8BBE...", noPresetsAvailable: "\u6CA1\u6709\u53EF\u7528\u7684\u9884\u8BBE", selectCcrPreset: "\u9009\u62E9\u4E00\u4E2A\u63D0\u4F9B\u5546\u9884\u8BBE\uFF1A", keyRequired: "API \u5BC6\u94A5\u4E0D\u80FD\u4E3A\u7A7A", // Existing config existingCcrConfig: "\u53D1\u73B0\u73B0\u6709\u7684 CCR \u914D\u7F6E", overwriteCcrConfig: "\u662F\u5426\u5907\u4EFD\u73B0\u6709\u7684 CCR \u914D\u7F6E\u5E76\u91CD\u65B0\u914D\u7F6E\uFF1F", keepingExistingConfig: "\u4FDD\u7559\u73B0\u6709\u914D\u7F6E", backupCcrConfig: "\u6B63\u5728\u5907\u4EFD\u73B0\u6709\u7684 CCR \u914D\u7F6E...", ccrBackupSuccess: "CCR \u914D\u7F6E\u5DF2\u5907\u4EFD\u5230\uFF1A{path}", ccrBackupFailed: "\u5907\u4EFD CCR \u914D\u7F6E\u5931\u8D25", // Model selection selectDefaultModelForProvider: "\u9009\u62E9 {provider} \u7684\u9ED8\u8BA4\u6A21\u578B\uFF1A", enterApiKeyForProvider: "\u8BF7\u8F93\u5165 {provider} \u7684 API \u5BC6\u94A5\uFF1A", // Skip option skipOption: "\u8DF3\u8FC7\uFF0C\u5728 CCR \u4E2D\u81EA\u884C\u914D\u7F6E", skipConfiguring: "\u8DF3\u8FC7\u9884\u8BBE\u914D\u7F6E\uFF0C\u5C06\u521B\u5EFA\u7A7A\u914D\u7F6E\u6846\u67B6", // Success/Error messages ccrConfigSuccess: "CCR \u914D\u7F6E\u5DF2\u4FDD\u5B58", proxyConfigSuccess: "\u4EE3\u7406\u8BBE\u7F6E\u5DF2\u914D\u7F6E", ccrConfigFailed: "\u914D\u7F6E CCR \u5931\u8D25", ccrSetupComplete: "CCR \u8BBE\u7F6E\u5B8C\u6210", fetchPresetsError: "\u83B7\u53D6\u63D0\u4F9B\u5546\u9884\u8BBE\u5931\u8D25", failedToStartCcrService: "\u542F\u52A8 CCR \u670D\u52A1\u5931\u8D25", errorStartingCcrService: "\u542F\u52A8 CCR \u670D\u52A1\u65F6\u51FA\u9519", // CCR service status ccrRestartSuccess: "CCR \u670D\u52A1\u5DF2\u91CD\u542F", ccrRestartFailed: "CCR \u670D\u52A1\u91CD\u542F\u5931\u8D25", // Configuration tips configTips: "\u914D\u7F6E\u63D0\u793A", useClaudeCommand: "\u8BF7\u4F7F\u7528 claude \u547D\u4EE4\u542F\u52A8 Claude Code\uFF08\u800C\u975E ccr code\uFF09", advancedConfigTip: "\u60A8\u53EF\u4EE5\u4F7F\u7528 ccr ui \u547D\u4EE4\u8FDB\u884C\u66F4\u9AD8\u7EA7\u7684\u914D\u7F6E", manualConfigTip: "\u624B\u52A8\u4FEE\u6539\u914D\u7F6E\u6587\u4EF6\u540E\uFF0C\u8BF7\u6267\u884C ccr restart \u4F7F\u914D\u7F6E\u751F\u6548", // CCR Menu ccrMenuTitle: "CCR - Claude Code Router \u7BA1\u7406", ccrMenuOptions: { initCcr: "\u521D\u59CB\u5316 CCR", startUi: "\u542F\u52A8 CCR UI", checkStatus: "\u67E5\u8BE2 CCR \u72B6\u6001", restart: "\u91CD\u542F CCR", start: "\u542F\u52A8 CCR", stop: "\u505C\u6B62 CCR", back: "\u8FD4\u56DE\u4E3B\u83DC\u5355" }, ccrMenuDescriptions: { initCcr: "\u5B89\u88C5\u5E76\u914D\u7F6E CCR", startUi: "\u6253\u5F00 Web \u754C\u9762\u7BA1\u7406 CCR", checkStatus: "\u67E5\u770B CCR \u670D\u52A1\u8FD0\u884C\u72B6\u6001", restart: "\u91CD\u542F CCR \u670D\u52A1", start: "\u542F\u52A8 CCR \u670D\u52A1", stop: "\u505C\u6B62 CCR \u670D\u52A1" }, // Command execution messages startingCcrUi: "\u6B63\u5728\u542F\u52A8 CCR UI...", ccrUiStarted: "CCR UI \u5DF2\u542F\u52A8", checkingCcrStatus: "\u6B63\u5728\u67E5\u8BE2 CCR \u72B6\u6001...", ccrStatusTitle: "CCR \u72B6\u6001\u4FE1\u606F\uFF1A", restartingCcr: "\u6B63\u5728\u91CD\u542F CCR...", ccrRestarted: "CCR \u5DF2\u91CD\u542F", startingCcr: "\u6B63\u5728\u542F\u52A8 CCR...", ccrStarted: "CCR \u5DF2\u542F\u52A8", stoppingCcr: "\u6B63\u5728\u505C\u6B62 CCR...", ccrStopped: "CCR \u5DF2\u505C\u6B62", ccrCommandFailed: "\u6267\u884C CCR \u547D\u4EE4\u5931\u8D25", // Configuration check messages ccrNotConfigured: "CCR \u5C1A\u672A\u914D\u7F6E\u3002\u8BF7\u5148\u521D\u59CB\u5316 CCR\u3002", pleaseInitFirst: "\u8BF7\u9009\u62E9\u9009\u9879 1 \u6765\u521D\u59CB\u5316 CCR\u3002", // UI API Key messages ccrUiApiKey: "CCR UI \u767B\u5F55\u5BC6\u94A5", ccrUiApiKeyHint: "\u4F7F\u7528\u6B64\u5BC6\u94A5\u767B\u5F55 CCR UI \u754C\u9762" }; const cli = { runFullInit: "\u76F4\u63A5\u8FD0\u884C\u5B8C\u6574\u521D\u59CB\u5316", forceOverwrite: "\u5F3A\u5236\u8986\u76D6\u73B0\u6709\u914D\u7F6E", initClaudeConfig: "\u521D\u59CB\u5316 Claude Code \u914D\u7F6E", updatePromptsOnly: "\u4EC5\u66F4\u65B0 Claude Code \u63D0\u793A" }; const cometixMessages = { // Installation installingCometix: "\u6B63\u5728\u5B89\u88C5 CCometixLine...", cometixInstallSuccess: "CCometixLine \u5B89\u88C5\u6210\u529F", cometixInstallFailed: "\u5B89\u88C5 CCometixLine \u5931\u8D25", cometixAlreadyInstalled: "CCometixLine \u5DF2\u5B89\u88C5", statusLineConfigured: "Claude Code \u72B6\u6001\u680F\u914D\u7F6E\u5DF2\u8BBE\u7F6E", statusLineConfigFailed: "\u72B6\u6001\u680F\u914D\u7F6E\u5931\u8D25", statusLineManualConfig: "\u8BF7\u624B\u52A8\u6DFB\u52A0\u72B6\u6001\u680F\u914D\u7F6E\u5230 Claude Code \u8BBE\u7F6E\u4E2D", statusLineAlreadyConfigured: "Claude Code \u72B6\u6001\u680F\u914D\u7F6E\u5DF2\u5B58\u5728", // Installation prompt in init installCometixPrompt: "\u662F\u5426\u5B89\u88C5 CCometixLine - \u57FA\u4E8E Rust \u7684\u9AD8\u6027\u80FD Claude Code \u72B6\u6001\u680F\u5DE5\u5177\uFF0C\u96C6\u6210 Git \u4FE1\u606F\u548C\u5B9E\u65F6\u4F7F\u7528\u91CF\u8DDF\u8E2A\uFF1F", cometixSkipped: "CCometixLine \u5B89\u88C5\u5DF2\u8DF3\u8FC7", // Commands installingOrUpdating: "\u6B63\u5728\u5B89\u88C5/\u66F4\u65B0 CCometixLine...", installUpdateSuccess: "CCometixLine \u5B89\u88C5/\u66F4\u65B0\u5B8C\u6210", installUpdateFailed: "\u5B89\u88C5/\u66F4\u65B0 CCometixLine \u5931\u8D25", printingConfig: "\u6B63\u5728\u6253\u5370 CCometixLine \u914D\u7F6E...", printConfigSuccess: "\u914D\u7F6E\u6253\u5370\u6210\u529F", printConfigFailed: "\u6253\u5370\u914D\u7F6E\u5931\u8D25", enteringTuiConfig: "\u6B63\u5728\u8FDB\u5165 CCometixLine TUI \u914D\u7F6E\u6A21\u5F0F...", tuiConfigSuccess: "TUI \u914D\u7F6E\u5B8C\u6210\u6210\u529F", tuiConfigFailed: "\u8FD0\u884C TUI \u914D\u7F6E\u5931\u8D25", commandNotFound: "ccline \u547D\u4EE4\u672A\u627E\u5230\u3002\u8BF7\u5148\u5B89\u88C5 CCometixLine\u3002", // CCometixLine Menu cometixMenuTitle: "CCometixLine - \u57FA\u4E8E Rust \u7684\u9AD8\u6027\u80FD Claude Code \u72B6\u6001\u680F\u5DE5\u5177\uFF0C\u96C6\u6210 Git \u4FE1\u606F\u548C\u5B9E\u65F6\u4F7F\u7528\u91CF\u8DDF\u8E2A", cometixMenuOptions: { installOrUpdate: "\u5B89\u88C5\u6216\u66F4\u65B0", printConfig: "\u6253\u5370\u9ED8\u8BA4\u914D\u7F6E", customConfig: "\u81EA\u5B9A\u4E49\u914D\u7F6E", back: "\u8FD4\u56DE\u4E3B\u83DC\u5355" }, cometixMenuDescriptions: { installOrUpdate: "\u4F7F\u7528 npm \u5B89\u88C5\u6216\u66F4\u65B0 CCometixLine", printConfig: "\u663E\u793A\u5F53\u524D CCometixLine \u914D\u7F6E", customConfig: "\u8FDB\u5165 CCometixLine \u7684 TUI \u914D\u7F6E\u6A21\u5F0F" } }; const common = { // Basic multiSelectHint: "\uFF08\u7A7A\u683C\u9009\u62E9\uFF0Ca\u5168\u9009\uFF0Ci\u53CD\u9009\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF09", yes: "\u662F", no: "\u5426", skip: "\u8DF3\u8FC7", cancelled: "\u64CD\u4F5C\u5DF2\u53D6\u6D88", error: "\u9519\u8BEF", complete: "\u{1F389} \u914D\u7F6E\u5B8C\u6210\uFF01\u4F7F\u7528 'claude' \u547D\u4EE4\u5F00\u59CB\u4F53\u9A8C\u3002", none: "\u65E0", notConfigured: "\u672A\u914D\u7F6E", spaceToSelectReturn: "- \u7A7A\u683C\u9009\u62E9\uFF0C\u56DE\u8F66\u63D0\u4EA4", enterChoice: "\u8BF7\u8F93\u5165\u9009\u9879\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF08\u4E0D\u533A\u5206\u5927\u5C0F\u5199\uFF09", invalidChoice: "\u65E0\u6548\u9009\u62E9\u3002\u8BF7\u8F93\u5165\u6709\u6548\u9009\u9879\u3002", goodbye: "\u{1F44B} \u611F\u8C22\u4F7F\u7528 ZCF\uFF01\u518D\u89C1\uFF01", returnToMenu: "\u8FD4\u56DE\u4E3B\u83DC\u5355\uFF1F", back: "\u8FD4\u56DE" }; const configuration = { existingConfig: "\u68C0\u6D4B\u5230\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6\uFF0C\u5982\u4F55\u5904\u7406\uFF1F", backupAndOverwrite: "\u5907\u4EFD\u5E76\u8986\u76D6\u5168\u90E8", updateDocsOnly: "\u4EC5\u66F4\u65B0\u5DE5\u4F5C\u6D41\u76F8\u5173md\u5E76\u5907\u4EFD\u65E7\u914D\u7F6E", mergeConfig: "\u5408\u5E76\u914D\u7F6E", backupSuccess: "\u5DF2\u5907\u4EFD\u6240\u6709\u914D\u7F6E\u6587\u4EF6\u5230", copying: "\u6B63\u5728\u590D\u5236\u914D\u7F6E\u6587\u4EF6...", configSuccess: "\u914D\u7F6E\u6587\u4EF6\u5DF2\u590D\u5236\u5230", noExistingConfig: "\u672A\u627E\u5230\u73B0\u6709\u914D\u7F6E\u3002\u8BF7\u5148\u8FD0\u884C `zcf`\u3002", updatingPrompts: "\u6B63\u5728\u66F4\u65B0 Claude Code \u8BB0\u5FC6\u6587\u6863...", // Model configuration selectDefaultModel: "\u9009\u62E9\u9ED8\u8BA4\u6A21\u578B", modelConfigSuccess: "\u9ED8\u8BA4\u6A21\u578B\u5DF2\u914D\u7F6E", existingModelConfig: "\u68C0\u6D4B\u5230\u5DF2\u6709\u6A21\u578B\u914D\u7F6E", currentModel: "\u5F53\u524D\u6A21\u578B", modifyModel: "\u662F\u5426\u4FEE\u6539\u6A21\u578B\u914D\u7F6E\uFF1F", keepModel: "\u4FDD\u6301\u5F53\u524D\u6A21\u578B\u914D\u7F6E", defaultModelOption: "\u9ED8\u8BA4 - \u8BA9 Claude Code \u81EA\u52A8\u9009\u62E9", opusModelOption: "Opus - \u53EA\u7528opus\uFF0Ctoken\u6D88\u8017\u9AD8\uFF0C\u614E\u7528", opusPlanModelOption: "OpusPlan - Opus\u505A\u8BA1\u5212\uFF0Csonnet\u7F16\u5199\u4EE3\u7801\uFF0C\u63A8\u8350", modelConfigured: "\u9ED8\u8BA4\u6A21\u578B\u5DF2\u914D\u7F6E", // AI memory configuration selectMemoryOption: "\u9009\u62E9\u914D\u7F6E\u9009\u9879", configureAiLanguage: "\u914D\u7F6E AI \u8F93\u51FA\u8BED\u8A00", configureAiPersonality: "\u914D\u7F6E AI \u4E2A\u6027\u98CE\u683C", aiLanguageConfigured: "AI \u8F93\u51FA\u8BED\u8A00\u5DF2\u914D\u7F6E", existingLanguageConfig: "\u68C0\u6D4B\u5230\u5DF2\u6709 AI \u8F93\u51FA\u8BED\u8A00\u914D\u7F6E", currentLanguage: "\u5F53\u524D\u8BED\u8A00", modifyLanguage: "\u662F\u5426\u4FEE\u6539 AI \u8F93\u51FA\u8BED\u8A00\uFF1F", keepLanguage: "\u4FDD\u6301\u5F53\u524D\u8BED\u8A00\u914D\u7F6E", // AI personality selectAiPersonality: "\u9009\u62E9 AI \u4E2A\u6027\u98CE\u683C", customPersonalityHint: "\u5B9A\u4E49\u4F60\u81EA\u5DF1\u7684\u4E2A\u6027", enterCustomPersonality: "\u8BF7\u8F93\u5165\u81EA\u5B9A\u4E49\u4E2A\u6027\u63CF\u8FF0", personalityConfigured: "AI \u4E2A\u6027\u5DF2\u914D\u7F6E", existingPersonality: "\u68C0\u6D4B\u5230\u5DF2\u6709 AI \u4E2A\u6027\u914D\u7F6E", currentPersonality: "\u5F53\u524D\u4E2A\u6027", modifyPersonality: "\u662F\u5426\u4FEE\u6539 AI \u4E2A\u6027\u914D\u7F6E\uFF1F", keepPersonality: "\u4FDD\u6301\u5F53\u524D\u4E2A\u6027\u914D\u7F6E", directiveCannotBeEmpty: "\u6307\u4EE4\u4E0D\u80FD\u4E3A\u7A7A", languageRequired: "\u8BED\u8A00\u4E3A\u5FC5\u586B\u9879", // Cache confirmClearCache: "\u786E\u8BA4\u6E05\u9664\u6240\u6709 ZCF \u504F\u597D\u7F13\u5B58\uFF1F", cacheCleared: "ZCF \u7F13\u5B58\u5DF2\u6E05\u9664", noCacheFound: "\u672A\u627E\u5230\u7F13\u5B58\u6587\u4EF6", // Environment and permissions selectEnvPermissionOption: "\u8BF7\u9009\u62E9\u914D\u7F6E\u9009\u9879", importRecommendedEnv: "\u5BFC\u5165 ZCF \u63A8\u8350\u73AF\u5883\u53D8\u91CF", importRecommendedEnvDesc: "\u9690\u79C1\u4FDD\u62A4\u53D8\u91CF\u7B49", importRecommendedPermissions: "\u5BFC\u5165 ZCF \u63A8\u8350\u6743\u9650\u914D\u7F6E", importRecommendedPermissionsDesc: "\u51E0\u4E4E\u5168\u90E8\u6743\u9650\uFF0C\u51CF\u5C11\u9891\u7E41\u8BF7\u6C42\u6743\u9650\uFF0C\u5371\u9669\u64CD\u4F5C\u7531\u89C4\u5219\u9650\u5236", openSettingsJson: "\u6253\u5F00 settings.json \u624B\u52A8\u914D\u7F6E", openSettingsJsonDesc: "\u9AD8\u7EA7\u7528\u6237\u81EA\u5B9A\u4E49", envImportSuccess: "\u73AF\u5883\u53D8\u91CF\u5DF2\u5BFC\u5165", permissionsImportSuccess: "\u6743\u9650\u914D\u7F6E\u5DF2\u5BFC\u5165", openingSettingsJson: "\u6B63\u5728\u6253\u5F00 settings.json...", // JSON config related invalidConfiguration: "\u914D\u7F6E\u65E0\u6548", failedToParseJson: "\u89E3\u6790 JSON \u6587\u4EF6\u5931\u8D25:", failedToBackupConfig: "\u5907\u4EFD\u914D\u7F6E\u5931\u8D25", failedToReadTemplateSettings: "\u8BFB\u53D6\u6A21\u677F\u8BBE\u7F6E\u5931\u8D25", failedToMergeSettings: "\u5408\u5E76\u8BBE\u7F6E\u5931\u8D25", preservingExistingSettings: "\u4FDD\u7559\u73B0\u6709\u8BBE\u7F6E", memoryDirNotFound: "\u672A\u627E\u5230\u8BB0\u5FC6\u76EE\u5F55", failedToSetOnboarding: "\u8BBE\u7F6E\u5F15\u5BFC\u6807\u5FD7\u5931\u8D25", fixWindowsMcp: "\u4FEE\u590D Windows MCP \u914D\u7F6E\uFF1F" }; const errors = { // General errors failedToSetOnboarding: "\u8BBE\u7F6E\u5165\u95E8\u5B8C\u6210\u6807\u5FD7\u5931\u8D25\uFF1A", failedToWriteMcpConfig: "\u5199\u5165 MCP \u914D\u7F6E\u5931\u8D25\uFF1A", templateDirNotFound: "\u6A21\u677F\u76EE\u5F55\u672A\u627E\u5230\uFF1A", failedToReadTemplateSettings: "\u8BFB\u53D6\u6A21\u677F settings.json \u5931\u8D25\uFF1A", failedToMergeSettings: "\u5408\u5E76 settings.json \u5931\u8D25\uFF1A", preservingExistingSettings: "\u7531\u4E8E\u5408\u5E76\u9519\u8BEF\uFF0C\u4FDD\u7559\u73B0\u6709\u7684 settings.json", // File system errors failedToReadFile: "\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A", failedToWriteFile: "\u5199\u5165\u6587\u4EF6\u5931\u8D25\uFF1A", failedToCopyFile: "\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A", failedToRemoveFile: "\u5220\u9664\u6587\u4EF6\u5931\u8D25\uFF1A", failedToReadDirectory: "\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25\uFF1A", failedToGetStats: "\u83B7\u53D6\u6587\u4EF6\u72B6\u6001\u5931\u8D25\uFF1A", sourceDirNotExist: "\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A", memoryDirNotFound: "\u8BB0\u5FC6\u76EE\u5F55\u672A\u627E\u5230\uFF1A", // JSON config errors invalidConfiguration: "\u914D\u7F6E\u65E0\u6548\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C", failedToParseJson: "\u89E3\u6790 JSON \u6587\u4EF6\u5931\u8D25\uFF1A", failedToBackupConfig: "\u5907\u4EFD\u914D\u7F6E\u6587\u4EF6\u5931\u8D25\uFF1A", invalidEnvConfig: "\u65E0\u6548\u7684 env \u914D\u7F6E\uFF1A\u671F\u671B\u5BF9\u8C61", invalidApiUrl: "\u65E0\u6548\u7684 ANTHROPIC_BASE_URL\uFF1A\u671F\u671B\u5B57\u7B26\u4E32", invalidApiKey: "\u65E0\u6548\u7684 ANTHROPIC_API_KEY\uFF1A\u671F\u671B\u5B57\u7B26\u4E32", invalidAuthToken: "\u65E0\u6548\u7684 ANTHROPIC_AUTH_TOKEN\uFF1A\u671F\u671B\u5B57\u7B26\u4E32", invalidPermissionsConfig: "\u65E0\u6548\u7684\u6743\u9650\u914D\u7F6E\uFF1A\u671F\u671B\u5BF9\u8C61", invalidPermissionsAllow: "\u65E0\u6548\u7684 permissions.allow\uFF1A\u671F\u671B\u6570\u7EC4", // MCP errors failedToAddOnboardingFlag: "\u6DFB\u52A0 hasCompletedOnboarding \u6807\u5FD7\u5931\u8D25\uFF1A", // AI personality errors failedToApplyPersonality: "\u5E94\u7528\u4E2A\u6027\u6307\u4EE4\u5931\u8D25\uFF1A" }; const installation = { installPrompt: "\u68C0\u6D4B\u5230 Claude Code \u672A\u5B89\u88C5\uFF0C\u662F\u5426\u81EA\u52A8\u5B89\u88C5\uFF1F", installing: "\u6B63\u5728\u5B89\u88C5 Claude Code...", installSuccess: "Claude Code \u5B89\u88C5\u6210\u529F", alreadyInstalled: "Claude Code \u5DF2\u5B89\u88C5", installFailed: "Claude Code \u5B89\u88C5\u5931\u8D25", npmNotFound: "npm \u672A\u5B89\u88C5\u3002\u8BF7\u5148\u5B89\u88C5 Node.js \u548C npm\u3002", // Termux specific termuxDetected: "\u68C0\u6D4B\u5230 Termux \u73AF\u5883", termuxInstallHint: "\u5728 Termux \u4E2D\uFF0C\u8BF7\u5148\u8FD0\u884C: pkg install nodejs \u6216 pkg install nodejs-lts", termuxPathInfo: "\u4F7F\u7528 Termux \u8DEF\u5F84: {path}", termuxEnvironmentInfo: "Termux \u73AF\u5883\u901A\u8FC7 pkg \u7BA1\u7406\u5668\u63D0\u4F9B Node.js \u548C npm", // Windows specific windowsDetected: "\u68C0\u6D4B\u5230 Windows \u7CFB\u7EDF\uFF0C\u5C06\u81EA\u52A8\u914D\u7F6E\u517C\u5BB9\u683C\u5F0F" }; const language = { selectScriptLang: "\u9009\u62E9ZCF\u663E\u793A\u8BED\u8A00", selectConfigLang: "\u9009\u62E9 Claude Code \u914D\u7F6E\u8BED\u8A00", selectAiOutputLang: "\u9009\u62E9 AI \u8F93\u51FA\u8BED\u8A00", aiOutputLangHint: "AI \u5C06\u4F7F\u7528\u6B64\u8BED\u8A00\u56DE\u590D\u4F60\u7684\u95EE\u9898", enterCustomLanguage: "\u8BF7\u8F93\u5165\u81EA\u5B9A\u4E49\u8BED\u8A00\uFF08\u4F8B\u5982\uFF1AJapanese, French \u7B49\uFF09", languageChanged: "\u8BED\u8A00\u5DF2\u66F4\u6539", configLangHint: { "zh-CN": "\u4FBF\u4E8E\u4E2D\u6587\u7528\u6237\u81EA\u5B9A\u4E49", "en": "\u63A8\u8350\uFF0Ctoken \u6D88\u8017\u66F4\u4F4E" }, updateConfigLangPrompt: "\u9009\u62E9\u914D\u7F6E\u8BED\u8A00", updateConfigLangChoice: { "zh-CN": "\u4E2D\u6587\u7248\u914D\u7F6E", "en": "\u82F1\u6587\u7248\u914D\u7F6E" } }; const mcp = { configureMcp: "\u662F\u5426\u914D\u7F6E MCP \u670D\u52A1\uFF1F", selectMcpServices: "\u9009\u62E9\u8981\u5B89\u88C5\u7684 MCP \u670D\u52A1", allServices: "\u5168\u90E8\u5B89\u88C5", mcpServiceInstalled: "\u5DF2\u9009\u62E9\u7684 MCP \u670D\u52A1", enterExaApiKey: "\u8BF7\u8F93\u5165 Exa API Key\uFF08\u53EF\u4ECE https://dashboard.exa.ai/api-keys \u83B7\u53D6\uFF09", skipMcp: "\u8DF3\u8FC7 MCP \u914D\u7F6E", mcpConfigSuccess: "MCP \u670D\u52A1\u5DF2\u914D\u7F6E", mcpBackupSuccess: "\u5DF2\u5907\u4EFD\u539F\u6709 MCP \u914D\u7F6E", fixWindowsMcp: "\u4FEE\u590D Windows MCP \u914D\u7F6E", fixWindowsMcpDesc: "\u4FEE\u590D Windows \u5E73\u53F0 MCP \u547D\u4EE4\u914D\u7F6E\u95EE\u9898", windowsMcpFixed: "Windows MCP \u914D\u7F6E\u5DF2\u4FEE\u590D", configureMcpServices: "\u914D\u7F6E MCP \u670D\u52A1", selectMcpOption: "\u9009\u62E9 MCP \u914D\u7F6E\u9009\u9879" }; const menu = { selectFunction: "\u8BF7\u9009\u62E9\u529F\u80FD", menuSections: { otherTools: "\u5176\u4ED6\u5DE5\u5177" }, menuOptions: { fullInit: "\u5B8C\u6574\u521D\u59CB\u5316", importWorkflow: "\u5BFC\u5165\u5DE5\u4F5C\u6D41", configureApiOrCcr: "\u914D\u7F6E API \u6216 CCR \u4EE3\u7406", configureApi: "\u914D\u7F6E API", configureMcp: "\u914D\u7F6E MCP", configureModel: "\u914D\u7F6E\u9ED8\u8BA4\u6A21\u578B", configureAiMemory: "\u914D\u7F6E Claude \u5168\u5C40\u8BB0\u5FC6", configureEnvPermission: "\u5BFC\u5165\u63A8\u8350\u73AF\u5883\u53D8\u91CF\u548C\u6743\u9650\u914D\u7F6E", configureCcr: "\u914D\u7F6E