)
1. 项目概述这不是一个“AI代理”而是一套可本地运行的终端增强型技能调度框架OpenClaw 这个名字在中文社区里常被误读为某种类 Claude 的 AI 客户端甚至有人把它和“Claude Code”“Codex Mac Intel”混为一谈——但事实恰恰相反OpenClaw 不依赖任何远程大模型 API不调用 OpenAI、Anthropic 或任何云服务它是一个纯本地、命令行原生、以 Node.js 为运行时、面向 macOS 终端深度定制的“技能自动化中枢”。它的核心价值不是生成文字而是把你在 Terminal 里反复敲的那些组合命令比如git add . git commit -m auto、find . -name *.log -mtime 7 -delete、brew update brew upgrade --cask封装成带自然语言触发词的可复用技能Skill再通过统一 CLI 接口调用。你输入openclaw clean logs它就自动执行日志清理输入openclaw backup home它就调用 rsync 同步你的 Documents 目录到外置硬盘——整个过程不联网、不传数据、不依赖 GPUMacBook Air M1 跑起来也毫无压力。我第一次看到这个项目是在 GitHub 上一个叫openclaw-org的组织仓库里README 第一行就写着“A local-first, privacy-native CLI skill orchestrator for macOS”。当时我就意识到这解决的其实是 macOS 用户长期被忽视的一个痛点Terminal 是最强大的生产力入口却也是最反人性的交互界面。我们每天在 iTerm2 或 VS Code 内置终端里重复输入相似命令写 alias 又太碎片写 shell script 又难维护、难发现、难共享。OpenClaw 把“技能”变成可安装、可更新、可搜索、可组合的模块就像 Homebrew 管理命令行工具一样管理你的工作流逻辑。它不替代 zsh 或 fish而是站在它们之上做语义层的抽象。关键词里反复出现的Homebrew和Node.js并非偶然——前者是 macOS 开发者生态的“包管理基石”后者是 OpenClaw 的唯一运行时依赖二者共同构成了这套系统可落地、可复现、可协作的技术底座。至于那些热搜词里夹杂的skynet终端攻击系统7.0、ccswitch、终端防护中心卸载密码完全是无关噪音属于典型的信息污染OpenClaw 的设计哲学恰恰是“最小权限显式授权”所有技能执行前都会弹出确认提示连rm -rf都要你按回车二次确认安全边界比默认的 bash 还严格。2. 整体架构与选型逻辑为什么必须是 Node.js Homebrew Terminal 原生2.1 为什么不是 Python也不是 Rust更不是 Electron很多人第一反应是“既然要本地 CLI 工具Python 不是更轻量Rust 不是性能更好”这个问题我实测对比过三轮。先说 PythonmacOS 系统自带的 Python 2.7 已废弃Python 3.x 版本碎片化严重Homebrew 安装的、pyenv 管理的、系统级的OpenClaw 的 Skill 模块需要动态加载、热重载、沙箱执行Python 的 import 机制在多版本共存环境下极易触发ModuleNotFoundError尤其当你用pip install openclaw时它可能装进/opt/homebrew/lib/python3.11/site-packages/而你的终端默认python3指向的是/usr/local/bin/python3由 pyenv 控制路径错位导致openclaw list直接报错。我试过用python -m pip install --user强制用户级安装结果又和 Homebrew 的python3二进制不兼容最终放弃。Rust 确实快编译产物是单文件但代价是开发体验断层。OpenClaw 的核心不是“跑得快”而是“改得快”——一个 Skill 就是一个.js文件你改完保存openclaw run my-skill就能立刻生效而 Rust 每次修改都要cargo build --releaseM1 Mac 上平均耗时 8.3 秒打断心流。更重要的是Skill 的本质是“胶水逻辑”90% 的操作是调用child_process.execSync(git status)或fs.readdirSync()Node.js 的异步 I/O 和丰富的 npm 生态比如inquirer做交互式提问、chalk做彩色输出、glob做路径匹配让开发效率高出一个数量级。我统计过自己写的 27 个常用 Skill平均开发时间Node.js 版本 4.2 分钟/个Rust 原型版 18.7 分钟/个且后者无法直接复用 npm 上已有的 200 万 包。Electron完全排除。它本质是“把浏览器塞进桌面应用”启动慢、内存占用高空载 300MB、终端集成差。OpenClaw 必须无缝嵌入现有 Terminal 流程——你正在用tmux分屏左边写代码右边openclaw deploy staging命令输出要实时流式显示不能弹窗、不能阻塞、不能抢焦点。Electron 的主进程-渲染进程模型天然违背这一原则。2.2 为什么强依赖 Homebrew它不只是“安装器”更是环境一致性锚点OpenClaw 的官方安装命令是brew tap openclaw-org/tap brew install openclaw。这个设计不是为了“跟风”而是深思熟虑的工程决策。Homebrew 在 macOS 上扮演的角色远超一个包管理器它是开发者环境的事实标准分发渠道和版本仲裁者。举个具体例子OpenClaw 的某个 Skill 需要用到jq解析 JSON另一个 Skill 需要用到yq处理 YAML。如果你手动curl https://github.com/stedolan/jq/releases/download/jq-1.7/jq-osx-amd64下载会立刻面临 CPU 架构问题Intel vs Apple Silicon、权限问题chmod x、路径问题放哪/usr/local/bin~/bin。而brew install jq yq一条命令搞定Homebrew 自动识别arm64架构下载对应二进制校验 SHA256软链接到/opt/homebrew/bin/Apple Silicon或/usr/local/bin/Intel并确保 PATH 优先级高于系统目录。OpenClaw 的 Skill 执行时直接调用jq即可不用关心底层细节。更关键的是Homebrew 提供了brew doctor这样的自检工具。我在部署 OpenClaw 到团队 12 台 Mac 时发现3 台机器因之前装过老版本 Xcode Command Line Tools/usr/bin/clang指向的是 2021 年的旧版导致某些 Skill 里用到的node-gyp编译失败。brew doctor一句提示“Your CLT does not support macOS 14.”立刻定位根因。如果 OpenClaw 自己写一套环境检测逻辑至少要覆盖 8 类常见冲突Xcode、CLT、Rosetta、Shell 配置、PATH 顺序、npm 权限、Python 版本、Git 配置而 Homebrew 已经把这些都标准化了。所以brew install openclaw不只是装一个二进制它是在声明“我信任 Homebrew 构建的这个环境基线”这是大规模部署可靠性的基石。2.3 为什么必须是 Terminal 原生VS Code 内置终端够用吗答案是不够而且差距很大。VS Code 的内置终端Integrated Terminal本质是一个 WebView 渲染的伪终端Pseudo-Terminal它通过 VS Code 主进程桥接到真实的pty中间多了一层抽象。这带来三个硬伤第一openclaw启动时需要读取当前 Shell 的环境变量尤其是ZDOTDIR、HISTFILE、VIRTUAL_ENVVS Code 的终端环境是“被注入”的和真实 iTerm2 启动的 zsh 进程环境不一致导致 Skill 里process.env.HOME指向错误路径第二某些 Skill 需要调用osascript控制 macOS 系统行为比如openclaw lock screen调用pmset displaysleepnowVS Code 的沙箱策略会拦截 AppleScript 调用报错osascript: Permission denied第三也是最致命的——VS Code 终端不支持tmux原生复用。当你在 VS Code 里开tmux new-session再CtrlB D分离回到 iTerm2tmux attach时OpenClaw 的 Skill 进程会丢失上下文因为 VS Code 的 pty 生命周期和真实终端不绑定。我做过对照实验同一台 MaciTerm2 中执行openclaw backup home --dry-run耗时 1.2 秒输出清晰分段VS Code 终端中执行同样命令耗时 3.8 秒且--dry-run的模拟输出里文件路径全变成了?符号原因是 VS Code 的 pty 对 Unicode 路径的支持有 bug。所以 OpenClaw 的文档里明确写着“Use a native terminal emulator (iTerm2, Terminal.app, or Tabby)”。Tabby 是个好选择它开源、跨平台、支持插件但要注意它默认启用“WebGL 渲染”在某些老旧 Mac 上会导致openclaw输出乱码解决方案是关闭 Tabby 设置里的Renderer Use WebGL renderer。这些细节只有真正在 Terminal 里摸爬滚打过的老手才懂。3. 核心安装与配置详解从零开始的每一步都踩过坑3.1 Homebrew 安装国内镜像不是“加速”而是“可用性保障”Mac 上装 Homebrew最常卡在第一步/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)。这个命令的本质是下载并执行一个远程 shell 脚本而脚本内部会git cloneHomebrew 的核心仓库homebrew-core这个仓库托管在 GitHub国内直连成功率低于 30%。很多人搜到“Homebrew 国内镜像安装”以为只是换curl地址这是巨大误区。真正的镜像方案必须覆盖三个环节安装脚本本身、Git 克隆源、Bottle预编译二进制下载源。我推荐的完整流程是# 1. 先确保 curl 和 git 可用macOS 自带但检查下版本 curl --version # 应 7.64.1 git --version # 应 2.20.1 # 2. 下载并修改安装脚本关键 cd /tmp curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install.git -o install.sh # 用 sed 替换脚本中的 GitHub URL 为清华镜像 sed -i s|https://github.com/Homebrew|https://mirrors.tuna.tsinghua.edu.cn/git/homebrew|g install.sh sed -i s|https://api.github.com/repos/Homebrew|https://api.github.com/repos/mirrors-tuna-tsinghua/homebrew|g install.sh # 3. 执行修改后的脚本注意不要加 -f 参数避免强制覆盖 /bin/bash install.sh # 4. 安装后立即配置镜像源否则 brew install 仍会失败 echo export HOMEBREW_BOTTLE_DOMAINhttps://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles ~/.zshrc echo export HOMEBREW_CORE_GIT_REMOTEhttps://mirrors.tuna.tsinghua.edu.cn/git/homebrew-core ~/.zshrc source ~/.zshrc # 5. 验证这步必须成功否则后续全崩 brew doctor # 应输出 Your system is ready to brew. brew update # 应快速完成无 timeout提示sed -i 中的空字符串是 macOS 特有的语法Linux 上是sed -i别抄错。清华镜像站tuna.tsinghua.edu.cn是目前最稳定的中科大ustc.edu.cn偶尔同步延迟阿里云mirrors.aliyun.com对 Apple Silicon 支持稍弱。为什么不能简单用HOMEBREW_BOTTLE_DOMAIN就完事因为 Homebrew 安装时第一步是git clone https://github.com/Homebrew/brew这个地址不走HOMEBREW_BOTTLE_DOMAIN必须提前替换安装脚本里的硬编码 URL。我曾见同事跳过第 2 步只配了第 4 步结果brew install node卡在Cloning into /opt/homebrew/Library/Taps/homebrew/homebrew-core...等了 22 分钟超时失败。3.2 Node.js 安装拒绝nvm拥抱brew install node的深层原因网络上充斥着“用 nvm 管理 Node.js 版本”的教程但 OpenClaw 明确要求node --version输出必须是 Homebrew 安装的版本。原因有三第一权限一致性。brew install node会把node和npm二进制放在/opt/homebrew/bin/Apple Silicon或/usr/local/bin/Intel而nvm安装的 node 在~/.nvm/versions/node/v20.15.0/bin/当 OpenClaw 的 Skill 里调用spawn(npm, [install])时它依赖PATH查找如果nvm的路径没正确注入到所有 Shell 会话比如 tmux 新窗口没 source.zshrc就会找不到npm第二全局包隔离。nvm的npm install -g是 per-version 的nvm use 18和nvm use 20的全局包互不干扰但 OpenClaw 的 Skill 可能需要调用eslint、prettier等全局 CLI如果它们只装在 v18 下v20 的 OpenClaw 就执行失败第三也是最关键的——Homebrew 的node包含了完整的node-gyp构建链而nvm安装的 node 默认不带node-gyp需要额外npm install -g node-gyp且node-gyp依赖 Python 和 Xcode CLT版本错配极易崩溃。所以我的标准操作是# 卸载所有 nvm 相关如果已装 rm -rf ~/.nvm sed -i /nvm/d ~/.zshrc source ~/.zshrc # 用 brew 安装最新 LTS 版本目前是 20.15.0 brew install node # 验证必须同时看到 node 和 npm node --version # v20.15.0 npm --version # 10.7.0 # 设置 npm 全局安装路径到 Homebrew 目录避免权限问题 mkdir -p /opt/homebrew/lib/node_modules npm config set prefix /opt/homebrew # 这样 npm install -g xxx 就会装到 /opt/homebrew/lib/node_modules/注意npm config set prefix这一步极其重要。如果不设npm install -g默认装到~/lib/node_modules/而 OpenClaw 的 Skill 执行时require(xxx)会去NODE_PATH查找Homebrew 的 node 默认不包含用户目录导致Cannot find module xxx。设为/opt/homebrew后/opt/homebrew/lib/node_modules自动加入NODE_PATH。3.3 OpenClaw 本体安装与初始化openclaw init不是形式主义执行brew tap openclaw-org/tap brew install openclaw后你以为就完了不这只是开始。接下来必须运行openclaw init这个命令会做五件事创建~/.openclaw/目录作为所有 Skill、配置、缓存的根目录生成~/.openclaw/config.json其中defaultShell字段默认设为zsh根据你当前$SHELL自动识别初始化~/.openclaw/skills/目录并克隆官方 Skill 仓库openclaw-org/skills到~/.openclaw/skills/core/在~/.zshrc末尾追加一行source /opt/homebrew/opt/openclaw/share/openclaw-completion.zsh启用命令补全输入openclaw [tab]就能列出所有 Skill运行一次openclaw update拉取最新的 Skill 定义。提示openclaw init会检查~/.openclaw/是否存在如果存在它不会覆盖而是增量更新。所以如果你之前手动创建过这个目录init可能跳过某些步骤。遇到问题时最干净的重装方式是rm -rf ~/.openclaw brew uninstall openclaw brew install openclaw openclaw init。初始化完成后立刻验证openclaw list # 应输出 15 个官方 Skill如 clean, git, brew, node openclaw info clean # 应显示该 Skill 的描述、触发词、作者 openclaw run clean temp # 应执行清理 /var/folders/.../T/ 下的临时文件如果openclaw list报错Error: Cannot find module openclaw/core说明openclaw init没成功大概率是~/.openclaw/skills/core/目录为空此时手动执行mkdir -p ~/.openclaw/skills/core git clone https://github.com/openclaw-org/skills.git ~/.openclaw/skills/core3.4 技能Skill的本地开发与调试从“Hello World”到生产级OpenClaw 的 Skill 本质是 CommonJS 模块放在~/.openclaw/skills/下的任意子目录里。官方推荐结构是~/.openclaw/skills/ ├── core/ # 官方维护的通用 Skill ├── personal/ # 你自己写的私有 Skill └── team/ # 团队共享的 Skill可通过 git submodule 管理写一个最简单的hello.js// ~/.openclaw/skills/personal/hello.js module.exports { name: hello, description: Print hello world with your name, triggers: [hello, hi], args: [ { name: name, type: string, required: true, description: Your name } ], async run({ args, logger }) { logger.info(Hello, ${args.name}! Welcome to OpenClaw.); return { success: true }; } };保存后在终端执行openclaw list # 应看到新增的 hello Skill openclaw run hello --name Alex # 输出: Hello, Alex! Welcome to OpenClaw.关键细节triggers数组定义了触发词openclaw hello --name Alex和openclaw hi --name Alex效果一样args定义了命令行参数OpenClaw 会自动解析--name并传入args.namelogger是 OpenClaw 提供的日志对象logger.info()输出绿色文字logger.error()输出红色比console.log()更专业return { success: true }是约定返回值success: false会让openclaw run返回非零退出码方便在 shell 脚本里判断成败。调试技巧如果 Skill 报错openclaw run默认不显示堆栈加--debug参数openclaw run hello --name Alex --debug修改 Skill 后无需重启 OpenClaw它每次run都是动态require()改完保存立即生效想测试 Skill 是否能访问系统命令加一行const { execSync } require(child_process); execSync(ls -la);如果报错command not found说明 PATH 没继承需在run函数开头加process.env.PATH process.env.PATH || /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin;。4. 实战场景与高级配置让 OpenClaw 成为你 Mac 的“第二大脑”4.1 场景一自动化 Git 工作流比 alias 强 10 倍你肯定写过alias gsgit status、alias gagit add .但这些 alias 无法处理复杂逻辑。比如“一键提交所有变更跳过暂存区自动添加 .gitignore 规则里的文件”alias 做不到shell script 写起来又啰嗦。OpenClaw 的git-commit-allSkill 就是为此而生// ~/.openclaw/skills/personal/git-commit-all.js const { execSync } require(child_process); const fs require(fs); module.exports { name: git-commit-all, description: Commit all changes including untracked files, with auto .gitignore handling, triggers: [git-commit-all, gca], args: [ { name: message, type: string, required: true, description: Commit message } ], async run({ args, logger }) { try { // 1. 检查是否在 git repo 中 execSync(git rev-parse --is-inside-work-tree, { stdio: ignore }); // 2. 获取 .gitignore 中的模式简化版实际应解析完整语法 let ignorePatterns []; if (fs.existsSync(.gitignore)) { const ignoreContent fs.readFileSync(.gitignore, utf8); ignorePatterns ignoreContent .split(\n) .map(line line.trim()) .filter(line line !line.startsWith(#)); } // 3. 添加所有未跟踪文件排除 .gitignore 规则 const untracked execSync(git ls-files --others --exclude-standard, { encoding: utf8 }) .trim() .split(\n) .filter(file file !ignorePatterns.some(pattern file.includes(pattern))); if (untracked.length 0) { logger.info(Adding ${untracked.length} untracked files...); untracked.forEach(file execSync(git add ${file}, { stdio: ignore })); } // 4. 提交 execSync(git commit -m ${args.message}, { stdio: inherit }); logger.success(✅ Commit successful!); return { success: true }; } catch (error) { logger.error(❌ Failed: ${error.message}); return { success: false }; } } };使用openclaw git-commit-all --message feat: add new dashboard。它比git add . git commit -m xxx安全得多因为会尊重.gitignore不会误提交node_modules/或dist/。我把它绑定到 VS Code 的快捷键通过tasks.json调用openclaw git-commit-all真正实现“CtrlShiftP → Git: Commit All”。4.2 场景二智能清理比brew cleanup更懂你的磁盘brew cleanup只清理 Homebrew 安装的旧版本但 Mac 的磁盘空间杀手往往是~/Library/Caches/、~/Downloads/、/var/folders/。OpenClaw 的clean-smartSkill 结合了时间、大小、类型三维过滤// ~/.openclaw/skills/personal/clean-smart.js const { execSync } require(child_process); const path require(path); module.exports { name: clean-smart, description: Smart cleanup of caches, downloads, and temp files based on size age, triggers: [clean-smart, cs], args: [ { name: days, type: number, default: 30, description: Max age in days (default: 30) }, { name: min-size-mb, type: number, default: 100, description: Min size in MB to target (default: 100) } ], async run({ args, logger }) { const DAYS args.days; const MIN_SIZE_MB args.minSizeMb; // 清理 Downloads 中超过 30 天且大于 100MB 的文件 logger.info( Scanning ~/Downloads for files ${MIN_SIZE_MB}MB, ${DAYS} days old...); const downloadsCmd find ~/Downloads -type f -mtime ${DAYS} -size ${MIN_SIZE_MB}M -print0 | wc -l | tr -d ; const downloadCount parseInt(execSync(downloadsCmd, { encoding: utf8 }).trim()); if (downloadCount 0) { logger.warn(⚠️ Found ${downloadCount} large old files in Downloads. Cleaning...); execSync(find ~/Downloads -type f -mtime ${DAYS} -size ${MIN_SIZE_MB}M -delete, { stdio: ignore }); logger.success(✅ Cleaned ${downloadCount} files from Downloads); } else { logger.info(✅ No large old files found in Downloads); } // 类似逻辑处理 Caches 和 temp... // 此处省略实际代码包含对 ~/Library/Caches/ 和 /var/folders/ 的扫描 return { success: true }; } };使用openclaw clean-smart --days 7 --min-size-mb 50清理过去 7 天内、大于 50MB 的旧文件。我把它设为每周 cron 任务0 2 * * 0 openclaw clean-smart --days 7 --min-size-mb 100周日凌晨 2 点执行。4.3 场景三终端复用增强Tabby OpenClaw 的黄金组合Tabby 是我目前用过的最好的终端工具但它原生不支持“基于命令的会话复用”。比如我想让openclaw dev-server启动的本地开发服务器始终运行在一个名为dev的 Tabby 标签页里而不是每次新开一个。OpenClaw 的session插件解决了这个问题# 安装 session 插件官方提供 brew install openclaw-session # 启动一个命名会话 openclaw session start dev --command npm run dev # 后续想连接到这个会话 openclaw session attach dev # 或者直接发送命令到会话 openclaw session send dev rsync -av ./dist/ userserver:/var/www/原理是openclaw session start会在后台用tmux创建一个命名会话tmux new-session -d -s dev然后在其中执行npm run devattach就是tmux attach -t devsend就是tmux send-keys -t dev rsync... Enter。这样你的开发服务器、数据库、前端构建都可以用openclaw session统一管理Tabby 只负责显示逻辑全在 OpenClaw 层。我甚至写了openclaw session list的 Skill用tmux ls解析输出生成 Markdown 表格直接贴到团队 Wiki 里。4.4 高级配置自定义 Shell 集成与错误处理OpenClaw 默认用zsh但如果你用fish或bash需要手动配置。以fish为例在~/.config/fish/config.fish末尾添加# OpenClaw completion for fish set -q XDG_DATA_HOME; or set XDG_DATA_HOME ~/.local/share set -q OPENCLAW_SHARE; or set OPENCLAW_SHARE /opt/homebrew/share/openclaw if test -f $OPENCLAW_SHARE/openclaw-completion.fish source $OPENCLAW_SHARE/openclaw-completion.fish end错误处理是 OpenClaw 的隐藏王牌。所有 Skill 的run函数都包裹在 try-catch 中但你可以主动抛出特定错误让 OpenClaw 做差异化处理。比如// 在 Skill 中 if (!fs.existsSync(/usr/local/bin/docker)) { throw new Error(DOCKER_MISSING); // OpenClaw 会捕获这个字符串 }然后在~/.openclaw/config.json里配置{ errorHandlers: { DOCKER_MISSING: { message: Docker is not installed. Run brew install docker first., action: brew install docker } } }这样当 Skill 报DOCKER_MISSING错时OpenClaw 不仅显示友好提示还会问你“Run brew install docker now? (y/N)”按 y 就自动执行。这种“错误即操作”的设计大幅降低新用户门槛。5. 常见问题与避坑指南那些没人告诉你的“Mac 专属雷区”5.1 “Failed to install Homebrew portable Ruby” 错误不是 Ruby 问题是系统证书过期这个错误通常出现在较老的 macOS10.15 Catalina 之前或企业锁控 Mac 上。错误信息里提到 “portable Ruby”让人以为要装 Ruby其实根源是 Homebrew 安装脚本里curl调用 GitHub API 时SSL 证书验证失败。根本原因是 macOS 系统根证书库过旧无法验证 GitHub 的新证书链。解决方案三步更新 macOS 系统到最新版首选一劳永逸如果无法更新手动更新根证书下载 Apple Root Certificate Bundle 双击安装到“系统”钥匙串然后在钥匙串访问中找到“DigiCert Global Root G3”右键“显示简介”→“信任”→“使用此证书时始终信任”最后强制curl忽略证书验证仅临时应急# 修改 Homebrew 安装脚本把所有 curl 命令加上 -k 参数 sed -i s|curl -fsSL|curl -fsSL -k|g install.sh注意-k参数有安全风险仅用于内网或可信环境生产环境务必用前两步。5.2 “Node.js v24.16.0 is not yet released”Homebrew 的版本同步延迟Homebrew 的node公式formula更新有滞后性。当 Node.js 官网发布 v24.16.0Homebrew 的node公式可能还在 v24.15.0此时brew install node24就会报这个错。这不是你的错是 Homebrew 维护者的节奏问题。应对策略查看 Homebrew node 公式状态brew search node如果输出node最新稳定版和node22、node20但没有node24说明 v24 尚未被接纳临时降级brew install node22 brew link --force node22或者绕过 Homebrew用官方二进制从 nodejs.org/dist/ 下载node-v24.16.0-darwin-arm64.tar.xz解压到/opt/node然后sudo ln -sf /opt/node/bin/node /opt/homebrew/bin/node长期建议订阅 Homebrew 的 GitHub Releases 关注node公式的更新。5.3 “Terminal 进程启动失败: 启动期间发生本机异常(无法启动 conpty)”VS Code 的 Windows 遗留 Bug这个错误消息里出现了conptyConsole Pseudo-Terminal这是 Windows 10 的概念Mac 上根本不存在。它暴露了一个事实你正在用 VS Code 的Windows 版本安装包.exe通过 CrossOver 或 Parallels 运行在 Mac 上VS Code 官网下载页有明确区分macOS 是.zip或.dmgWindows 是.exe。一旦用错VS Code 会尝试加载 Windows 的 conpty.dll自然失败。验证方法在终端执行code --version如果输出类似1.85.0 x64且x64后面跟着一串数字如1703212345这就是 Windows 版本。macOS 版本输出是1.85.0 arm64或1.85.0 x64无后续数字。解决方案卸载当前 VS Code访问 code.visualstudio.com → Download for macOS → 选择.zipApple Silicon或.dmgIntel重新安装。这个 Bug 我见过