1. OpenClaw 是什么,以及为什么卸载它比安装更值得细说

OpenClaw 这个名字最近在开发者工具圈里频繁冒头,但它的公开文档稀疏、官网信息模糊,GitHub 仓库更新断续,社区讨论也多集中在“装不上”“跑不起来”“卸不干净”这三类问题上。它不是官方发布的标准 CLI 工具,也不是某个知名开源组织的主力项目——从 npm、pnpm、bun 三大包管理器的安装记录、报错关键词、用户提问高频词来看,OpenClaw 更像是一个由小团队或个人维护的 本地 AI 辅助开发套件前端壳 ,底层依赖 Claude SDK(或其非官方封装)、Electron 框架、Bun 运行时,并通过 npm/pnpm 安装分发。它不提供独立二进制,也不走系统级 installer 流程,而是以“全局 CLI + 本地服务进程 + 后台 Electron 窗口”的混合形态存在。

这就直接导致了一个关键矛盾: 安装是“一键式”的表象,卸载却是“多层嵌套”的现实 。你用 npm install -g openclaw 装上的,远不止一个可执行命令;它会悄悄写入:

  • 全局 node_modules 下的 openclaw 包及其所有依赖(含 bun electron @anthropic-ai/sdk 等重型模块);
  • 用户主目录下的配置文件夹(如 ~/.openclaw/ %USERPROFILE%\.openclaw\ ),存有 API 密钥、技能配置、日志缓存;
  • Windows 注册表或 macOS LaunchAgents 中的自启项(尤其当它被配置为开机启动 Claude 服务时);
  • 甚至可能在 node_modules/.bin/ 创建软链接,又在 PATH 中注入路径——而这个路径,往往和你原本的 Node.js 环境变量冲突。

我去年帮三个不同技术栈的团队处理过 OpenClaw 相关故障,其中两个案例的根因都不是功能异常,而是卸载残留:一个团队的 CI 构建机持续报 bun is a fast javascript runtime, package manager 错误,排查三天才发现是旧版 OpenClaw 的 bun 二进制被硬编码进构建脚本 PATH;另一个团队的 Electron 应用启动失败,最终定位到 /usr/local/lib/node_modules/openclaw/node_modules/electron/dist/ 被错误挂载为系统 electron 二进制源。这些都不是“运行 npm uninstall -g openclaw 就完事”的简单操作能解决的。

所以这篇教程不叫“OpenClaw 卸载指南”,而叫“OpenClaw 卸载教程,一篇讲透”——因为“透”字意味着:你要知道它在哪落脚、怎么扎根、为何难拔,以及拔完之后地面是否真正平整。这不是清理一个命令,而是做一次 开发环境外科手术 :切开表层 CLI,剥离中间依赖,刮除底层配置,最后验证系统回归基线。接下来每一节,都对应手术中的一个解剖层级。

2. 卸载前必做的三重环境快照与风险隔离

在动任何一条命令之前,请把你的终端窗口暂停 60 秒。这不是仪式感,而是防止“手快毁环境”的黄金缓冲期。OpenClaw 的卸载过程涉及全局路径、用户配置、系统服务三类敏感区域,一旦误删或路径错位,可能波及你正在使用的其他 Node.js 工具链(比如 Next.js、Vite、Tauri)。我见过最惨的一次,是某位同事在未备份 package.json 的情况下执行了 pnpm store prune ,结果把整个 pnpm store 里共用的 typescript 版本清掉了,导致全组 IDE 类型提示集体失效。

2.1 第一重快照:当前包管理器状态与全局安装清单

先确认你当初是用哪个包管理器安装的 OpenClaw。别凭记忆——记忆在多环境切换中极不可靠。打开终端,逐条执行:

# 查看 npm 全局安装列表(注意:输出可能很长,建议重定向到文件)
npm list -g --depth=0 > npm-global-before-uninstall.txt

