@trench-craft/sds 1.0.0

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 (276) hide show
  1. package/README.en.md +522 -0
  2. package/README.md +566 -0
  3. package/dist/bin/sds.d.ts +3 -0
  4. package/dist/bin/sds.d.ts.map +1 -0
  5. package/dist/bin/sds.js +50 -0
  6. package/dist/bin/sds.js.map +1 -0
  7. package/dist/src/__tests__/cli.test.d.ts +2 -0
  8. package/dist/src/__tests__/cli.test.d.ts.map +1 -0
  9. package/dist/src/__tests__/cli.test.js +37 -0
  10. package/dist/src/__tests__/cli.test.js.map +1 -0
  11. package/dist/src/__tests__/e2e.test.d.ts +5 -0
  12. package/dist/src/__tests__/e2e.test.d.ts.map +1 -0
  13. package/dist/src/__tests__/e2e.test.js +143 -0
  14. package/dist/src/__tests__/e2e.test.js.map +1 -0
  15. package/dist/src/__tests__/graph.test.d.ts +5 -0
  16. package/dist/src/__tests__/graph.test.d.ts.map +1 -0
  17. package/dist/src/__tests__/graph.test.js +423 -0
  18. package/dist/src/__tests__/graph.test.js.map +1 -0
  19. package/dist/src/__tests__/openspec.test.d.ts +5 -0
  20. package/dist/src/__tests__/openspec.test.d.ts.map +1 -0
  21. package/dist/src/__tests__/openspec.test.js +172 -0
  22. package/dist/src/__tests__/openspec.test.js.map +1 -0
  23. package/dist/src/commands/apply.d.ts +4 -0
  24. package/dist/src/commands/apply.d.ts.map +1 -0
  25. package/dist/src/commands/apply.js +14 -0
  26. package/dist/src/commands/apply.js.map +1 -0
  27. package/dist/src/commands/archive.d.ts +4 -0
  28. package/dist/src/commands/archive.d.ts.map +1 -0
  29. package/dist/src/commands/archive.js +20 -0
  30. package/dist/src/commands/archive.js.map +1 -0
  31. package/dist/src/commands/cache.d.ts +4 -0
  32. package/dist/src/commands/cache.d.ts.map +1 -0
  33. package/dist/src/commands/cache.js +31 -0
  34. package/dist/src/commands/cache.js.map +1 -0
  35. package/dist/src/commands/config.d.ts +4 -0
  36. package/dist/src/commands/config.d.ts.map +1 -0
  37. package/dist/src/commands/config.js +29 -0
  38. package/dist/src/commands/config.js.map +1 -0
  39. package/dist/src/commands/e2e.d.ts +4 -0
  40. package/dist/src/commands/e2e.d.ts.map +1 -0
  41. package/dist/src/commands/e2e.js +65 -0
  42. package/dist/src/commands/e2e.js.map +1 -0
  43. package/dist/src/commands/graph.d.ts +4 -0
  44. package/dist/src/commands/graph.d.ts.map +1 -0
  45. package/dist/src/commands/graph.js +783 -0
  46. package/dist/src/commands/graph.js.map +1 -0
  47. package/dist/src/commands/init.d.ts +4 -0
  48. package/dist/src/commands/init.d.ts.map +1 -0
  49. package/dist/src/commands/init.js +15 -0
  50. package/dist/src/commands/init.js.map +1 -0
  51. package/dist/src/commands/project.d.ts +4 -0
  52. package/dist/src/commands/project.d.ts.map +1 -0
  53. package/dist/src/commands/project.js +6 -0
  54. package/dist/src/commands/project.js.map +1 -0
  55. package/dist/src/commands/propose.d.ts +4 -0
  56. package/dist/src/commands/propose.d.ts.map +1 -0
  57. package/dist/src/commands/propose.js +26 -0
  58. package/dist/src/commands/propose.js.map +1 -0
  59. package/dist/src/commands/registry.d.ts +4 -0
  60. package/dist/src/commands/registry.d.ts.map +1 -0
  61. package/dist/src/commands/registry.js +6 -0
  62. package/dist/src/commands/registry.js.map +1 -0
  63. package/dist/src/commands/skills-install.d.ts +4 -0
  64. package/dist/src/commands/skills-install.d.ts.map +1 -0
  65. package/dist/src/commands/skills-install.js +158 -0
  66. package/dist/src/commands/skills-install.js.map +1 -0
  67. package/dist/src/commands/skills.d.ts +4 -0
  68. package/dist/src/commands/skills.d.ts.map +1 -0
  69. package/dist/src/commands/skills.js +19 -0
  70. package/dist/src/commands/skills.js.map +1 -0
  71. package/dist/src/commands/verify.d.ts +4 -0
  72. package/dist/src/commands/verify.d.ts.map +1 -0
  73. package/dist/src/commands/verify.js +31 -0
  74. package/dist/src/commands/verify.js.map +1 -0
  75. package/dist/src/core/engine.d.ts +33 -0
  76. package/dist/src/core/engine.d.ts.map +1 -0
  77. package/dist/src/core/engine.js +87 -0
  78. package/dist/src/core/engine.js.map +1 -0
  79. package/dist/src/core/engine.test.d.ts +2 -0
  80. package/dist/src/core/engine.test.d.ts.map +1 -0
  81. package/dist/src/core/engine.test.js +13 -0
  82. package/dist/src/core/engine.test.js.map +1 -0
  83. package/dist/src/core/session-state.d.ts +18 -0
  84. package/dist/src/core/session-state.d.ts.map +1 -0
  85. package/dist/src/core/session-state.js +55 -0
  86. package/dist/src/core/session-state.js.map +1 -0
  87. package/dist/src/core/session-state.test.d.ts +2 -0
  88. package/dist/src/core/session-state.test.d.ts.map +1 -0
  89. package/dist/src/core/session-state.test.js +90 -0
  90. package/dist/src/core/session-state.test.js.map +1 -0
  91. package/dist/src/core/subagent-timeout.d.ts +18 -0
  92. package/dist/src/core/subagent-timeout.d.ts.map +1 -0
  93. package/dist/src/core/subagent-timeout.js +61 -0
  94. package/dist/src/core/subagent-timeout.js.map +1 -0
  95. package/dist/src/core/subagent-timeout.test.d.ts +2 -0
  96. package/dist/src/core/subagent-timeout.test.d.ts.map +1 -0
  97. package/dist/src/core/subagent-timeout.test.js +57 -0
  98. package/dist/src/core/subagent-timeout.test.js.map +1 -0
  99. package/dist/src/core/task-sync.d.ts +19 -0
  100. package/dist/src/core/task-sync.d.ts.map +1 -0
  101. package/dist/src/core/task-sync.js +62 -0
  102. package/dist/src/core/task-sync.js.map +1 -0
  103. package/dist/src/core/task-sync.test.d.ts +2 -0
  104. package/dist/src/core/task-sync.test.d.ts.map +1 -0
  105. package/dist/src/core/task-sync.test.js +84 -0
  106. package/dist/src/core/task-sync.test.js.map +1 -0
  107. package/dist/src/graph/advanced-performance.d.ts +137 -0
  108. package/dist/src/graph/advanced-performance.d.ts.map +1 -0
  109. package/dist/src/graph/advanced-performance.js +375 -0
  110. package/dist/src/graph/advanced-performance.js.map +1 -0
  111. package/dist/src/graph/database.d.ts +79 -0
  112. package/dist/src/graph/database.d.ts.map +1 -0
  113. package/dist/src/graph/database.js +305 -0
  114. package/dist/src/graph/database.js.map +1 -0
  115. package/dist/src/graph/engine.d.ts +43 -0
  116. package/dist/src/graph/engine.d.ts.map +1 -0
  117. package/dist/src/graph/engine.js +334 -0
  118. package/dist/src/graph/engine.js.map +1 -0
  119. package/dist/src/graph/exporter.d.ts +56 -0
  120. package/dist/src/graph/exporter.d.ts.map +1 -0
  121. package/dist/src/graph/exporter.js +273 -0
  122. package/dist/src/graph/exporter.js.map +1 -0
  123. package/dist/src/graph/index.d.ts +21 -0
  124. package/dist/src/graph/index.d.ts.map +1 -0
  125. package/dist/src/graph/index.js +14 -0
  126. package/dist/src/graph/index.js.map +1 -0
  127. package/dist/src/graph/layouts.d.ts +77 -0
  128. package/dist/src/graph/layouts.d.ts.map +1 -0
  129. package/dist/src/graph/layouts.js +368 -0
  130. package/dist/src/graph/layouts.js.map +1 -0
  131. package/dist/src/graph/parser.d.ts +47 -0
  132. package/dist/src/graph/parser.d.ts.map +1 -0
  133. package/dist/src/graph/parser.js +228 -0
  134. package/dist/src/graph/parser.js.map +1 -0
  135. package/dist/src/graph/performance.d.ts +90 -0
  136. package/dist/src/graph/performance.d.ts.map +1 -0
  137. package/dist/src/graph/performance.js +275 -0
  138. package/dist/src/graph/performance.js.map +1 -0
  139. package/dist/src/graph/semantic.d.ts +151 -0
  140. package/dist/src/graph/semantic.d.ts.map +1 -0
  141. package/dist/src/graph/semantic.js +402 -0
  142. package/dist/src/graph/semantic.js.map +1 -0
  143. package/dist/src/graph/types.d.ts +114 -0
  144. package/dist/src/graph/types.d.ts.map +1 -0
  145. package/dist/src/graph/types.js +5 -0
  146. package/dist/src/graph/types.js.map +1 -0
  147. package/dist/src/graph/visualizer.d.ts +50 -0
  148. package/dist/src/graph/visualizer.d.ts.map +1 -0
  149. package/dist/src/graph/visualizer.js +869 -0
  150. package/dist/src/graph/visualizer.js.map +1 -0
  151. package/dist/src/openspec/apply.d.ts +16 -0
  152. package/dist/src/openspec/apply.d.ts.map +1 -0
  153. package/dist/src/openspec/apply.js +140 -0
  154. package/dist/src/openspec/apply.js.map +1 -0
  155. package/dist/src/openspec/archive.d.ts +3 -0
  156. package/dist/src/openspec/archive.d.ts.map +1 -0
  157. package/dist/src/openspec/archive.js +17 -0
  158. package/dist/src/openspec/archive.js.map +1 -0
  159. package/dist/src/openspec/e2e-generate.d.ts +39 -0
  160. package/dist/src/openspec/e2e-generate.d.ts.map +1 -0
  161. package/dist/src/openspec/e2e-generate.js +315 -0
  162. package/dist/src/openspec/e2e-generate.js.map +1 -0
  163. package/dist/src/openspec/e2e-runner.d.ts +32 -0
  164. package/dist/src/openspec/e2e-runner.d.ts.map +1 -0
  165. package/dist/src/openspec/e2e-runner.js +208 -0
  166. package/dist/src/openspec/e2e-runner.js.map +1 -0
  167. package/dist/src/openspec/explore.d.ts +3 -0
  168. package/dist/src/openspec/explore.d.ts.map +1 -0
  169. package/dist/src/openspec/explore.js +20 -0
  170. package/dist/src/openspec/explore.js.map +1 -0
  171. package/dist/src/openspec/propose.d.ts +8 -0
  172. package/dist/src/openspec/propose.d.ts.map +1 -0
  173. package/dist/src/openspec/propose.js +124 -0
  174. package/dist/src/openspec/propose.js.map +1 -0
  175. package/dist/src/openspec/verify.d.ts +13 -0
  176. package/dist/src/openspec/verify.d.ts.map +1 -0
  177. package/dist/src/openspec/verify.js +156 -0
  178. package/dist/src/openspec/verify.js.map +1 -0
  179. package/dist/src/platform/claudecode.d.ts +2 -0
  180. package/dist/src/platform/claudecode.d.ts.map +1 -0
  181. package/dist/src/platform/claudecode.js +7 -0
  182. package/dist/src/platform/claudecode.js.map +1 -0
  183. package/dist/src/platform/codex.d.ts +2 -0
  184. package/dist/src/platform/codex.d.ts.map +1 -0
  185. package/dist/src/platform/codex.js +7 -0
  186. package/dist/src/platform/codex.js.map +1 -0
  187. package/dist/src/platform/opencode.d.ts +2 -0
  188. package/dist/src/platform/opencode.d.ts.map +1 -0
  189. package/dist/src/platform/opencode.js +7 -0
  190. package/dist/src/platform/opencode.js.map +1 -0
  191. package/dist/src/platform/router.d.ts +13 -0
  192. package/dist/src/platform/router.d.ts.map +1 -0
  193. package/dist/src/platform/router.js +57 -0
  194. package/dist/src/platform/router.js.map +1 -0
  195. package/dist/src/skills/cache.d.ts +16 -0
  196. package/dist/src/skills/cache.d.ts.map +1 -0
  197. package/dist/src/skills/cache.js +53 -0
  198. package/dist/src/skills/cache.js.map +1 -0
  199. package/dist/src/skills/discovery.d.ts +12 -0
  200. package/dist/src/skills/discovery.d.ts.map +1 -0
  201. package/dist/src/skills/discovery.js +61 -0
  202. package/dist/src/skills/discovery.js.map +1 -0
  203. package/dist/src/skills/loader.d.ts +12 -0
  204. package/dist/src/skills/loader.d.ts.map +1 -0
  205. package/dist/src/skills/loader.js +69 -0
  206. package/dist/src/skills/loader.js.map +1 -0
  207. package/dist/src/skills/registry.d.ts +23 -0
  208. package/dist/src/skills/registry.d.ts.map +1 -0
  209. package/dist/src/skills/registry.js +68 -0
  210. package/dist/src/skills/registry.js.map +1 -0
  211. package/dist/src/utils/fs.d.ts +5 -0
  212. package/dist/src/utils/fs.d.ts.map +1 -0
  213. package/dist/src/utils/fs.js +23 -0
  214. package/dist/src/utils/fs.js.map +1 -0
  215. package/dist/src/utils/logger.d.ts +7 -0
  216. package/dist/src/utils/logger.d.ts.map +1 -0
  217. package/dist/src/utils/logger.js +8 -0
  218. package/dist/src/utils/logger.js.map +1 -0
  219. package/dist/src/utils/yaml.d.ts +3 -0
  220. package/dist/src/utils/yaml.d.ts.map +1 -0
  221. package/dist/src/utils/yaml.js +8 -0
  222. package/dist/src/utils/yaml.js.map +1 -0
  223. package/package.json +62 -0
  224. package/registry/skills-registry.yaml +218 -0
  225. package/skills/core/brainstorming/SKILL.md +259 -0
  226. package/skills/core/brainstorming/scripts/frame-template.html +214 -0
  227. package/skills/core/brainstorming/scripts/helper.js +88 -0
  228. package/skills/core/brainstorming/scripts/server.cjs +338 -0
  229. package/skills/core/brainstorming/scripts/start-server.sh +153 -0
  230. package/skills/core/brainstorming/scripts/stop-server.sh +55 -0
  231. package/skills/core/brainstorming/skill.yaml +12 -0
  232. package/skills/core/brainstorming/spec-document-reviewer-prompt.md +48 -0
  233. package/skills/core/brainstorming/visual-companion.md +286 -0
  234. package/skills/core/claude-code-core/SKILL.md +164 -0
  235. package/skills/core/claude-code-core/skill.yaml +14 -0
  236. package/skills/core/claude-code-prompt/SKILL.md +283 -0
  237. package/skills/core/claude-code-prompt/skill.yaml +14 -0
  238. package/skills/core/claude-code-subagent/SKILL.md +168 -0
  239. package/skills/core/claude-code-subagent/skill.yaml +14 -0
  240. package/skills/core/e2e-generate/SKILL.md +147 -0
  241. package/skills/core/e2e-generate/skill.yaml +12 -0
  242. package/skills/core/ecc-agents-md-router/SKILL.md +90 -0
  243. package/skills/core/ecc-agents-md-router/skill.yaml +12 -0
  244. package/skills/core/ecc-context-injector/SKILL.md +69 -0
  245. package/skills/core/ecc-context-injector/skill.yaml +12 -0
  246. package/skills/core/existing-code-caveman/SKILL.md +340 -0
  247. package/skills/core/existing-code-caveman/skill.yaml +12 -0
  248. package/skills/core/opsx-apply/SKILL.md +121 -0
  249. package/skills/core/opsx-apply/skill.yaml +12 -0
  250. package/skills/core/opsx-archive/SKILL.md +83 -0
  251. package/skills/core/opsx-archive/skill.yaml +12 -0
  252. package/skills/core/opsx-explore/SKILL.md +101 -0
  253. package/skills/core/opsx-explore/skill.yaml +12 -0
  254. package/skills/core/opsx-propose/SKILL.md +131 -0
  255. package/skills/core/opsx-propose/skill.yaml +16 -0
  256. package/skills/core/opsx-verify/SKILL.md +109 -0
  257. package/skills/core/opsx-verify/skill.yaml +12 -0
  258. package/skills/core/subagent-driven-development/SKILL.md +157 -0
  259. package/skills/core/subagent-driven-development/code-quality-reviewer-prompt.md +64 -0
  260. package/skills/core/subagent-driven-development/implementer-prompt.md +122 -0
  261. package/skills/core/subagent-driven-development/skill.yaml +12 -0
  262. package/skills/core/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  263. package/skills/core/writing-plans/SKILL.md +268 -0
  264. package/skills/core/writing-plans/plan-document-reviewer-prompt.md +63 -0
  265. package/skills/core/writing-plans/skill.yaml +12 -0
  266. package/skills/locale/chinese-code-review/SKILL.md +17 -0
  267. package/skills/locale/chinese-code-review/skill.yaml +16 -0
  268. package/skills/locale/chinese-commit-conventions/SKILL.md +17 -0
  269. package/skills/locale/chinese-commit-conventions/skill.yaml +16 -0
  270. package/skills/locale/chinese-documentation/SKILL.md +17 -0
  271. package/skills/locale/chinese-documentation/skill.yaml +16 -0
  272. package/skills/locale/chinese-git-workflow/SKILL.md +17 -0
  273. package/skills/locale/chinese-git-workflow/skill.yaml +16 -0
  274. package/templates/agents-md.md +42 -0
  275. package/templates/claude-md.md +44 -0
  276. package/templates/codex-md.md +49 -0
