jqopenclaw-node-invoker
统一通过 Gateway 的 node.invoke 调用 JQOpenClawNode 能力(file.read、file.write、process.exec、process.manage、system.run、process.which、system.info、system.screenshot、system.notify、system.clipboard、system.input、node.selfUpdate)。当用户需要远程文件读写、文件移动/删除、目录创建/删除、进程管理(列表/搜索/终止)、远程进程执行、命令可执行性探测、系统信息采集、截图采集、系统弹窗、系统剪贴板读写、输入控制(鼠标/键盘)、节点自更新、节点命令可用性排查或修复 node.invoke 参数错误时使用。
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/jqopenclaw-node-invoker/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How jqopenclaw-node-invoker Compares
| Feature / Agent | jqopenclaw-node-invoker | Standard Approach |
|---|---|---|
| Platform Support | multi | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
统一通过 Gateway 的 node.invoke 调用 JQOpenClawNode 能力(file.read、file.write、process.exec、process.manage、system.run、process.which、system.info、system.screenshot、system.notify、system.clipboard、system.input、node.selfUpdate)。当用户需要远程文件读写、文件移动/删除、目录创建/删除、进程管理(列表/搜索/终止)、远程进程执行、命令可执行性探测、系统信息采集、截图采集、系统弹窗、系统剪贴板读写、输入控制(鼠标/键盘)、节点自更新、节点命令可用性排查或修复 node.invoke 参数错误时使用。
Which AI agents support this skill?
This skill is compatible with multi.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# JQOpenClaw Node Invoker
## 快速流程
1. 确定目标 `nodeId`(用户给定优先)。
2. 调用 `node.describe` 检查节点在线状态,并按“节点识别规则”确认是否为 JQOpenClawNode。
3. 若命令未声明或被网关策略拦截,先输出阻断原因,再给修复建议。
4. 按 [references/command-spec.md](references/command-spec.md) 构造 `node.invoke` 请求。
5. 每次调用使用新的 `idempotencyKey`(UUID)。
6. 输出结果时先给结论,再给关键字段,不直接堆原始 JSON。
## 节点识别规则
- 先读 `node.describe` 返回的 `modelIdentifier`、`commands`、`displayName`、`nodeId`。
- 强匹配(可直接判定为 JQOpenClawNode):
- `modelIdentifier` 非空,且满足以下任一条件:
- 等于 `JQOpenClawNode`。
- 以 `JQOpenClawNode` 开头(如 `JQOpenClawNode(Qt/C++)`)。
- 弱匹配(仅在 `modelIdentifier` 为空时使用):
- `commands` 同时包含:`file.read`、`file.write`、`process.exec`、`process.manage`、`system.run`、`process.which`、`system.info`、`system.screenshot`、`system.notify`、`system.clipboard`、`system.input`、`node.selfUpdate`。
- 且 `displayName` 或 `nodeId` 包含 `JQOpenClaw`。
- 拒绝匹配:
- `modelIdentifier` 明确存在但不匹配 `JQOpenClawNode*`,即使命令集合相似也不按本技能处理。
- 不确定处理:
- 若仅满足部分条件,先明确告知“节点类型不确定”,并要求用户指定目标 `nodeId` 或修正节点 `modelIdentifier` 后再执行。
## 命令映射
- 文件读取:`file.read`
- 文件写入/移动/删除/目录增删:`file.write`
- 进程执行(program/arguments/detached):`process.exec`
- 进程管理(枚举/搜索/终止):`process.manage`
- 远程进程执行(OpenClaw 标准参数):`system.run`
- 可执行命令探测:`process.which`
- 系统基础信息:`system.info`
- 屏幕截图:`system.screenshot`
- 系统弹窗:`system.notify`
- 系统剪贴板:`system.clipboard`
- 输入控制:`system.input`
- 节点自更新:`node.selfUpdate`
## 调用规则
- 统一使用 `node.invoke`。
- `params` 必须是对象,字段类型严格匹配。
- 节点侧仅接受 `node.invoke.request.payload.paramsJSON`,且 `paramsJSON` 必须解析为对象。
- `paramsJSON` 缺失或 `null` 时按空对象处理;若存在但不是字符串、为空字符串、或解析后不是对象,按 `INVALID_PARAMS` 处理。
- `file.write` 必须显式传 `allowWrite=true` 才允许执行;未显式授权时应返回阻断提示。
- `timeoutMs` 需按任务复杂度设置:
- `file.read` / `file.write`:5000-30000
- `process.exec`:5000-120000(`detached=false` 时生效)
- `process.manage`:5000-30000(`kill` 场景应确保 `timeoutMs >= waitMs`)
- `system.run`:5000-120000
- `process.which`:5000-15000
- `system.info`:30000
- `system.screenshot`:60000
- `system.notify`:5000-15000(仅参数校验与弹窗投递,弹窗异步展示)
- `system.clipboard`:5000-15000(读写系统剪贴板文本)
- `system.input`:5000-15000(仅参数校验与入队,动作异步执行)
- `node.selfUpdate`:30000-300000(下载+校验+脚本启动;成功后节点会退出重启)
- 调用 `node.selfUpdate` 时,`md5` 为必填(32 位十六进制);缺失或格式错误按 `INVALID_PARAMS` 处理。
- `node.invoke.timeoutMs` 可省略;若传入,必须为非负整数(毫秒),否则按 `INVALID_PARAMS` 处理。其中 `0` 视为立即超时。
- `node.invoke.timeoutMs` 会参与请求预算裁剪;当前节点会将 `system.run.params.timeoutMs`、`process.exec.params.timeoutMs`(`detached=false`)与 `file.read(operation=rg)` 的内部超时裁剪到该预算内(取更小值)。
- 即便省略 `node.invoke.timeoutMs`,网关/调用端仍有等待超时(当前 OpenClaw 常见默认约 `30000ms`,CLI `openclaw nodes invoke` 默认 `15000ms`)。
- 实际可用执行时长取决于最先触发的超时层:调用端/网关等待超时、`node.invoke.timeoutMs`(若传入)、能力内部超时。
- `process.manage` 当前仅支持 Windows;非 Windows 环境调用会返回 `PROCESS_MANAGE_FAILED`。
- `process.manage`:
- `operation=list/search/kill`,默认 `list`。
- `search` 必须提供 `query`(或 `keyword`)与 `pid` 之一。
- `kill` 必须提供 `pid`,可选 `waitMs` 范围 `[0, 30000]` 与 `force`(默认 `true`);`force=false` 为非强杀退出请求(仅对具有顶层窗口的进程生效);`waitMs` 当前不会被 `node.invoke.timeoutMs` 自动裁剪。
- `kill` 默认拒绝终止关键进程(critical process);仅当目标 PID 为当前节点进程时允许。
- `process.exec` 使用 `program + arguments`,支持 `detached`;用于兼容历史调用方。
- `system.run` 对齐 OpenClaw:仅使用 `command`(argv 数组)、`rawCommand`、`cwd`、`env`、`timeoutMs`、`needsScreenRecording`。
- `process.which` 支持 `program`(单个)或 `programs`(数组)探测;未命中返回 `found=false`,不作为命令失败。
- `file.read` 支持 `operation=read/lines/list/rg/stat/md5`。大文件建议使用 `read + offsetBytes + maxBytes` 分块读取(`maxBytes` 上限 `2097152`);按行区间读取使用 `lines + startLine/endLine`;目录遍历可用 `list + recursive + glob`;元信息查询使用 `stat`;文件指纹可用 `md5`。
- `file.write` 默认禁用;需显式 `allowWrite=true`。开启后默认 `operation=write`;移动用 `operation=move`(配 `destinationPath`/`toPath`);删除用 `operation=delete`(走回收站删除);目录创建用 `operation=mkdir`;目录删除用 `operation=rmdir`。
## 网关阻断处理
- `command not allowlisted`:
- 说明这是 Gateway 策略拦截。
- 提示管理员在 Gateway 配置添加 `gateway.nodes.allowCommands`(如 `file.read`、`file.write`、`process.exec`、`process.manage`、`system.run`、`process.which`、`system.notify`、`system.clipboard`、`system.input`、`node.selfUpdate`)。
- `command not declared by node` / `node did not declare commands`:
- 先看 `node.describe.commands`。
- 要求节点端先声明命令再调用。
## 错误处理规范
- `INVALID_PARAMS`:参数缺失、类型不匹配或超出范围(含 `file.read` / `file.write` / `process.exec` / `process.manage` / `system.run` / `process.which` / `system.notify` / `system.clipboard` / `system.input` / `node.selfUpdate` 的参数校验失败,例如 `node.selfUpdate` 缺失必填 `md5`)。指出具体字段问题并给出可直接重试的参数。
- `TIMEOUT`:可能为网关等待超时,或显式传入 `timeoutMs=0` 触发立即超时。建议增大 `timeoutMs` 或缩小任务范围。
- `FILE_READ_FAILED` / `FILE_WRITE_FAILED`:用于非参数类失败。输出失败原因并给路径、权限、目录存在性、回收站可用性等排查建议。
- `PROCESS_MANAGE_FAILED`:用于非参数类失败(目标进程不存在、权限不足、非 Windows 平台、命中关键进程保护、终止或等待过程失败)。输出节点返回错误并给 PID、权限、平台和进程存活状态排查建议。
- `PROCESS_EXEC_FAILED`:用于 `process.exec` 的非参数类失败(程序不存在、权限不足、启动失败等无法产出结构化执行结果)。输出节点返回错误并给 `program`、`workingDirectory`、权限排查建议。
- `SYSTEM_RUN_FAILED`:用于 `system.run` 的非参数类失败(命令非法、程序不存在、权限不足、启动失败等无法产出结构化执行结果)。输出节点返回错误并给 `command`、`cwd`、权限、目标进程状态排查建议。
- `PROCESS_WHICH_FAILED`:用于非参数类失败(探测流程内部异常)。输出节点返回错误并建议重试或检查节点日志。
- `SYSTEM_INFO_FAILED`:系统信息采集失败。建议检查节点系统命令可用性与权限。
- `SCREENSHOT_CAPTURE_FAILED` / `SCREENSHOT_UPLOAD_FAILED`:截图采集或上传失败。建议检查显示环境、`file-server-uri`、`file-server-token` 与网络连通性。
- `SYSTEM_INPUT_FAILED`:`system.input` 投递或平台能力失败。建议检查平台是否为 Windows、线程池状态与节点日志。
- `SYSTEM_NOTIFY_FAILED`:`system.notify` 投递失败。建议检查应用实例状态与 UI 线程分发日志。
- `SYSTEM_CLIPBOARD_FAILED`:`system.clipboard` 执行失败。建议检查节点应用实例、图形环境与剪贴板访问能力。
- `NODE_SELF_UPDATE_FAILED`:`node.selfUpdate` 执行失败(下载失败、HTTP 状态异常、落盘失败、脚本启动失败等)。建议检查下载地址可达性、磁盘空间与杀毒拦截。
- `NODE_SELF_UPDATE_MD5_MISMATCH`:`node.selfUpdate` 下载成功但 MD5 校验不匹配。建议核对必填 `md5` 与发布包内容。
- `COMMAND_NOT_SUPPORTED`:改用已声明命令或升级节点版本。
## 输出规范
- 成功时:
- 先一句话结论。
- 再列关键字段(例如 `bytesWritten`、`exitCode`、`timedOut`、`url`)。
- 对 `process.manage`,优先展示 `operation`、`pid`、`returnedCount/totalMatched`、`waitResult`、`resultClass` 等字段。
- 对 `system.run` / `process.exec`,若 `timedOut=true` 或 `resultClass=timeout`,按“命令超时”给出失败结论与重试建议(即使 `node.invoke` 本身返回成功结构)。
- 失败时:
- 先给 `error.code`、`error.message`。
- 再给一条可执行的下一步操作。
## 安全边界
- `file.write`、`process.exec`、`process.manage`、`system.run` 与 `process.which` 默认按最小必要原则执行。
- 对可能破坏状态的操作(删除、覆盖、重置、停服务、终止进程)先征得用户明确确认。
- 不自行提升权限,不绕过网关策略。
## system.notify
- 命令名:`system.notify`
- 用途:弹出系统消息提示框。
- 参数:
- `message`:必填字符串,非空,长度范围 `[1, 4000]`
- `title`:可选字符串,默认 `JQOpenClaw`,长度上限 `120`
- 返回字段:`operation=notify`、`title`、`message`、`shown=true`、`async=true`、`ok=true`
- 错误处理:
- 参数错误返回 `INVALID_PARAMS`
- 投递失败返回 `SYSTEM_NOTIFY_FAILED`
## system.clipboard
- 命令名:`system.clipboard`
- 用途:读取当前系统剪贴板文本,或写入文本到系统剪贴板。
- 参数:
- `operation`:可选字符串,`read|write`,默认 `read`
- `text`:当 `operation=write` 时必填字符串
- 返回字段(`operation=read`):`operation=read`、`text`、`length`、`hasText`、`ok=true`
- 返回字段(`operation=write`):`operation=write`、`written=true`、`length`、`hasText`、`ok=true`
- 错误处理:
- 参数错误返回 `INVALID_PARAMS`
- 执行失败返回 `SYSTEM_CLIPBOARD_FAILED`
## system.input
- 命令名:`system.input`
- 用途:按顺序执行输入动作数组,支持鼠标、键盘和延迟混排。
- 执行语义:参数校验通过后异步入队;`node.invoke` 立即返回。
- 调度策略:latest-wins。若新请求到达,会取消旧请求尚未完成的剩余动作;已执行动作不会回滚。
- 使用建议:`keyboard.down` / `keyboard.up` 尽量在同一请求内闭合配对,或优先使用 `keyboard.tap`。
- 入参要求:
- `params.actions` 必须为数组,长度 `[1, 1000]`
- 每个动作对象必须包含 `type`
- 支持 `mouse.move`、`mouse.click`、`mouse.scroll`、`mouse.drag`、`keyboard.down`、`keyboard.up`、`keyboard.tap`、`keyboard.text`、`delay`
- 关键校验:
- `mouse.move.mode`:`absolute|relative`
- `mouse.click.button`:`left|right`
- `mouse.scroll`:`delta` 或 `deltaY` 二选一必填,可选 `deltaX`
- `mouse.drag`:`mode=absolute|relative`,可选 `button=left|right`
- `keyboard.text.text`:非空字符串
- `delay.ms`:`[0, 60000]`
- 错误处理:
- 参数错误返回 `INVALID_PARAMS`
- 投递失败返回 `SYSTEM_INPUT_FAILED`
## 参考
- [references/command-spec.md](references/command-spec.md)