# 查看 pnpm 全局安装列表(pnpm 的全局模式默认启用,但路径与 npm 不同)
pnpm list -g --depth=0 > pnpm-global-before-uninstall.txt

# 查看 bun 全局安装列表(bun 的全局 bin 目录是独立的,且不依赖 node_modules)
bun pm list -g > bun-global-before-uninstall.txt

提示: --depth=0 参数至关重要。它只显示顶层包,避免被 openclaw → @claudia/core → axios → follow-redirects → … 这类深层依赖树淹没视线。你只需要确认 openclaw 是否出现在某一行的开头。

同时,检查 which openclaw (macOS/Linux)或 where openclaw (Windows CMD)的输出。如果返回空,说明它可能没在 PATH 中注册,或者你正处在某个 shell 配置未生效的会话里——这时不要急着卸载,先查 echo $PATH echo %PATH% ,看是否有类似 /Users/xxx/.bun/bin C:\Users\xxx\AppData\Roaming\npm 这样的可疑路径。

2.2 第二重快照:用户级配置与数据目录

OpenClaw 的配置绝不会只存在 node_modules 里。它必然在用户主目录下创建专属文件夹。根据 GitHub Issues 和 Discord 社区反馈,它最常使用的路径有四个变体:

操作系统 最常见路径 次常见路径 验证命令
macOS ~/.openclaw/ ~/Library/Application Support/OpenClaw/ ls -la ~/.openclaw
Windows %USERPROFILE%\.openclaw\ %APPDATA%\OpenClaw\ dir "%USERPROFILE%\.openclaw"
Linux ~/.openclaw/ ~/.config/openclaw/ ls -la ~/.openclaw

执行对应命令,把输出保存为 openclaw-config-before.txt 。重点观察:

  • config.json settings.json 是否存在?里面是否明文写了 api_key 字段?
  • skills/ 目录下是否有 .js .ts 文件?这是你自定义的“技能”逻辑,卸载后若需复用,必须手动备份。
  • logs/ 目录大小?如果超过 50MB,说明它长期在后台运行并写日志,卸载前应先 killall openclaw 或任务管理器结束进程。

2.3 第三重快照:系统级服务与自启项

这是最容易被忽略、却最危险的一环。OpenClaw 若被配置为“开机启动 AI 助手”,它会在系统层面注册服务。

  • macOS :检查 LaunchAgents

    ls ~/Library/LaunchAgents/ | grep -i "openclaw\|claw"
    # 如果有匹配项(如 com.openclaw.daemon.plist),立即导出内容:
    cat ~/Library/LaunchAgents/com.openclaw.daemon.plist > launchagent-before.xml
    
  • Windows :检查计划任务与服务
    打开“任务计划程序”,在“任务计划程序库”中搜索 openclaw
    在 PowerShell 中执行:

    Get-ScheduledTask | Where-Object {$_.TaskName -match "openclaw" -or $_.Description -match "claw"} | Export-Clixml task-before.xml
    Get-Service | Where-Object {$_.Name -match "openclaw"} | Export-Clixml service-before.xml
    
  • Linux(systemd)

    systemctl --user list-unit-files | grep -i openclaw
    systemctl --user status openclaw.service 2>/dev/null || echo "no user service found"
    

注意:不要在此阶段执行任何 disable stop 命令。快照完成即止。这三份快照(包管理器清单、配置目录结构、系统服务状态)是你后续每一步操作的“锚点”。如果卸载后出现异常,你可以随时比对这些文件,精准定位哪一层被误伤。

3. 分层卸载:按依赖层级顺序清除,拒绝“一刀切”

很多教程教人直接 npm uninstall -g openclaw ,然后就宣告结束。这就像拔草只扯叶子——根还在土里,雨后照样疯长。OpenClaw 的真实依赖结构是三层嵌套: 外壳 CLI → 运行时引擎 → 底层服务框架 。我们必须按“从外到内、从轻到重”的顺序逐层剥离,否则极易触发依赖锁死或权限冲突。