package/README.md ADDED
@@ -0,0 +1,566 @@
1
+ # @trench-craft/sds
2
+
3
+ **Spec-Driven Superpowers** — 为 Claude Code、OpenCode 等 AI 编程工具提供结构化开发工作流。
4
+
5
+ 通过 6 阶段流水线将模糊的需求转化为高质量代码:
6
+ **上下文感知 → 需求收敛 → 规范建档 → 计划拆解 → 智能开发 → 质量门 → 归档交付**
7
+
8
+ ---
9
+
10
+ ## 目录
11
+
12
+ - [特性](#特性)
13
+ - [环境要求](#环境要求)
14
+ - [快速开始](#快速开始)
15
+ - [工作流详解](#工作流详解)
16
+ - [Phase 0: 上下文感知](#phase-0-上下文感知)
17
+ - [Phase 1: 需求收敛](#phase-1-需求收敛)
18
+ - [Phase 2: 生成 4 份工件](#phase-2-生成-4-份工件)
19
+ - [Phase 3: 计划拆解](#phase-3-计划拆解)
20
+ - [Phase 4: 智能开发](#phase-4-智能开发)
21
+ - [Phase 5: 质量门](#phase-5-质量门)
22
+ - [Phase 6: 归档交付](#phase-6-归档交付)
23
+ - [CLI 参考](#cli-参考)
24
+ - [平台支持](#平台支持)
25
+ - [卸载](#卸载)
26
+ - [常见问题](#常见问题)
27
+ - [FAQ](#faq)
28
+ - [架构](#架构)
29
+ - [开发](#开发)
30
+ - [从 V1 迁移](#从-v1-迁移)
31
+ - [License](#license)
32
+
33
+ ---
34
+
35
+ ## 特性
36
+
37
+ | 特性 | 说明 |
38
+ |------|------|
39
+ | **6 阶段流水线** | 从上下文感知到归档交付,每个变更经过完整流程 |
40
+ | **4 份标准化工件** | 每个变更产出 proposal / design / specs / tasks |
41
+ | **HARD-GATE 保护** | 设计方案未获批准前禁止写代码,技能层强制 |
42
+ | **TDD 强制** | 实现阶段强制测试驱动开发(红 → 绿 → 重构) |
43
+ | **子代理审查** | 规格合规 + 代码质量双层审查,自动化质量关卡 |
44
+ | **空项目自动跳过** | Phase 0 检测到空项目时自动跳过,直入需求分析 |
45
+ | **双平台支持** | 同时支持 Claude Code 和 OpenCode |
46
+ | **对话保护** | 技能仅在开发任务时激活,日常对话不受影响 |
47
+ | **CodeGraph** | 基于 Tree-sitter 的结构索引,支持 SQL 查询、增量更新、可视化 |
48
+ | **Understand Anything** | LLM 驱动的语义增强,支持 AI 助手自身模型(无需 API Key) |
49
+
50
+ ---
51
+
52
+ ## 环境要求
53
+
54
+ - **Node.js** >= 18.0.0
55
+ - **npm** >= 9.0.0
56
+ - **Claude Code** CLI 或 **OpenCode**(或兼容的 AI 编程工具)
57
+
58
+ ---
59
+
60
+ ## 快速开始
61
+
62
+ > 这是**项目级安装** — 在项目目录中执行 `npx`,不需要 `npm install -g`。
63
+ > SDS 技能会安装到项目的 `.opencode/skills/` 或 `.claude/skills/` 目录下。
64
+
65
+ ### 1. 安装技能
66
+
67
+ ```bash
68
+ # 进入你的项目目录
69
+ cd my-project
70
+
71
+ # ─── 方式一:自动检测工具(推荐)───
72
+ # 如果项目已存在 .opencode 或 .claude 目录,会自动识别
73
+ npx @trench-craft/sds@2.2.0 skills install core
74
+
75
+ # ─── 方式二:手动指定工具 ───
76
+ # OpenCode:
77
+ npx @trench-craft/sds@2.2.0 skills install core --tool opencode
78
+ # 简称: --tool oc
79
+
80
+ # Claude Code:
81
+ npx @trench-craft/sds@2.2.0 skills install core --tool claude
82
+ # 简称: --tool cc 或 --tool claude-code
83
+
84
+ # 安装全部技能(核心 + 中文语言包)
85
+ npx @trench-craft/sds@2.2.0 skills install all --tool opencode
86
+ ```
87
+
88
+ ### 2. 验证安装
89
+
90
+ ```bash
91
+ # 检查技能文件
92
+ # OpenCode:
93
+ ls .opencode/skills/
94
+
95
+ # Claude Code:
96
+ ls .claude/skills/
97
+
98
+ # 检查生成的配置文件
99
+ # OpenCode:
100
+ cat AGENTS.md
101
+
102
+ # Claude Code:
103
+ cat CLAUDE.md
104
+ ```
105
+
106
+ 如果安装成功,你应该能看到对应的技能目录,以及自动生成的配置文件。
107
+
108
+ ### 3. 查看可用命令
109
+
110
+ ```bash
111
+ npx @trench-craft/sds --help
112
+ ```
113
+
114
+ ### 4. 开始使用
115
+
116
+ 用 AI 编程工具打开项目,输入:
117
+
118
+ > "我要实现一个用户登录功能"
119
+
120
+ AI 会自动识别为开发任务,启动工作流:
121
+
122
+ ```
123
+ Phase 0: 检测到空项目,跳过探索 → Phase 1: 开始问你需求问题
124
+ ```
125
+
126
+ ---
127
+
128
+ ## 工作流详解
129
+
130
+ ```
131
+ ┌─────────────────────────────────────────────────────────────────────────┐
132
+ │ SDS 6 阶段流水线 │
133
+ ├──────────┬───────────┬───────────┬──────────┬──────────┬────────┬───────┤
134
+ │ Phase 0 │ Phase 1 │ Phase 2 │ Phase 3 │ Phase 4 │Phase 5 │Phase 6│
135
+ │ 上下文 │ 需求 │ 规范 │ 计划 │ 智能 │质量门 │归档 │
136
+ │ 感知 │ 收敛 │ 建档 │ 拆解 │ 开发 │ │交付 │
137
+ ├──────────┼───────────┼───────────┼──────────┼──────────┼────────┼───────┤
138
+ │ codebase │ brain- │ generate- │ write- │ apply- │ verify │archiv-│
139
+ │ -map │ storming │ artifacts │ plans │ changes │ -chang │ e │
140
+ │ deep- │ │ │ │ subagent │ es │ -chan-│
141
+ │ explore │ │ │ │ -dev │ │ ges │
142
+ └──────────┴───────────┴───────────┴──────────┴──────────┴────────┴───────┘
143
+ ```
144
+
145
+ ### Phase 0: 上下文感知
146
+
147
+ **技能**: `codebase-map`(代码库地图)、`deep-explore`(深度探索)
148
+
149
+ 在开始变更之前,先了解现有代码库的全貌。
150
+
151
+ | 场景 | 行为 |
152
+ |------|------|
153
+ | **已有代码的项目** | 扫描目录结构、检测技术栈、映射模块、识别风险 |
154
+ | **新项目/空项目** | **自动跳过** — 直接进入 Phase 1 |
155
+ | **特定模块查询** | 对目标区域进行深入调查 |
156
+
157
+ **输出**: `AGENTS.md` / `CLAUDE.md`(项目地图)
158
+
159
+ **示例**: "这个项目是做什么的?" / "分析一下认证系统"
160
+
161
+ ---
162
+
163
+ ### Phase 1: 需求收敛
164
+
165
+ **技能**: `brainstorming`
166
+
167
+ 最关键阶段。AI 通过结构化对话探索需求,在写任何代码之前先完成设计。
168
+
169
+ ```
170
+ ┌──────────────────────────────────────────────────┐
171
+ │ Brainstorming 流程 │
172
+ ├──────────────────────────────────────────────────┤
173
+ │ │
174
+ │ 1. 探索项目上下文(文件、文档、commit) │
175
+ │ 2. 一次一个问题澄清需求 │
176
+ │ 3. 提出 2-3 种方案,附带权衡分析 │
177
+ │ 4. 分节展示设计方案,每节获得用户批准 │
178
+ │ 5. 编写设计文档 │
179
+ │ 6. 子代理审查规格 │
180
+ │ 7. 用户审查书面规格 │
181
+ │ 8. 进入 Phase 2 │
182
+ │ │
183
+ └──────────────────────────────────────────────────┘
184
+ ```
185
+
186
+ **🚫 HARD-GATE**: 设计方案未获用户批准前,禁止写任何实现代码。
187
+
188
+ **输出**: `openspec/changes/<name>/brainstorming.md`
189
+
190
+ **示例**: "我要实现一个登录功能"
191
+
192
+ ---
193
+
194
+ ### Phase 2: 生成 4 份工件
195
+
196
+ **技能**: `generate-artifacts`
197
+
198
+ 将已批准的需求转化为 4 份标准化工件:
199
+
200
+ | 工件 | 内容 | 作用 |
201
+ |------|------|------|
202
+ | `proposal.md` | 背景、目标、范围(包含/不包含)、技术选型 | 明确**做什么**和**为什么做** |
203
+ | `design.md` | 架构图、API 定义、数据模型、安全设计 | 决定**怎么做** |
204
+ | `specs.md` | 功能规格、非功能规格、验收标准 | 定义**做成什么样** |
205
+ | `tasks.md` | 任务列表、依赖关系图、预估时间 | 制定**执行计划** |
206
+
207
+ > ⚠️ **4 份工件均为强制性产出,缺一不可。**
208
+
209
+ **输出目录**: `openspec/changes/<name>/`
210
+
211
+ **目录结构**:
212
+ ```
213
+ openspec/changes/login-feature/
214
+ ├── proposal.md (提案:背景/目标/范围/技术选型)
215
+ ├── design.md (设计:架构/接口/数据模型/安全)
216
+ ├── specs.md (规格:功能场景/验收标准)
217
+ └── tasks.md (任务:开发任务/依赖关系/预估)
218
+ ```
219
+
220
+ ---
221
+
222
+ ### Phase 3: 计划拆解
223
+
224
+ **技能**: `write-plans`
225
+
226
+ 将规格拆解为详细的、可执行的实现计划,每个任务遵循 TDD。
227
+
228
+ **计划结构**:
229
+ ````markdown
230
+ ### 任务 N:[组件名称]
231
+
232
+ **文件**:
233
+ - 创建:`path/to/file.py`
234
+ - 修改:`path/to/existing.py:123-145`
235
+ - 测试:`tests/path/to/test.py`
236
+
237
+ - [ ] **步骤 1:编写失败的测试**
238
+ ```python
239
+ def test_specific_behavior():
240
+ result = function(input)
241
+ assert result == expected
242
+ ```
243
+
244
+ - [ ] **步骤 2:运行测试验证失败**
245
+ 运行:`pytest tests/path/test.py -v`
246
+ 预期:FAIL
247
+
248
+ - [ ] **步骤 3:编写最少实现代码**
249
+ ```python
250
+ def function(input):
251
+ return expected
252
+ ```
253
+
254
+ - [ ] **步骤 4:运行测试验证通过**
255
+ 运行:`pytest tests/path/test.py -v`
256
+ 预期:PASS
257
+
258
+ - [ ] **步骤 5:Commit**
259
+ ````
260
+
261
+ **禁止占位符**:每个步骤必须包含实际代码和预期输出。"TODO"、"后续实现"、"添加错误处理"等占位符不被允许。
262
+
263
+ **输出**: `openspec/changes/<name>/plan.md`
264
+
265
+ ---
266
+
267
+ ### Phase 4: 智能开发
268
+
269
+ **技能**: `apply-changes`、`subagent-development`
270
+
271
+ 两种执行方式:
272
+
273
+ #### 方式 A:标准执行(手动)
274
+
275
+ 按 `plan.md` 顺序逐任务执行,遵循 TDD(红 → 绿 → 重构)。
276
+
277
+ #### 方式 B:子代理驱动开发(推荐)
278
+
279
+ 每个任务由独立子代理执行,完成后进行两阶段审查:
280
+
281
+ ```
282
+ ┌──────────────┐ ┌───────────────┐ ┌──────────────────┐
283
+ │ 实现子代理 │───▶│ 规格审查子代理 │───▶│ 代码质量审查子代理 │
284
+ │ (TDD+编码) │ │ (合规检查) │ │ (质量检查) │
285
+ └──────────────┘ └───────────────┘ └──────────────────┘
286
+ │ │
287
+ └─────────── 失败则重试 ──────────────────┘
288
+ ```
289
+
290
+ **优势**:
291
+ - 每个任务独立上下文(无污染)
292
+ - 两阶段审查提前发现缺陷
293
+ - TDD 自动执行
294
+ - 并行安全
295
+
296
+ **子代理状态**:
297
+
298
+ | 状态 | 含义 | 处理 |
299
+ |------|------|------|
300
+ | DONE | 完成 | 进入审查 |
301
+ | DONE_WITH_CONCERNS | 完成但有疑虑 | 处理疑虑后审查 |
302
+ | NEEDS_CONTEXT | 需要更多上下文 | 提供后重试 |
303
+ | BLOCKED | 无法完成 | 评估原因,拆分或升级 |
304
+
305
+ ---
306
+
307
+ ### Phase 5: 质量门
308
+
309
+ **技能**: `verify-changes`
310
+
311
+ 7 项强制性质量检查:
312
+
313
+ | # | 检查项 | 命令/标准 |
314
+ |---|--------|-----------|
315
+ | 1 | **编译检查** | `tsc --noEmit`、`go build` 等 |
316
+ | 2 | **测试检查** | 所有测试通过 |
317
+ | 3 | **规格符合性** | 所有 specs.md 需求已实现 |
318
+ | 4 | **任务完整性** | tasks.md 全部完成 |
319
+ | 5 | **代码质量** | LSP 无错误、无 TODO/FIXME |
320
+ | 6 | **文档同步** | README、API 文档、环境变量同步 |
321
+ | 7 | **Breaking Changes** | API 后向兼容、配置变更记录 |
322
+
323
+ 所有 7 项必须通过才能进入下一阶段。任何一项失败 → 修复后重新验证。
324
+
325
+ **输出**: `openspec/changes/<name>/verify.md`
326
+
327
+ ---
328
+
329
+ ### Phase 6: 归档交付
330
+
331
+ **技能**: `archive-changes`
332
+
333
+ 将已完成变更归档,保留完整历史:
334
+
335
+ ```
336
+ openspec/
337
+ ├── changes/login-feature/ (活跃中 — 归档后移除)
338
+ └── archive/2026-05-13-login-feature/ (永久记录)
339
+ ├── proposal.md
340
+ ├── design.md
341
+ ├── specs.md
342
+ ├── tasks.md
343
+ ├── plan.md
344
+ └── verify.md
345
+ ```
346
+
347
+ **前置条件**: Phase 5 必须通过,否则不能归档。
348
+
349
+ ---
350
+
351
+ ## CLI 参考
352
+
353
+ ```bash
354
+ @trench-craft/sds <command> [options]
355
+
356
+ 命令:
357
+ skills install <type> 安装技能(core | locale | all)[默认: all]
358
+ skills verify [skill] 验证技能安装
359
+ skills list 列出已安装技能
360
+
361
+ 选项:
362
+ --tool <tool> 指定工具: opencode | oc | claude-code | cc | claude
363
+ [自动检测 .opencode / .claude 目录]
364
+ --verbose 详细输出
365
+ -V, --version 输出版本号
366
+ -h, --help 显示帮助
367
+ ```
368
+
369
+ ### 示例
370
+
371
+ ```bash
372
+ # 自动检测并安装
373
+ npx @trench-craft/sds skills install core
374
+
375
+ # 指定工具(支持缩写)
376
+ npx @trench-craft/sds skills install all --tool oc
377
+ npx @trench-craft/sds skills install core --tool cc
378
+ npx @trench-craft/sds skills install core --tool claude-code
379
+
380
+ # 仅安装语言包
381
+ npx @trench-craft/sds skills install locale --tool opencode
382
+ ```
383
+
384
+ ---
385
+
386
+ ## 平台支持
387
+
388
+ | 平台 | 配置文件 | 技能目录 | 检测方式 |
389
+ |------|----------|----------|----------|
390
+ | **OpenCode** | `AGENTS.md` | `.opencode/skills/` | 检测 `.opencode/` 目录 |
391
+ | **Claude Code** | `CLAUDE.md` | `.claude/skills/` | 检测 `.claude/` 目录 |
392
+
393
+ **Claude Code 额外获得**:
394
+ - `core-engine` — 文件系统、Git、命令执行能力
395
+ - `prompt-manager` — 提示词优化
396
+ - `subagent-dispatcher` — 子代理生命周期管理
397
+
398
+ OpenCode 安装时自动过滤 Claude Code 特有的技能。
399
+
400
+ ---
401
+
402
+ ## 卸载
403
+
404
+ ```bash
405
+ # 删除技能文件和配置
406
+ # OpenCode:
407
+ rmdir /s /q .opencode\skills
408
+ del AGENTS.md
409
+
410
+ # Claude Code:
411
+ rmdir /s /q .claude\skills
412
+ del CLAUDE.md
413
+
414
+ # 删除 npm 包
415
+ npm uninstall @trench-craft/sds
416
+ ```
417
+
418
+ ---
419
+
420
+ ## 常见问题
421
+
422
+ | 问题 | 解决方案 |
423
+ |------|----------|
424
+ | **技能不被识别** | 安装后重启 AI 编程工具 |
425
+ | **"未检测到工具"错误** | 显式指定 `--tool opencode` 或 `--tool claude-code` |
426
+ | **技能名称显示中文** | V1 缓存,使用最新版本重新安装 |
427
+ | **子代理不触发** | 确保先完成 `plan.md`,再调用 `subagent-development` |
428
+ | **验证失败(规格对齐)** | 检查 `specs.md` 的验收标准是否全部实现 |
429
+ | **Windows 路径问题** | 使用正斜杠 `/` 或转义反斜杠 `\\` |
430
+ | **安装后找不到命令** | 确保已 `npm install`,或使用 `npx @trench-craft/sds` |
431
+
432
+ ---
433
+
434
+ ## FAQ
435
+
436
+ ### V1 和 V2 有什么区别?
437
+
438
+ V2(`@trench-craft/sds`)是完全重写的版本,引入了 6 阶段 OpenSpec 工作流。详见[从 V1 迁移](#从-v1-迁移)。
439
+
440
+ ### 可以在其他 AI 工具中使用吗?
441
+
442
+ 技能系统专为 Claude Code 和 OpenCode 设计,但可以适配到任何支持技能/插件的 AI 编程助手。
443
+
444
+ ### 每个项目都需要安装吗?
445
+
446
+ 是的。技能是项目级的,每个项目需要独立安装。
447
+
448
+ ### 会影响 AI 响应速度吗?
449
+
450
+ 不会。技能仅在匹配的任务上激活。日常对话、问题咨询等非开发话题不会触发任何技能。
451
+
452
+ ### 跳过一个阶段会怎样?
453
+
454
+ 工作流的设计初衷是在早期发现缺陷。跳过阶段会增加返工、遗漏需求或质量问题的风险。
455
+
456
+ ---
457
+
458
+ ## 架构
459
+
460
+ ```
461
+ @trench-craft/sds
462
+ ├── bin/sds.ts ← CLI 入口
463
+ ├── src/
464
+ │ ├── commands/
465
+ │ │ ├── init.ts ← 项目初始化
466
+ │ │ ├── skills-install.ts ← 技能安装器(核心逻辑)
467
+ │ │ ├── skills.ts ← 技能命令组
468
+ │ │ ├── config.ts ← 配置管理
469
+ │ │ ├── project.ts ← 项目管理
470
+ │ │ └── ... ← 其他命令
471
+ │ ├── platform/
472
+ │ │ ├── opencode.ts ← OpenCode 适配器
473
+ │ │ └── claude.ts ← Claude Code 适配器
474
+ │ ├── core/
475
+ │ │ └── engine.ts ← SDS 引擎
476
+ │ └── skills/ ← 技能加载器
477
+ ├── skills/
478
+ │ ├── core/ ← 14 个核心技能
479
+ │ │ ├── brainstorming/ — 需求分析
480
+ │ │ ├── opsx-propose/ — 生成 4 份工件
481
+ │ │ ├── writing-plans/ — 计划拆解
482
+ │ │ ├── opsx-apply/ — 执行变更
483
+ │ │ ├── opsx-verify/ — 验证变更
484
+ │ │ ├── opsx-archive/ — 归档变更
485
+ │ │ ├── existing-code-caveman/ — 代码库探索
486
+ │ │ ├── opsx-explore/ — 深度探索
487
+ │ │ ├── subagent-driven-development/ — 子代理开发
488
+ │ │ ├── ecc-agents-md-router/ — 工作流路由
489
+ │ │ ├── ecc-context-injector/ — 上下文注入
490
+ │ │ ├── claude-code-core/ (仅 Claude Code)
491
+ │ │ ├── claude-code-prompt/ (仅 Claude Code)
492
+ │ │ └── claude-code-subagent/ (仅 Claude Code)
493
+ │ └── locale/ ← 4 个语言包技能
494
+ │ ├── chinese-code-review/
495
+ │ ├── chinese-commit-conventions/
496
+ │ ├── chinese-documentation/
497
+ │ └── chinese-git-workflow/
498
+ ├── templates/
499
+ │ ├── agents-md.md ← OpenCode AGENTS.md 模板
500
+ │ └── claude-md.md ← Claude Code CLAUDE.md 模板
501
+ └── package.json
502
+ ```
503
+
504
+ ---
505
+
506
+ ## 开发
507
+
508
+ ```bash
509
+ # 克隆仓库
510
+ git clone <repo-url>
511
+ cd packages/sds
512
+
513
+ # 安装依赖
514
+ npm install
515
+
516
+ # 构建
517
+ npm run build
518
+
519
+ # 本地测试
520
+ npm link
521
+ cd /path/to/test-project
522
+ npm link @trench-craft/sds
523
+ npx sds skills install core --tool opencode
524
+ ```
525
+
526
+ ---
527
+
528
+ ## 从 V1 迁移
529
+
530
+ V2(`@trench-craft/sds`)是 V1(`trench-craft-skills`)的重大升级。
531
+
532
+ | 对比项 | V1 | V2 |
533
+ |--------|----|----|
534
+ | **包名** | `trench-craft-skills` | **`@trench-craft/sds`** |
535
+ | **工作流** | 线性流程 | **6 阶段 OpenSpec 流水线** |
536
+ | **工件路径** | `docs/superpowers/` | **`openspec/changes/<name>/`** |
537
+ | **4 份工件** | 无 | **proposal / design / specs / tasks** |
538
+ | **CLI 参数** | `--platform` | **`--tool`** |
539
+ | **技能名称** | 中文 | **英文 kebab-case** |
540
+ | **Phase 0** | 无 | **上下文感知(空项目自动跳过)** |
541
+ | **计划审查** | 可选 | **子代理强制审查** |
542
+ | **验证阶段** | 无 | **7 项强制质量检查** |
543
+ | **归档阶段** | 无 | **结构化归档,保留历史** |
544
+
545
+ ### 迁移步骤
546
+
547
+ 1. 卸载 V1 技能:
548
+ ```bash
549
+ rmdir /s /q .opencode\skills .claude\skills
550
+ del AGENTS.md CLAUDE.md
551
+ ```
552
+ 2. 安装 V2:
553
+ ```bash
554
+ npx @trench-craft/sds skills install core --tool opencode
555
+ ```
556
+ 3. 旧的 `docs/superpowers/` 工件仍可阅读,但新工作使用 `openspec/changes/` 路径。
557
+
558
+ ---
559
+
560
+ ## License
561
+
562
+ MIT
563
+
564
+ ---
565
+
566
+ *为相信 AI 辅助编码需要结构的开发者而建。*
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=sds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sds.d.ts","sourceRoot":"","sources":["../../bin/sds.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { createRequire } from 'module';
4
+ const require = createRequire(import.meta.url);
5
+ let pkg;
6
+ try {
7
+ pkg = require('../package.json');
8
+ }
9
+ catch {
10
+ try {
11
+ pkg = require('../../package.json');
12
+ }
13
+ catch {
14
+ console.error('错误: 无法读取包配置');
15
+ process.exit(1);
16
+ }
17
+ }
18
+ const program = new Command();
19
+ program
20
+ .name('sds')
21
+ .description('Spec-Driven Superpowers CLI')
22
+ .version(pkg.version)
23
+ .option('--verbose', '详细输出');
24
+ // 注册命令
25
+ const initModule = await import('../src/commands/init.js');
26
+ program.addCommand(initModule.default);
27
+ const skillsModule = await import('../src/commands/skills.js');
28
+ program.addCommand(skillsModule.default);
29
+ const projectModule = await import('../src/commands/project.js');
30
+ program.addCommand(projectModule.default);
31
+ const configModule = await import('../src/commands/config.js');
32
+ program.addCommand(configModule.default);
33
+ const applyModule = await import('../src/commands/apply.js');
34
+ program.addCommand(applyModule.default);
35
+ const verifyModule = await import('../src/commands/verify.js');
36
+ program.addCommand(verifyModule.default);
37
+ const archiveModule = await import('../src/commands/archive.js');
38
+ program.addCommand(archiveModule.default);
39
+ const proposeModule = await import('../src/commands/propose.js');
40
+ program.addCommand(proposeModule.default);
41
+ const cacheModule = await import('../src/commands/cache.js');
42
+ program.addCommand(cacheModule.default);
43
+ const registryModule = await import('../src/commands/registry.js');
44
+ program.addCommand(registryModule.default);
45
+ const graphModule = await import('../src/commands/graph.js');
46
+ program.addCommand(graphModule.default);
47
+ const e2eModule = await import('../src/commands/e2e.js');
48
+ program.addCommand(e2eModule.default);
49
+ program.parse();
50
+ //# sourceMappingURL=sds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sds.js","sourceRoot":"","sources":["../../bin/sds.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,IAAI,GAAwB,CAAC;AAC7B,IAAI,CAAC;IACH,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACnC,CAAC;AAAC,MAAM,CAAC;IACP,IAAI,CAAC;QACH,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,6BAA6B,CAAC;KAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAE/B,OAAO;AACP,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAC3D,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAEvC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAC/D,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAEzC,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACjE,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAE1C,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAC/D,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAEzC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAC7D,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAExC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAC/D,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAEzC,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACjE,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAE1C,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACjE,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAC7D,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAExC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;AACnE,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAE3C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAC7D,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAExC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACzD,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAEtC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/cli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { execSync } from 'child_process';
3
+ import { resolve } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname } from 'path';
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const pkgRoot = resolve(__dirname, '..', '..');
8
+ function runSds(args) {
9
+ return execSync(`npx tsx bin/sds.ts ${args}`, {
10
+ cwd: pkgRoot,
11
+ encoding: 'utf8',
12
+ timeout: 10000,
13
+ }).trim();
14
+ }
15
+ describe('sds CLI', () => {
16
+ it('--version 输出版本号 2.0.0', () => {
17
+ const output = runSds('--version');
18
+ expect(output).toBe('2.0.0');
19
+ });
20
+ it('--help 包含所有 8 个命令', () => {
21
+ const output = runSds('--help');
22
+ const expectedCommands = [
23
+ 'init',
24
+ 'skills',
25
+ 'project',
26
+ 'generate',
27
+ 'apply',
28
+ 'verify',
29
+ 'archive',
30
+ 'propose',
31
+ ];
32
+ for (const cmd of expectedCommands) {
33
+ expect(output).toContain(cmd);
34
+ }
35
+ });
36
+ });
37
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE/C,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,QAAQ,CAAC,sBAAsB,IAAI,EAAE,EAAE;QAC5C,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,gBAAgB,GAAG;YACvB,MAAM;YACN,QAAQ;YACR,SAAS;YACT,UAAU;YACV,OAAO;YACP,QAAQ;YACR,SAAS;YACT,SAAS;SACV,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * E2E 生成器集成测试
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/e2e.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}