sophhub 0.4.31 → 0.4.33

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sophhub",
3
- "version": "0.4.31",
3
+ "version": "0.4.33",
4
4
  "description": "SophHub CLI - Manage and download AI Agent skills and agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,10 +1,21 @@
1
1
  {
2
2
  "name": "sophclaw-skill-creator",
3
- "version": "1.0.0",
4
- "types": ["store"],
3
+ "version": "1.1.0",
4
+ "types": ["private"],
5
5
  "displayName": "Skill 创建向导",
6
- "description": "在 SophClaw 仓库中交互式创建符合规范的 Skill,三步流程:需求对齐→方案对齐→生成代码",
6
+ "description": "在 SophClaw 仓库中创建/修改 Skill 或为已有 Skill 补全 design.md。两条路径:路径 A(创建/修改)三步流程:需求对齐→方案对齐→生成代码;路径 B(补全 design.md)五步流程:确定目标→阅读代码→逆向整理→逐节确认→写入文档",
7
7
  "changelog": [
8
+ {
9
+ "version": "1.1.0",
10
+ "date": "2026-05-28",
11
+ "changes": [
12
+ "新增路径 B:为已有 skill 补全 design.md(五步流程:确定目标→阅读代码→逆向整理→逐节确认→写入文档)",
13
+ "SKILL.md 拆分为入口+分流,路径 A/B 详细步骤拆分到 references/path-a-create.md 和 references/path-b-backfill.md",
14
+ "新增 <skills_dir> 自动定位机制,支持 workspace root 为 sophclaw-skills/ 或上级目录",
15
+ "路径 A 新增复用检查步骤:遍历已有 skill 发现可复用代码",
16
+ "generate.py 新增 --output-dir 参数,支持指定输出目录"
17
+ ]
18
+ },
8
19
  {
9
20
  "version": "1.0.0",
10
21
  "date": "2026-05-25",
@@ -14,5 +25,5 @@
14
25
  }
15
26
  ],
16
27
  "createdAt": "2026-05-25",
17
- "updatedAt": "2026-05-25"
28
+ "updatedAt": "2026-05-28"
18
29
  }
@@ -1,205 +1,41 @@
1
1
  ---
2
2
  name: sophclaw-skill-creator
3
- description: 在 SophClaw 仓库中创建新 skill。当用户说"创建skill""新建skill""开发一个skill""帮我做一个skill"时使用。三步流程:需求对齐→方案对齐→生成代码。
3
+ description: 在 SophClaw 仓库中创建新 skill / 修改已有 skill / 为已有 skill 补全 design.md。当用户说"创建skill""新建skill""开发一个skill""帮我做一个skill""修改skill""补充design.md""补全设计文档"时使用。
4
4
  ---
5
5
 
6
6
  # SophClaw Skill Creator
7
7
 
8
- 在 SophClaw 仓库中交互式创建符合规范的 skill。
8
+ 在 SophClaw 仓库中交互式创建或维护 skill。
9
9
 
10
- ## 流程
10
+ ## 定位 skills 目录
11
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
- ### 生成骨架
12
+ 触发后,先确定 sophclaw-skills 仓库的 skills 目录位置:
150
13
 
151
14
  ```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
15
+ # 检查常见路径
16
+ ls skills/ 2>/dev/null && echo "FOUND:skills/" || echo "NOT_FOUND:skills/"
17
+ ls sophclaw-skills/skills/ 2>/dev/null && echo "FOUND:sophclaw-skills/skills/" || echo "NOT_FOUND:sophclaw-skills/skills/"
158
18
  ```
159
19
 
160
- - `--display-name` `--skill-description`:store 类型必填
161
- - `--resources`:可选,逗号分隔,按需创建
20
+ - 如果 `skills/` 存在且有 skill.json 文件 → 说明用户直接打开了 `sophclaw-skills/` 作为 workspace root
21
+ - 如果 `sophclaw-skills/skills/` 存在 → 说明用户打开了上一级目录
22
+ - 都不存在 → 请用户提供 skills 目录的绝对路径,赋给 `<skills_dir>`
162
23
 