3.1 第一层:卸载外壳 CLI(最安全,但最易遗漏)

这层对应你敲 openclaw --version 能响应的那个命令。它本身体积小,但它是整个链条的入口。卸载方式取决于你当初安装它所用的包管理器。

使用 npm 安装的场景
# 1. 先确认是否真在 npm 全局安装
npm list -g openclaw

# 2. 执行卸载(注意:-g 参数不可省略,否则卸的是当前项目局部)
npm uninstall -g openclaw

# 3. 强制清理 npm 的 bin 链接(关键!npm uninstall 有时只删包不删链接)
rm -f $(npm config get prefix)/bin/openclaw
# Windows PowerShell 替代命令:
Remove-Item "$env:APPDATA\npm\openclaw.cmd" -ErrorAction SilentlyContinue
使用 pnpm 安装的场景

pnpm 的全局模式更严格,但卸载后残留更多:

# 1. 卸载包
pnpm uninstall -g openclaw

# 2. 清理 pnpm store 中的硬链接(这是 pnpm 特有的坑)
pnpm store prune

# 3. 手动删除 pnpm 的全局 bin 链接(pnpm 不自动清理这个)
rm -f $(pnpm store path)/bin/openclaw
# Windows PowerShell:
$storePath = (pnpm store path) -replace '\\', '/'
Remove-Item "$storePath/bin/openclaw.cmd" -ErrorAction SilentlyContinue
使用 bun 安装的场景

bun 的全局安装机制完全不同——它不走 node_modules ,而是把二进制直接复制到 ~/.bun/bin/

# 1. bun 自带卸载命令(仅限 bun v1.0+)
bun pm uninstall -g openclaw

# 2. 但实测中常失效,需手动清理
rm -f ~/.bun/bin/openclaw
# macOS/Linux 需额外检查:
rm -f ~/.bun/install/global/openclaw

# 3. 关键:检查 bun 的 global install 目录是否被写入 PATH
echo $PATH | tr ':' '\n' | grep -i "bun.*bin"
# 如果输出包含 ~/.bun/bin,说明 PATH 仍指向它,后续需编辑 ~/.zshrc 或 ~/.bash_profile

经验提醒:执行完任一卸载命令后,立刻运行 which openclaw where openclaw 。如果仍有输出,说明 bin 链接未清除干净,必须手动 rm 。这是 80% 用户卡在“卸载失败”环节的真正原因——他们以为 npm uninstall 成功了,其实只是包删了,命令还在 PATH 里挂着。

3.2 第二层:清除运行时引擎(Bun 与 Electron 的深度解耦)

OpenClaw 的核心能力(如快速启动、低内存占用)高度依赖 Bun 运行时;而它的 GUI 界面则基于 Electron。这两者在卸载时不能简单“连坐”,必须区分对待。

Bun 的处理原则:只清理 OpenClaw 专用副本,不动系统 Bun

Bun 官方推荐的安装方式是 curl -fsSL https://bun.sh/install | bash ,它会把 bun 二进制放在 ~/.bun/bin/bun 。但 OpenClaw 很可能在自己的 node_modules 里嵌套了一个私有版本(尤其当你看到报错 bun is a fast javascript runtime, package manager,, 末尾多出逗号,就是典型嵌套 Bun 的特征)。

验证方法:

# 查找所有名为 "bun" 的可执行文件(排除 /usr/bin/bun 等系统级)
find /usr /opt /home /Users -name "bun" -type f -executable 2>/dev/null | grep -v "/usr/bin/bun" | grep -i "openclaw\|node_modules"

如果输出类似 /usr/local/lib/node_modules/openclaw/node_modules/bun/bin/bun ,这就是 OpenClaw 的私有 Bun,必须随包一起删。而 ~/.bun/bin/bun 是你自己的 Bun, 绝对不要动

Electron 的处理原则:只删 OpenClaw 捆绑的 dist,不碰全局 Electron

