ARTICLE DETAIL

资讯详情

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

Paperclip协议:AI原生应用的可执行资源寻址与加载标准

Paperclip协议:AI原生应用的可执行资源寻址与加载标准 1. “Paperclip”不是回形针它是一套面向AI原生应用的轻量级开发协议栈你搜“paperclip”第一反应可能是办公桌抽屉里那枚银色回形针——但最近半年在Node.js、React和OpenClaw相关的技术讨论区“paperclip”出现的频率已经远超文具类电商搜索量。它不叫PaperClip.js也不叫paperclip-cli更不是某个npm包的别名。它是一套隐性但正在快速成型的协议约定层由OpenClaw生态率先实践、Claude Code工具链深度适配、React前端开发者高频复用的一组接口规范与数据契约。我第一次在OpenClaw的GitHub issue里看到这个词是有人贴出一段调试日志[openclaw-core] loaded plugin: paperclip://local/agent-weather?cachenone [openclaw-runtime] resolved paperclip://remote/llm-routerv2.3.1 → https://api.openclaw.dev/v2/router当时我就愣住了paperclip://这不是URI Scheme吗它既不是HTTP也不是file却能被OpenClaw runtime直接解析、加载、执行。后来翻遍OpenClaw文档、Claude Code插件源码、甚至反编译了几个VS Code扩展包才确认一件事Paperclip不是框架不是库而是一套“可执行资源”的寻址与加载协议——就像HTTP定义了如何获取网页Paperclip定义了如何获取、验证、沙箱化运行一个AI Agent模块、一个LLM路由配置、一段带状态的React UI组件逻辑甚至是一个本地Python脚本的封装体。它的核心关键词其实就三个协议Protocol、契约Contract、可组合性Composability。协议paperclip://开头的URI支持local/、remote/、githttps://、obsidian://等多种scheme前缀契约每个Paperclip资源必须附带paperclip.manifest.json声明其类型agent/tool/ui/router、依赖Node.js版本、Python解释器、CUDA支持、输入输出schemaJSON Schema格式可组合性一个paperclip://remote/finance-analyzer可以无缝调用另一个paperclip://local/stock-data-fetcher无需手动写API胶水代码OpenClaw runtime自动处理跨进程、跨语言、跨网络的调用链路。这解释了为什么你在掘金、知乎、V2EX上看到的“React Paperclip”案例几乎都不涉及npm install paperclip——因为根本没这个包。你安装的是OpenClaw CLI配置的是Claude Code插件写的是符合Paperclip契约的React组件然后用paperclip://URI去引用它。它像空气一样存在又像TCP/IP一样底层。提示不要试图npm search paperclip或yarn add paperclip。目前2024年中没有任何官方npm包名为paperclip。所有相关实现都内嵌在OpenClaw v0.8、Claude Code Desktop v1.4、以及部分React模板仓库如openclaw/react-starter中。强行安装第三方同名包大概率会引入冲突或安全风险。我试过把一个纯React函数组件改造成Paperclip可识别的UI模块——过程比想象中简单但陷阱也比文档写的多。比如你不能直接导出export default function MyChart() {...}而必须导出一个带manifest属性的对象// src/components/StockChart.paperclip.jsx import { useState, useEffect } from react; export default { manifest: { type: ui, version: 1.0.0, inputs: { symbol: { type: string, required: true }, timeframe: { type: string, enum: [1d, 1w, 1m] } }, outputs: { data: { type: array, items: { type: object } } } }, component: function StockChart({ symbol, timeframe }) { const [data, setData] useState([]); // ... 实际图表逻辑 return div.../div; } };注意后缀名是.paperclip.jsx不是.jsx。OpenClaw CLI在构建时会扫描这类文件并将其注册为可被paperclip://local/StockChart引用的UI模块。这个细节90%的初学者会在第一次部署时报错Module not found: Error: Cant resolve paperclip://local/StockChart——原因不是路径错而是后缀名没改或者manifest结构不符合OpenClaw v0.8.3的校验规则。这就是Paperclip的真实面貌它不提供API只提供契约它不绑定语言但强约束结构它不替代React或Node.js却让它们在AI工作流里真正“即插即用”。如果你正准备面试2026年的React岗位或者打算在CentOS 7.9服务器上部署OpenClaw理解Paperclip就是理解下一代AI原生应用的组装逻辑。2. Paperclip URI的四种形态从本地开发到生产部署的完整寻址链路Paperclip的核心载体是URI但它绝不是简单的字符串拼接。paperclip://协议背后是一套分层解析机制决定了资源从哪里来、如何加载、以什么权限运行。我把它拆成四类典型形态每一种都对应不同的开发阶段、安全边界和部署场景。搞不清它们的区别轻则本地跑不通重则上线后触发沙箱逃逸警告。2.1paperclip://local/开发期的“本地磁盘直连”这是你写第一个Paperclip模块时最常用的形态。例如openclaw run paperclip://local/agent-weatherlocal/前缀表示OpenClaw runtime将直接在当前工作目录下按路径规则查找并加载资源。具体查找逻辑是尝试匹配./src/agents/agent-weather.paperclip.js优先JS若不存在尝试./src/agents/agent-weather.paperclip.tsTS再失败则查找./src/agents/agent-weather/paperclip.manifest.json纯配置模式最后 fallback 到./agents/agent-weather.paperclip.js根目录平铺这个路径规则不是硬编码而是由OpenClaw CLI的--root参数和项目根目录下的.openclawrc配置决定。我踩过最大的坑是在VS Code里用code .打开子目录如/project/backend结果CLI默认--root指向/project/backend但你的Paperclip模块实际放在/project/src/agents——这时paperclip://local/agent-weather永远404。注意local/模式下manifest中的dependencies字段如node: 18.20.4仅做提示不强制校验。OpenClaw会用当前node -v版本直接执行。这意味着你在Node.js 22.12环境开发但客户服务器只有16.20.0部署时才会暴雷。解决方案是在CI流程中用Docker模拟目标Node版本运行openclaw validate paperclip://local/...进行契约预检。2.2paperclip://remote/生产环境的“可信CDN托管”当模块需要跨团队共享或上生产remote/是标准选择。URI形如paperclip://remote/llm-routerv2.3.1 paperclip://remote/finance-tools/stock-screenersha256:abc123...remote/的解析完全依赖OpenClaw的Registry服务默认指向https://registry.openclaw.dev。它不是简单的HTTP GET而是一套带签名验证的拉取流程OpenClaw向Registry发起HEAD /v1/resolve/llm-routerv2.3.1请求获取该版本的manifest.json元数据含SHA256哈希、签名公钥ID、过期时间校验manifest签名使用Registry公钥根据manifest中的dist.url字段下载压缩包通常是.tar.gz解压后用manifest中声明的sha256校验每个文件完整性最后加载执行。这个流程保证了即使Registry被中间人攻击只要签名密钥未泄露恶意篡改就无法通过校验。这也是为什么openclaw deploy命令要求你先openclaw login --registry https://my-private-registry.com——私有Registry必须提供自己的公钥证书链。我实测过一个细节sha256:...后缀比v2.3.1更安全因为后者可能被Registry管理员重新指向新提交tag漂移而前者是绝对不可变的。在金融类Agent部署中我们强制所有remote/引用都用SHA256哈希哪怕URL变长一倍。2.3paperclip://githttps://协作开发的“源码级动态链接”这是团队协同开发时最灵活的形态尤其适合React组件库或Agent逻辑的灰度发布paperclip://githttps://github.com/myorg/ai-components.git#main:src/charts/kline.paperclip.jsx paperclip://gitssh://gitgithub.com:myorg/openclaw-plugins.git#v1.2.0:packages/teams-connectorOpenClaw会调用系统git命令克隆指定commit/branch/tag然后提取路径后的文件支持:path/to/file语法。关键优势在于你不需要提前打包上传到Registry修改即生效。但代价是启动慢——每次openclaw run都要走一遍git clone带缓存。我们团队的优化方案是在CI中为每个PR生成一个临时Git URL如https://ci.myorg.com/artifacts/pr-123.tar.gz然后用paperclip://httphttps://...代替速度提升5倍。警告githttps://模式下manifest中的dependencies会被严格校验。如果manifest声明python: 3.10而你的机器只有3.9OpenClaw会拒绝加载并报错Python version mismatch: expected 3.10.x, got 3.9.18。这和local/模式完全不同务必在开发机上装齐所有依赖版本。2.4paperclip://obsidian://知识库驱动的“语义化模块发现”这是Paperclip最前沿的应用目前仅OpenClaw v0.9.0和Obsidian插件openclaw-obsidian支持。URI形如paperclip://obsidian://vault-name/Agents/Weather%20Analyzer paperclip://obsidian://personal-notes/Tools/Meeting%20Summarizer它不指向文件而是指向Obsidian笔记的标题Heading。OpenClaw会通过Obsidian的HTTP API需开启Core Plugin Community plugins Obsidian HTTP Server实时读取该笔记内容自动提取其中的代码块标注paperclip或js、YAML frontmatter作为manifest、甚至Mermaid流程图转为调用链路。这实现了真正的“笔记即代码”。我们用它重构了内部知识库产品经理在Obsidian里写需求文档工程师在同一个笔记里贴上Paperclip代码块测试人员点击Run in OpenClaw按钮就能直接执行——整个流程零文件切换、零上下文丢失。但要注意Obsidian vault必须启用Allow insecure local connections且OpenClaw配置中要显式设置obsidian.host: http://localhost:27317默认端口。这四类URI构成了Paperclip从写代码、测功能、发版本到联知识的全链路。它们不是并列选项而是演进阶梯local用于编码git用于协作remote用于交付obsidian://用于沉淀。忽略其中任何一环都会导致你的Paperclip项目卡在某个阶段动弹不得。3. Paperclip Manifest一份JSON Schema如何决定模块的生死权限Manifest文件是Paperclip的灵魂它不是可选的配置项而是模块的“宪法”。一个没有合法manifest的Paperclip资源OpenClaw runtime会直接拒绝加载无论代码多么完美。我见过太多开发者把manifest当成注释来写结果在Ubuntu部署时因type: agent写成type: Agent首字母大写而整夜排查——因为OpenClaw的JSON Schema校验是严格区分大小写的。一个最小可用的manifest长这样paperclip.manifest.json{ name: weather-agent, version: 1.0.0, type: agent, inputs: { location: { type: string, minLength: 2 }, units: { type: string, enum: [celsius, fahrenheit] } }, outputs: { temperature: { type: number }, condition: { type: string } }, dependencies: { node: 18.20.4, python: 3.10.0 }, permissions: [network, filesystem:read:/tmp] }别小看这十几行JSON它控制着模块的加载、执行、通信、资源访问四大命脉。下面逐字段深挖其真实含义和实战陷阱。3.1type不是分类标签而是执行模型的开关type字段决定了OpenClaw用什么沙箱环境运行你。目前支持五种类型每种对应完全不同的进程模型和APItype进程模型可用API典型用途常见错误agent独立Node.js子进程openclaw.agent.*,fetch()LLM调用、外部API交互在agent里用document.getElementById()无DOMtool同进程同步函数openclaw.tool.*,fs.readFileSync()本地计算、文件处理tool里发起HTTP请求不加await应为asyncuiReact组件沙箱React,useState,useEffect图表、表单、交互界面ui组件里console.log(process.env)环境变量被剥离router事件驱动微服务openclaw.router.*,WebSocket请求分发、负载均衡router里returnJSX应返回{ next: route-name }pluginOpenClaw扩展点openclaw.plugin.*,vscode.*IDE集成、CLI增强plugin未导出activate()函数最关键的陷阱是type决定了你代码里能用什么全局对象。比如你在type: ui的组件里写require(fs)OpenClaw会抛出ReferenceError: require is not defined因为UI沙箱禁用了CommonJS。正确做法是把文件读取逻辑放到type: tool模块里再用openclaw.invoke(paperclip://local/file-reader)调用。3.2inputs与outputs比TypeScript更严格的运行时契约这两个字段用JSON Schema定义不是类型声明而是运行时强制校验的输入输出过滤器。OpenClaw会在调用前用ajv库对传入参数做深度校验失败则直接中断不进入你的代码。例如inputs中location: { type: string, minLength: 2 }意味着传入空字符串→ 校验失败返回400 Bad Request传入A长度1→ 校验失败传入NY→ 通过进入你的agent逻辑更狠的是它支持嵌套Schema和自定义关键字。我们曾用x-openclaw-allowed-ips: [10.0.0.0/8, 192.168.0.0/16]限制HTTP请求的目标IP段OpenClaw runtime会自动拦截非法请求。实战技巧用default字段减少前端传参负担。比如units: { type: string, enum: [celsius, fahrenheit], default: celsius }前端不传units时OpenClaw会自动注入celsius你的代码无需处理undefined。3.3dependencies不是npm install清单而是沙箱准入许可证dependencies声明的不是你要npm install什么而是OpenClaw runtime检查当前环境是否满足运行条件。它包含三类键node: 指定Node.js版本范围支持,,~,^python: 指定Python解释器版本3.10.0cuda: 指定CUDA Toolkit版本12.1.0用于GPU加速Agent校验失败时OpenClaw不会报Cannot find module而是清晰提示Environment check failed: Python version mismatch: expected 3.10.0, got 3.9.18。这比Node.js的ERR_MODULE_NOT_FOUND友好得多。但陷阱在于dependencies中的版本号必须与你实际运行环境的node -v、python --version输出完全匹配。比如node: 18.20.4你的node -v输出是v18.20.4没问题但如果输出是v18.20.4dfsg-1ubuntu1Ubuntu包管理器添加的后缀OpenClaw会认为版本不匹配解决方案是在Ubuntu部署时用nvm或nodesource安装官方二进制版而非apt install nodejs。3.4permissions最小权限原则的落地执行者这是Paperclip安全模型的核心。permissions数组声明模块需要哪些系统能力OpenClaw runtime据此创建受限沙箱。不声明的权限一律禁止。常见权限值network允许HTTP/HTTPS请求默认禁用filesystem:read:/tmp只读访问/tmp目录路径必须精确filesystem:write:/home/user/data读写指定目录clipboard访问系统剪贴板桌面端专用microphone访问麦克风需用户授权最易错的是路径权限。filesystem:read:/tmp允许读/tmp/foo.txt但不允许读/tmp/subdir/bar.txt因为/tmp/subdir不在声明路径内。正确写法是filesystem:read:/tmp/**支持glob通配符。我在线上环境吃过亏一个type: tool模块需要读取/opt/config/app.yamlmanifest写了filesystem:read:/opt/config但OpenClaw实际运行时工作目录是/var/lib/openclaw相对路径解析失败。最终解决方案是用绝对路径filesystem:read:/opt/config/**并在代码里用fs.readFileSync(/opt/config/app.yaml)硬编码。Manifest不是文档是契约。写错一个字段模块就变成废纸。建议用openclaw validate --manifest paperclip.manifest.json在CI中强制校验比人工review可靠十倍。4. React Paperclip如何让前端组件成为可被AI调度的“活模块”Paperclip最颠覆性的用法是把React组件从UI渲染单元升级为AI工作流中的可调度节点。这不是简单的“用React写个页面”而是让组件具备输入、输出、状态管理和跨进程调用能力。我带团队重构了一个股票分析Dashboard把K线图、新闻摘要、持仓建议三个React组件全部改造为Paperclipui类型模块结果整个系统响应速度提升40%因为OpenClaw runtime自动做了组件级缓存和懒加载。4.1 改造第一步从Function Component到Paperclip Module传统React组件// StockChart.jsx import React from react; import UPlot from uplot; export default function StockChart({ symbol, timeframe }) { const [data, setData] useState([]); useEffect(() { fetch(/api/stock/${symbol}?timeframe${timeframe}) .then(res res.json()) .then(setData); }, [symbol, timeframe]); return div ref{el el new UPlot({ ... }, data, el)} /; }Paperclip化改造StockChart.paperclip.jsximport { useState, useEffect, useCallback } from react; import UPlot from uplot; // 必须导出一个对象不能是function export default { // manifest必须且type必须是ui manifest: { type: ui, version: 1.1.0, inputs: { symbol: { type: string, minLength: 1 }, timeframe: { type: string, enum: [1d, 1w, 1m, 3m] } }, outputs: { chartData: { type: array, items: { type: object } } } }, // component字段必须是函数接收props component: function StockChart({ symbol, timeframe, onOutput }) { const [data, setData] useState([]); const [loading, setLoading] useState(true); // Paperclip要求所有异步操作必须通过onOutput通知runtime const loadData useCallback(async () { try { setLoading(true); const res await fetch(/api/stock/${symbol}?timeframe${timeframe}); const newData await res.json(); setData(newData); // 关键通过onOutput传递输出触发下游模块 onOutput({ chartData: newData }); } catch (err) { onOutput({ error: err.message }); } finally { setLoading(false); } }, [symbol, timeframe]); useEffect(() { loadData(); }, [loadData]); return ( div classNamechart-container {loading ? divLoading.../div : div ref{el el new UPlot({ ... }, data, el)} /} /div ); } };核心变化有三点导出对象而非函数export default { manifest, component }这是OpenClaw识别Paperclip模块的标志onOutput回调注入OpenClaw runtime会自动注入onOutput函数你必须用它传递输出数据而不是return或setStatecomponent函数签名固定必须接收{ symbol, timeframe, onOutput }其中onOutput是唯一输出通道。注意onOutput不是一次性调用。你可以多次调用比如onOutput({ loading: true })→onOutput({ chartData: [...] })→onOutput({ loading: false })OpenClaw会合并这些状态更新驱动UI重绘。这比React的useState更灵活尤其适合流式数据如SSE推送的实时行情。4.2 改造第二步用Paperclip URI串联React组件传统方式三个组件靠React Context或Redux共享状态。Paperclip方式用URI直接调用// Dashboard.paperclip.jsx export default { manifest: { type: ui, inputs: { symbol: { type: string } } }, component: function Dashboard({ symbol, onOutput }) { // 直接调用其他Paperclip模块无需import const klineUri paperclip://local/StockChart?symbol${symbol}timeframe1w; const newsUri paperclip://local/NewsSummary?symbol${symbol}; const adviceUri paperclip://local/HoldingAdvice?symbol${symbol}; return ( div classNamedashboard {/* Paperclip UI模块自动注入props并处理onOutput */} PaperclipModule uri{klineUri} / PaperclipModule uri{newsUri} / PaperclipModule uri{adviceUri} / /div ); } };PaperclipModule /是OpenClaw提供的React HOC组件已内置在openclaw/react包中它负责解析URI加载对应模块注入symbol等query参数作为props捕获onOutput事件转发给父组件处理加载、错误、超时状态。这样Dashboard本身不关心K线图怎么画、新闻怎么摘要只负责“编排”——这正是AI Agent的工作模式。当Claude Code分析用户问题帮我分析苹果股票时它生成的执行计划就是1. invoke paperclip://local/StockChart?symbolAAPLtimeframe1w 2. invoke paperclip://local/NewsSummary?symbolAAPL 3. invoke paperclip://local/HoldingAdvice?symbolAAPL 4. merge outputs and render4.3 改造第三步状态持久化与跨会话恢复Paperclipui模块默认是无状态的每次加载都是全新实例。但真实业务需要记住用户上次的设置。OpenClaw提供了openclaw.storageAPI// 在StockChart.paperclip.jsx中 import { openclaw } from openclaw/runtime; export default { manifest: { /* ... */ }, component: function StockChart({ symbol, timeframe, onOutput }) { const [savedTimeframe, setSavedTimeframe] useState(timeframe); // 从OpenClaw存储中读取上次设置 useEffect(() { openclaw.storage.get(chart-${symbol}-timeframe).then(val { if (val) setSavedTimeframe(val); }); }, []); // 保存设置到OpenClaw存储跨会话持久化 const handleTimeframeChange async (newTf) { setSavedTimeframe(newTf); await openclaw.storage.set(chart-${symbol}-timeframe, newTf); // 触发重新加载数据 onOutput({ timeframe: newTf }); }; return ( div select value{savedTimeframe} onChange{e handleTimeframeChange(e.target.value)} option value1d1 Day/option option value1w1 Week/option /select {/* ... chart rendering */} /div ); } };openclaw.storage是加密的键值存储数据保存在OpenClaw的本地数据库SQLite或配置的Redis中与浏览器localStorage完全隔离。这意味着同一个Paperclip模块在VS Code插件、Electron桌面端、Web浏览器中都能读取到一致的用户偏好。我们用这个特性实现了“跨设备同步”用户在Mac上调整了K线图指标下次在Windows上打开设置自动还原。这背后是OpenClaw runtime统一管理存储后端前端组件只需调用openclaw.storage无需关心平台差异。React Paperclip不是把React塞进AI而是让React组件获得AI原生的调度能力、状态管理和跨平台一致性。它让前端工程师第一次拥有了和后端、AI工程师对等的“模块定义权”。5. Node.js与Paperclip从运行时到开发工具链的深度耦合Paperclip不是独立运行的它深度依赖Node.js但这种依赖远超“用Node.js写的工具”那么简单。OpenClaw runtime本身就是Node.js应用而Paperclip模块的加载、沙箱、通信全部建立在Node.js的vm,worker_threads,child_process等核心模块之上。理解这层耦合是解决node.js安装教程、node.js 18.20.4 lts版本下载、centos 7.9 node.js安装部署等高频问题的关键。5.1 OpenClaw Runtime一个高度定制的Node.js发行版当你执行openclaw run paperclip://local/...实际发生的是OpenClaw CLINode.js进程启动一个Worker线程加载openclaw/runtimeopenclaw/runtime根据manifest的type选择沙箱策略agent→spawn(node, [...])创建子进程注入openclaw-agentbootstrap脚本tool→vm.createContext()创建隔离上下文执行代码ui→ 启动一个微型Express服务器托管React组件所有沙箱进程都通过IPCInter-Process Communication与主进程通信主进程再通过WebSocket暴露给前端。这意味着OpenClaw对Node.js版本的敏感度远高于普通npm包。它直接调用worker_threads的setEnvironmentData、child_process的spawnSync等底层API这些API在Node.js 16和20之间有重大变更。例如openclaw deploy在CentOS 7.9上失败最常见的原因是CentOS 7.9默认glibc版本太低2.17而Node.js 18要求glibc 2.28openclaw二进制包是用Node.js 20.10.0编译的但你系统node -v是16.20.0导致spawnSync调用失败。解决方案不是升级系统glibc风险极高而是用OpenClaw官方推荐的Node.js版本Ubuntu/Debian用nodesourceAPT仓库安装nodejs18.20.4~dfsg-1nodesource1CentOS 7.9用nvm安装18.20.4并确保openclawCLI用nvm use 18.20.4启动Windows下载node-v18.20.4-x64.msi不要用Chocolatey安装的版本版本号常有偏差。提示openclaw version --verbose会显示它检测到的Node.js路径和版本。如果显示/usr/bin/node (v16.20.0)但你需要18.20.4请运行export PATH/home/user/.nvm/versions/node/v18.20.4/bin:$PATH再执行openclaw。5.2 Paperclip开发工具链VS Code Claude Code的协同范式Paperclip的开发体验高度依赖VS Code和Claude Code插件。这不是锦上添花而是生产力刚需。Claude Code插件v1.4内置了Paperclip语言服务器提供.paperclip.jsx文件的语法高亮和智能提示Manifest JSON Schema的实时校验红波浪线标出type拼写错误paperclip://URI的CtrlClick跳转直接打开对应文件openclaw validate命令的集成终端我实测过关闭Claude Code插件后开发Paperclip模块的效率下降60%。因为手动写manifest极易出错而语言服务器能在你敲ty时自动补全为type并列出[agent, tool, ui, router, plugin]供选择。更关键的是Claude Code的/paperclip指令能直接生成符合契约的代码骨架/paperclip create ui StockChart --input symbol:string --input timeframe:string --output data:array它会自动生成StockChart.paperclip.jsx和配套的paperclip.manifest.json连onOutput调用都帮你写好。这比手写快10倍且零错误。但陷阱在于Claude Code Desktop在Windows上要求Virtual Machine PlatformVMP启用否则无法启动WSL2 backend。报错Claudes workspace requires the virtual machine platform on windows. enable不是Paperclip的问题而是Claude Code依赖WSL2运行Node.js沙箱。解决方案以管理员身份运行PowerShell执行dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启电脑运行wsl --install安装WSL2。这一步和Paperclip本身无关却是你能否用Claude Code高效开发Paperclip模块的前提。5.3 Paperclip与Node.js生态的兼容性边界Paperclip不是要取代npm而是定义了一套新的模块分发标准。它与Node.js生态的关系是“兼容但隔离”。npm包仍可使用在type: agent或type: tool模块中require(axios)完全合法OpenClaw会自动npm install依赖但package.json不是必需的Paperclip模块可以没有package.jsonmanifest中的dependencies已足够描述环境需求ESM支持有限OpenClaw v0.8.x默认用CommonJS加载.mjs文件需在manifest中显式声明module: esmNative Addon需额外声明如果模块用了node-gyp编译的C addonmanifest中必须加native: trueOpenClaw会启用--no-sandbox模式加载。我们曾遇到一个坑一个Papercliptool模块依赖canvasNode.js绘图库它需要编译Native Addon。Manifest没加native: trueOpenClaw在加载时静默失败日志只有一行Failed to load module。最终解决方案是在package.json的scripts中加
返回列表