diff --git a/cc-haha/desktop/src/i18n/locales/en.ts b/cc-haha/desktop/src/i18n/locales/en.ts
index c5693ad..778983e 100644
--- a/cc-haha/desktop/src/i18n/locales/en.ts
+++ b/cc-haha/desktop/src/i18n/locales/en.ts
@@ -151,7 +151,7 @@ export const en = {
// Settings > Adapters
'settings.tab.adapters': 'IM Adapters',
- 'settings.adapters.description': 'Configure IM adapters to chat with Claude Code via Telegram or Feishu.',
+ 'settings.adapters.description': 'Configure IM adapters to chat with Heicode via Telegram or Feishu.',
'settings.adapters.telegram': 'Telegram',
'settings.adapters.feishu': 'Feishu',
'settings.adapters.botToken': 'Bot Token',
@@ -195,7 +195,7 @@ export const en = {
// Settings > MCP
'settings.mcp.title': 'MCP servers',
- 'settings.mcp.description': 'Connect external tools and data sources for Claude Code. Add, edit, reconnect, and disable servers without leaving the desktop app.',
+ 'settings.mcp.description': 'Connect external tools and data sources for Heicode. Add, edit, reconnect, and disable servers without leaving the desktop app.',
'settings.mcp.addServer': 'Add server',
'settings.mcp.empty': 'No MCP servers configured yet',
'settings.mcp.emptyHint': 'Add a custom stdio, HTTP, or SSE MCP server to start extending tool access.',
@@ -217,7 +217,7 @@ export const en = {
'settings.mcp.globalOnlyHint': 'This page manages only user-global MCP servers for speed. Project-specific MCP will move into the chat slash-command experience.',
'settings.mcp.form.back': 'Back to servers',
'settings.mcp.form.createTitle': 'Connect to a custom MCP',
- 'settings.mcp.form.createHint': 'Set up a custom MCP server with the fields supported by Claude Code today.',
+ 'settings.mcp.form.createHint': 'Set up a custom MCP server with the fields supported by Heicode today.',
'settings.mcp.form.editTitle': 'Update {name} MCP',
'settings.mcp.form.editHint': 'Review connection details, save changes, or reconnect this server from the desktop app.',
'settings.mcp.form.transportLocked': 'If you would like to switch MCP server type, uninstall first.',
@@ -266,7 +266,7 @@ export const en = {
'settings.mcp.targetProject.projectSelected': 'This server will be shared through: {path}/.mcp.json',
'settings.mcp.targetProject.projectEmpty': 'Choose the project whose `.mcp.json` should receive this shared MCP server.',
'settings.mcp.targetProject.globalTitle': 'Global install target',
- 'settings.mcp.targetProject.globalHint': 'User scope does not need a target project. It is stored in your global Claude config and is available everywhere.',
+ 'settings.mcp.targetProject.globalHint': 'User scope does not need a target project. It is stored in your global Heicode config and is available everywhere.',
'settings.mcp.toast.created': 'Created MCP server "{name}"',
'settings.mcp.toast.saved': 'Saved MCP server "{name}"',
'settings.mcp.toast.deleted': 'Deleted MCP server "{name}"',
@@ -281,12 +281,12 @@ export const en = {
// Settings > Agents
'settings.tab.agents': 'Agents',
'settings.agents.title': 'Installed Agents',
- 'settings.agents.description': 'Browse agents available to Claude across built-in, project, and user sources. Use /agents in TUI to inspect active sources and overrides.',
+ 'settings.agents.description': 'Browse agents available to Heicode across built-in, project, and user sources. Use /agents in TUI to inspect active sources and overrides.',
'settings.agents.browserTitle': 'Browse installed agents',
'settings.agents.browserEyebrow': 'Agent Browser',
'settings.agents.entryEyebrow': 'Agent Profile',
'settings.agents.empty': 'No agents available yet.',
- 'settings.agents.emptyHint': 'Add agent definitions in your Claude settings or project to see them here.',
+ 'settings.agents.emptyHint': 'Add agent definitions in your Heicode settings or project to see them here.',
'settings.agents.model': 'Model',
'settings.agents.tools': 'Tools',
'settings.agents.systemPrompt': 'System Prompt',
@@ -392,7 +392,7 @@ export const en = {
'settings.plugins.scope.managed': 'Managed',
'settings.plugins.scope.builtin': 'Built-in',
'settings.plugins.empty': 'No plugins installed',
- 'settings.plugins.emptyHint': 'Install plugins from Claude Code to manage them here.',
+ 'settings.plugins.emptyHint': 'Install plugins from Heicode to manage them here.',
'settings.plugins.back': 'Back to list',
'settings.plugins.noDescription': 'No description available for this plugin.',
'settings.plugins.errorCount': '{count} errors',
@@ -437,7 +437,7 @@ export const en = {
// Settings > Computer Use
'settings.tab.computerUse': 'Computer Use',
'settings.computerUse.title': 'Computer Use',
- 'settings.computerUse.description': 'Allow Claude to take screenshots, click, type, and control your computer. Requires Python 3. On macOS, accessibility permissions are also needed.',
+ 'settings.computerUse.description': 'Allow Heicode to take screenshots, click, type, and control your computer. Requires Python 3. On macOS, accessibility permissions are also needed.',
'settings.computerUse.notSupported': 'Computer Use is only supported on macOS and Windows.',
'settings.computerUse.python': 'Python 3',
'settings.computerUse.pythonNotFound': 'Not installed. Please install Python 3 first.',
@@ -464,7 +464,7 @@ export const en = {
'settings.computerUse.recheckBtn': 'Recheck Status',
'settings.computerUse.requirementsLabel': 'Required packages',
'settings.computerUse.appsTitle': 'Authorized Apps',
- 'settings.computerUse.appsDescription': 'Pre-authorize apps for Computer Use. Authorized apps can be controlled by Claude without runtime prompts.',
+ 'settings.computerUse.appsDescription': 'Pre-authorize apps for Computer Use. Authorized apps can be controlled by Heicode without runtime prompts.',
'settings.computerUse.appsLoading': 'Loading installed apps...',
'settings.computerUse.appsEmpty': 'No installed apps found. Please setup the environment first.',
'settings.computerUse.appsSearch': 'Search apps...',
@@ -489,20 +489,20 @@ export const en = {
'settings.general.effort.high': 'High',
'settings.general.effort.max': 'Max',
'settings.general.webFetchPreflightTitle': 'WebFetch Preflight',
- 'settings.general.webFetchPreflightDescription': 'Desktop sessions skip Claude\'s domain preflight by default to avoid false failures on third-party providers and restricted networks.',
+ 'settings.general.webFetchPreflightDescription': 'Desktop sessions skip Heicode\'s domain preflight by default to avoid false failures on third-party providers and restricted networks.',
'settings.general.webFetchPreflightEnabled': 'Skip WebFetch domain preflight',
'settings.general.webFetchPreflightHint': 'Turn this off only if you explicitly want to restore the upstream safety preflight before each WebFetch request.',
// ─── Empty Session ──────────────────────────────────────
'empty.title': 'New session',
- 'empty.subtitle': 'Start a fresh coding session. Claude is ready to help you build, debug, and architect your project.',
+ 'empty.subtitle': 'Start a fresh coding session. Heicode is ready to help you build, debug, and architect your project.',
'empty.placeholder': 'Ask anything...',
'empty.addFiles': 'Add files or photos',
'empty.slashCommands': 'Slash commands',
'empty.failedToCreate': 'Failed to create session',
// ─── Chat Input ──────────────────────────────────────
- 'chat.placeholder': 'Ask Claude to edit, debug or explain...',
+ 'chat.placeholder': 'Ask Heicode to edit, debug or explain...',
'chat.placeholderMissing': 'This session points to a missing workspace. Create a new session or pick another project.',
'chat.addFiles': 'Add files or photos',
'chat.slashCommands': 'Slash commands',
@@ -619,10 +619,10 @@ export const en = {
'streaming.working': 'Working',
// ─── Permission Dialog ──────────────────────────────────────
- 'permission.allowEditFile': 'Allow Claude to {toolName} {fileName}?',
- 'permission.allowEditFileGeneric': 'Allow Claude to {toolName} this file?',
- 'permission.allowBash': 'Allow Claude to run this command?',
- 'permission.allowTool': 'Allow Claude to use {toolName}?',
+ 'permission.allowEditFile': 'Allow Heicode to {toolName} {fileName}?',
+ 'permission.allowEditFileGeneric': 'Allow Heicode to {toolName} this file?',
+ 'permission.allowBash': 'Allow Heicode to run this command?',
+ 'permission.allowTool': 'Allow Heicode to use {toolName}?',
'permission.awaitingApproval': 'Awaiting approval',
'permission.responded': 'Responded',
'permission.allow': 'Allow',
@@ -635,15 +635,15 @@ export const en = {
// ─── Computer Use Approval ──────────────────────────────────────
'computerUseApproval.titleApps': 'Computer Use wants to control these apps',
'computerUseApproval.titleTcc': 'Computer Use needs macOS permissions',
- 'computerUseApproval.reason': 'Why Claude is asking',
+ 'computerUseApproval.reason': 'Why Heicode is asking',
'computerUseApproval.allow': 'Allow for session',
'computerUseApproval.deny': 'Deny',
'computerUseApproval.alreadyGranted': 'Already granted for this session',
'computerUseApproval.notInstalled': 'App not installed',
'computerUseApproval.sensitiveApp': 'This app is treated as sensitive and deserves extra review.',
'computerUseApproval.alsoRequested': 'Also requested',
- 'computerUseApproval.hideWhileWorking': '{count} other apps will be hidden while Claude works.',
- 'computerUseApproval.hideWhileWorkingRestore': '{count} other apps will be hidden while Claude works, then restored when Claude is done.',
+ 'computerUseApproval.hideWhileWorking': '{count} other apps will be hidden while Heicode works.',
+ 'computerUseApproval.hideWhileWorkingRestore': '{count} other apps will be hidden while Heicode works, then restored when Heicode is done.',
'computerUseApproval.accessibility': 'Accessibility',
'computerUseApproval.screenRecording': 'Screen Recording',
'computerUseApproval.granted': 'Granted',
@@ -652,10 +652,10 @@ export const en = {
'computerUseApproval.openScreenRecording': 'Open Screen Recording',
'computerUseApproval.tryAgain': 'Try again',
'computerUseApproval.tccHint': 'Grant the missing permissions in System Settings, then come back and choose "Try again".',
- 'computerUseApproval.tryAgainHint': 'Try again returns control to Claude so it can call request_access once more after macOS permission changes take effect.',
+ 'computerUseApproval.tryAgainHint': 'Try again returns control to Heicode so it can call request_access once more after macOS permission changes take effect.',
// ─── Ask User Question ──────────────────────────────────────
- 'question.needsInput': 'Claude needs your input',
+ 'question.needsInput': 'Heicode needs your input',
'question.answered': 'Answered',
'question.customResponse': 'Or type a custom response:',
'question.typePlaceholder': 'Type your answer...',
@@ -815,7 +815,7 @@ export const en = {
'permMode.askPermissions': 'Ask permissions',
'permMode.askPermDesc': 'Confirm file edits and higher-risk commands when CLI asks',
'permMode.autoAccept': 'Auto accept edits',
- 'permMode.autoAcceptDesc': 'Claude writes to disk without asking',
+ 'permMode.autoAcceptDesc': 'Heicode writes to disk without asking',
'permMode.planMode': 'Plan mode',
'permMode.planModeDesc': 'Architecture & reasoning only, no files',
'permMode.bypass': 'Bypass permissions',
@@ -823,7 +823,7 @@ export const en = {
'permMode.dontAsk': "Don't ask",
'permMode.enableBypassTitle': 'Enable bypass permissions?',
'permMode.enableBypassSubtitle': 'This grants full access to your system',
- 'permMode.enableBypassBody': 'Claude will have unrestricted access to execute shell commands and modify files within:',
+ 'permMode.enableBypassBody': 'Heicode will have unrestricted access to execute shell commands and modify files within:',
'permMode.permReadWrite': 'Read, write, and delete any files',
'permMode.permShell': 'Execute arbitrary shell commands',
'permMode.permPackages': 'Install or remove packages',
diff --git a/cc-haha/desktop/src/i18n/locales/zh.ts b/cc-haha/desktop/src/i18n/locales/zh.ts
index f3da603..b9806ac 100644
--- a/cc-haha/desktop/src/i18n/locales/zh.ts
+++ b/cc-haha/desktop/src/i18n/locales/zh.ts
@@ -96,7 +96,7 @@ export const zh: Record = {
'settings.providers.title': '服务商',
'settings.providers.description': '管理 API 服务商以访问模型。',
'settings.providers.addProvider': '添加服务商',
- 'settings.providers.officialName': 'Claude 官方',
+ 'settings.providers.officialName': 'Heicode 官方',
'settings.providers.officialDesc': 'Anthropic 原生接入 — 无需 API 密钥',
'settings.providers.connected': '已连接 ({latency}ms)',
'settings.providers.failed': '失败: {error}',
@@ -153,7 +153,7 @@ export const zh: Record = {
// Settings > Adapters
'settings.tab.adapters': 'IM 接入',
- 'settings.adapters.description': '配置即时通讯适配器,通过 Telegram 或飞书与 Claude Code 对话。',
+ 'settings.adapters.description': '配置即时通讯适配器,通过 Telegram 或飞书与 Heicode 对话。',
'settings.adapters.telegram': 'Telegram',
'settings.adapters.feishu': '飞书 (Feishu)',
'settings.adapters.botToken': 'Bot Token',
@@ -210,7 +210,7 @@ export const zh: Record = {
'settings.mcp.scope.plugin': '插件',
'settings.mcp.scopeDesc.local': '只对你自己生效,但绑定到某一个项目。配置写在用户配置里,同时带上选中的项目上下文。',
'settings.mcp.scopeDesc.project': '写入选中项目的 `.mcp.json`,项目成员共享。',
- 'settings.mcp.scopeDesc.user': '写入你的全局 Claude 配置,对所有项目生效。',
+ 'settings.mcp.scopeDesc.user': '写入你的全局 Heicode 配置,对所有项目生效。',
'settings.mcp.scope.dynamic': '内置',
'settings.mcp.scope.enterprise': '企业托管',
'settings.mcp.scope.claudeai': 'Claude.ai',
@@ -219,7 +219,7 @@ export const zh: Record = {
'settings.mcp.globalOnlyHint': '这个页面只管理全局用户 MCP,以保证速度和清晰度。项目级 MCP 将放到聊天页的斜杠命令体验里。',
'settings.mcp.form.back': '返回服务列表',
'settings.mcp.form.createTitle': '连接自定义 MCP',
- 'settings.mcp.form.createHint': '按当前 Claude Code 支持的字段添加一个自定义 MCP 服务。',
+ 'settings.mcp.form.createHint': '按当前 Heicode 支持的字段添加一个自定义 MCP 服务。',
'settings.mcp.form.editTitle': '更新 {name} MCP',
'settings.mcp.form.editHint': '查看连接信息、保存修改,或直接在桌面端重连这个服务。',
'settings.mcp.form.transportLocked': '如果你想切换 MCP 服务类型,请先卸载后重新添加。',
@@ -268,7 +268,7 @@ export const zh: Record = {
'settings.mcp.targetProject.projectSelected': '这个 MCP 会写入:{path}/.mcp.json,作为项目共享配置。',
'settings.mcp.targetProject.projectEmpty': '请选择要写入 `.mcp.json` 的项目。',
'settings.mcp.targetProject.globalTitle': '全局安装目标',
- 'settings.mcp.targetProject.globalHint': '全局用户不需要选择项目。它会写入你的全局 Claude 配置,并对所有项目生效。',
+ 'settings.mcp.targetProject.globalHint': '全局用户不需要选择项目。它会写入你的全局 Heicode 配置,并对所有项目生效。',
'settings.mcp.toast.created': '已创建 MCP 服务 “{name}”',
'settings.mcp.toast.saved': '已保存 MCP 服务 “{name}”',
'settings.mcp.toast.deleted': '已删除 MCP 服务 “{name}”',
@@ -283,12 +283,12 @@ export const zh: Record = {
// Settings > Agents
'settings.tab.agents': 'Agents',
'settings.agents.title': '已安装的 Agents',
- 'settings.agents.description': '浏览 Claude 当前可用的 Agents,包括内置、项目和用户来源。可在 TUI 中使用 /agents 查看当前生效项与覆盖关系。',
+ 'settings.agents.description': '浏览 Heicode 当前可用的 Agents,包括内置、项目和用户来源。可在 TUI 中使用 /agents 查看当前生效项与覆盖关系。',
'settings.agents.browserTitle': '浏览已安装 Agents',
'settings.agents.browserEyebrow': 'Agent 浏览器',
'settings.agents.entryEyebrow': 'Agent 档案',
'settings.agents.empty': '暂无可用 Agent。',
- 'settings.agents.emptyHint': '在 Claude 设置或当前项目中添加 Agent 定义后,就会显示在这里。',
+ 'settings.agents.emptyHint': '在 Heicode 设置或当前项目中添加 Agent 定义后,就会显示在这里。',
'settings.agents.model': '模型',
'settings.agents.tools': '工具',
'settings.agents.systemPrompt': '系统提示词',
@@ -394,7 +394,7 @@ export const zh: Record = {
'settings.plugins.scope.managed': '托管',
'settings.plugins.scope.builtin': '内置',
'settings.plugins.empty': '暂无已安装插件',
- 'settings.plugins.emptyHint': '先在 Claude Code 里安装插件,桌面端就可以在这里管理。',
+ 'settings.plugins.emptyHint': '先在 Heicode 里安装插件,桌面端就可以在这里管理。',
'settings.plugins.back': '返回列表',
'settings.plugins.noDescription': '这个插件没有可用描述。',
'settings.plugins.errorCount': '{count} 个错误',
@@ -439,7 +439,7 @@ export const zh: Record = {
// Settings > Computer Use
'settings.tab.computerUse': 'Computer Use',
'settings.computerUse.title': 'Computer Use',
- 'settings.computerUse.description': '允许 Claude 截屏、点击、打字并控制你的电脑。需要 Python 3,macOS 上还需要辅助功能权限。',
+ 'settings.computerUse.description': '允许 Heicode 截屏、点击、打字并控制你的电脑。需要 Python 3,macOS 上还需要辅助功能权限。',
'settings.computerUse.notSupported': 'Computer Use 仅支持 macOS 和 Windows。',
'settings.computerUse.python': 'Python 3',
'settings.computerUse.pythonNotFound': '未安装,请先安装 Python 3。',
@@ -466,7 +466,7 @@ export const zh: Record = {
'settings.computerUse.recheckBtn': '重新检测',
'settings.computerUse.requirementsLabel': '需要的 Python 包',
'settings.computerUse.appsTitle': '已授权应用',
- 'settings.computerUse.appsDescription': '预先授权 App,Claude 将可以直接控制这些 App,无需运行时弹窗确认。',
+ 'settings.computerUse.appsDescription': '预先授权 App,Heicode 将可以直接控制这些 App,无需运行时弹窗确认。',
'settings.computerUse.appsLoading': '加载已安装的 App...',
'settings.computerUse.appsEmpty': '未找到已安装的 App,请先安装环境。',
'settings.computerUse.appsSearch': '搜索 App...',
@@ -491,20 +491,20 @@ export const zh: Record = {
'settings.general.effort.high': '高',
'settings.general.effort.max': '最大',
'settings.general.webFetchPreflightTitle': 'WebFetch 预检',
- 'settings.general.webFetchPreflightDescription': '桌面端默认跳过 Claude 的域名预检,避免第三方服务商或受限网络下出现误报失败。',
+ 'settings.general.webFetchPreflightDescription': '桌面端默认跳过 Heicode 的域名预检,避免第三方服务商或受限网络下出现误报失败。',
'settings.general.webFetchPreflightEnabled': '跳过 WebFetch 域名预检',
'settings.general.webFetchPreflightHint': '只有在你明确需要恢复上游默认安全预检时,才建议关闭这个选项。',
// ─── Empty Session ──────────────────────────────────────
'empty.title': '新建会话',
- 'empty.subtitle': '开始一个新的编码会话。Claude 已准备好帮你构建、调试和架构你的项目。',
+ 'empty.subtitle': '开始一个新的编码会话。Heicode 已准备好帮你构建、调试和架构你的项目。',
'empty.placeholder': '随便问点什么...',
'empty.addFiles': '添加文件或图片',
'empty.slashCommands': '斜杠命令',
'empty.failedToCreate': '创建会话失败',
// ─── Chat Input ──────────────────────────────────────
- 'chat.placeholder': '让 Claude 编辑、调试或解释代码...',
+ 'chat.placeholder': '让 Heicode 编辑、调试或解释代码...',
'chat.placeholderMissing': '此会话指向的工作目录缺失。请新建会话或选择其他项目。',
'chat.addFiles': '添加文件或图片',
'chat.slashCommands': '斜杠命令',
@@ -621,10 +621,10 @@ export const zh: Record = {
'streaming.working': '工作中',
// ─── Permission Dialog ──────────────────────────────────────
- 'permission.allowEditFile': '允许 Claude {toolName} {fileName}?',
- 'permission.allowEditFileGeneric': '允许 Claude {toolName}此文件?',
- 'permission.allowBash': '允许 Claude 执行此命令?',
- 'permission.allowTool': '允许 Claude 使用 {toolName}?',
+ 'permission.allowEditFile': '允许 Heicode {toolName} {fileName}?',
+ 'permission.allowEditFileGeneric': '允许 Heicode {toolName}此文件?',
+ 'permission.allowBash': '允许 Heicode 执行此命令?',
+ 'permission.allowTool': '允许 Heicode 使用 {toolName}?',
'permission.awaitingApproval': '等待审批',
'permission.responded': '已响应',
'permission.allow': '允许',
@@ -644,8 +644,8 @@ export const zh: Record = {
'computerUseApproval.notInstalled': '应用未安装',
'computerUseApproval.sensitiveApp': '该应用属于高敏感类别,请额外确认后再授权。',
'computerUseApproval.alsoRequested': '同时请求了',
- 'computerUseApproval.hideWhileWorking': 'Claude 工作时会隐藏另外 {count} 个应用。',
- 'computerUseApproval.hideWhileWorkingRestore': 'Claude 工作时会隐藏另外 {count} 个应用,结束后会自动恢复。',
+ 'computerUseApproval.hideWhileWorking': 'Heicode 工作时会隐藏另外 {count} 个应用。',
+ 'computerUseApproval.hideWhileWorkingRestore': 'Heicode 工作时会隐藏另外 {count} 个应用,结束后会自动恢复。',
'computerUseApproval.accessibility': '辅助功能',
'computerUseApproval.screenRecording': '屏幕录制',
'computerUseApproval.granted': '已授权',
@@ -654,10 +654,10 @@ export const zh: Record = {
'computerUseApproval.openScreenRecording': '打开屏幕录制设置',
'computerUseApproval.tryAgain': '稍后重试',
'computerUseApproval.tccHint': '先在系统设置里授予缺失权限,返回后再点“稍后重试”。',
- 'computerUseApproval.tryAgainHint': '“稍后重试”会把控制权交还给 Claude,让它在 macOS 权限生效后重新调用 request_access。',
+ 'computerUseApproval.tryAgainHint': '“稍后重试”会把控制权交还给 Heicode,让它在 macOS 权限生效后重新调用 request_access。',
// ─── Ask User Question ──────────────────────────────────────
- 'question.needsInput': 'Claude 需要你的输入',
+ 'question.needsInput': 'Heicode 需要你的输入',
'question.answered': '已回答',
'question.customResponse': '或输入自定义回复:',
'question.typePlaceholder': '输入你的回答...',
@@ -817,7 +817,7 @@ export const zh: Record = {
'permMode.askPermissions': '询问权限',
'permMode.askPermDesc': 'CLI 请求时确认文件编辑和高风险命令',
'permMode.autoAccept': '自动接受编辑',
- 'permMode.autoAcceptDesc': 'Claude 无需询问即可写入磁盘',
+ 'permMode.autoAcceptDesc': 'Heicode 无需询问即可写入磁盘',
'permMode.planMode': '计划模式',
'permMode.planModeDesc': '仅架构和推理,不操作文件',
'permMode.bypass': '跳过权限',
@@ -825,7 +825,7 @@ export const zh: Record = {
'permMode.dontAsk': '不询问',
'permMode.enableBypassTitle': '启用跳过权限?',
'permMode.enableBypassSubtitle': '这将授予对系统的完全访问权限',
- 'permMode.enableBypassBody': 'Claude 将拥有不受限制的权限来执行 Shell 命令和修改以下目录中的文件:',
+ 'permMode.enableBypassBody': 'Heicode 将拥有不受限制的权限来执行 Shell 命令和修改以下目录中的文件:',
'permMode.permReadWrite': '读取、写入和删除任何文件',
'permMode.permShell': '执行任意 Shell 命令',
'permMode.permPackages': '安装或移除软件包',