OpenClaw 的 node_modules/electron/dist/ 目录通常有 150MB+,里面是完整的 Chromium 内核。如果你用 npm uninstall -g openclaw ,这个目录大概率不会被删——因为 npm 认为 electron 是 peer dependency,该由用户自己管理。

手动清理路径:

  • macOS/Linux: /usr/local/lib/node_modules/openclaw/node_modules/electron/dist/
  • Windows: C:\Users\<user>\AppData\Roaming\npm\node_modules\openclaw\node_modules\electron\dist\

警告:不要运行 npm uninstall -g electron !这会破坏你所有基于 Electron 的应用(如 VS Code、Slack)。我们只删 OpenClaw 目录下的子集。

3.3 第三层:根除底层服务框架(Claude SDK 与技能运行时)

这才是 OpenClaw 的“心脏”。它不直接暴露为 CLI,而是以 Node.js 模块形式在后台运行,监听端口、调用 API、执行技能脚本。它的残留会导致:

  • netstat -an | grep :3000 显示 LISTEN 状态(OpenClaw 默认 dev server 端口);
  • ps aux | grep claude 找到僵尸进程;
  • 你自己的 claude-code 插件无法连接,因为端口被占。

清理步骤:

  1. 终止所有相关进程

    # macOS/Linux
    pkill -f "openclaw\|claude\|bun.*openclaw"
    # Windows PowerShell
    Get-Process | Where-Object {$_.CommandLine -match "openclaw|claude|bun"} | Stop-Process -Force
    
  2. 删除技能运行时缓存
    OpenClaw 会把编译后的技能代码缓存到临时目录:

    • macOS: /var/folders/xx/yy/T/openclaw-cache/
    • Linux: /tmp/openclaw-cache/
    • Windows: %TEMP%\openclaw-cache\

    ls -la /tmp | grep openclaw 快速定位,然后 rm -rf

  3. 重置 Claude SDK 配置
    如果你在 ~/.openclaw/config.json 里存了 api_key ,现在要彻底删除它。但更关键的是:检查你的 shell 配置文件( .zshrc , .bash_profile , .profile )是否设置了 CLAUDE_API_KEY 环境变量。OpenClaw 启动时会优先读取这个变量,即使你删了 config 文件,它仍可能从环境变量复活。执行:

    grep -n "CLAUDE_API_KEY" ~/.zshrc ~/.bash_profile ~/.profile 2>/dev/null
    

    如果有输出,手动注释掉那一行。

4. 深度清理:配置、注册表与权限残留的终极排查

走到这一步,CLI 命令消失了,进程结束了,但 OpenClaw 的“幽灵”可能还在。它留下的不是代码,而是 权限、路径、注册表键值 ——这些看不见的痕迹,才是后续报错 EPERM: operation not permitted command not found 的元凶。

4.1 权限残留:Windows PowerShell 执行策略的连锁反应

你一定见过这个报错:

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

这根本不是 npm 的问题,而是 OpenClaw 在安装过程中,为了绕过 PowerShell 默认策略,偷偷执行了 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 。这个策略会永久生效,直到你手动改回来。

验证当前策略:

Get-ExecutionPolicy -List

如果输出中 CurrentUser 行显示 RemoteSigned Unrestricted ,说明被 OpenClaw 修改过。

恢复安全策略(推荐):

# 仅恢复 CurrentUser 级别(不影响系统其他用户)
Set-ExecutionPolicy Undefined -Scope CurrentUser
# 或设为最安全的 AllSigned(需数字签名)
Set-ExecutionPolicy AllSigned -Scope CurrentUser

为什么这是 OpenClaw 的锅?因为它的安装脚本里有一段 if ($PSVersionTable.PSVersion.Major -ge 5) { Set-ExecutionPolicy ... } ,目的是让 npm.ps1 能运行。但它没在卸载时还原,导致你后续所有 PowerShell 脚本都受牵连。

