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.
Files changed (37) hide show
  1. package/README.md +24 -22
  2. package/README.zh.md +25 -24
  3. package/dist/cli.js +4 -4
  4. package/dist/cli.js.map +1 -1
  5. package/dist/services/doctor-service.js +1 -1
  6. package/dist/services/doctor-service.js.map +1 -1
  7. package/dist/services/skill-flow.js +1 -1
  8. package/dist/services/skill-flow.js.map +1 -1
  9. package/dist/services/source-service.js +4 -4
  10. package/dist/services/source-service.js.map +1 -1
  11. package/dist/tests/skill-flow.test.js +1427 -0
  12. package/dist/tests/skill-flow.test.js.map +1 -1
  13. package/dist/tui/config-app.js +1 -1
  14. package/dist/tui/config-app.js.map +1 -1
  15. package/dist/utils/format.js +1 -1
  16. package/dist/utils/format.js.map +1 -1
  17. package/package.json +10 -1
  18. package/.gstack/browse-network.log +0 -1
  19. package/.gstack/browse.json +0 -7
  20. package/.gstack/qa-reports/base-branch.txt +0 -1
  21. package/.gstack/qa-reports/qa-report-skill-flow-cli-2026-03-22.md +0 -159
  22. package/.gstack/qa-reports/qa-report-skill-manager-2026-03-22.md +0 -60
  23. package/docs/DESIGN.md +0 -407
  24. package/docs/PRD/PRD-1.0.0.md +0 -1862
  25. package/docs/PRD/renew/PRD-0.0.0.md +0 -26
  26. package/docs/PRD/renew/PRD-0.0.1.md +0 -408
  27. package/docs/PRD/renew/PRD-0.0.2.md +0 -705
  28. package/docs/PRD/renew/PRD-0.0.3.md +0 -740
  29. package/docs/PRD/renew/PRD-0.0.4.md +0 -1494
  30. package/docs/README.md +0 -242
  31. package/docs/plan/PLAN_v1.0.0.md +0 -663
  32. package/docs/plan/PLAN_v1.0.1.md +0 -845
  33. package/docs/refrences/README.md +0 -9
  34. package/docs/refrences/agent-skill-paths.md +0 -274
  35. package/docs/refrences/config-state-reconciliation.md +0 -199
  36. package/docs/refrences/naming-dedupe-warning-rules.md +0 -482
  37. 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
-