skill-flow 1.0.2 → 1.0.3
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/README.md +24 -22
- package/README.zh.md +25 -24
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/services/doctor-service.js +1 -1
- package/dist/services/doctor-service.js.map +1 -1
- package/dist/services/skill-flow.js +1 -1
- package/dist/services/skill-flow.js.map +1 -1
- package/dist/services/source-service.js +4 -4
- package/dist/services/source-service.js.map +1 -1
- package/dist/tests/skill-flow.test.js +1427 -0
- package/dist/tests/skill-flow.test.js.map +1 -1
- package/dist/tui/config-app.js +1 -1
- package/dist/tui/config-app.js.map +1 -1
- package/dist/utils/format.js +1 -1
- package/dist/utils/format.js.map +1 -1
- package/package.json +10 -1
- package/.gstack/browse-network.log +0 -1
- package/.gstack/browse.json +0 -7
- package/.gstack/qa-reports/base-branch.txt +0 -1
- package/.gstack/qa-reports/qa-report-skill-flow-cli-2026-03-22.md +0 -159
- package/.gstack/qa-reports/qa-report-skill-manager-2026-03-22.md +0 -60
- package/docs/DESIGN.md +0 -407
- package/docs/PRD/PRD-1.0.0.md +0 -1862
- package/docs/PRD/renew/PRD-0.0.0.md +0 -26
- package/docs/PRD/renew/PRD-0.0.1.md +0 -408
- package/docs/PRD/renew/PRD-0.0.2.md +0 -705
- package/docs/PRD/renew/PRD-0.0.3.md +0 -740
- package/docs/PRD/renew/PRD-0.0.4.md +0 -1494
- package/docs/README.md +0 -242
- package/docs/plan/PLAN_v1.0.0.md +0 -663
- package/docs/plan/PLAN_v1.0.1.md +0 -845
- package/docs/refrences/README.md +0 -9
- package/docs/refrences/agent-skill-paths.md +0 -274
- package/docs/refrences/config-state-reconciliation.md +0 -199
- package/docs/refrences/naming-dedupe-warning-rules.md +0 -482
- package/img/img-1.jpg +0 -0
|
@@ -1,740 +0,0 @@
|
|
|
1
|
-
# skill-flow 定型版 PRD
|
|
2
|
-
|
|
3
|
-
> 版本:v1.0
|
|
4
|
-
> 产出方式:基于三位项目人员视角的多轮讨论收敛
|
|
5
|
-
> 项目人员:Martin Fowler / Isaac Z. Schlueter / Mitchell Hashimoto
|
|
6
|
-
> 平台:macOS(MVP)
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# 一、三人多轮讨论纪要
|
|
11
|
-
|
|
12
|
-
## 第一轮:先定边界,这到底是不是“包管理器”?
|
|
13
|
-
|
|
14
|
-
### Martin Fowler
|
|
15
|
-
“它不是一个下载器。下载只是入口。真正的产品边界应该是:`Source → SkillLeaf → Channel → Deployment`。只要这个边界不清,后面 `config`、`update`、`uninstall` 都会混成文件搬运。”
|
|
16
|
-
|
|
17
|
-
### Isaac Z. Schlueter
|
|
18
|
-
“如果没有锁定层,它就不是 manager,只是 installer。你一旦要支持多来源、多技能仓库、多渠道分发,就必须记录用户意图和解析结果,否则更新、回滚、恢复安装都不可靠。”
|
|
19
|
-
|
|
20
|
-
### Mitchell Hashimoto
|
|
21
|
-
“CLI 不是把能力堆成命令。真正的主流程只有一个:`add source -> inspect inventory -> choose channels -> apply deployments`。用户不该理解内部状态文件,但状态文件必须非常强。”
|
|
22
|
-
|
|
23
|
-
### 本轮结论
|
|
24
|
-
|
|
25
|
-
1. 产品正式定义为:
|
|
26
|
-
**一个面向 Agent Skills 生态的 CLI 包管理器与渠道投影器**。
|
|
27
|
-
2. 系统边界只负责:
|
|
28
|
-
**获取、扫描、校验、索引、锁定、分发、更新、卸载、诊断**。
|
|
29
|
-
3. 系统明确**不负责执行 skill**,也不对 skill 脚本做运行时沙箱承诺。
|
|
30
|
-
4. 数据模型固定为:
|
|
31
|
-
`Source / SourceSnapshot / SkillLeaf / Channel / Deployment / Manifest / Lock`。
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## 第二轮:Source 怎么建模,仓库和 skill 的关系是什么?
|
|
36
|
-
|
|
37
|
-
### Martin Fowler
|
|
38
|
-
“仓库不是 skill。仓库是 source root,skill 才是 leaf。否则你没法表达一个仓库里多个技能,也没法做你要的一级/二级树选择。”
|
|
39
|
-
|
|
40
|
-
### Isaac Z. Schlueter
|
|
41
|
-
“更新也必须以 source 为单位,而不是 skill 为单位。因为上游版本边界属于 source。你可以按 skill 选择是否部署,但不能按 skill 伪造上游版本。”
|
|
42
|
-
|
|
43
|
-
### Mitchell Hashimoto
|
|
44
|
-
“UI 上可以把 source 展示成一级目录,把 skill 展示成二级节点;但内部一定要有稳定的 `sourceId` 和 `skillId`,不能依赖展示名。”
|
|
45
|
-
|
|
46
|
-
### 本轮结论
|
|
47
|
-
|
|
48
|
-
1. **Source 是上游单位**:Git 仓库、ClawHub slug、未来的 well-known URL。
|
|
49
|
-
2. **SkillLeaf 是可安装单位**:一个合法 skill root。
|
|
50
|
-
3. **Source 与 SkillLeaf 是一对多关系**。
|
|
51
|
-
4. 你的“两层结构”正式进入领域模型,而不是只作为 UI 细节。
|
|
52
|
-
5. internal id 与 display label 分离:
|
|
53
|
-
- internal:稳定、不可读也没关系
|
|
54
|
-
- display:仓库名 / 作者名 / `single`
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## 第三轮:Channel 不是路径字符串,而是适配器
|
|
59
|
-
|
|
60
|
-
### Martin Fowler
|
|
61
|
-
“Channel 必须是 adapter,不是 path。因为 Claude、OpenCode、Codex、OpenClaw 的发现规则、优先级、兼容路径、以及对 symlink 的容忍度都不一样。”
|
|
62
|
-
|
|
63
|
-
### Isaac Z. Schlueter
|
|
64
|
-
“同一个 leaf 投影到不同 channel,可以是不同 strategy。manager 的任务不是追求实现统一,而是追求状态统一。”
|
|
65
|
-
|
|
66
|
-
### Mitchell Hashimoto
|
|
67
|
-
“用户界面里可以看到都是‘一个目标’,但产品内部必须知道:Claude 默认是 per-skill symlink,OpenClaw 默认要 copy。”
|
|
68
|
-
|
|
69
|
-
### 本轮结论
|
|
70
|
-
|
|
71
|
-
正式把 Channel 定义为:
|
|
72
|
-
|
|
73
|
-
- 一个**目标目录解析器**
|
|
74
|
-
- 一个**发现规则集合**
|
|
75
|
-
- 一个**分发策略集合**
|
|
76
|
-
- 一个**诊断器**
|
|
77
|
-
|
|
78
|
-
而不是一个简单路径。
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## 第四轮:锁文件要不要做成“一等公民”?
|
|
83
|
-
|
|
84
|
-
### Isaac Z. Schlueter
|
|
85
|
-
“必须,而且不是一个文件,而是两个层级:manifest 记录用户意图,lock 记录解析结果。否则用户选了哪些 channel、哪些 skill,是‘期望状态’;上游实际解析到的 commit/version/hash,是‘已解析状态’。这两个不能混。”
|
|
86
|
-
|
|
87
|
-
### Martin Fowler
|
|
88
|
-
“同意。manifest 是 policy,lock 是 materialized view。”
|
|
89
|
-
|
|
90
|
-
### Mitchell Hashimoto
|
|
91
|
-
“从 CLI 体验上,这意味着 `config` 改的是 manifest,`apply/update` 刷的是 lock。这样 `doctor` 才能告诉用户:你的意图没变,但当前部署漂移了。”
|
|
92
|
-
|
|
93
|
-
### 本轮结论
|
|
94
|
-
|
|
95
|
-
MVP 固定采用双文件状态:
|
|
96
|
-
|
|
97
|
-
- `manifest.json`:用户意图
|
|
98
|
-
- `lock.json`:解析结果与部署状态
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## 第五轮:MVP 里到底支持哪些 Source?
|
|
103
|
-
|
|
104
|
-
### Martin Fowler
|
|
105
|
-
“从建模上要预留 SourceAdapter,但 MVP 不要把来源铺太大。”
|
|
106
|
-
|
|
107
|
-
### Isaac Z. Schlueter
|
|
108
|
-
“Git 一定要是第一优先级,因为它天然有 snapshot。ClawHub 可以做第二优先级,因为它已经有 version/store/lock 语义。”
|
|
109
|
-
|
|
110
|
-
### Mitchell Hashimoto
|
|
111
|
-
“`search` 的体验不能太弱,但 GitHub 关键词搜索的结果质量不一定稳定。MVP 里要区分:`add` 支持显式 locator,`search` 则优先做有结构化结果的来源。”
|
|
112
|
-
|
|
113
|
-
### 本轮结论
|
|
114
|
-
|
|
115
|
-
MVP Source 范围定为:
|
|
116
|
-
|
|
117
|
-
1. **Git Source**
|
|
118
|
-
- 必做
|
|
119
|
-
- 支持 GitHub repo / 任意 git URL / 本地 git 路径
|
|
120
|
-
2. **ClawHub Source**
|
|
121
|
-
- 必做
|
|
122
|
-
- 作为注册表来源
|
|
123
|
-
3. **Well-known Skills Discovery**
|
|
124
|
-
- 只预留接口,P1 再做
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## 第六轮:分发策略拍板
|
|
129
|
-
|
|
130
|
-
### Martin Fowler
|
|
131
|
-
“要遵循渠道现实,不要为了‘统一’牺牲兼容。”
|
|
132
|
-
|
|
133
|
-
### Isaac Z. Schlueter
|
|
134
|
-
“中心化 canonical store 没问题,但投影策略必须 per-channel。”
|
|
135
|
-
|
|
136
|
-
### Mitchell Hashimoto
|
|
137
|
-
“用户应该默认感知不到复杂性,所以策略要自动选,只在 `doctor` 和 advanced config 里解释。”
|
|
138
|
-
|
|
139
|
-
### 本轮结论
|
|
140
|
-
|
|
141
|
-
- Claude Code:**per-skill symlink** 默认,copy 兜底
|
|
142
|
-
- OpenCode:**symlink** 默认
|
|
143
|
-
- Codex:**symlink** 默认
|
|
144
|
-
- 通用 `.agents/skills`:**symlink** 默认
|
|
145
|
-
- OpenClaw:**copy** 默认,不走跨根 symlink
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## 第七轮:技术栈正式定型
|
|
150
|
-
|
|
151
|
-
### Mitchell Hashimoto
|
|
152
|
-
“既然 `config` 是树状 TUI,终端 UI 就不是附属品,而是主界面。Ink 很合适。”
|
|
153
|
-
|
|
154
|
-
### Isaac Z. Schlueter
|
|
155
|
-
“如果你选 Node,就选当前 LTS 主线,不要用已进入 maintenance 的版本。”
|
|
156
|
-
|
|
157
|
-
### Martin Fowler
|
|
158
|
-
“技术栈要服务模型稳定和 schema 演进,所以 Zod、atomic writes、fixture-based tests 都该是正式要求,不是实现偏好。”
|
|
159
|
-
|
|
160
|
-
### 本轮结论
|
|
161
|
-
|
|
162
|
-
正式技术栈:
|
|
163
|
-
|
|
164
|
-
- Runtime:**Node.js 24 LTS**
|
|
165
|
-
- Language:**TypeScript 5.x**
|
|
166
|
-
- Package manager:**pnpm**
|
|
167
|
-
- CLI framework:**oclif**
|
|
168
|
-
- TUI:**Ink**
|
|
169
|
-
- Schema validation:**Zod**
|
|
170
|
-
- Git wrapper:**system git + simple-git**
|
|
171
|
-
- Test:**Vitest**
|
|
172
|
-
- Distribution:**npm first,Homebrew tap in P1**
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
# 二、skill-flow 定型版 PRD
|
|
177
|
-
|
|
178
|
-
## 1. 产品定义
|
|
179
|
-
|
|
180
|
-
`skill-flow` 是一个面向 Agent Skills 生态的 macOS CLI。
|
|
181
|
-
它统一管理多来源 skills,把上游内容下载到 `~/.skillflow/source/`,扫描出合法的 `SkillLeaf`,在 `~/.skillflow/skills/` 建立 canonical skill 集合,再将用户选中的 skill 以适配渠道的方式分发到 Claude Code、OpenCode、Codex、OpenClaw 与通用 `.agents/skills`。其核心职责是**索引与投影**,不是执行 skill。
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## 2. 目标与非目标
|
|
186
|
-
|
|
187
|
-
### 2.1 目标
|
|
188
|
-
|
|
189
|
-
MVP 要完成六件事:
|
|
190
|
-
|
|
191
|
-
1. 支持 Git Source 与 ClawHub Source 的添加、扫描、更新、卸载。
|
|
192
|
-
2. 支持“单 source 多 skill”的两层树状模型。
|
|
193
|
-
3. 支持 `skill-flow config` 的树形多选 TUI。
|
|
194
|
-
4. 支持按 channel 投影:Claude Code、OpenCode、Codex、OpenClaw、`.agents/skills`。
|
|
195
|
-
5. 支持 `manifest.json + lock.json` 双层状态。
|
|
196
|
-
6. 支持 `doctor` 做冲突、漂移、路径和兼容性检查。
|
|
197
|
-
|
|
198
|
-
### 2.2 非目标
|
|
199
|
-
|
|
200
|
-
MVP 不做以下事情:
|
|
201
|
-
|
|
202
|
-
1. 不执行 skill 中的脚本。
|
|
203
|
-
2. 不修改上游 `SKILL.md`。
|
|
204
|
-
3. 不做 GUI。
|
|
205
|
-
4. 不做通用 project-scope 管理;只有 OpenClaw 因官方工作区模型原因,保留 workspace 渠道。
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## 3. 用户与典型场景
|
|
210
|
-
|
|
211
|
-
目标用户是同时使用多个 AI coding agent 的开发者。他们的高频动作是:
|
|
212
|
-
|
|
213
|
-
- 从 GitHub 或 ClawHub 获取 skills
|
|
214
|
-
- 统一查看一个 source 里有哪些 skill
|
|
215
|
-
- 把其中部分 skill 应用到某个或全部渠道
|
|
216
|
-
- 后续更新 source,并同步刷新多个渠道
|
|
217
|
-
- 卸载整个 source,或仅取消某个 channel 的启用状态
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## 4. 领域模型
|
|
222
|
-
|
|
223
|
-
### 4.1 Source
|
|
224
|
-
|
|
225
|
-
一个可更新的上游单位。
|
|
226
|
-
示例:git repo、ClawHub slug、未来的 well-known URL。
|
|
227
|
-
|
|
228
|
-
字段建议:
|
|
229
|
-
|
|
230
|
-
- `sourceId`
|
|
231
|
-
- `sourceType`
|
|
232
|
-
- `locator`
|
|
233
|
-
- `displayName`
|
|
234
|
-
- `storageRoot`
|
|
235
|
-
- `updateStrategy`
|
|
236
|
-
|
|
237
|
-
### 4.2 SourceSnapshot
|
|
238
|
-
|
|
239
|
-
Source 在某一时刻的解析快照。
|
|
240
|
-
|
|
241
|
-
- git:`remote + branch + commit SHA`
|
|
242
|
-
- clawhub:`slug + version + contentHash`
|
|
243
|
-
- future well-known:`baseUrl + indexHash/etag`
|
|
244
|
-
|
|
245
|
-
### 4.3 SkillLeaf
|
|
246
|
-
|
|
247
|
-
真正可安装的 skill 单元。
|
|
248
|
-
满足条件:
|
|
249
|
-
|
|
250
|
-
- 存在 `SKILL.md`
|
|
251
|
-
- frontmatter 可解析
|
|
252
|
-
- `name`
|
|
253
|
-
- `description`
|
|
254
|
-
|
|
255
|
-
字段建议:
|
|
256
|
-
|
|
257
|
-
- `skillId`
|
|
258
|
-
- `sourceId`
|
|
259
|
-
- `name`
|
|
260
|
-
- `description`
|
|
261
|
-
- `relativeRoot`
|
|
262
|
-
- `contentHash`
|
|
263
|
-
- `hasScripts`
|
|
264
|
-
- `hasReferences`
|
|
265
|
-
- `hasAssets`
|
|
266
|
-
- `riskFlags[]`
|
|
267
|
-
|
|
268
|
-
### 4.4 Channel
|
|
269
|
-
|
|
270
|
-
一个目标适配器,而不是路径。
|
|
271
|
-
|
|
272
|
-
字段建议:
|
|
273
|
-
|
|
274
|
-
- `channelId`
|
|
275
|
-
- `displayName`
|
|
276
|
-
- `resolvedPath`
|
|
277
|
-
- `strategy`
|
|
278
|
-
- `pathSource`
|
|
279
|
-
- `healthStatus`
|
|
280
|
-
|
|
281
|
-
### 4.5 Deployment
|
|
282
|
-
|
|
283
|
-
SkillLeaf 到 Channel 的一次投影关系。
|
|
284
|
-
|
|
285
|
-
字段建议:
|
|
286
|
-
|
|
287
|
-
- `deploymentId`
|
|
288
|
-
- `skillId`
|
|
289
|
-
- `channelId`
|
|
290
|
-
- `strategy`
|
|
291
|
-
- `targetPath`
|
|
292
|
-
- `status`
|
|
293
|
-
- `lastAppliedAt`
|
|
294
|
-
|
|
295
|
-
---
|
|
296
|
-
|
|
297
|
-
## 5. 文件系统布局
|
|
298
|
-
|
|
299
|
-
`skill-flow` 采用“原始内容、canonical 集合、状态文件”三层结构:
|
|
300
|
-
|
|
301
|
-
```text
|
|
302
|
-
~/.skillflow/
|
|
303
|
-
source/
|
|
304
|
-
git/
|
|
305
|
-
<sourceId>/
|
|
306
|
-
clawhub/
|
|
307
|
-
<sourceId>/
|
|
308
|
-
skills/
|
|
309
|
-
<sourceId>/
|
|
310
|
-
<skillName>/ -> ../../source/...
|
|
311
|
-
state/
|
|
312
|
-
manifest.json
|
|
313
|
-
lock.json
|
|
314
|
-
channels.json
|
|
315
|
-
history.ndjson
|
|
316
|
-
cache/
|
|
317
|
-
tmp/
|
|
318
|
-
logs/
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
## 6. Source 策略
|
|
324
|
-
|
|
325
|
-
### 6.1 Git Source(MVP 必做)
|
|
326
|
-
|
|
327
|
-
输入支持:
|
|
328
|
-
|
|
329
|
-
- GitHub `owner/repo`
|
|
330
|
-
- 任意 git URL
|
|
331
|
-
- 本地 git 路径
|
|
332
|
-
|
|
333
|
-
落地策略:
|
|
334
|
-
|
|
335
|
-
- 原样 clone 到 `source/git/<sourceId>/`
|
|
336
|
-
- 默认通过 system git 做 fetch/pull
|
|
337
|
-
- `simple-git` 作为 Node 包装层,不替代 git 本身
|
|
338
|
-
|
|
339
|
-
### 6.2 ClawHub Source(MVP 必做)
|
|
340
|
-
|
|
341
|
-
输入支持:
|
|
342
|
-
|
|
343
|
-
- `clawhub:<slug>`
|
|
344
|
-
- `clawhub:<slug>@<version>`
|
|
345
|
-
|
|
346
|
-
MVP 实现:
|
|
347
|
-
|
|
348
|
-
- 优先采用 **CLI bridge**:shell-out `clawhub install/update/list`
|
|
349
|
-
- 读取或同步 `.clawhub/lock.json` 信息到 `skill-flow lock`
|
|
350
|
-
|
|
351
|
-
### 6.3 Well-known Skills Discovery(P1)
|
|
352
|
-
|
|
353
|
-
只做接口预留,不进 MVP。
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
## 7. Source 命名与展示规则
|
|
358
|
-
|
|
359
|
-
### 外显 display 规则
|
|
360
|
-
|
|
361
|
-
- Git 仓库:显示仓库名
|
|
362
|
-
- 非 Git 且可识别作者:显示作者名
|
|
363
|
-
- 无法识别:显示 `single`
|
|
364
|
-
|
|
365
|
-
### 内部 storage 规则
|
|
366
|
-
|
|
367
|
-
- Git:`<host>__<owner>__<repo>`
|
|
368
|
-
- ClawHub:`clawhub__<slug>`
|
|
369
|
-
- Generic single:`single__<hash>`
|
|
370
|
-
|
|
371
|
-
---
|
|
372
|
-
|
|
373
|
-
## 8. Skill 扫描与索引规则
|
|
374
|
-
|
|
375
|
-
扫描逻辑:
|
|
376
|
-
|
|
377
|
-
1. 递归搜索包含 `SKILL.md` 的目录
|
|
378
|
-
2. 跳过 `.git`、`node_modules`、构建产物
|
|
379
|
-
3. 解析 frontmatter
|
|
380
|
-
4. 生成 `SkillLeaf` 索引项
|
|
381
|
-
5. 建立 `skills/<sourceId>/<skillName>` canonical 入口
|
|
382
|
-
|
|
383
|
-
校验等级分两层:
|
|
384
|
-
|
|
385
|
-
### 标准校验
|
|
386
|
-
|
|
387
|
-
- `SKILL.md` 存在
|
|
388
|
-
- YAML 可解析
|
|
389
|
-
- `name`
|
|
390
|
-
- `description`
|
|
391
|
-
|
|
392
|
-
### 严格校验
|
|
393
|
-
|
|
394
|
-
- `name` 与目录名匹配
|
|
395
|
-
- 命名合法
|
|
396
|
-
- `description` 长度合理
|
|
397
|
-
- 相对路径引用可达
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
## 9. Channel 适配与默认策略
|
|
402
|
-
|
|
403
|
-
### 9.1 Claude Code
|
|
404
|
-
|
|
405
|
-
默认渠道路径:`~/.claude/skills`
|
|
406
|
-
默认策略:**per-skill symlink**
|
|
407
|
-
|
|
408
|
-
兼容说明:
|
|
409
|
-
|
|
410
|
-
- 不把整个 `~/.claude/skills` 替换成 symlink
|
|
411
|
-
- 只在目录内按 skill 建单独 symlink
|
|
412
|
-
- `doctor` 提示必要时可切换 copy fallback
|
|
413
|
-
|
|
414
|
-
### 9.2 OpenCode
|
|
415
|
-
|
|
416
|
-
默认渠道路径:`~/.config/opencode/skills`
|
|
417
|
-
默认策略:**symlink**
|
|
418
|
-
|
|
419
|
-
### 9.3 Codex
|
|
420
|
-
|
|
421
|
-
默认渠道路径:`~/.agents/skills`
|
|
422
|
-
默认策略:**symlink**
|
|
423
|
-
|
|
424
|
-
### 9.4 OpenClaw
|
|
425
|
-
|
|
426
|
-
默认渠道路径:
|
|
427
|
-
|
|
428
|
-
- 首选:`<workspace>/skills`
|
|
429
|
-
- 备选:`~/.openclaw/skills`
|
|
430
|
-
|
|
431
|
-
默认策略:**copy**
|
|
432
|
-
|
|
433
|
-
### 9.5 通用 `.agents/skills`
|
|
434
|
-
|
|
435
|
-
默认路径:`~/.agents/skills`
|
|
436
|
-
默认策略:**symlink**
|
|
437
|
-
|
|
438
|
-
---
|
|
439
|
-
|
|
440
|
-
## 10. 命令设计
|
|
441
|
-
|
|
442
|
-
正式命令集:
|
|
443
|
-
|
|
444
|
-
```bash
|
|
445
|
-
skill-flow add <source>
|
|
446
|
-
skill-flow search <query>
|
|
447
|
-
skill-flow list
|
|
448
|
-
skill-flow config
|
|
449
|
-
skill-flow update [--all | <sourceId>]
|
|
450
|
-
skill-flow uninstall [<sourceId>...]
|
|
451
|
-
skill-flow doctor
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
### `add`
|
|
455
|
-
|
|
456
|
-
作用:添加一个 Source,并完成初次索引。
|
|
457
|
-
流程:
|
|
458
|
-
|
|
459
|
-
1. 解析 source adapter
|
|
460
|
-
2. 下载/clone
|
|
461
|
-
3. 扫描 skill leaf
|
|
462
|
-
4. 建立 canonical 集合
|
|
463
|
-
5. 写 `manifest + lock`
|
|
464
|
-
|
|
465
|
-
### `search`
|
|
466
|
-
|
|
467
|
-
MVP 定义:
|
|
468
|
-
|
|
469
|
-
- ClawHub:正式支持
|
|
470
|
-
- Git:支持显式 locator 输入;关键词搜索作为 beta 能力
|
|
471
|
-
- 本地:可搜索已安装 inventory
|
|
472
|
-
|
|
473
|
-
### `list`
|
|
474
|
-
|
|
475
|
-
展示:
|
|
476
|
-
|
|
477
|
-
- sources
|
|
478
|
-
- skills
|
|
479
|
-
- deployments
|
|
480
|
-
- update availability
|
|
481
|
-
- `--json` 输出
|
|
482
|
-
|
|
483
|
-
### `config`
|
|
484
|
-
|
|
485
|
-
这是核心命令,必须实现 TUI。
|
|
486
|
-
|
|
487
|
-
**第一屏:Channel 选择**
|
|
488
|
-
|
|
489
|
-
- 展示已探测到的 channel
|
|
490
|
-
- 支持多选与 `all channels`
|
|
491
|
-
|
|
492
|
-
**第二屏:Source/Skill 树选择**
|
|
493
|
-
|
|
494
|
-
- 一级:source display root
|
|
495
|
-
- 二级:skill leaf
|
|
496
|
-
- Space:切换选中
|
|
497
|
-
- Tab:展开/收起
|
|
498
|
-
- Enter:确认
|
|
499
|
-
- 一级节点三态:未选 / 部分 / 全选
|
|
500
|
-
|
|
501
|
-
**第三屏:Apply 预览**
|
|
502
|
-
|
|
503
|
-
- 将创建的 symlink 数
|
|
504
|
-
- 将复制的目录数
|
|
505
|
-
- 冲突项
|
|
506
|
-
- 风险提示项
|
|
507
|
-
|
|
508
|
-
### `update`
|
|
509
|
-
|
|
510
|
-
- Git:fetch/pull,重扫索引,刷新 deployments
|
|
511
|
-
- ClawHub:调用 registry update 语义
|
|
512
|
-
|
|
513
|
-
### `uninstall`
|
|
514
|
-
|
|
515
|
-
按 source 粒度卸载:
|
|
516
|
-
|
|
517
|
-
- 移除 source 原始内容
|
|
518
|
-
- 移除 canonical 集合
|
|
519
|
-
- 移除 deployments
|
|
520
|
-
- 更新 state
|
|
521
|
-
|
|
522
|
-
### `doctor`
|
|
523
|
-
|
|
524
|
-
检查项:
|
|
525
|
-
|
|
526
|
-
- channel path 是否可用
|
|
527
|
-
- symlink 是否断裂
|
|
528
|
-
- OpenClaw realpath 风险
|
|
529
|
-
- 同名冲突
|
|
530
|
-
- lock 漂移
|
|
531
|
-
- 可更新 source
|
|
532
|
-
- 兼容性 warning
|
|
533
|
-
|
|
534
|
-
---
|
|
535
|
-
|
|
536
|
-
## 11. 状态文件设计
|
|
537
|
-
|
|
538
|
-
### `manifest.json`
|
|
539
|
-
|
|
540
|
-
记录用户意图:
|
|
541
|
-
|
|
542
|
-
- sources
|
|
543
|
-
- naming policy
|
|
544
|
-
- selected skills by channel
|
|
545
|
-
- user overrides
|
|
546
|
-
|
|
547
|
-
### `lock.json`
|
|
548
|
-
|
|
549
|
-
记录解析结果:
|
|
550
|
-
|
|
551
|
-
- source snapshots
|
|
552
|
-
- skill leaf inventory
|
|
553
|
-
- deployments
|
|
554
|
-
- content hashes
|
|
555
|
-
- timestamps
|
|
556
|
-
- schemaVersion
|
|
557
|
-
|
|
558
|
-
### `channels.json`
|
|
559
|
-
|
|
560
|
-
记录本机探测与 path override:
|
|
561
|
-
|
|
562
|
-
- detected channels
|
|
563
|
-
- resolved path
|
|
564
|
-
- available strategies
|
|
565
|
-
- health flags
|
|
566
|
-
|
|
567
|
-
### `history.ndjson`
|
|
568
|
-
|
|
569
|
-
记录审计事件:
|
|
570
|
-
|
|
571
|
-
- add
|
|
572
|
-
- update
|
|
573
|
-
- config-apply
|
|
574
|
-
- uninstall
|
|
575
|
-
- doctor-warning
|
|
576
|
-
|
|
577
|
-
---
|
|
578
|
-
|
|
579
|
-
## 12. 冲突与一致性规则
|
|
580
|
-
|
|
581
|
-
### 12.1 同 channel 同名 skill
|
|
582
|
-
|
|
583
|
-
默认阻止,不静默覆盖。
|
|
584
|
-
用户必须:
|
|
585
|
-
|
|
586
|
-
- 取消其中一个,或
|
|
587
|
-
- 设置 alias(P1)
|
|
588
|
-
|
|
589
|
-
### 12.2 目标路径已有非本工具管理文件
|
|
590
|
-
|
|
591
|
-
默认不接管,标记 `foreign-existing`。
|
|
592
|
-
|
|
593
|
-
### 12.3 Source 内同名 leaf
|
|
594
|
-
|
|
595
|
-
扫描时直接判定 source inventory 非法,需要用户缩小范围或忽略。
|
|
596
|
-
|
|
597
|
-
### 12.4 原子性
|
|
598
|
-
|
|
599
|
-
所有 state 文件写入采用:
|
|
600
|
-
|
|
601
|
-
- `tmp write`
|
|
602
|
-
- `fsync`
|
|
603
|
-
- `rename`
|
|
604
|
-
|
|
605
|
-
所有 deployment 采用 staged apply;失败时不提交 lock 的成功状态。
|
|
606
|
-
|
|
607
|
-
---
|
|
608
|
-
|
|
609
|
-
## 13. 安全要求
|
|
610
|
-
|
|
611
|
-
第三方 skill 视为不可信输入。
|
|
612
|
-
|
|
613
|
-
MVP 安全要求:
|
|
614
|
-
|
|
615
|
-
1. 永不执行 skill 脚本
|
|
616
|
-
2. 扫描时做 frontmatter 与路径校验
|
|
617
|
-
3. 拒绝 root 外 realpath 投影
|
|
618
|
-
4. 风险标记:
|
|
619
|
-
- `has-scripts`
|
|
620
|
-
- `invalid-frontmatter`
|
|
621
|
-
- `name-dir-mismatch`
|
|
622
|
-
- `external-symlink`
|
|
623
|
-
- `foreign-existing`
|
|
624
|
-
- `openclaw-root-risk`
|
|
625
|
-
5. 默认提示审计,`--yes` 才跳过确认
|
|
626
|
-
|
|
627
|
-
---
|
|
628
|
-
|
|
629
|
-
## 14. 技术栈
|
|
630
|
-
|
|
631
|
-
正式技术栈如下:
|
|
632
|
-
|
|
633
|
-
### 14.1 运行时与语言
|
|
634
|
-
|
|
635
|
-
- **Node.js 24 LTS**
|
|
636
|
-
- **TypeScript 5.x**
|
|
637
|
-
|
|
638
|
-
### 14.2 包管理与构建
|
|
639
|
-
|
|
640
|
-
- **pnpm**
|
|
641
|
-
- 发布到 **npm**
|
|
642
|
-
|
|
643
|
-
### 14.3 CLI 与 TUI
|
|
644
|
-
|
|
645
|
-
- **oclif**:命令系统、插件式扩展能力、自动文档、测试友好
|
|
646
|
-
- **Ink**:用于 `config` 的树状交互界面
|
|
647
|
-
|
|
648
|
-
### 14.4 Schema 与状态验证
|
|
649
|
-
|
|
650
|
-
- **Zod**
|
|
651
|
-
|
|
652
|
-
### 14.5 Git 访问
|
|
653
|
-
|
|
654
|
-
- **system git** 为真相源
|
|
655
|
-
- **simple-git** 为 Node 包装层
|
|
656
|
-
|
|
657
|
-
### 14.6 测试
|
|
658
|
-
|
|
659
|
-
- **Vitest**
|
|
660
|
-
- fixture-based filesystem integration tests
|
|
661
|
-
|
|
662
|
-
### 14.7 建议工程结构
|
|
663
|
-
|
|
664
|
-
```text
|
|
665
|
-
src/
|
|
666
|
-
commands/
|
|
667
|
-
tui/
|
|
668
|
-
domain/
|
|
669
|
-
adapters/
|
|
670
|
-
source/
|
|
671
|
-
channel/
|
|
672
|
-
services/
|
|
673
|
-
scan/
|
|
674
|
-
deploy/
|
|
675
|
-
update/
|
|
676
|
-
doctor/
|
|
677
|
-
state/
|
|
678
|
-
utils/
|
|
679
|
-
```
|
|
680
|
-
|
|
681
|
-
---
|
|
682
|
-
|
|
683
|
-
## 15. 里程碑
|
|
684
|
-
|
|
685
|
-
### Milestone 1
|
|
686
|
-
- Git Source
|
|
687
|
-
- 扫描器
|
|
688
|
-
- manifest/lock
|
|
689
|
-
- list/add/update
|
|
690
|
-
|
|
691
|
-
### Milestone 2
|
|
692
|
-
- config TUI
|
|
693
|
-
- Claude/OpenCode/Codex/agents 投影
|
|
694
|
-
- doctor
|
|
695
|
-
|
|
696
|
-
### Milestone 3
|
|
697
|
-
- OpenClaw copy deployment
|
|
698
|
-
- ClawHub adapter
|
|
699
|
-
- uninstall
|
|
700
|
-
|
|
701
|
-
### Milestone 4
|
|
702
|
-
- search
|
|
703
|
-
- diff
|
|
704
|
-
- schema migration
|
|
705
|
-
- alias conflict handling
|
|
706
|
-
|
|
707
|
-
### Milestone 5(P1)
|
|
708
|
-
- well-known discovery
|
|
709
|
-
- project-scope support
|
|
710
|
-
- Homebrew tap
|
|
711
|
-
- advanced channel overrides
|
|
712
|
-
- external plugin SDK
|
|
713
|
-
|
|
714
|
-
---
|
|
715
|
-
|
|
716
|
-
## 16. 最终拍板结论
|
|
717
|
-
|
|
718
|
-
这一版 PRD 的硬结论只有八条:
|
|
719
|
-
|
|
720
|
-
1. `skill-flow` 的本质是 **Source Resolver + Skill Indexer + Channel Projector**。
|
|
721
|
-
2. **仓库不是 skill,skill 是 leaf**。
|
|
722
|
-
3. **manifest + lock 必做**。
|
|
723
|
-
4. **Channel 必须是 adapter,不是路径字符串**。
|
|
724
|
-
5. **Claude/OpenCode/Codex/agents 默认 symlink;OpenClaw 默认 copy**。
|
|
725
|
-
6. **MVP 先做 global scope;OpenClaw 因 workspace 例外保留 workspace channel**。
|
|
726
|
-
7. **技术栈定为 Node 24 + TypeScript + oclif + Ink + Zod + simple-git + Vitest + pnpm**。
|
|
727
|
-
8. **安全默认从严,不执行第三方脚本,不静默覆盖冲突**。
|
|
728
|
-
|
|
729
|
-
---
|
|
730
|
-
|
|
731
|
-
# 三、补充说明
|
|
732
|
-
|
|
733
|
-
这份 Markdown 文档是已经可进入研发启动会的定型版本。下一步最适合继续拆解的是:
|
|
734
|
-
|
|
735
|
-
- 命令参数 spec
|
|
736
|
-
- `manifest.json` / `lock.json` 的 JSON Schema
|
|
737
|
-
- SourceAdapter / ChannelAdapter 接口定义
|
|
738
|
-
- 错误码与诊断码
|
|
739
|
-
- `config` TUI 组件树与交互状态机
|
|
740
|
-
|