163
- ### 用户编辑
24
+ 后续所有操作中,用 `<skills_dir>` 指代这个路径。以下路径中的 `<skills_dir>` 均需替换为实际路径。
164
25
 
165
- 生成后提醒用户编辑 `src/SKILL.md` 填充具体内容。编辑注意事项:
166
- - description 已在第二步打磨好,直接填入 frontmatter
167
- - 路径用 `{baseDir}/scripts/xxx.py`(不含 `src/`)
168
- - 命令示范用 `uv run`,不用 `python`
169
- - 不提及其他 skill
170
- - 不写实现细节
26
+ ## 路径选择
171
27
 
172
- ### 校验
28
+ 触发后先判断用户意图,分流到对应路径:
173
29
 
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
- ```
30
+ | 用户意图 | 关键词 | 走哪条路径 |
31
+ |---------|--------|-----------|
32
+ | 创建新 skill / 修改已有 skill | "创建skill""新建skill""开发skill""修改skill" | 路径 A |
33
+ | 为已有 skill 补全 design.md | "补充design.md""补全设计文档" | 路径 B |
198
34
 
199
- - **ERROR**:结构问题,必须修复(skill.json 缺失、name 不一致、store 缺少中文名等)
200
- - **WARNING**:内容建议,建议审视修改(description 偏长、路径含 src/、用了 python 而非 uv run 等)
35
+ - **路径 A(创建/修改 skill)**:需求对齐 方案对齐 → 生成代码。详见 [references/path-a-create.md](references/path-a-create.md)
36
+ - **路径 B(补全 design.md)**:阅读代码 逆向整理 逐节确认 → 写入文档。详见 [references/path-b-backfill.md](references/path-b-backfill.md)
201
37
 
202
- STATUS=succeeded 当且仅当无 ERROR。
38
+ 确定路径后,**只读取对应路径的 reference 文件**,不要把另一条路径加载到上下文。
203
39
 
204
40
  ## 关键规范速查
205
41
 
@@ -1,5 +1,5 @@
1
1
  [project]
2
2
  name = "sophclaw-skill-creator"
3
- version = "1.0.0"
3
+ version = "1.1.0"
4
4
  description = "Interactive skill creation wizard for SophClaw repository"
5
5
  requires-python = ">=3.8"
@@ -0,0 +1,208 @@
1
+ # SophClaw Skill Creator — 路径 A:创建新 skill / 修改已有 skill
2
+
3
+ 适用于 skill 不存在或需要改动 skill 本身(代码、配置、SKILL.md)。
4
+
5
+ 三步流程:需求对齐 → 方案对齐 → 生成代码。
6
+
7
+ ```dot
8
+ digraph skill_create {
9
+ rankdir=TB;
10
+
11
+ start [label="用户请求创建/修改 skill", shape=oval];
12
+ step1 [label="第一步:需求对齐\n自适应提问,明确需求", shape=box];
13
+ spec1 [label="产出 design.md「需求说明」", shape=box];
14
+ user_ok1 [label="用户确认?", shape=diamond];
15
+ step2 [label="第二步:方案对齐\n设计结构 + 打磨 description", shape=box];
16
+ spec2 [label="产出 design.md「方案设计」+「测试用例」", shape=box];
17
+ user_ok2 [label="用户确认?", shape=diamond];
18
+ step3 [label="第三步:生成代码\ngenerate.py 生成骨架", shape=box];
19
+ edit [label="用户编辑 SKILL.md", shape=box];
20
+ validate [label="validate.py 校验", shape=box];
21
+ check [label="有 ERROR?", shape=diamond];
22
+ done [label="完成 ✅", shape=oval];
23
+
24
+ start -> step1;
25
+ step1 -> spec1;
26
+ spec1 -> user_ok1;
27
+ user_ok1 -> step1 [label="否,修改"];
28
+ user_ok1 -> step2 [label="是"];
29
+ step2 -> spec2;
30
+ spec2 -> user_ok2;
31
+ user_ok2 -> step2 [label="否,修改"];
32
+ user_ok2 -> step3 [label="是"];
33
+ step3 -> edit;
34
+ edit -> validate;
35
+ validate -> check;
36
+ check -> edit [label="是,修复"];
37
+ check -> done [label="否"];
38
+ }
39
+ ```
40
+
41
+ ## 第一步:需求对齐
42
+
43
+ 自适应提问,帮用户把 skill 想清楚。每次只问一个问题,多问"为什么"。至少覆盖:
44
+
45
+ 1. **功能**:这个 skill 做什么?输入是什么?输出是什么?
46
+ 2. **触发场景**:用户会怎么说话来触发它?(这是 description 的核心素材)
47
+ 3. **上线平台**:确定 type,按以下决策树选择:
48
+
49
+ ```dot
50
+ digraph type_select {
51
+ rankdir=TB;
52
+
53
+ q1 [label="用户能自己安装?", shape=diamond];
54
+ q2 [label="默认所有用户可见?", shape=diamond];
55
+ q3 [label="已确定长期维护?", shape=diamond];
56
+
57
+ store [label="store\n商店可安装\n需中文 displayName/description", shape=box];
58
+ builtin [label="builtin\n系统内置,默认可用", shape=box];
59
+ private [label="private\n内部使用,CLI 不可见", shape=box];
60
+ tmp [label="tmp\n临时/未分类,CLI 不可见", shape=box];
61
+
62
+ q1 -> q2 [label="否"];
63
+ q1 -> store [label="是"];
64
+ q2 -> builtin [label="是"];
65
+ q2 -> q3 [label="否"];
66
+ q3 -> private [label="是"];
67
+ q3 -> tmp [label="否/不确定"];
68
+ }
69
+ ```
70
+
71
+ - `store`:**必须**有中文 displayName 和 description
72
+ - `private` / `tmp`:CLI list/download 不可见
73
+ 4. **是否需要脚本**:涉及 API 调用?复杂数据处理?还是纯指令型的 SKILL.md 就够?
74
+ 5. **是否需要 references/assets**:有大量参考文档?有模板文件?
75
+
76
+ 确认需求后,产出 `design.md` 的「需求说明」部分,格式:
77
+
78
+ ```markdown
79
+ # <skill-name> 设计文档
80
+
81
+ ## 一、需求说明
82
+ - 功能描述
83
+ - 触发场景(用户怎么说话会触发)
84
+ - 输入/输出约定
85
+ - 上线平台及 type 选择理由
86
+ ```
87
+
88
+ 用户确认后进入下一步。
89
+
90
+ ## 第二步:方案对齐
91
+
92
+ 基于需求,设计 skill 结构。重点:
93
+
94
+ ### 复用检查(先做,避免重复造轮子)
95
+
96
+ 在讨论具体方案之前,先检查已有 skill 是否有可复用的代码或模式:
97
+
98
+ 1. **完整读取已有 skill**:遍历 `<skills_dir>/` 下所有子目录,读取每个 skill 的全部文件(skill.json、SKILL.md、scripts/ 下的脚本)
99
+ 2. **判断复用价值**:根据第一步确认的需求,找出哪些 skill 的代码或设计模式可以复用(如 API 调用封装、输出格式、错误处理、目录结构等)
100
+ 3. **向用户呈现**:列出可复用的 skill 及具体复用点,问用户是否采纳
101
+
102
+ > **为什么先做复用检查?** 仓库里已有数十个 skill,很多基础能力已有成熟的实现。直接复用可以减少代码量、保持风格一致、避免引入新的 bug 模式。
103
+
104
+ ### 目录结构设计
105
+
106
+ 讨论并确定需要哪些资源目录(scripts/references/assets),产出目录树。
107
+
108
+ ### description 打磨(核心)
109
+
110
+ 这是最容易出问题的地方。**description 是 LLM 匹配 skill 的唯一依据**,必须包含功能+触发场景。
111
+
112
+ **公式**:`功能 + 触发场景 = 好的 description`
113
+
114
+ 正例:
115
+ ```yaml
116
+ description: 压缩 PNG/JPEG 图片。当用户要求压缩图片、减小图片体积、优化图片大小时使用。
117
+ ```
118
+
119
+ 反例:
120
+ ```yaml
121
+ # ❌ 太长,没有触发场景
122
+ description: 这是一个功能强大的图片处理工具,支持多种格式的压缩、旋转、裁剪、滤镜等操作
123
+
124
+ # ❌ 只写了功能,没写何时触发
125
+ description: 图片压缩工具
126
+
127
+ # ❌ 写了实现细节
128
+ description: 使用 Pillow 库对图片进行有损压缩,支持调整质量和尺寸
129
+ ```
130
+
131
+ **与用户协作打磨**:如果用户给的 description 太长或缺少触发场景,指出问题并帮助精简。
132
+
133
+ ### 方案产出
134
+
135
+ 在 `design.md` 中追加「方案设计」和「测试用例」:
136
+
137
+ ```markdown
138
+ ## 二、方案设计
139
+ - 目录结构
140
+ - 是否需要脚本及理由
141
+ - SKILL.md 关键设计决策
142
+ - 注意事项
143
+
144
+ ## 三、测试用例
145
+ | 编号 | 测试场景 | 触发语句 | 预期匹配 | 预期行为 | 预期输出 |
146
+ ```
147
+
148
+ 测试用例至少覆盖:正常场景、不触发场景、边界场景。
149
+
150
+ 用户确认后进入下一步。
151
+
152
+ ## 第三步:生成代码
153
+
154
+ ### 生成骨架
155
+
156
+ ```bash
157
+ uv run {baseDir}/scripts/generate.py \
158
+ --name <skill-name> \
159
+ --type <builtin|store|private|tmp> \
160
+ --display-name <中文名称> \
161
+ --skill-description <中文描述> \
162
+ --resources scripts,references,assets \
163
+ --output-dir <skills_dir>
164
+ ```
165
+
166
+ - `--display-name` 和 `--skill-description`:store 类型必填
167
+ - `--resources`:可选,逗号分隔,按需创建
168
+
169
+ ### 用户编辑
170
+
171
+ 生成后提醒用户编辑 `src/SKILL.md` 填充具体内容。编辑注意事项:
172
+ - description 已在第二步打磨好,直接填入 frontmatter
173
+ - 路径用 `{baseDir}/scripts/xxx.py`(不含 `src/`)
174
+ - 命令示范用 `uv run`,不用 `python`
175
+ - 不提及其他 skill
176
+ - 不写实现细节
177
+
178
+ ### 校验
179
+
180
+ ```bash
181
+ uv run {baseDir}/scripts/validate.py <skills_dir>/<skill-name>
182
+ ```
183
+
184
+ ```dot
185
+ digraph validate_loop {
186
+ rankdir=TB;
187
+
188
+ run [label="运行 validate.py", shape=box];
189
+ has_err [label="有 ERROR?", shape=diamond];
190
+ has_warn [label="有 WARNING?", shape=diamond];
191
+ fix_err [label="修复 ERROR(必须)", shape=box];
192
+ review [label="审视 WARNING\n决定是否修改", shape=box];
193
+ done [label="通过 ✅", shape=oval];
194
+
195
+ run -> has_err;
196
+ has_err -> fix_err [label="是"];
197
+ fix_err -> run [label="重新校验"];
198
+ has_err -> has_warn [label="否"];
199
+ has_warn -> review [label="是"];
200
+ review -> run [label="修改后重新校验"];
201
+ has_warn -> done [label="否"];
202
+ }
203
+ ```
204
+
205
+ - **ERROR**:结构问题,必须修复(skill.json 缺失、name 不一致、store 缺少中文名等)
206
+ - **WARNING**:内容建议,建议审视修改(description 偏长、路径含 src/、用了 python 而非 uv run 等)
207
+
208
+ STATUS=succeeded 当且仅当无 ERROR。
@@ -0,0 +1,111 @@
1
+ # SophClaw Skill Creator — 路径 B:补全 design.md
2
+
3
+ 从已有代码逆向分析,为缺少 `design.md` 的 skill 补全设计文档。
4
+
5
+ 流程:逆向分析 → 对齐确认 → 生成文档。
6
+
7
+ ```dot
8
+ digraph design_backfill {
9
+ rankdir=TB;
10
+
11
+ start [label="用户要求补全 design.md", shape=oval];
12
+ identify [label="第一步:确定目标 skill\n确认 skill 名称", shape=box];
13
+ read [label="第二步:阅读已有代码\nskill.json + SKILL.md + 脚本 + 资源", shape=box];
14
+ draft [label="第三步:逆向整理\n从代码中还原需求和方案", shape=box];
15
+ discuss [label="第四步:逐节确认\n与用户对齐理解", shape=box];
16
+ write [label="第五步:写入 design.md", shape=box];
17
+ done [label="完成 ✅", shape=oval];
18
+
19
+ start -> identify;
20
+ identify -> read;
21
+ read -> draft;
22
+ draft -> discuss;
23
+ discuss -> draft [label="用户纠正/补充"];
24
+ discuss -> write [label="用户确认"];
25
+ write -> done;
26
+ }
27
+ ```
28
+
29
+ ## 第一步:确定目标 skill
30
+
31
+ 用户可能说"给 restore-state 补一个 design.md"、"补充 XXX 的设计文档"。先确认:
32
+
33
+ 1. skill 名称是什么?
34
+ 2. 确认路径 `<skills_dir>/<name>/` 存在(用 `ls <skills_dir>/<name>/` 验证)
35
+ 3. 确认 `design.md` 确实不存在(不覆盖已有文件)
36
+
37
+ ## 第二步:阅读已有代码
38
+
39
+ 完整读取目标 skill 的以下文件:
40
+
41
+ | 文件 | 获取什么信息 |
42
+ |------|-------------|
43
+ | `<skills_dir>/<name>/skill.json` | name、version、types、displayName、description、changelog |
44
+ | `<skills_dir>/<name>/src/SKILL.md` | 触发描述、前置检查、用法、输出格式、异常处理 |
45
+ | `<skills_dir>/<name>/src/scripts/*.py` | 核心逻辑、关键设计决策、配置常量 |
46
+ | `<skills_dir>/<name>/src/pyproject.toml` | 依赖、Python 版本要求 |
47
+ | `<skills_dir>/<name>/src/references/*` | 参考文档 |
48
+ | `<skills_dir>/<name>/src/assets/*` | 模板/资源文件 |
49
+
50
+ **这一步不问用户任何问题**,全靠阅读代码收集信息。
51
+
52
+ ## 第三步:逆向整理
53
+
54
+ 从代码中还原设计文档所需的内容:
55
+
56
+ **还原需求说明**(从 skill.json + SKILL.md):
57
+ - 功能描述 ← SKILL.md 的功能说明
58
+ - 触发场景 ← SKILL.md 的 description + 触发条件描述
59
+ - 输入/输出约定 ← SKILL.md 的输入输出描述 + 脚本的 exit code 逻辑
60
+
61
+ **还原方案设计**(从脚本代码 + 目录结构):
62
+ - 目录结构 ← `ls` 查看实际文件树
63
+ - 是否需要脚本及理由 ← 存在 `src/scripts/` 则"需要"
64
+ - SKILL.md 关键设计决策 ← 代码中的硬编码常量、特殊处理逻辑、注释说明
65
+ - 注意事项 ← SKILL.md 的异常处理表 + 脚本的错误分支
66
+
67
+ **还原测试用例**(从 SKILL.md 的异常处理表 + 脚本边界逻辑):
68
+ - 正常场景 ← SKILL.md 的用法示例
69
+ - 异常场景 ← SKILL.md 的异常处理表 + 脚本中的错误处理分支
70
+ - 不触发场景 ← 从 description 反推边界(相近但不应触发的场景,如"备份数据"对 restore-state)
71
+
72
+ ## 第四步:逐节确认
73
+
74
+ 将整理好的内容分节呈现给用户,每节确认后再继续下一节:
75
+
76
+ 1. 先呈现「需求说明」,问:"功能描述和触发场景我整理得对吗?有没有遗漏或需要补充的?"
77
+ 2. 再呈现「方案设计」,问:"架构和关键设计决策我理解得对吗?"
78
+ 3. 最后呈现「测试用例」,问:"测试用例是否完整?是否需要增删?"
79
+
80
+ **与路径A的共同点**:都需要与用户对齐,确保理解正确。
81
+ **与路径A的不同点**:这里是先基于代码给出初步判断再确认,而非从零开始提问。
82
+
83
+ ## 第五步:写入 design.md
84
+
85
+ 用户逐节确认后,写入 `<skills_dir>/<name>/design.md`。
86
+
87
+ **格式严格遵循** [references/skill-notes.md](references/skill-notes.md) **§十「design.md 规范」**:
88
+
89
+ ```markdown
90
+ # <skill-name> 设计文档
91
+
92
+ ## 一、需求说明
93
+ - 功能描述
94
+ - 触发场景(用户怎么说话会触发)
95
+ - 输入/输出约定
96
+ - 上线平台及 type 选择理由
97
+
98
+ ## 二、方案设计
99
+ - 目录结构
100
+ - 是否需要脚本及理由
101
+ - SKILL.md 关键设计决策
102
+ - 注意事项
103
+
104
+ ## 三、测试用例
105
+ | 编号 | 测试场景 | 触发语句 | 预期匹配 | 预期行为 | 预期输出 |
106
+ ```
107
+
108
+ **补充说明**(在规范结构基础上可酌情扩充):
109
+ - 「需求说明」可追加"核心能力""不触发场景"小节,帮助完善边界描述
110
+ - 「方案设计」可追加"架构""职责划分"小节,补充架构图和组件分工表
111
+ - 以上为可选扩充,规范中的 4 个要点和表头必须保留
@@ -127,12 +127,13 @@ def parse_resources(raw_resources):
127
127
  return deduped, ""
128
128
 
129
129
 
130
- def generate_skill(skill_name, skill_type, display_name, skill_description, resources):
130
+ def generate_skill(skill_name, skill_type, display_name, skill_description, resources, output_dir=None):
131
131
  """Create the full skill directory structure."""
132
132
  today = date.today().isoformat()
133
133
  skill_title = title_case_skill_name(skill_name)
134
134
 
135
- skill_dir = Path.cwd() / "skills" / skill_name
135
+ base = Path(output_dir) if output_dir else Path.cwd() / "skills"
136
+ skill_dir = base / skill_name
136
137
  src_dir = skill_dir / "src"
137
138
 
138
139
  # Check for existing directory
@@ -209,6 +210,7 @@ def main():
209
210
  parser.add_argument("--display-name", default="", help="Chinese display name (required for store)")
210
211
  parser.add_argument("--skill-description", default="", help="Chinese description (required for store)")
211
212
  parser.add_argument("--resources", default="", help="Comma-separated: scripts,references,assets")
213
+ parser.add_argument("--output-dir", default="", help="Output directory for the skill (defaults to ./skills/)")
212
214
  args = parser.parse_args()
213
215
 
214
216
  # Validate name
@@ -252,6 +254,7 @@ def main():
252
254
  display_name=args.display_name.strip(),
253
255
  skill_description=args.skill_description.strip(),
254
256
  resources=resources,
257
+ output_dir=args.output_dir.strip() or None,
255
258
  )
256
259
 
257
260
  if not success: