sophhub 0.4.27 → 0.4.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skills/sophclaw-skill-creator/skill.json +18 -0
- package/skills/sophclaw-skill-creator/src/SKILL.md +216 -0
- package/skills/sophclaw-skill-creator/src/pyproject.toml +5 -0
- package/skills/sophclaw-skill-creator/src/references/skill-notes.md +301 -0
- package/skills/sophclaw-skill-creator/src/scripts/generate.py +262 -0
- package/skills/sophclaw-skill-creator/src/scripts/validate.py +303 -0
- package/skills/sophnet-image-ocr/skill.json +15 -3
- package/skills/sophnet-image-ocr/src/SKILL.md +28 -125
- package/skills/sophnet-image-ocr/src/pyproject.toml +8 -2
- package/skills/sophnet-image-ocr/src/references/api-details.md +36 -0
- package/skills/sophnet-image-ocr/src/scripts/ocr.py +26 -2
- package/skills/sophnet-image-ocr/src/uv.lock +0 -234
package/package.json
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sophclaw-skill-creator",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"types": ["store"],
|
|
5
|
+
"displayName": "Skill 创建向导",
|
|
6
|
+
"description": "在 SophClaw 仓库中交互式创建符合规范的 Skill,三步流程:需求对齐→方案对齐→生成代码",
|
|
7
|
+
"changelog": [
|
|
8
|
+
{
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"date": "2026-05-25",
|
|
11
|
+
"changes": [
|
|
12
|
+
"初次提交:交互式 skill 创建向导,三步流程(需求对齐→方案对齐→生成代码),含 generate.py 和 validate.py"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"createdAt": "2026-05-25",
|
|
17
|
+
"updatedAt": "2026-05-25"
|
|
18
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sophclaw-skill-creator
|
|
3
|
+
description: 在 SophClaw 仓库中创建新 skill。当用户说"创建skill""新建skill""开发一个skill""帮我做一个skill"时使用。三步流程:需求对齐→方案对齐→生成代码。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SophClaw Skill Creator
|
|
7
|
+
|
|
8
|
+
在 SophClaw 仓库中交互式创建符合规范的 skill。
|
|
9
|
+
|
|
10
|
+
## 流程
|
|
11
|
+
|
|
12
|
+
```dot
|
|
13
|
+
digraph skill_create {
|
|
14
|
+
rankdir=TB;
|
|
15
|
+
|
|
16
|
+
start [label="用户请求创建 skill", shape=oval];
|
|
17
|
+
step1 [label="第一步:需求对齐\n自适应提问,明确需求", shape=box];
|
|
18
|
+
spec1 [label="产出 design.md「需求说明」", shape=box];
|
|
19
|
+
user_ok1 [label="用户确认?", shape=diamond];
|
|
20
|
+
step2 [label="第二步:方案对齐\n设计结构 + 打磨 description", shape=box];
|
|
21
|
+
spec2 [label="产出 design.md「方案设计」+「测试用例」", shape=box];
|
|
22
|
+
user_ok2 [label="用户确认?", shape=diamond];
|
|
23
|
+
step3 [label="第三步:生成代码\ngenerate.py 生成骨架", shape=box];
|
|
24
|
+
edit [label="用户编辑 SKILL.md", shape=box];
|
|
25
|
+
validate [label="validate.py 校验", shape=box];
|
|
26
|
+
check [label="有 ERROR?", shape=diamond];
|
|
27
|
+
done [label="完成 ✅", shape=oval];
|
|
28
|
+
|
|
29
|
+
start -> step1;
|
|
30
|
+
step1 -> spec1;
|
|
31
|
+
spec1 -> user_ok1;
|
|
32
|
+
user_ok1 -> step1 [label="否,修改"];
|
|
33
|
+
user_ok1 -> step2 [label="是"];
|
|
34
|
+
step2 -> spec2;
|
|
35
|
+
spec2 -> user_ok2;
|
|
36
|
+
user_ok2 -> step2 [label="否,修改"];
|
|
37
|
+
user_ok2 -> step3 [label="是"];
|
|
38
|
+
step3 -> edit;
|
|
39
|
+
edit -> validate;
|
|
40
|
+
validate -> check;
|
|
41
|
+
check -> edit [label="是,修复"];
|
|
42
|
+
check -> done [label="否"];
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 第一步:需求对齐
|
|
47
|
+
|
|
48
|
+
自适应提问,帮用户把 skill 想清楚。每次只问一个问题,多问"为什么"。至少覆盖:
|
|
49
|
+
|
|
50
|
+
1. **功能**:这个 skill 做什么?输入是什么?输出是什么?
|
|
51
|
+
2. **触发场景**:用户会怎么说话来触发它?(这是 description 的核心素材)
|
|
52
|
+
3. **上线平台**:确定 type,按以下决策树选择:
|
|
53
|
+
|
|
54
|
+
```dot
|
|
55
|
+
digraph type_select {
|
|
56
|
+
rankdir=TB;
|
|
57
|
+
|
|
58
|
+
q1 [label="用户能自己安装?", shape=diamond];
|
|
59
|
+
q2 [label="默认所有用户可见?", shape=diamond];
|
|
60
|
+
q3 [label="已确定长期维护?", shape=diamond];
|
|
61
|
+
|
|
62
|
+
store [label="store\n商店可安装\n需中文 displayName/description", shape=box];
|
|
63
|
+
builtin [label="builtin\n系统内置,默认可用", shape=box];
|
|
64
|
+
private [label="private\n内部使用,CLI 不可见", shape=box];
|
|
65
|
+
tmp [label="tmp\n临时/未分类,CLI 不可见", shape=box];
|
|
66
|
+
|
|
67
|
+
q1 -> q2 [label="否"];
|
|
68
|
+
q1 -> store [label="是"];
|
|
69
|
+
q2 -> builtin [label="是"];
|
|
70
|
+
q2 -> q3 [label="否"];
|
|
71
|
+
q3 -> private [label="是"];
|
|
72
|
+
q3 -> tmp [label="否/不确定"];
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- `store`:**必须**有中文 displayName 和 description
|
|
77
|
+
- `private` / `tmp`:CLI list/download 不可见
|
|
78
|
+
4. **是否需要脚本**:涉及 API 调用?复杂数据处理?还是纯指令型的 SKILL.md 就够?
|
|
79
|
+
5. **是否需要 references/assets**:有大量参考文档?有模板文件?
|
|
80
|
+
|
|
81
|
+
确认需求后,产出 `design.md` 的「需求说明」部分,格式:
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
# <skill-name> 设计文档
|
|
85
|
+
|
|
86
|
+
## 一、需求说明
|
|
87
|
+
- 功能描述
|
|
88
|
+
- 触发场景(用户怎么说话会触发)
|
|
89
|
+
- 输入/输出约定
|
|
90
|
+
- 上线平台及 type 选择理由
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
用户确认后进入下一步。
|
|
94
|
+
|
|
95
|
+
## 第二步:方案对齐
|
|
96
|
+
|
|
97
|
+
基于需求,设计 skill 结构。重点:
|
|
98
|
+
|
|
99
|
+
### 目录结构设计
|
|
100
|
+
|
|
101
|
+
讨论并确定需要哪些资源目录(scripts/references/assets),产出目录树。
|
|
102
|
+
|
|
103
|
+
### description 打磨(核心)
|
|
104
|
+
|
|
105
|
+
这是最容易出问题的地方。**description 是 LLM 匹配 skill 的唯一依据**,必须包含功能+触发场景。
|
|
106
|
+
|
|
107
|
+
**公式**:`功能 + 触发场景 = 好的 description`
|
|
108
|
+
|
|
109
|
+
正例:
|
|
110
|
+
```yaml
|
|
111
|
+
description: 压缩 PNG/JPEG 图片。当用户要求压缩图片、减小图片体积、优化图片大小时使用。
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
反例:
|
|
115
|
+
```yaml
|
|
116
|
+
# ❌ 太长,没有触发场景
|
|
117
|
+
description: 这是一个功能强大的图片处理工具,支持多种格式的压缩、旋转、裁剪、滤镜等操作
|
|
118
|
+
|
|
119
|
+
# ❌ 只写了功能,没写何时触发
|
|
120
|
+
description: 图片压缩工具
|
|
121
|
+
|
|
122
|
+
# ❌ 写了实现细节
|
|
123
|
+
description: 使用 Pillow 库对图片进行有损压缩,支持调整质量和尺寸
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**与用户协作打磨**:如果用户给的 description 太长或缺少触发场景,指出问题并帮助精简。
|
|
127
|
+
|
|
128
|
+
### 方案产出
|
|
129
|
+
|
|
130
|
+
在 `design.md` 中追加「方案设计」和「测试用例」:
|
|
131
|
+
|
|
132
|
+
```markdown
|
|
133
|
+
## 二、方案设计
|
|
134
|
+
- 目录结构
|
|
135
|
+
- 是否需要脚本及理由
|
|
136
|
+
- SKILL.md 关键设计决策
|
|
137
|
+
- 注意事项
|
|
138
|
+
|
|
139
|
+
## 三、测试用例
|
|
140
|
+
| 编号 | 测试场景 | 触发语句 | 预期匹配 | 预期行为 | 预期输出 |
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
测试用例至少覆盖:正常场景、不触发场景、边界场景。
|
|
144
|
+
|
|
145
|
+
用户确认后进入下一步。
|
|
146
|
+
|
|
147
|
+
## 第三步:生成代码
|
|
148
|
+
|
|
149
|
+
### 生成骨架
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
uv run {baseDir}/scripts/generate.py \
|
|
153
|
+
--name <skill-name> \
|
|
154
|
+
--type <builtin|store|private|tmp> \
|
|
155
|
+
--display-name <中文名称> \
|
|
156
|
+
--skill-description <中文描述> \
|
|
157
|
+
--resources scripts,references,assets
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- `--display-name` 和 `--skill-description`:store 类型必填
|
|
161
|
+
- `--resources`:可选,逗号分隔,按需创建
|
|
162
|
+
|
|
163
|
+
### 用户编辑
|
|
164
|
+
|
|
165
|
+
生成后提醒用户编辑 `src/SKILL.md` 填充具体内容。编辑注意事项:
|
|
166
|
+
- description 已在第二步打磨好,直接填入 frontmatter
|
|
167
|
+
- 路径用 `{baseDir}/scripts/xxx.py`(不含 `src/`)
|
|
168
|
+
- 命令示范用 `uv run`,不用 `python`
|
|
169
|
+
- 不提及其他 skill
|
|
170
|
+
- 不写实现细节
|
|
171
|
+
|
|
172
|
+
### 校验
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
uv run {baseDir}/scripts/validate.py skills/<skill-name>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```dot
|
|
179
|
+
digraph validate_loop {
|
|
180
|
+
rankdir=TB;
|
|
181
|
+
|
|
182
|
+
run [label="运行 validate.py", shape=box];
|
|
183
|
+
has_err [label="有 ERROR?", shape=diamond];
|
|
184
|
+
has_warn [label="有 WARNING?", shape=diamond];
|
|
185
|
+
fix_err [label="修复 ERROR(必须)", shape=box];
|
|
186
|
+
review [label="审视 WARNING\n决定是否修改", shape=box];
|
|
187
|
+
done [label="通过 ✅", shape=oval];
|
|
188
|
+
|
|
189
|
+
run -> has_err;
|
|
190
|
+
has_err -> fix_err [label="是"];
|
|
191
|
+
fix_err -> run [label="重新校验"];
|
|
192
|
+
has_err -> has_warn [label="否"];
|
|
193
|
+
has_warn -> review [label="是"];
|
|
194
|
+
review -> run [label="修改后重新校验"];
|
|
195
|
+
has_warn -> done [label="否"];
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- **ERROR**:结构问题,必须修复(skill.json 缺失、name 不一致、store 缺少中文名等)
|
|
200
|
+
- **WARNING**:内容建议,建议审视修改(description 偏长、路径含 src/、用了 python 而非 uv run 等)
|
|
201
|
+
|
|
202
|
+
STATUS=succeeded 当且仅当无 ERROR。
|
|
203
|
+
|
|
204
|
+
## 关键规范速查
|
|
205
|
+
|
|
206
|
+
以下为核心要点摘要,完整规范见 [references/skill-notes.md](references/skill-notes.md)。
|
|
207
|
+
|
|
208
|
+
- description = 功能 + 触发场景(LLM 匹配的唯一依据)
|
|
209
|
+
- 路径用 `{baseDir}/scripts/xxx.py`,不含 `src/`
|
|
210
|
+
- 用 `uv run` 启动 Python 脚本,不用 `python`
|
|
211
|
+
- 不提及其他 skill,保持独立性
|
|
212
|
+
- SKILL.md 只写用法,不写实现细节
|
|
213
|
+
- SKILL.md frontmatter 不含 `version` 字段(由 skill.json 管理)
|
|
214
|
+
- `store` 类型必须有中文 `displayName` 和 `description`
|
|
215
|
+
- pyproject.toml 的 `version` 与 skill.json 保持一致
|
|
216
|
+
- Python 兼容 3.8+,用 pathlib,文件 I/O 指定 encoding="utf-8"
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# Skill 开发规范
|
|
2
|
+
|
|
3
|
+
本文档是 SophClaw Skill 开发的完整规范,供 `sophclaw-skill-creator` 在第二步(方案对齐)和第三步(校验)中参考。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 硬规则(必须遵守)
|
|
8
|
+
|
|
9
|
+
1. **description = 功能 + 触发场景** — LLM 匹配 skill 的唯一依据
|
|
10
|
+
2. **SKILL.md 只写用法,不写实现细节** — 实现放 scripts/
|
|
11
|
+
3. **用 `uv run` 启动 Python 脚本** — 不用 `python`
|
|
12
|
+
4. **路径用运行时路径** — `{baseDir}/scripts/xxx.py`,不含 `src/`
|
|
13
|
+
5. **不提及其他 skill** — 保持独立性
|
|
14
|
+
6. **SKILL.md 不含 `version` 字段** — 版本号由 skill.json 唯一管理
|
|
15
|
+
7. **store 类型必须有中文 displayName 和 description**
|
|
16
|
+
8. **pyproject.toml version 与 skill.json version 一致**
|
|
17
|
+
9. **Python 兼容 3.8+** — 用 typing.Optional/List/Dict,pathlib,encoding="utf-8"
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 一、分离原则
|
|
22
|
+
|
|
23
|
+
**SKILL.md 只写"怎么用",实现细节放在 scripts/ 里。**
|
|
24
|
+
|
|
25
|
+
| 文件类型 | 职责 | 内容 |
|
|
26
|
+
|---------|------|------|
|
|
27
|
+
| SKILL.md | 接口文档 | 功能描述、调用步骤、输出格式、注意事项 |
|
|
28
|
+
| scripts/*.py | 具体实现 | 业务逻辑、API 调用、数据处理 |
|
|
29
|
+
|
|
30
|
+
**理由**:SKILL.md 保持简洁,LLM 阅读成本低;实现变更不影响接口文档;清晰边界让 skill 更易维护。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 二、Skill 类型
|
|
35
|
+
|
|
36
|
+
| type | CLI 可见 | 适用场景 | 特殊要求 |
|
|
37
|
+
|------|---------|---------|---------|
|
|
38
|
+
| builtin | 是 | 系统内置,默认可用 | 无 |
|
|
39
|
+
| store | 是 | 商店可安装 | **必须**有中文 displayName 和 description |
|
|
40
|
+
| private | 否 | 内部使用 | CLI list/download 隐藏 |
|
|
41
|
+
| tmp | 否 | 临时/未分类 | CLI list/download 隐藏 |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 三、目录结构
|
|
46
|
+
|
|
47
|
+
### 仓库结构(开发时)
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
skill-name/
|
|
51
|
+
├── skill.json # 必需:元信息
|
|
52
|
+
├── design.md # 开发留存:需求+方案+测试用例(不参与打包)
|
|
53
|
+
├── src/ # 打包时会被拉出
|
|
54
|
+
│ ├── SKILL.md # 必需:skill 接口文档
|
|
55
|
+
│ ├── pyproject.toml # 推荐:Python 项目配置
|
|
56
|
+
│ ├── scripts/ # 可选:Python 脚本
|
|
57
|
+
│ │ └── __init__.py
|
|
58
|
+
│ ├── references/ # 可选:参考文档
|
|
59
|
+
│ └── assets/ # 可选:静态资源
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 运行时结构(打包后)
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
skill-name/
|
|
66
|
+
├── SKILL.md # src/ 被拉出到根目录
|
|
67
|
+
├── scripts/
|
|
68
|
+
├── references/
|
|
69
|
+
└── assets/
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**关键**:SKILL.md 中写路径时必须用运行时路径(`{baseDir}/scripts/xxx.py`),不能带 `src/`。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 四、skill.json 规范
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"name": "skill-name",
|
|
81
|
+
"version": "1.0.0",
|
|
82
|
+
"types": ["store"],
|
|
83
|
+
"displayName": "中文名称",
|
|
84
|
+
"description": "中文描述",
|
|
85
|
+
"changelog": [
|
|
86
|
+
{
|
|
87
|
+
"version": "1.0.0",
|
|
88
|
+
"date": "2026-05-25",
|
|
89
|
+
"changes": ["变更说明"]
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"createdAt": "2026-05-25",
|
|
93
|
+
"updatedAt": "2026-05-25"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- `name`:与目录名一致,kebab-case
|
|
98
|
+
- `version`:语义化版本号;**每次代码变更必须 bump 并添加 changelog 条目**
|
|
99
|
+
- `types`:数组,元素为 builtin/store/private/tmp
|
|
100
|
+
- `displayName` / `description`:store 类型必填,使用中文
|
|
101
|
+
- `createdAt` / `updatedAt`:ISO 日期格式
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 五、SKILL.md 编写规范
|
|
106
|
+
|
|
107
|
+
### frontmatter
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
---
|
|
111
|
+
name: skill-name
|
|
112
|
+
description: 功能 + 触发场景(一句话;LLM 匹配的唯一依据)
|
|
113
|
+
---
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- **不包含 `version` 字段**(版本号由 skill.json 管理)
|
|
117
|
+
- description 是 LLM 匹配 skill 的唯一依据,必须清楚表达功能和触发场景
|
|
118
|
+
|
|
119
|
+
### description 公式
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
功能 + 触发场景 = 好的 description
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
正例:
|
|
126
|
+
```yaml
|
|
127
|
+
# ✅ 言简意赅,功能+触发场景
|
|
128
|
+
description: 生成证件照。当用户上传人物照片并要求生成证件照、换底色、制作一寸/二寸照片时使用。
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
反例:
|
|
132
|
+
```yaml
|
|
133
|
+
# ❌ 冗长模糊
|
|
134
|
+
description: 这是一个用于处理图片的工具,可以帮助用户进行各种图片相关操作
|
|
135
|
+
|
|
136
|
+
# ❌ 只有功能,无触发场景
|
|
137
|
+
description: 图片压缩
|
|
138
|
+
|
|
139
|
+
# ❌ 包含实现细节
|
|
140
|
+
description: 使用 Pillow 库压缩图片,支持调整质量参数
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### body 内容
|
|
144
|
+
|
|
145
|
+
- 功能描述
|
|
146
|
+
- 调用命令示例(使用 `uv run`,路径为 `{baseDir}/scripts/...`)
|
|
147
|
+
- 输出格式
|
|
148
|
+
- 注意事项
|
|
149
|
+
- 不写实现细节、不写代码逻辑、不提及其他 skill
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 六、脚本编写规范
|
|
154
|
+
|
|
155
|
+
### 入口脚本模板
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
#!/usr/bin/env python3
|
|
159
|
+
"""
|
|
160
|
+
Skill 描述:一句话说明功能
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
import argparse
|
|
164
|
+
import sys
|
|
165
|
+
|
|
166
|
+
def main():
|
|
167
|
+
parser = argparse.ArgumentParser(description="功能描述")
|
|
168
|
+
parser.add_argument("--input", required=True, help="输入参数")
|
|
169
|
+
args = parser.parse_args()
|
|
170
|
+
|
|
171
|
+
# 业务逻辑
|
|
172
|
+
|
|
173
|
+
print("STATUS=succeeded")
|
|
174
|
+
print("OUTPUT_PATH={}".format(output_path))
|
|
175
|
+
|
|
176
|
+
if __name__ == "__main__":
|
|
177
|
+
main()
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 输出规范
|
|
181
|
+
|
|
182
|
+
脚本输出结构化的键值对,便于 LLM 解析:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
STATUS=succeeded
|
|
186
|
+
OUTPUT_PATH=/path/to/result
|
|
187
|
+
ERROR_MESSAGE=(失败时)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Python 兼容性
|
|
191
|
+
|
|
192
|
+
- 目标 Python 3.8+
|
|
193
|
+
- 使用 `typing.Optional`、`typing.List`、`typing.Dict`(不用 `X | Y`、`list[X]`)
|
|
194
|
+
- 文件 I/O 指定 `encoding="utf-8"`
|
|
195
|
+
- 优先使用 `pathlib` 而非字符串拼接路径
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 七、执行规范
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# ✅ 正确
|
|
203
|
+
uv run {baseDir}/scripts/xxx.py --args
|
|
204
|
+
|
|
205
|
+
# ❌ 错误
|
|
206
|
+
python {baseDir}/scripts/xxx.py --args
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`uv` 自动管理依赖和虚拟环境,执行更快更可靠。
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 八、pyproject.toml 规范
|
|
214
|
+
|
|
215
|
+
```toml
|
|
216
|
+
[project]
|
|
217
|
+
name = "skill-name"
|
|
218
|
+
version = "1.0.0"
|
|
219
|
+
description = "Skill description"
|
|
220
|
+
requires-python = ">=3.8"
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
- `version` 必须与 `skill.json` 保持一致
|
|
224
|
+
- `name` 与 skill 名称一致
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 九、三方加载机制
|
|
229
|
+
|
|
230
|
+
Skill 采用渐进式披露设计,LLM 按需加载内容:
|
|
231
|
+
|
|
232
|
+
1. **Metadata(name + description)** — 始终在上下文中,LLM 根据 description 决定是否触发
|
|
233
|
+
2. **SKILL.md body** — 触发后才加载,包含调用指令、输出格式、注意事项
|
|
234
|
+
3. **Bundled resources(scripts/references/assets)** — 按需执行或加载,不占用上下文
|
|
235
|
+
|
|
236
|
+
**关键**:description 是触发的唯一依据,不要期望 body 里的说明能帮助匹配。
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 十、design.md 规范
|
|
241
|
+
|
|
242
|
+
design.md 在 skill 创建阶段由 LLM 产出,放在 skill 根目录(与 skill.json 同级),不参与打包。
|
|
243
|
+
|
|
244
|
+
### 结构
|
|
245
|
+
|
|
246
|
+
```markdown
|
|
247
|
+
# <skill-name> 设计文档
|
|
248
|
+
|
|
249
|
+
## 一、需求说明
|
|
250
|
+
- 功能描述
|
|
251
|
+
- 触发场景(用户怎么说话会触发)
|
|
252
|
+
- 输入/输出约定
|
|
253
|
+
- 上线平台及 type 选择理由
|
|
254
|
+
|
|
255
|
+
## 二、方案设计
|
|
256
|
+
- 目录结构
|
|
257
|
+
- 是否需要脚本及理由
|
|
258
|
+
- SKILL.md 关键设计决策
|
|
259
|
+
- 注意事项
|
|
260
|
+
|
|
261
|
+
## 三、测试用例
|
|
262
|
+
| 编号 | 测试场景 | 触发语句 | 预期匹配 | 预期行为 | 预期输出 |
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### 用途
|
|
266
|
+
|
|
267
|
+
- 记录设计决策,供后续维护者参考
|
|
268
|
+
- 测试用例覆盖正常/边界/不触发场景
|
|
269
|
+
- 不被打包,仅仓库内留存
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 十一、检查清单
|
|
274
|
+
|
|
275
|
+
开发完成后逐项检查:
|
|
276
|
+
|
|
277
|
+
### 结构检查
|
|
278
|
+
- [ ] skill.json 存在且字段齐全
|
|
279
|
+
- [ ] name 一致性(目录名 = skill.json.name = SKILL.md frontmatter.name)
|
|
280
|
+
- [ ] types 值合法
|
|
281
|
+
- [ ] store 类型有中文 displayName 和 description
|
|
282
|
+
- [ ] src/SKILL.md 存在且 frontmatter 格式正确
|
|
283
|
+
- [ ] SKILL.md frontmatter 无 version 字段
|
|
284
|
+
- [ ] src/pyproject.toml 存在
|
|
285
|
+
- [ ] pyproject.toml version == skill.json version
|
|
286
|
+
|
|
287
|
+
### 内容检查
|
|
288
|
+
- [ ] description 简短精准:功能 + 触发场景
|
|
289
|
+
- [ ] 命令示例用 `uv run`,不用 `python`
|
|
290
|
+
- [ ] 路径为运行时路径(不含 `src/`)
|
|
291
|
+
- [ ] 未提及其他 skill
|
|
292
|
+
- [ ] SKILL.md 中无实现细节(大段代码、API 调用逻辑)
|
|
293
|
+
- [ ] 脚本输出结构化、可解析(STATUS=... 格式)
|
|
294
|
+
|
|
295
|
+
### 变更管理
|
|
296
|
+
- [ ] 代码变更后 skill.json version 已 bump
|
|
297
|
+
- [ ] changelog 已追加条目
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
*本文档基于 `sophclaw-skill-creator` 的需求整理,持续迭代。*
|