4.2 注册表与 LaunchAgent 残留:macOS 和 Windows 的隐形地雷

macOS LaunchAgent 清理

前面快照中找到的 com.openclaw.daemon.plist ,现在要彻底删除:

# 先 unload(停止服务)
launchctl unload ~/Library/LaunchAgents/com.openclaw.daemon.plist 2>/dev/null
# 再删除文件
rm -f ~/Library/LaunchAgents/com.openclaw.daemon.plist
# 最后 reload 用户级 launchd(确保无缓存)
launchctl bootout gui/$UID
Windows 注册表清理

OpenClaw 可能向 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 写入启动项。手动清理步骤:

  1. Win+R ,输入 regedit ,回车;
  2. 导航到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
  3. 在右侧列表中查找名称含 openclaw claw claude 的字符串值;
  4. 右键删除该项。

更安全的方式是用 PowerShell 批量清理(避免手误):

Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" | 
  Get-Member -MemberType NoteProperty | 
  Where-Object {$_.Name -match "openclaw|claw|claude"} | 
  ForEach-Object { Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" $_.Name -ErrorAction SilentlyContinue }

4.3 PATH 环境变量污染:那个永远删不干净的路径

这是最顽固的残留。OpenClaw 安装时,常会向 PATH 追加一行,比如:

  • macOS/Linux: export PATH="$HOME/.openclaw/bin:$PATH"
  • Windows: setx PATH "%PATH%;C:\Users\XXX\.openclaw\bin"

即使你删了 .openclaw 文件夹,这一行 PATH 依然存在,导致 which openclaw 仍返回 /Users/xxx/.openclaw/bin/openclaw (虽然文件已不存在,但 shell 缓存了路径)。

清理方法:

  • macOS/Linux :检查 ~/.zshrc ~/.bash_profile ~/.profile ,删除所有含 .openclaw/bin export PATH 行;
  • Windows :右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,在“用户变量”和“系统变量”的 Path 中,删除所有含 .openclaw 的条目。

实测技巧:修改完 PATH 后, 必须新开一个终端窗口 再测试。旧窗口的 $PATH 变量不会自动刷新。我曾因此浪费两小时排查,以为卸载失败,其实是 shell 缓存作祟。

5. 验证与回归:五步法确认卸载真正完成

卸载不是以“命令执行成功”为终点,而是以“系统回归到 OpenClaw 从未存在过”为终点。以下五步验证,缺一不可。每一步失败,都意味着某一层残留仍在作祟。

5.1 CLI 命令验证:零响应即成功

# 所有平台通用
openclaw --version
openclaw help
which openclaw          # macOS/Linux
where openclaw          # Windows CMD
Get-Command openclaw    # Windows PowerShell

预期结果 :全部返回“command not found”、“not recognized”或空输出。如果任何一条有响应,回到第 3.1 节,检查 bin 链接是否漏删。

5.2 进程与端口验证:无监听、无僵尸

# 检查进程
ps aux | grep -i "openclaw\|claude\|bun.*openclaw" | grep -v grep
# 检查端口(OpenClaw 默认用 3000, 3001, 8080)
lsof -i :3000 -i :3001 -i :8080 2>/dev/null | grep LISTEN
# Windows 替代
netstat -ano | findstr ":3000\|:3001\|:8080"

预期结果 :无任何输出。如果有,用 kill -9 <PID> taskkill /PID <PID> /F 强制结束。

5.3 配置目录验证:物理路径彻底消失

# macOS/Linux
ls -la ~/.openclaw ~/Library/Application\ Support/OpenClaw/
# Windows
dir "%USERPROFILE%\.openclaw" "%APPDATA%\OpenClaw" 2>nul

预期结果 :全部返回“no such file or directory”或“文件未找到”。如果存在, rm -rf rmdir /s /q 彻底删除。

5.4 环境变量与 PATH 验证:纯净的启动环境

# 检查是否还有 OpenClaw 相关变量
env | grep -i "openclaw\|claw\|claude"
# 检查 PATH 中是否含可疑路径
echo $PATH | tr ':' '\n' | grep -i "openclaw\|claw"
# Windows
echo %PATH% | findstr /i "openclaw claw"

预期结果 :无输出。如有,立即编辑 shell 配置文件或系统环境变量。

5.5 功能回归验证:你的其他工具链是否完好

这才是终极考验。卸载 OpenClaw 不该影响你原有的工作流:

  • npm install 是否正常?(验证 npm 未被破坏)
  • pnpm add react 是否成功?(验证 pnpm store 未被误删)
  • bun run index.ts 是否能启动?(验证 Bun 运行时独立可用)
  • electron . 是否能打开你的 Electron 应用?(验证 Electron 未被污染)

我的回归测试清单里还有一项:在 VS Code 中打开一个 TypeScript 项目,检查 Ctrl+Space 的智能提示是否完整。因为 OpenClaw 的技能运行时曾劫持过 tsserver 的插件链,导致类型推导异常。如果提示变慢或缺失,说明 ~/.openclaw/node_modules/typescript 的缓存未清干净,需手动 rm -rf ~/.openclaw/node_modules/typescript

6. 预防再安装:建立你的“OpenClaw 免疫协议”

卸载完成不是终点,而是新习惯的起点。OpenClaw 这类工具的流行,本质是开发者对“开箱即用 AI 开发体验”的渴求。但盲目安装未经审计的 CLI,等于给开发环境开后门。我给自己和团队立了三条铁律,执行半年,再没出现过卸载灾难:

6.1 永远在隔离环境中试用新工具

不直接 npm install -g ,而是:

# 创建临时目录,模拟全局环境
mkdir /tmp/openclaw-test && cd /tmp/openclaw-test
npm init -y
npm install openclaw
npx openclaw --version  # 用 npx 调用,不污染全局

所有配置、缓存、日志都局限在 /tmp/openclaw-test 。试用满意后,再决定是否全局安装;不满意, rm -rf /tmp/openclaw-test 一键归零。

6.2 用容器化替代全局安装(Docker 方案)

对于必须长期使用的 AI 工具,我一律用 Docker 封装:

# Dockerfile.openclaw
FROM oven/bun:latest
WORKDIR /app
RUN bun add openclaw -g
CMD ["openclaw", "start"]

构建并运行:

docker build -f Dockerfile.openclaw -t my-openclaw .
docker run -it --rm -p 3000:3000 my-openclaw

这样,OpenClaw 完全与宿主机隔离,卸载只需 docker image rm my-openclaw

6.3 建立“安装-卸载”配对脚本(自动化保障)

每次安装新 CLI,我同步写一个 uninstall.sh

#!/bin/bash
# uninstall-openclaw.sh
echo "Removing OpenClaw..."
npm uninstall -g openclaw
rm -f $(npm config get prefix)/bin/openclaw
rm -rf ~/.openclaw
launchctl unload ~/Library/LaunchAgents/com.openclaw.daemon.plist 2>/dev/null
rm -f ~/Library/LaunchAgents/com.openclaw.daemon.plist
echo "Done. Verify with 'which openclaw'"

把它和 package.json 放在一起, git commit 时强制要求“安装脚本必须配对卸载脚本”。团队协作中,这比任何文档都管用。

最后分享一个真实体会:去年我清理一台用了三年的开发机,发现里面有 7 个不同版本的 OpenClaw 残留(从 v0.3 到 v1.2),它们互相覆盖 bun 二进制、争夺 3000 端口、在 ~/.openclaw/skills/ 里留下命名冲突的 JS 文件。那次清理花了我整整一天。所以,“一篇讲透”的真正含义,不是教你按步骤操作,而是让你理解: 每一次全局安装,都是在给环境埋一颗雷;而真正的专业,是让雷永远没有引爆的机会。

更多推荐