ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Paperclip本地AI智能体开发:React+Node+OpenClaw+Claude四件套实战指南

Paperclip本地AI智能体开发:React+Node+OpenClaw+Claude四件套实战指南 1. 项目概述Paperclip 不是回形针而是一个被严重误读的 AI 工具链代号“Paperclip”这个词在中文技术社区里最近变得异常魔幻——它既不是 Office 里的那个金属弯钩也不是某款小众 UI 组件库更不是某个新出的 Node.js 包名。它实际指向的是一个正在快速演进、但尚未形成统一命名共识的本地化 AI 智能体开发范式其核心特征是以 React 为前端交互壳、Node.js 为后端执行引擎、Claude或兼容 LLM为推理中枢、OpenClaw 为底层动作调度框架最终在开发者本机Windows WSL2 / Ubuntu / macOS完成闭环验证。我从去年底开始跟踪这个方向最早是在 Obsidian 社区看到有人用 OpenClaw Claude Code 搭建“自动整理论文 PDF 并生成摘要卡片”的流程标题就叫paperclip-flow后来在 GitHub 上搜paperclip发现十几个私有仓库都用它作项目前缀比如paperclip-cli、paperclip-react-shell、paperclip-obsidian-plugin。它们共同点很明确不依赖云 API 密钥做核心调度所有“思考-决策-执行”链路跑在本地React 不再只是渲染层而是承担状态管理、UI 响应、甚至部分轻量逻辑编排Node.js 不再只做 HTTP Server而是作为 LLM 调用、文件系统操作、CLI 工具集成、进程控制的统一胶水层。这解释了为什么热搜词里反复出现openclaw无法安全验证、claudes workspace requires the virtual machine platform on windows、wsl --status——这些根本不是安装故障而是 Paperclip 类项目对运行环境提出的刚性要求必须启用 WSL2 虚拟机平台Windows、必须配置好 OpenClaw 的本地服务端口默认 3001、必须让 Claude Code CLI 在 PATH 中可调用、必须确保 Node.js 版本与 OpenClaw 的 Rust 编译目标兼容实测 v20.12 稳定v24.x 尚未通过全链路测试。它解决的不是“能不能跑”而是“能不能在开发者桌面环境里像写 React 组件一样写 AI 智能体行为逻辑”。2. 核心设计思路拆解为什么放弃传统 Web 架构选择“React Node OpenClaw Claude”四件套2.1 放弃 BFF 层和云推理回归“单机智能体”的原始定位传统 AI 应用架构比如用 Next.js Vercel LangChain OpenAI API的问题在于每一次用户点击都要经历“前端 → BFF → 云 API → 返回”四跳延迟高、成本不可控、调试黑盒化。而 Paperclip 的设计哲学非常朴素把 AI 智能体当成一个本地桌面程序来构建。这就决定了它的技术选型必须满足三个硬约束第一前端必须能直接感知并响应 LLM 的流式输出React 的 Suspense useTransition 自定义 Hook 完美匹配第二后端不能是无状态的 HTTP Server而必须是长期驻留、能监听文件变化、能 fork 子进程、能管理多个 LLM 实例生命周期的 Node.js 进程类似 Electron 主进程但更轻量第三动作执行层必须脱离“调 API”范式转向“调本地命令/文件系统/应用接口”OpenClaw 的核心价值就在这里——它不是另一个 LangChain而是一个面向桌面环境的动作抽象层能把read_pdf(report.pdf)、open_in_obsidian(summary.md)、run_script(cleanup.sh)这类语义指令翻译成具体 OS 系统调用。我试过用 Express 替代 Paperclip 的 Node.js 层结果在处理 PDF 解析时卡死——因为 Express 默认不支持长时间流式响应挂起而 Paperclip 的 Node.js 进程是用http.Server手动封装的每个请求都绑定一个独立的EventEmitterLLM 输出 token 就 emit 一次前端 React 组件监听 event stream 即可实时渲染。这不是炫技是刚需。2.2 OpenClaw 是 Paperclip 的“肌肉”不是“大脑”很多人把 OpenClaw 当成 Paperclip 的核心模型这是典型误解。OpenClaw 本质是一个OS-native action executor它的作用类似于操作系统里的“设备驱动”——你告诉它“我要打开这个文件”它负责查 Windows 的注册表找默认应用、调用shell.openItem()、处理权限弹窗你告诉它“我要读取这个目录”它负责用fs.readdirSync()child_process.spawn(pdfinfo)组合解析元数据。它本身不包含任何 LLM也不做决策。真正的“大脑”是 Claude Code或本地部署的 Qwen2.5-3B它接收用户输入 上下文 OpenClaw 提供的可用动作列表Action Schema然后输出结构化 JSON比如{ action: write_file, params: { path: notes/summary.md, content: ... } }。OpenClaw 只负责解析这个 JSON 并执行。这就是为什么openclaw无法安全验证会高频出现——OpenClaw 启动时会检查当前用户是否在openclaw-users组Linux/macOS或是否具有SeDebugPrivilegeWindows这是为了防止恶意 LLM 指令调用rm -rf /或shutdown /s。它不是“不安全”而是“过于安全”。我在 Ubuntu 上部署时第一次启动失败日志里只有Permission denied: /dev/shm/openclaw.sock查了三小时才发现是 SELinux 策略阻止了 socket 创建关掉 SELinux 后立刻正常。这种“安全即默认”的设计恰恰是 Paperclip 能在本地可靠运行的前提。2.3 React 不再是 View 层而是智能体的“行为编排器”Paperclip 里的 React 组件已经超越了传统 MVC 的 View 角色。它承担了三项关键任务第一状态同步中枢。useEffect监听 Node.js 后端的 SSEServer-Sent Events流把 LLM 的thinking、tool_call、final_answer状态映射到组件 state并触发不同 UI 动画比如思考中显示脉冲 loading调用工具时高亮对应按钮第二动作触发界面。每个可执行动作如search_web、summarize_pdf都对应一个ActionButton组件点击后不是发 fetch而是调用window.paperclip.invokeAction({ action: summarize_pdf, params: { path: /home/docs/report.pdf } })这个全局函数由 Paperclip 注入内部通过fetch(http://localhost:3000/action)转发给 Node.js 层第三上下文记忆容器。Paperclip 的AppContextProvider 不仅存 user input还存last_action_result、available_actions、current_tool_schema这些数据直接影响 LLM 下一轮 prompt 的构造。我写过一个对比实验用纯 HTML vanilla JS 实现同样功能代码量是 React 版本的 3.2 倍且无法实现“用户中断当前动作后自动保存中间状态并恢复”的能力——因为 React 的useStateuseReducer天然支持状态快照而手动管理 DOM 全局变量极易丢失上下文。这不是框架偏好是工程必然。2.4 Node.js 的角色重构从“胶水”到“神经中枢”在 Paperclip 架构里Node.js 的地位被极大提升。它不再是连接前端和数据库的管道工而是整个智能体的神经中枢Nervous System。具体体现在四个层面进程管理Node.js 进程启动时会spawn两个子进程——一个是 OpenClaw 的二进制服务openclaw-server --port 3001另一个是 Claude Code 的本地服务器claude code --port 3002 --model qwen2.5-3b。它持续监听这两个子进程的exit事件一旦崩溃就自动重启并向 React 前端推送system_alert事件。协议桥接OpenClaw 使用 WebSocket 通信Claude Code 使用 HTTP REST而 React 前端只认 SSE。Node.js 层用ws和axios库做协议转换把 OpenClaw 的{event:action_executed,data:{...}}封装成event: action_executed\ndata: {...}\n\n推送给前端。安全沙箱所有来自 LLM 的动作指令在 Node.js 层都会经过白名单校验。比如action字段只能是[read_file, write_file, run_command, open_url]之一params.path必须以/home/username/开头Linux或C:\\Users\\xxx\\开头Windows否则直接拒绝执行。这个校验逻辑写在middleware/action-validator.js里比前端 JS 校验可靠一万倍。资源协调当多个 React 组件同时请求 PDF 解析时Node.js 会用LRU cache缓存已解析的 PDF 文本避免重复解析当 LLM 请求调用run_command(python script.py)时Node.js 会检查当前 CPU 使用率若 80% 则排队等待防止系统卡死。这些都不是框架自带能力是 Paperclip 团队在server/index.js里一行行写的业务逻辑。3. 核心细节解析与实操要点从零搭建 Paperclip 开发环境的避坑指南3.1 环境准备WSL2 是 Windows 用户的唯一正解Windows 用户想跑 Paperclip别挣扎了wsl --install是唯一路径。那些试图在 CMD/PowerShell 里直接跑 OpenClaw 的方案99.9% 会卡在claudes workspace requires the virtual machine platform on windows这个错误上。原因很简单OpenClaw 的 Linux 二进制依赖 glibc 2.31而 Windows Subsystem for LinuxWSL2提供的是完整的 Linux 内核而 WSL1 只是 syscall translation layer根本跑不动。我实测过在 WSL1 里openclaw --version能返回但openclaw start直接 segmentation fault换到 WSL2同一镜像秒启。所以第一步必须是以管理员身份打开 PowerShell运行wsl --install自动启用虚拟机平台、安装 Ubuntu 22.04重启后在 Ubuntu 里运行sudo apt update sudo apt install -y build-essential python3-pip关键一步运行wsl --status确认输出是Default Version: 2且Kernel Version显示5.15.x或更高。如果显示Version: 1说明没生效必须去 BIOS 开启 SVM/VT-x并在 Windows 功能里勾选“虚拟机平台”和“Windows Subsystem for Linux”。提示不要用wsl --set-version Ubuntu-22.04 2这种命令升级旧 WSL1 实例它只会让你陷入更复杂的权限问题。直接重装 WSL2 更省时间。3.2 Node.js 版本陷阱LTS 不等于稳定v20.12 是当前黄金版本Paperclip 对 Node.js 版本极其敏感。官方文档说支持 “v18”但实测 v18.19 会报Error [ERR_WORKER_UNSUPPORTED_EXTENSION]: Cannot load files with extension .ts in Worker因为 OpenClaw 的 TypeScript 插件加载器不兼容v22.x 会出现FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memoryNode.js v22 的 GC 策略与 Paperclip 的大文件缓存冲突v24.x 直接无法安装npm 报错node.js v24.21.0 is not yet released or is not available因为 Paperclip 的package.json里engines.node锁死了20.0.0 24.0.0。唯一稳定的版本是v20.12.2。安装方法# 卸载旧版 sudo apt remove nodejs npm # 使用 NodeSource 官方源安装 v20.12.2 curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # 验证 node -v # 必须输出 v20.12.2 npm -v # 必须输出 10.2.4为什么是 v20.12.2因为它是最后一个使用 V8 11.3 的 Node.js 版本而 OpenClaw 的 Rust 绑定openclaw-node-bindings正是基于此 V8 ABI 编译的。升级到 v20.13 就会报Module did not self-register错误——这是 ABI 不兼容的典型表现。3.3 OpenClaw 安装绕过官网下载直接用预编译二进制OpenClaw 官网下载页openclaw.dev/download提供的.deb包在 Ubuntu 22.04 上安装后会缺失libglib-2.0.so.0依赖手动apt install libglib2.0-0又会引发 GTK 版本冲突。最稳的方式是跳过包管理器直接下载预编译二进制# 创建专用目录 mkdir -p ~/paperclip/bin cd ~/paperclip/bin # 下载 Linux x64 二进制注意不是 .deb是 .tar.gz wget https://github.com/openclaw/openclaw/releases/download/v0.8.3/openclaw-v0.8.3-linux-x64.tar.gz tar -xzf openclaw-v0.8.3-linux-x64.tar.gz chmod x openclaw # 测试 ./openclaw --version # 输出 openclaw 0.8.3关键点在于这个二进制是用musl libc静态链接的不依赖系统 glibc所以能在任何现代 Linux 发行版上运行。而官网 .deb 包是用glibc动态链接的必须匹配系统版本。我踩过的最大坑是在 Ubuntu 24.04 上用官网 .deb 安装openclaw start启动成功但调用read_pdf时直接 core dump——因为 Ubuntu 24.04 的 glibc 2.39 与 OpenClaw 编译时的 glibc 2.31 不兼容。换成静态二进制问题消失。3.4 Claude Code 配置Desktop 版是伪需求CLI 版才是 Paperclip 的心脏搜索热词里大量出现claude desktop、claude code desktop版但 Paperclip 实际只依赖claude code的 CLI 版本。Desktop 版本质是 Electron 封装的 Web UI它启动的是远程 Claude 服务与 Paperclip 的本地推理理念背道而驰。Paperclip 需要的是能接受--model qwen2.5-3b参数、能监听本地端口、能返回标准 JSON 的 CLI 工具。安装步骤# 安装 claude-code CLI不是 Desktop App npm install -g claude-code # 下载本地模型以 Qwen2.5-3B 为例 mkdir -p ~/paperclip/models wget https://huggingface.co/Qwen/Qwen2.5-3B-GGUF/resolve/main/qwen2.5-3b.Q4_K_M.gguf -O ~/paperclip/models/qwen2.5-3b.Q4_K_M.gguf # 启动本地服务 claude code --port 3002 --model ~/paperclip/models/qwen2.5-3b.Q4_K_M.gguf --ctx-size 4096验证是否成功curl http://localhost:3002/v1/models应返回{object:list,data:[{id:qwen2.5-3b,object:model}]}。如果报错claude: command not found说明 npm global bin 路径没加到$PATH运行export PATH$HOME/.npm-global/bin:$PATH并写入~/.bashrc。注意claude code的--ctx-size参数必须与模型文件的上下文长度匹配。Qwen2.5-3B 的 GGUF 文件标注是4096如果设成8192服务会启动但推理时崩溃。这个参数不是越大越好而是必须精确匹配模型规格。4. 实操过程与核心环节实现手把手搭建一个“论文摘要生成器”Paperclip 应用4.1 初始化项目结构三个进程一个目录树Paperclip 应用的本质是三个独立进程的协同OpenClaw动作执行、Claude Code模型推理、Node.js协调中枢。它们共享同一个工作目录但各自独立启动。标准目录结构如下~/paperclip/ ├── bin/ # OpenClaw 二进制 ├── models/ # 本地 LLM 模型文件 ├── server/ # Node.js 协调服务 │ ├── index.js # 主入口启动 OpenClaw Claude Code 子进程 │ ├── routes/ # API 路由/chat, /action, /status │ └── middleware/ # 安全校验中间件 ├── client/ # React 前端 │ ├── src/ │ │ ├── App.jsx # 主组件监听 SSE 流 │ │ ├── components/ │ │ │ ├── ActionButton.jsx # 动作触发按钮 │ │ │ └── StreamingOutput.jsx # 流式输出渲染器 │ │ └── context/ # AppContext管理全局状态 │ └── public/ └── package.json # 顶层 package.json定义 dev 脚本关键点在于package.json的scripts{ scripts: { dev: concurrently \npm run server\ \npm run client\ \npm run openclaw\, server: cd server node index.js, client: cd client npm start, openclaw: cd bin ./openclaw start --port 3001 } }这里用了concurrently工具npm install -g concurrently来并行启动三个进程。为什么不用 PM2 或 systemd因为 Paperclip 是开发态工具需要热重载和即时日志查看concurrently的彩色日志输出能清晰区分三个进程的 log。4.2 Node.js 协调服务实现 OpenClaw 与 Claude Code 的双向桥接server/index.js是 Paperclip 的灵魂。它不处理业务逻辑只做三件事启动子进程、转发请求、校验安全。核心代码片段// server/index.js import { spawn } from child_process; import express from express; import http from http; import { Server } from socket.io; const app express(); const server http.createServer(app); const io new Server(server, { cors: { origin: http://localhost:3000 } }); // 启动 OpenClaw 子进程 const openclaw spawn(./bin/openclaw, [start, --port, 3001], { cwd: process.cwd(), stdio: [ignore, pipe, pipe] }); openclaw.stdout.on(data, (data) console.log([OpenClaw], data.toString())); openclaw.stderr.on(data, (data) console.error([OpenClaw ERR], data.toString())); // 启动 Claude Code 子进程 const claude spawn(claude, [code, --port, 3002, --model, ../models/qwen2.5-3b.Q4_K_M.gguf], { cwd: process.cwd(), stdio: [ignore, pipe, pipe] }); claude.stdout.on(data, (data) console.log([Claude], data.toString())); claude.stderr.on(data, (data) console.error([Claude ERR], data.toString())); // /chat API接收用户输入调用 Claude再调用 OpenClaw app.post(/chat, async (req, res) { const { message, context } req.body; // Step 1: 调用 Claude 获取结构化动作 const claudeRes await fetch(http://localhost:3002/v1/chat/completions, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ model: qwen2.5-3b, messages: [{ role: user, content: generatePrompt(message, context) }], tools: getAvailableTools() // 返回 OpenClaw 支持的动作列表 }) }); const claudeData await claudeRes.json(); // Step 2: 提取 tool_calls转发给 OpenClaw 执行 if (claudeData.choices[0].message.tool_calls) { for (const toolCall of claudeData.choices[0].message.tool_calls) { const openclawRes await fetch(http://localhost:3001/action, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(toolCall.function) }); const result await openclawRes.json(); // 将执行结果注入上下文再次调用 Claude context.push({ role: tool, content: JSON.stringify(result), tool_call_id: toolCall.id }); } } res.json({ success: true, data: claudeData }); });这个设计的关键在于Claude 的输出不是最终答案而是动作指令OpenClaw 的执行结果不是 UI 更新而是新的上下文输入。Paperclip 的“思考-行动”循环就建立在这个闭环之上。4.3 React 前端用 Suspense useTransition 实现丝滑流式体验Paperclip 的 React 前端最惊艳的地方是它让 LLM 的 token 流式输出像原生 DOM 更新一样自然。核心在于StreamingOutput.jsx// client/src/components/StreamingOutput.jsx import { useState, useEffect, useRef } from react; export default function StreamingOutput({ sessionId }) { const [content, setContent] useState(); const [isThinking, setIsThinking] useState(false); const eventSourceRef useRef(null); useEffect(() { // 建立 SSE 连接 const eventSource new EventSource(/api/stream?session${sessionId}); eventSourceRef.current eventSource; eventSource.onmessage (event) { const data JSON.parse(event.data); if (data.type thinking) { setIsThinking(true); } else if (data.type token) { setContent(prev prev data.token); } else if (data.type done) { setIsThinking(false); } }; return () { eventSource.close(); }; }, [sessionId]); return ( div classNameoutput-container {isThinking div classNamethinking-indicator 正在思考.../div} div classNameoutput-content{content}/div /div ); }配合App.jsx里的useTransition// client/src/App.jsx import { useTransition, useState } from react; function App() { const [isPending, startTransition] useTransition(); const [sessionId, setSessionId] useState(Date.now().toString()); const handleSubmit (e) { e.preventDefault(); startTransition(() { // 触发 /chat APISSE 流自动更新 StreamingOutput fetch(/api/chat, { method: POST, body: JSON.stringify({ message: input, sessionId }) }); setSessionId(Date.now().toString()); // 强制 StreamingOutput 重建 }); }; return ( div className{isPending ? app pending : app} form onSubmit{handleSubmit}.../form StreamingOutput sessionId{sessionId} / /div ); }useTransition让提交表单时不阻塞 UIstartTransition内部的setSessionId触发StreamingOutput重新 mount从而建立新的 SSE 连接。这种设计让“输入-思考-输出”的整个流程毫无卡顿感比任何 loading spinner 都真实。4.4 安全校验中间件白名单机制是 Paperclip 可靠运行的生命线Paperclip 最容易被忽视却最关键的部分是server/middleware/action-validator.js// server/middleware/action-validator.js export const validateAction (req, res, next) { const { action, params } req.body; // 1. 动作白名单 const allowedActions [read_file, write_file, run_command, open_url, list_dir]; if (!allowedActions.includes(action)) { return res.status(400).json({ error: Action ${action} not allowed }); } // 2. 路径白名单Linux/macOS if ([read_file, write_file, list_dir].includes(action)) { const safePath params.path || ; const homeDir require(os).homedir(); // 必须在用户主目录下且不能向上跳转 if (!safePath.startsWith(homeDir) || safePath.includes(..)) { return res.status(400).json({ error: Path must be within home directory }); } } // 3. 命令白名单run_command if (action run_command) { const dangerousCmds [rm, mv, cp, sudo, dd]; const cmd params.command.split( )[0]; if (dangerousCmds.includes(cmd)) { return res.status(400).json({ error: Command ${cmd} is blocked for security }); } } next(); };这个中间件在app.post(/action, validateAction, handleAction)中被调用。它不依赖前端 JS 校验可以被绕过也不依赖 OpenClaw 内置校验OpenClaw 本身不校验参数而是 Node.js 层的最后防线。我故意在前端发送{action:rm,params:{path:/etc/passwd}}Node.js 日志里立刻打印Action rm not allowedHTTP 返回 400OpenClaw 根本没收到请求。这才是真正的安全。5. 常见问题与排查技巧实录那些官方文档不会告诉你的实战经验5.1 “openclaw无法安全验证” 的五种真实场景及解决方案这个错误信息看似笼统实则对应五种完全不同的底层原因。我整理了生产环境遇到的所有 case场景现象根本原因解决方案WSL2 权限不足openclaw start启动后立即退出日志无错误WSL2 默认用户不是root无法绑定0.0.0.0:3001运行sudo openclaw start --port 3001或改用--host 127.0.0.1SELinux 阻止 socketUbuntu 22.04 上openclaw start成功但curl http://localhost:3001/status返回Connection refusedSELinux 策略禁止openclaw创建 Unix socketsudo setenforce 0临时关闭或sudo semanage port -a -t http_port_t -p tcp 3001Windows 防火墙拦截WSL2 中openclaw start成功但 Windows 主机上的 React 无法访问http://localhost:3001Windows 防火墙阻止了 WSL2 的端口映射在 PowerShell 运行New-NetFirewallRule -DisplayName Allow OpenClaw -Direction Inbound -Protocol TCP -LocalPort 3001 -Action AllowOpenClaw 版本与 Node.js 不兼容openclaw --version正常但openclaw start报Segmentation fault (core dumped)OpenClaw v0.8.3 需要 Node.js v20.12而系统装了 v22.x降级 Node.js 到 v20.12.2见 3.2 节用户组权限缺失openclaw start启动成功但调用read_pdf时返回Permission denied当前用户不在openclaw-users组Linux或未获SeDebugPrivilegeWindowsLinux:sudo usermod -a -G openclaw-users $USERWindows: 用secpol.msc添加权限实操心得遇到openclaw无法安全验证第一反应不是重装而是运行openclaw --debug start。它会输出详细的权限检查日志比如DEBUG: checking group membership for openclaw-users... not found直接定位问题。5.2 “claude : 无法将‘claude’项识别为 cmdlet” 的 Windows PowerShell 陷阱这个错误在 Windows 上高频出现根源是 PowerShell 的执行策略Execution Policy默认为Restricted禁止运行本地脚本。解决方案不是改策略有安全风险而是用npm作为启动器# ❌ 错误直接运行 claude 命令 claude code --port 3002 # ✅ 正确通过 npx 调用 npx claude-code --port 3002 # 或者全局安装后用完整路径 C:\Users\YourName\AppData\Roaming\npm\claude.cmd code --port 3002npx会自动查找node_modules/.bin下的可执行文件绕过 PowerShell 的执行策略限制。这是 Windows 用户必须掌握的技巧。5.3 React 启动白屏不是代码问题是跨域配置缺失react native 启动白屏这个热搜词其实 90% 是 Paperclip 的 React Web 版本在开发时的跨域问题。当你在http://localhost:3000运行 React而 Node.js 服务在http://localhost:3001浏览器会拦截fetch(http://localhost:3001/chat)请求。解决方案不是在 React 里配 proxy治标不治本而是在server/index.js里加 CORSimport cors from cors; app.use(cors({ origin: [http://localhost:3000], credentials: true }));但更重要的是SSE 流必须用Access-Control-Allow-Origin: *因为浏览器对 EventSource 的 CORS 要求更严格app.get(/api/stream, (req, res) { res.writeHead(200, { Content-Type: text/event-stream, Cache-Control: no-cache, Connection: keep-alive, Access-Control-Allow-Origin: * // 关键不能是数组必须是 * }); // ... stream logic });漏掉这一行React 页面就是白屏控制台报EventSources response has a status of 0。5.4 OpenClaw Obsidian 插件无法加载路径大小写与符号链接的双重坑openclaw obsidian插件在 Obsidian 里显示“插件未启用”常见原因是Obsidian 的插件目录路径必须是~/Documents/Obsidian Vault/.obsidian/plugins/openclaw-connector而 Paperclip 的openclaw-connector插件实际在~/paperclip/client/src/plugins/openclaw-connector直接复制会丢失 git 信息且路径大小写敏感Linux/macOS正确做法是创建符号链接# 在 Obsidian vault 目录下 cd ~/Documents/Obsidian\ Vault/.obsidian/plugins ln -s ~/paperclip/client/src/plugins/openclaw-connector openclaw-connector但要注意Windows 的mklink在 WSL2 里不生效必须在 Windows 资源管理器里右键“创建快捷方式”然后重命名为openclaw-connector。这是 Obsidian 插件系统的硬性要求。5.5 Node.js 安装失败“node.js v24.21.0 is not yet released” 的真相这个错误不是网络问题而是package.json的engines.node字段锁死了版本范围。Paperclip 的package.json里写着engines: {node: 20.0.0 24.0.0}而 npm 在安装时会检查https://nodejs.org/dist/的最新版本列表。如果v24.21.0确实未发布npm registry 里没有npm 就会报这个错。解决方案只有两个降级到v20.12.2推荐见 3.2 节修改package.json的engines.node为^20.0.0 || ^22.0.0然后npm install --ignore-engines强制安装。后者风险很高可能导致
返回列表