Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 07fa0b0038 | |||
| b1e93a323f | |||
| f214598470 | |||
| 5abe67f340 | |||
| 599d7cff48 |
@@ -17,6 +17,8 @@
|
|||||||
4. 在 `scripts/service/` 中补业务 service 与真正的发布/执行逻辑。
|
4. 在 `scripts/service/` 中补业务 service 与真正的发布/执行逻辑。
|
||||||
5. 用 `python scripts/main.py health` 和 `python scripts/main.py version` 做最小验证。
|
5. 用 `python scripts/main.py health` 和 `python scripts/main.py version` 做最小验证。
|
||||||
|
|
||||||
|
如果你的技能在平台里默认是非公开的(`access_scope = 0`),建议在 `SKILL.md` 的 `metadata.openclaw.developer_ids` 中填写开发者用户 ID 列表。这样发布后,平台会自动给这些开发者补可见权限,避免“技能已发布但开发者自己在市场中看不到”。
|
||||||
|
|
||||||
开发教程入口:
|
开发教程入口:
|
||||||
|
|
||||||
- <a href="references/REQUIREMENTS.md" target="_blank" rel="noopener noreferrer">需求文档模板</a>:给技术人员编写和查看研发需求的标准模板
|
- <a href="references/REQUIREMENTS.md" target="_blank" rel="noopener noreferrer">需求文档模板</a>:给技术人员编写和查看研发需求的标准模板
|
||||||
@@ -46,3 +48,4 @@ python scripts/main.py version
|
|||||||
|
|
||||||
- 不要再往模板里引入旧式 `docs/` 或 `optional/` 目录。
|
- 不要再往模板里引入旧式 `docs/` 或 `optional/` 目录。
|
||||||
- 新技能若不需要某些目录,也建议先保留结构,再按实际业务填充内容。
|
- 新技能若不需要某些目录,也建议先保留结构,再按实际业务填充内容。
|
||||||
|
- `metadata.openclaw.developer_ids` 是发布元数据,不是用户展示文案。它的作用是让发布后的非公开技能自动授权给指定开发者查看。
|
||||||
|
|||||||
8
SKILL.md
8
SKILL.md
@@ -1,13 +1,16 @@
|
|||||||
---
|
---
|
||||||
name: 技能开发模板(复制后请修改)
|
name: 技能开发模板(复制后请修改)
|
||||||
description: "这是 OpenClaw 技能开发模板仓库,不直接作为业务技能发布。复制为新技能仓库后,按本模板替换 slug、名称、说明、CLI 子命令与 service 实现。"
|
description: "这是 OpenClaw 技能开发模板仓库,不直接作为业务技能发布。复制为新技能仓库后,按本模板替换 slug、名称、说明、CLI 子命令与 service 实现。"
|
||||||
version: 1.0.0
|
version: 1.0.13
|
||||||
author: 深圳匠厂科技有限公司
|
author: 深圳匠厂科技有限公司
|
||||||
metadata:
|
metadata:
|
||||||
openclaw:
|
openclaw:
|
||||||
slug: your-skill-slug
|
slug: your-skill-slug
|
||||||
emoji: "📦"
|
emoji: "📦"
|
||||||
category: "通用"
|
category: "通用"
|
||||||
|
developer_ids:
|
||||||
|
- 10032
|
||||||
|
- 12428
|
||||||
allowed-tools:
|
allowed-tools:
|
||||||
- bash
|
- bash
|
||||||
---
|
---
|
||||||
@@ -39,4 +42,7 @@ python {baseDir}/scripts/main.py version
|
|||||||
|
|
||||||
- 复制后请同步修改 `scripts/util/constants.py` 中的 `SKILL_SLUG` / `SKILL_VERSION`。
|
- 复制后请同步修改 `scripts/util/constants.py` 中的 `SKILL_SLUG` / `SKILL_VERSION`。
|
||||||
- 如技能无需持久化,可保留 `db/` 目录但不主动调用。
|
- 如技能无需持久化,可保留 `db/` 目录但不主动调用。
|
||||||
|
- `metadata.openclaw.developer_ids` 用于声明技能发布后的默认开发者可见用户 ID 列表。
|
||||||
|
- 当技能在平台中 `access_scope = 0`(不公开)时,发布流程会把 `developer_ids` 中的用户自动补写到 `skill_user_access`,使这些开发者仍可在技能市场中查看该技能。
|
||||||
|
- `developer_ids` 建议写为正整数数组;第一个 ID 会作为主开发者同步到 `skills.developer_id`。
|
||||||
- 面向用户与编排的文档写在 `references/`,不要再新增旧式 `docs/` / `optional/` 结构。
|
- 面向用户与编排的文档写在 `references/`,不要再新增旧式 `docs/` / `optional/` 结构。
|
||||||
|
|||||||
@@ -29,22 +29,23 @@
|
|||||||
|
|
||||||
| 工具 | 类型 | 适合场景 | 官方入口 |
|
| 工具 | 类型 | 适合场景 | 官方入口 |
|
||||||
|------|------|----------|----------|
|
|------|------|----------|----------|
|
||||||
| Cursor | 独立 AI IDE | 代码编辑、Agent 开发、整仓理解 | [官网](https://www.cursor.com/) / [下载](https://www.cursor.com/downloads) |
|
| Cursor | 独立 AI IDE | 代码编辑、Agent 开发、整仓理解 | <a href="https://www.cursor.com/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://www.cursor.com/downloads" target="_blank" rel="noopener noreferrer">下载</a> |
|
||||||
| Windsurf | 独立 AI IDE | Agent 编程、项目生成、连续开发流 | [文档](https://docs.codeium.com/windsurf) / [下载](https://windsurf.com/download) |
|
| Windsurf | 独立 AI IDE | Agent 编程、项目生成、连续开发流 | <a href="https://docs.codeium.com/windsurf" target="_blank" rel="noopener noreferrer">文档</a> / <a href="https://windsurf.com/download" target="_blank" rel="noopener noreferrer">下载</a> |
|
||||||
| GitHub Copilot | IDE 插件 / 编程助手 | 日常补全、解释代码、生成函数、配合 VS Code 或 JetBrains 使用 | [官网](https://github.com/copilot) |
|
| GitHub Copilot | IDE 插件 / 编程助手 | 日常补全、解释代码、生成函数、配合 VS Code 或 JetBrains 使用 | <a href="https://github.com/copilot" target="_blank" rel="noopener noreferrer">官网</a> |
|
||||||
| Claude Code | 终端 / IDE 编程代理 | 命令行开发、代码库分析、自动改代码、运行命令 | [官网](https://www.anthropic.com/claude-code) / [文档](https://docs.anthropic.com/en/docs/claude-code/) |
|
| Claude Code | 终端 / IDE 编程代理 | 命令行开发、代码库分析、自动改代码、运行命令 | <a href="https://www.anthropic.com/claude-code" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://docs.anthropic.com/en/docs/claude-code/" target="_blank" rel="noopener noreferrer">文档</a> |
|
||||||
| Aider | 终端 AI 编程工具 | 已有代码仓库的增量开发、终端协作、快速提交 | [官网](https://www.aider.chat/) / [文档](https://aider.chat/docs/) |
|
| Codex | 终端 / IDE / Web 编程代理 | OpenAI 官方编码代理,适合代码生成、理解、调试、评审 | <a href="https://developers.openai.com/codex/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://developers.openai.com/codex/quickstart" target="_blank" rel="noopener noreferrer">快速开始</a> |
|
||||||
| Cline | VS Code / JetBrains 插件 | 编辑器内 Agent 开发、命令执行、浏览器联动调试 | [官网](https://cline.bot/) / [文档](https://docs.cline.bot/introduction/welcome) / [VS Code 插件](https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev) |
|
| Aider | 终端 AI 编程工具 | 已有代码仓库的增量开发、终端协作、快速提交 | <a href="https://www.aider.chat/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://aider.chat/docs/" target="_blank" rel="noopener noreferrer">文档</a> |
|
||||||
|
| Cline | VS Code / JetBrains 插件 | 编辑器内 Agent 开发、命令执行、浏览器联动调试 | <a href="https://cline.bot/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://docs.cline.bot/introduction/welcome" target="_blank" rel="noopener noreferrer">文档</a> / <a href="https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev" target="_blank" rel="noopener noreferrer">VS Code 插件</a> |
|
||||||
|
|
||||||
### 国内主流工具
|
### 国内主流工具
|
||||||
|
|
||||||
| 工具 | 类型 | 适合场景 | 官方入口 |
|
| 工具 | 类型 | 适合场景 | 官方入口 |
|
||||||
|------|------|----------|----------|
|
|------|------|----------|----------|
|
||||||
| Trae | 独立 AI IDE | AI 辅助写代码、项目搭建、对话式开发 | [官网](https://www.trae.ai/home) / [下载](https://www.trae.ai/download) |
|
| Trae | 独立 AI IDE | AI 辅助写代码、项目搭建、对话式开发 | <a href="https://www.trae.ai/home" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://www.trae.ai/download" target="_blank" rel="noopener noreferrer">下载</a> |
|
||||||
| 通义灵码 | 独立 IDE / IDE 插件 | 国内团队日常编码、问答、补全、代码生成 | [官网](https://tongyi.aliyun.com/lingma/?channel=yy_AiBot) / [下载](https://tongyi.aliyun.com/lingma/download) |
|
| 通义灵码 | 独立 IDE / IDE 插件 | 国内团队日常编码、问答、补全、代码生成 | <a href="https://tongyi.aliyun.com/lingma/?channel=yy_AiBot" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://tongyi.aliyun.com/lingma/download" target="_blank" rel="noopener noreferrer">下载</a> |
|
||||||
| CodeGeeX | IDE 插件 / 开源助手 | 代码补全、生成、注释、跨语言辅助 | [GitHub](https://github.com/zai-org/CodeGeeX) / [VS Code 插件](https://marketplace.visualstudio.com/items?itemName=aminer.codegeex) |
|
| CodeGeeX | IDE 插件 / 开源助手 | 代码补全、生成、注释、跨语言辅助 | <a href="https://github.com/zai-org/CodeGeeX" target="_blank" rel="noopener noreferrer">GitHub</a> / <a href="https://marketplace.visualstudio.com/items?itemName=aminer.codegeex" target="_blank" rel="noopener noreferrer">VS Code 插件</a> |
|
||||||
| 腾讯 CodeBuddy | IDE 插件 | 代码补全、测试生成、智能问答、腾讯云开发体系协作 | [官网](https://www.codebuddy.ai/) / [文档](https://www.tencentcloud.com/document/product/1256) / [VS Code 插件](https://marketplace.visualstudio.com/items?itemName=Tencent-Cloud.coding-copilot) |
|
| 腾讯 CodeBuddy | IDE 插件 | 代码补全、测试生成、智能问答、腾讯云开发体系协作 | <a href="https://www.codebuddy.ai/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://www.tencentcloud.com/document/product/1256" target="_blank" rel="noopener noreferrer">文档</a> / <a href="https://marketplace.visualstudio.com/items?itemName=Tencent-Cloud.coding-copilot" target="_blank" rel="noopener noreferrer">VS Code 插件</a> |
|
||||||
| 百度文心快码(Baidu Comate) | IDE 插件 | 国内研发团队辅助编码、解释、测试、优化 | [官网](https://comate.baidu.com/zh) |
|
| 百度文心快码(Baidu Comate) | IDE 插件 | 国内研发团队辅助编码、解释、测试、优化 | <a href="https://comate.baidu.com/zh" target="_blank" rel="noopener noreferrer">官网</a> |
|
||||||
|
|
||||||
### 选型建议
|
### 选型建议
|
||||||
|
|
||||||
@@ -185,6 +186,8 @@ scripts/
|
|||||||
- 平台内部键
|
- 平台内部键
|
||||||
- 日志 logger 名
|
- 日志 logger 名
|
||||||
|
|
||||||
|
此外,如果该技能发布后默认不公开(`access_scope = 0`),建议一开始就把 `SKILL.md` 中的 `metadata.openclaw.developer_ids` 配好。这样后续发布到平台时,开发者本人仍能在技能市场中看到并验证该技能。
|
||||||
|
|
||||||
## 5. 哪些占位内容必须替换
|
## 5. 哪些占位内容必须替换
|
||||||
|
|
||||||
复制后,至少要全局检查并替换下面这些内容:
|
复制后,至少要全局检查并替换下面这些内容:
|
||||||
@@ -211,9 +214,23 @@ scripts/
|
|||||||
|
|
||||||
- 技能名称
|
- 技能名称
|
||||||
- 技能描述
|
- 技能描述
|
||||||
- slug
|
- `slug`
|
||||||
- category
|
作用:技能的唯一英文标识,通常用于仓库名、发布包名、运行时目录名、平台主键匹配等
|
||||||
- dependencies
|
示例:`weibo-publisher`、`douyin-publisher`、`xiaohongshu-publisher`
|
||||||
|
- `category`
|
||||||
|
作用:技能在平台中的分类,用于市场展示与归类,不是代码内部键
|
||||||
|
示例:`通用`、`内容`、`办公协作`、`物流`、`抖音`、`小红书`
|
||||||
|
- `developer_ids`(如需给非公开技能自动补开发者可见权限)
|
||||||
|
作用:声明发布后默认拥有可见权限的开发者用户 ID 列表
|
||||||
|
- `dependencies`
|
||||||
|
作用:声明该技能依赖的兄弟技能或运行前置能力,便于平台或编排层识别依赖关系
|
||||||
|
示例:
|
||||||
|
```yaml
|
||||||
|
dependencies:
|
||||||
|
required:
|
||||||
|
- account-manager
|
||||||
|
- content-manager
|
||||||
|
```
|
||||||
- 何时使用本技能
|
- 何时使用本技能
|
||||||
- 对用户的引导话术
|
- 对用户的引导话术
|
||||||
- CLI 使用原则
|
- CLI 使用原则
|
||||||
@@ -225,6 +242,33 @@ scripts/
|
|||||||
- 代码注释
|
- 代码注释
|
||||||
- `service/` 实现里
|
- `service/` 实现里
|
||||||
|
|
||||||
|
### 关于 `metadata.openclaw.developer_ids`
|
||||||
|
|
||||||
|
这是一个平台发布元数据字段,用于解决下面这个问题:
|
||||||
|
|
||||||
|
- 技能发布后若平台记录中的 `access_scope = 0`,技能默认不公开
|
||||||
|
- 如果不额外授权,连开发者自己也可能在技能市场里看不到这个技能
|
||||||
|
|
||||||
|
因此可以在 `SKILL.md` 中声明:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
metadata:
|
||||||
|
openclaw:
|
||||||
|
slug: your-skill-slug
|
||||||
|
category: 通用
|
||||||
|
developer_ids:
|
||||||
|
- 1032
|
||||||
|
- 12428
|
||||||
|
```
|
||||||
|
|
||||||
|
约定如下:
|
||||||
|
|
||||||
|
- 只允许填写正整数用户 ID
|
||||||
|
- 推荐使用数组,即使当前只有 1 个开发者
|
||||||
|
- 发布时平台会把这些用户自动补写到 `skill_user_access`
|
||||||
|
- 第一个 ID 会同步到 `skills.developer_id`
|
||||||
|
- 一期只做“补授权”,不会因为你 later 修改数组而自动撤销旧授权
|
||||||
|
|
||||||
## 7. `references/` 应该放什么
|
## 7. `references/` 应该放什么
|
||||||
|
|
||||||
`references/` 是当前规范 skill 的文档中心,建议至少有这些:
|
`references/` 是当前规范 skill 的文档中心,建议至少有这些:
|
||||||
@@ -349,27 +393,27 @@ scripts/
|
|||||||
3. 用子进程调用
|
3. 用子进程调用
|
||||||
4. 机器可读输出优先 JSON
|
4. 机器可读输出优先 JSON
|
||||||
|
|
||||||
## 13. 如何开发发布型 skill
|
## 13. 如何开发一个新 skill
|
||||||
|
|
||||||
如果你开发的是 publisher 类 skill,建议按这个顺序做:
|
不管你开发的是发布类、采集类、分析类还是知识库类 skill,建议都先按下面这个顺序推进:
|
||||||
|
|
||||||
1. 先把目录结构搭完整
|
1. 先把目录结构搭完整
|
||||||
2. 先让 `health` / `version` 跑通
|
2. 先让 `health` / `version` 跑通
|
||||||
3. 再让 `publish_service.py` 的骨架跑通
|
3. 再把核心 `service` 骨架跑通
|
||||||
4. 再接 `sibling_bridge.py`
|
4. 再接兄弟技能桥接、数据库或外部系统
|
||||||
5. 最后再写 `*_playwright.py`
|
5. 最后再补浏览器自动化、复杂流程编排或高风险集成
|
||||||
|
|
||||||
不要一开始就直接写页面选择器。
|
不要一开始就直接写页面选择器、复杂接口编排或深层业务逻辑。
|
||||||
|
|
||||||
推荐先确保这些基础能力正常:
|
推荐先确保这些基础能力正常:
|
||||||
|
|
||||||
- 能取到账号
|
- CLI 入口能跑通
|
||||||
- 能取到文章
|
- 基础命令输出稳定
|
||||||
- 能写日志
|
- 关键依赖能取到
|
||||||
- CLI 子命令通了
|
- 日志或本地状态能落下来
|
||||||
- 错误返回值格式定好了
|
- 错误返回值格式定好了
|
||||||
|
|
||||||
然后再进浏览器自动化。
|
如果你的 skill 恰好是 publisher 类,可以把上面的“核心 `service`”具体落成 `publish_service.py`,再逐步接 `sibling_bridge.py`、`*_playwright.py`。但这只是示例,不代表模板只适合发布类技能。
|
||||||
|
|
||||||
## 14. 本地开发的最小验证顺序
|
## 14. 本地开发的最小验证顺序
|
||||||
|
|
||||||
@@ -386,12 +430,19 @@ python scripts/main.py version
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/main.py -h
|
python scripts/main.py -h
|
||||||
python scripts/main.py publish -h
|
python scripts/main.py <your-command> -h
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. 验证本地日志与数据库
|
### 3. 验证本地日志与数据库
|
||||||
|
|
||||||
如果是发布型 skill,再继续:
|
如果你的 skill 需要本地日志或数据库,再继续:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/main.py <your-log-command>
|
||||||
|
python scripts/main.py <your-detail-command> <id>
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你沿用了模板中的发布型骨架,那么这里可以具体对应成:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/main.py logs
|
python scripts/main.py logs
|
||||||
@@ -403,7 +454,7 @@ python scripts/main.py log-get 1
|
|||||||
比如:
|
比如:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/main.py publish
|
python scripts/main.py <your-command>
|
||||||
```
|
```
|
||||||
|
|
||||||
## 15. 发布到正式环境验证
|
## 15. 发布到正式环境验证
|
||||||
@@ -418,6 +469,8 @@ python scripts/main.py publish
|
|||||||
.\release.ps1
|
.\release.ps1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
如果你的技能使用了 `metadata.openclaw.developer_ids`,那么这一步触发的发布工作流除了同步 `skills` / `skill_versions` 外,还会在平台侧自动补开发者可见权限。测试非公开技能时,建议重点验证这部分是否生效。
|
||||||
|
|
||||||
这一步会自动完成标准发布动作,包括:
|
这一步会自动完成标准发布动作,包括:
|
||||||
|
|
||||||
1. 检查当前仓库状态
|
1. 检查当前仓库状态
|
||||||
|
|||||||
@@ -17,10 +17,26 @@ description: "这是规范化的新技能模板说明,不直接作为业务技
|
|||||||
## 复制后你需要改什么
|
## 复制后你需要改什么
|
||||||
|
|
||||||
- `SKILL.md` 中的名称、描述、slug、触发说明
|
- `SKILL.md` 中的名称、描述、slug、触发说明
|
||||||
|
- `SKILL.md` 中 `metadata.openclaw.developer_ids`(如需让非公开技能默认授权给开发者查看)
|
||||||
- `references/CLI.md` 里的命令示例
|
- `references/CLI.md` 里的命令示例
|
||||||
- `scripts/util/constants.py` 中的 slug / 版本 / logger 名
|
- `scripts/util/constants.py` 中的 slug / 版本 / logger 名
|
||||||
- `scripts/service/` 下的真实业务实现
|
- `scripts/service/` 下的真实业务实现
|
||||||
|
|
||||||
|
## `developer_ids` 是做什么的
|
||||||
|
|
||||||
|
`metadata.openclaw.developer_ids` 是平台发布元数据,不是终端用户文案。
|
||||||
|
|
||||||
|
它用于声明:当技能发布后,如果平台侧将该技能设置为 `access_scope = 0`(不公开),哪些开发者用户仍应自动获得可见权限。
|
||||||
|
|
||||||
|
约定如下:
|
||||||
|
|
||||||
|
- 字段位置:`SKILL.md` -> `metadata.openclaw.developer_ids`
|
||||||
|
- 推荐格式:正整数数组,例如 `[1032, 12428]`
|
||||||
|
- 发布效果:发布接口会把这些用户补写到 `skill_user_access`
|
||||||
|
- 第一个 ID 会作为主开发者同步到 `skills.developer_id`
|
||||||
|
|
||||||
|
如果你的技能本来就是公开技能,或暂时不需要开发者专属可见性,这个字段可以留空数组。
|
||||||
|
|
||||||
## 不建议再保留的旧结构
|
## 不建议再保留的旧结构
|
||||||
|
|
||||||
- 旧模板里的 `docs/`
|
- 旧模板里的 `docs/`
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""技能标识与版本(复制后请修改)。"""
|
"""技能标识与版本(复制后请修改)。"""
|
||||||
|
|
||||||
SKILL_SLUG = "your-skill-slug"
|
SKILL_SLUG = "your-skill-slug"
|
||||||
SKILL_VERSION = "1.0.0"
|
SKILL_VERSION = "1.0.13"
|
||||||
LOG_LOGGER_NAME = "openclaw.skill.your_skill_slug"
|
LOG_LOGGER_NAME = "openclaw.skill.your_skill_slug"
|
||||||
|
|||||||
Reference in New Issue
Block a user