名称: skillcraft
描述: 设计与构建 OpenClaw 技能。当被要求“制作/构建/设计一个技能”、将临时功能提取为技能或将脚本/指令打包以供复用时使用。涵盖 OpenClaw 特定集成(工具调用、记忆、消息路由、定时任务、画布、节点)和 ClawHub 发布。
元数据: {"openclaw":{"emoji":"🧶"}}
一份关于创建 OpenClaw 技能的指导性指南。重点在于 OpenClaw 特定集成 —— 消息路由、定时任务调度、记忆持久化、频道格式化、前置元数据门控 —— 而非通用编程建议。
文档: https://docs.openclaw.ai/tools/skills · https://docs.openclaw.ai/tools/creating-skills
本技能专为前沿模型(Opus, Sonnet)编写。如果您使用的是较便宜的模型,并发现某个阶段描述不够详细,请自行扩展 —— 设计序列是一个脚手架,而非脚本。较便宜的模型应:
{baseDir}/patterns/ 中的模式文件从零构建时跳过此阶段。当需要将现有功能(脚本、TOOLS.md 章节、对话模式、重复指令)打包成技能时使用。
收集现有内容、存放位置、有效部分和脆弱部分。然后进入阶段 1。
与用户一起梳理:
尽早提问:这是为您的设置设计的,还是应该在任何 OpenClaw 实例上都能工作?
| 选择 | 影响 |
|---|---|
| 通用 | 通用路径,无本地假设,可发布至 ClawHub |
| 特定 | 可引用本地技能、工具、工作空间配置 |
从系统提示中扫描 <available_skills>,寻找互补能力。阅读有潜力的技能以了解组合机会。
结合技能需求查阅文档。以组合方式思考 —— OpenClaw 的原语能以强大方式组合。需要查阅的关键文档:
| 需求 | 文档 |
|---|---|
| 消息 | /concepts/messages |
| 定时任务/调度 | /automation/cron-jobs |
| 子代理 | /tools/subagents |
| 浏览器 | /tools/browser |
| 画布 UI | /tools/ (canvas) |
| 节点设备 | /nodes/ |
| 斜杠命令 | /tools/slash-commands |
查看 {baseDir}/patterns/composable-examples.md 获取组合这些特性的灵感。
基于阶段 1-2,确定适用的模式:
| 如果技能... | 模式 |
|---|---|
| 封装 CLI 工具 | {baseDir}/patterns/cli-wrapper.md |
| 封装 Web API | {baseDir}/patterns/api-wrapper.md |
| 监控与通知 | {baseDir}/patterns/monitor.md |
加载所有适用的模式并进行综合。大多数技能会组合多种模式。
脚本与指令的划分: 脚本处理确定性机制(API 调用、数据收集、文件处理)。SKILL.md 指令处理判断(解释结果、选择方法、组合输出)。划分边界是:一个智能程度较低的系统能否可靠地完成?如果可以 → 脚本。
向用户展示提议的架构以供审阅:
状态存放位置:
- <workspace>/memory/ —— 面向用户的上下文
- {baseDir}/state.json —— 技能内部状态(随技能迁移)
- <workspace>/state/<skill>.json —— 公共工作空间区域中的技能状态
如果是提取现有功能:包含迁移说明(哪些内容移动,哪些工作空间文件需要更新)。
验证: 它是否处理了阶段 1 的所有示例?是否存在矛盾?边缘情况?
与用户迭代直到满意为止。这是以低成本发现设计问题的阶段。
默认:同一会话。 按照规范逐步实现,并在每个步骤后由用户审阅。仅将复杂的脚本子组件交给子代理处理 —— SKILL.md 和集成逻辑保留在主会话中。
如果是提取现有功能:更新工作空间文件,清理旧位置,验证独立运行。
前置元数据决定了可发现性和门控。格式遵循 AgentSkills 规范,并带有 OpenClaw 扩展。
---
**名称:** my-skill
**描述:** [为可发现性优化的描述 —— 见下文]
**主页:** https://github.com/user/repo # 可选
**元数据:** {"openclaw":{"emoji":"🔧","requires":{"bins":["tool"],"env":["API_KEY"]},"primaryEnv":"API_KEY","install":[...]}}
---
关键: metadata 必须是 单行 JSON 对象(解析器限制)。
描述决定了技能是否会被加载。应包含:
- 核心能力 —— 它做什么
- 触发关键词 —— 用户可能会说的术语
- 适用场景 —— 技能适用的情境
测试:代理是否会为您的每个阶段 1 示例短语选择此技能?
| 键 | 用途 |
|---|---|
name |
技能标识符(必需) |
description |
可发现性文本(必需) |
homepage |
文档/仓库的 URL |
user-invocable |
true/false —— 是否作为斜杠命令暴露(默认:true) |
disable-model-invocation |
true/false —— 是否从模型提示中排除(默认:false) |
command-dispatch |
tool —— 绕过模型,直接分派到工具 |
command-tool |
用于直接分派的工具名称 |
command-arg-mode |
raw —— 将原始参数转发给工具 |
OpenClaw 在加载时使用 metadata.openclaw 过滤技能:
| 字段 | 效果 |
|---|---|
always: true |
跳过所有门控,始终加载 |
emoji |
在 macOS Skills UI 中显示 |
os |
平台过滤器(darwin, linux, win32) |
requires.bins |
PATH 上必须全部存在 |
requires.anyBins |
至少存在一个 |
requires.env |
环境变量必须存在或在配置中 |
requires.config |
配置路径必须为真值 |
primaryEnv |
映射到 skills.entries.<name>.apiKey |
install |
自动安装的安装器规范(brew/node/go/uv/download) |
沙盒注意: requires.bins 在加载时检查 主机。如果在沙盒中,二进制文件也必须存在于容器内。
每个符合条件的技能会向系统提示添加约 97 个字符 + 名称 + 描述 + 位置路径。保持描述信息丰富但不臃肿 —— 每个字符都会在每次交互中消耗令牌。
"install": [
{"id": "brew", "kind": "brew", "formula": "tap/tool", "bins": ["tool"], "label": "通过 brew 安装"},
{"id": "npm", "kind": "node", "package": "tool", "bins": ["tool"]},
{"id": "uv", "kind": "uv", "package": "tool", "bins": ["tool"]},
{"id": "go", "kind": "go", "package": "github.com/user/tool@latest", "bins": ["tool"]},
{"id": "dl", "kind": "download", "url": "https://...", "archive": "tar.gz"}
]
| 令牌 | 含义 |
|---|---|
{baseDir} |
此技能的目录(OpenClaw 在运行时解析) |
<workspace>/ |
代理的工作空间根目录 |
{baseDir} 引用技能内部内容(脚本、状态、模式)<workspace>/ 引用工作空间文件(TOOLS.md, memory/ 等){baseDir}/patterns/ (cli-wrapper, api-wrapper, monitor, composable-examples)