dsh-superpower 6.3.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 (60) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +334 -0
  3. package/cordis.patch.yml +3 -0
  4. package/lib/superpowers.d.ts +44 -0
  5. package/lib/superpowers.d.ts.map +1 -0
  6. package/lib/superpowers.js +291 -0
  7. package/lib/superpowers.js.map +1 -0
  8. package/package.json +62 -0
  9. package/skills/brainstorming/SKILL.md +207 -0
  10. package/skills/brainstorming/scripts/frame-template.html +213 -0
  11. package/skills/brainstorming/scripts/helper.js +167 -0
  12. package/skills/brainstorming/scripts/server.cjs +723 -0
  13. package/skills/brainstorming/scripts/start-server.sh +209 -0
  14. package/skills/brainstorming/scripts/stop-server.sh +120 -0
  15. package/skills/brainstorming/spec-document-reviewer-prompt.md +47 -0
  16. package/skills/brainstorming/visual-companion.md +293 -0
  17. package/skills/dispatching-parallel-agents/SKILL.md +167 -0
  18. package/skills/executing-plans/SKILL.md +64 -0
  19. package/skills/finishing-a-development-branch/SKILL.md +202 -0
  20. package/skills/receiving-code-review/SKILL.md +205 -0
  21. package/skills/requesting-code-review/SKILL.md +95 -0
  22. package/skills/requesting-code-review/code-reviewer.md +169 -0
  23. package/skills/subagent-driven-development/SKILL.md +347 -0
  24. package/skills/subagent-driven-development/implementer-prompt.md +133 -0
  25. package/skills/subagent-driven-development/re-review-prompt.md +84 -0
  26. package/skills/subagent-driven-development/scripts/review-package +46 -0
  27. package/skills/subagent-driven-development/scripts/sdd-workspace +40 -0
  28. package/skills/subagent-driven-development/scripts/task-brief +41 -0
  29. package/skills/subagent-driven-development/task-reviewer-prompt.md +129 -0
  30. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  31. package/skills/systematic-debugging/SKILL.md +283 -0
  32. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  33. package/skills/systematic-debugging/condition-based-waiting.md +116 -0
  34. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  35. package/skills/systematic-debugging/find-polluter.sh +72 -0
  36. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  37. package/skills/systematic-debugging/test-academic.md +14 -0
  38. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  39. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  40. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  41. package/skills/test-driven-development/SKILL.md +322 -0
  42. package/skills/test-driven-development/writing-good-tests.md +145 -0
  43. package/skills/using-git-worktrees/SKILL.md +167 -0
  44. package/skills/using-superpowers/SKILL.md +64 -0
  45. package/skills/using-superpowers/references/antigravity-tools.md +23 -0
  46. package/skills/using-superpowers/references/codex-tools.md +108 -0
  47. package/skills/using-superpowers/references/dsh-tools.md +47 -0
  48. package/skills/using-superpowers/references/gemini-tools.md +63 -0
  49. package/skills/using-superpowers/references/hermes-tools.md +56 -0
  50. package/skills/using-superpowers/references/pi-tools.md +16 -0
  51. package/skills/verification-before-completion/SKILL.md +120 -0
  52. package/skills/writing-plans/SKILL.md +160 -0
  53. package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  54. package/skills/writing-skills/SKILL.md +679 -0
  55. package/skills/writing-skills/anthropic-best-practices.md +1146 -0
  56. package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +188 -0
  57. package/skills/writing-skills/graphviz-conventions.dot +172 -0
  58. package/skills/writing-skills/persuasion-principles.md +187 -0
  59. package/skills/writing-skills/render-graphs.js +169 -0
  60. package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
@@ -0,0 +1,291 @@
1
+ /**
2
+ * dsh-superpower — DSH 移植版 Superpowers
3
+ *
4
+ * 将 obra/superpowers 的 14 个 skill 以 DSH 原生 SkillProvider 形式暴露,
5
+ * 通过 ctx.skills.registerProvider 注入全局层,rank 550 使 project 级 skill 可覆盖。
6
+ */
7
+ import { readdir, readFile, stat } from 'node:fs/promises';
8
+ import { dirname, join, resolve } from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { parse } from 'yaml';
11
+ import Schema from '@deepseek-ai/schemastery';
12
+ // ---------------------------------------------------------------------------
13
+ // Config
14
+ // ---------------------------------------------------------------------------
15
+ export const Config = Schema.object({
16
+ /** 注册到 ctx.skills 的 provider 名称,默认为 superpowers */
17
+ providerName: Schema.string().default('superpowers'),
18
+ /** skill 目录绝对路径,默认取包内 skills/;便于本地调试指向其他目录 */
19
+ skillDir: Schema.string(),
20
+ });
21
+ // ---------------------------------------------------------------------------
22
+ // 插件元信息
23
+ // ---------------------------------------------------------------------------
24
+ export const name = 'superpowers';
25
+ export const inject = ['skills'];
26
+ // ---------------------------------------------------------------------------
27
+ // 工具函数
28
+ // ---------------------------------------------------------------------------
29
+ const SKILL_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
30
+ const SUPERPOWERS_RANK = 550;
31
+ function isSkillName(v) {
32
+ return SKILL_NAME_RE.test(v);
33
+ }
34
+ function stringField(data, key) {
35
+ const v = data[key];
36
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
37
+ }
38
+ function optionalString(data, key) {
39
+ const v = data[key];
40
+ return typeof v === 'string' && v.length > 0 ? { [key]: v } : {};
41
+ }
42
+ function frontmatterBoolean(data, key) {
43
+ if (!Object.hasOwn(data, key))
44
+ return undefined;
45
+ const v = data[key];
46
+ if (typeof v === 'boolean')
47
+ return v;
48
+ if (v === 1 || v === '1')
49
+ return true;
50
+ if (v === 0 || v === '0')
51
+ return false;
52
+ if (typeof v === 'string') {
53
+ switch (v.toLowerCase()) {
54
+ case 'true':
55
+ case 'yes':
56
+ case 'on':
57
+ return true;
58
+ case 'false':
59
+ case 'no':
60
+ case 'off':
61
+ return false;
62
+ }
63
+ }
64
+ throw new TypeError(`frontmatter field "${key}" must be a boolean`);
65
+ }
66
+ function rejectLegacyKey(data, legacy, canonical) {
67
+ if (Object.hasOwn(data, legacy)) {
68
+ throw new Error(`frontmatter field "${legacy}" is unsupported; use "${canonical}"`);
69
+ }
70
+ }
71
+ function parseInvocationPolicy(data) {
72
+ rejectLegacyKey(data, 'disableModelInvocation', 'disable-model-invocation');
73
+ rejectLegacyKey(data, 'modelInvocable', 'disable-model-invocation');
74
+ rejectLegacyKey(data, 'userInvocable', 'user-invocable');
75
+ const disableModelInvocation = frontmatterBoolean(data, 'disable-model-invocation');
76
+ const userInvocable = frontmatterBoolean(data, 'user-invocable');
77
+ return {
78
+ modelInvocable: disableModelInvocation !== true,
79
+ userInvocable: userInvocable !== false,
80
+ };
81
+ }
82
+ function optionalMetadata(data) {
83
+ const v = data['metadata'];
84
+ if (typeof v === 'object' && v !== null && !Array.isArray(v))
85
+ return { metadata: v };
86
+ return {};
87
+ }
88
+ function findClosingFrontmatter(raw, start) {
89
+ let lineStart = start;
90
+ while (lineStart <= raw.length) {
91
+ const nl = raw.indexOf('\n', lineStart);
92
+ const lineEnd = nl < 0 ? raw.length : nl;
93
+ if (raw.slice(lineStart, lineEnd).replace(/\r$/, '') === '---') {
94
+ return { start: lineStart, bodyStart: nl < 0 ? raw.length : nl + 1 };
95
+ }
96
+ if (nl < 0)
97
+ return undefined;
98
+ lineStart = nl + 1;
99
+ }
100
+ return undefined;
101
+ }
102
+ function parseFrontmatter(raw) {
103
+ const firstNl = raw.indexOf('\n');
104
+ if (firstNl < 0)
105
+ return undefined;
106
+ if (raw.slice(0, firstNl).replace(/\r$/, '') !== '---')
107
+ return undefined;
108
+ const start = firstNl + 1;
109
+ const closing = findClosingFrontmatter(raw, start);
110
+ if (!closing)
111
+ return undefined;
112
+ const parsed = parse(raw.slice(start, closing.start));
113
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
114
+ return undefined;
115
+ return { data: parsed, body: raw.slice(closing.bodyStart) };
116
+ }
117
+ function resolveDefaultSkillDir(configSkillDir) {
118
+ if (configSkillDir)
119
+ return resolve(configSkillDir);
120
+ // 包内 skills/ 目录:相对于本文件 lib/superpowers.js -> ../skills
121
+ try {
122
+ // ESM 环境下通过 import.meta.url 解析
123
+ const here = fileURLToPath(import.meta.url);
124
+ return resolve(dirname(here), '..', 'skills');
125
+ }
126
+ catch {
127
+ // 降级:相对 cwd
128
+ return resolve('skills');
129
+ }
130
+ }
131
+ // ---------------------------------------------------------------------------
132
+ // Provider
133
+ // ---------------------------------------------------------------------------
134
+ class SuperpowersProvider {
135
+ name;
136
+ skillDir;
137
+ ctx;
138
+ constructor(ctx, _control, config) {
139
+ this.ctx = ctx;
140
+ this.name = config.providerName ?? 'superpowers';
141
+ this.skillDir = resolveDefaultSkillDir(config['skillDir']);
142
+ }
143
+ async list(_options) {
144
+ const candidates = [];
145
+ let entries;
146
+ try {
147
+ entries = await readdir(this.skillDir, { withFileTypes: true });
148
+ }
149
+ catch (err) {
150
+ const code = err?.code;
151
+ if (code === 'ENOENT' || code === 'ENOTDIR') {
152
+ this.ctx.logger.warn(`[superpowers] skillDir not found: ${this.skillDir}`);
153
+ return [];
154
+ }
155
+ throw err;
156
+ }
157
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
158
+ if (!entry.isDirectory())
159
+ continue;
160
+ if (entry.name.startsWith('.'))
161
+ continue;
162
+ const skillPath = join(this.skillDir, entry.name, 'SKILL.md');
163
+ try {
164
+ await stat(skillPath);
165
+ }
166
+ catch {
167
+ continue;
168
+ }
169
+ const parsed = await parseSkillFile(skillPath);
170
+ if (!parsed) {
171
+ this.ctx.logger.warn(`[superpowers] skip ${entry.name}: missing or invalid frontmatter`);
172
+ continue;
173
+ }
174
+ const { data, body } = parsed;
175
+ const skillName = stringField(data, 'name');
176
+ const description = stringField(data, 'description');
177
+ if (!skillName || !description) {
178
+ this.ctx.logger.warn(`[superpowers] skip ${skillPath}: frontmatter requires name and description`);
179
+ continue;
180
+ }
181
+ if (!isSkillName(skillName)) {
182
+ this.ctx.logger.warn(`[superpowers] skip ${skillPath}: invalid skill name "${skillName}"`);
183
+ continue;
184
+ }
185
+ // 目录名与 skill name 不一致时以 frontmatter 为准,但打印提示
186
+ if (skillName !== entry.name) {
187
+ this.ctx.logger.warn(`[superpowers] skill name "${skillName}" != directory "${entry.name}" (using frontmatter)`);
188
+ }
189
+ let invocation;
190
+ try {
191
+ invocation = parseInvocationPolicy(data);
192
+ }
193
+ catch (e) {
194
+ this.ctx.logger.warn(`[superpowers] skip ${skillPath}: ${String(e)}`);
195
+ continue;
196
+ }
197
+ candidates.push({
198
+ name: skillName,
199
+ description,
200
+ ...optionalString(data, 'whenToUse'),
201
+ invocation,
202
+ source: 'bundled',
203
+ provider: this.name,
204
+ rank: SUPERPOWERS_RANK,
205
+ locator: { path: skillPath, directory: dirname(skillPath) },
206
+ resourceBase: { kind: 'directory', path: dirname(skillPath) },
207
+ path: skillPath,
208
+ ...optionalMetadata(data),
209
+ });
210
+ // body 在 list 阶段不返回,仅用于校验可解析;真正内容由 get() 加载
211
+ void body;
212
+ }
213
+ return candidates;
214
+ }
215
+ async get(candidate, _options) {
216
+ const locator = candidate.locator;
217
+ const raw = await readFile(locator.path, 'utf8').catch(() => undefined);
218
+ if (raw === undefined)
219
+ return undefined;
220
+ const parsed = parseFrontmatter(raw);
221
+ if (!parsed)
222
+ return undefined;
223
+ const data = parsed.data;
224
+ const skillName = stringField(data, 'name');
225
+ const description = stringField(data, 'description');
226
+ if (!skillName || !description)
227
+ return undefined;
228
+ if (skillName !== candidate.name) {
229
+ // 名称漂移视为失效,触发上层 invalidate
230
+ return undefined;
231
+ }
232
+ let invocation;
233
+ try {
234
+ invocation = parseInvocationPolicy(data);
235
+ }
236
+ catch {
237
+ return undefined;
238
+ }
239
+ return {
240
+ name: skillName,
241
+ description,
242
+ ...optionalString(data, 'whenToUse'),
243
+ invocation,
244
+ source: 'bundled',
245
+ provider: this.name,
246
+ resourceBase: { kind: 'directory', path: locator.directory },
247
+ path: locator.path,
248
+ ...optionalMetadata(data),
249
+ content: parsed.body.trim(),
250
+ };
251
+ }
252
+ }
253
+ async function parseSkillFile(path) {
254
+ let raw;
255
+ try {
256
+ raw = await readFile(path, 'utf8');
257
+ }
258
+ catch {
259
+ return undefined;
260
+ }
261
+ try {
262
+ const parsed = parseFrontmatter(raw);
263
+ if (!parsed)
264
+ return undefined;
265
+ return parsed;
266
+ }
267
+ catch {
268
+ return undefined;
269
+ }
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ // 插件入口
273
+ // ---------------------------------------------------------------------------
274
+ export function apply(ctx, config = {}) {
275
+ // Schemastery 会在外层完成校验与默认值填充,这里做一次兜底
276
+ const resolved = {
277
+ providerName: config['providerName'] ?? 'superpowers',
278
+ ...config['skillDir'] !== undefined
279
+ ? { skillDir: config['skillDir'] }
280
+ : {},
281
+ };
282
+ ctx.logger.info(`[superpowers] registering provider "${resolved.providerName}"`);
283
+ ctx.skills.registerProvider((control) => {
284
+ return new SuperpowersProvider(ctx, control, resolved);
285
+ });
286
+ ctx.on('skills/change', () => {
287
+ ctx.logger.debug('[superpowers] skills catalog changed');
288
+ });
289
+ }
290
+ export default { name, inject, Config, apply };
291
+ //# sourceMappingURL=superpowers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "dsh-superpower",
3
+ "version": "6.3.0",
4
+ "description": "obra/superpowers 的 DSH 移植版 — 将完整的多智能体开发方法论以原生 DSH 技能开箱即用",
5
+ "type": "module",
6
+ "main": "lib/superpowers.js",
7
+ "types": "lib/superpowers.d.ts",
8
+ "files": [
9
+ "lib/",
10
+ "skills/",
11
+ "cordis.patch.yml",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc -p tsconfig.build.json",
17
+ "typecheck": "tsc --noEmit",
18
+ "lint": "eslint src --ext .ts 2>&1 || echo \"(no eslint config — skipped)\"",
19
+ "prepack": "npm run build",
20
+ "verify": "node scripts/verify.mjs"
21
+ },
22
+ "dsh": {
23
+ "bundle": {
24
+ "patch": "./cordis.patch.yml"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "yaml": "^2.4.2"
29
+ },
30
+ "peerDependencies": {
31
+ "@deepseek-ai/cordis": "^4.0.1",
32
+ "@deepseek-ai/dsh-skill": "^0.1.1-rc.2",
33
+ "@deepseek-ai/schemastery": "^3.18.1"
34
+ },
35
+ "devDependencies": {
36
+ "@deepseek-ai/cordis": "^4.0.1",
37
+ "@deepseek-ai/dsh-skill": "^0.1.1-rc.2",
38
+ "@deepseek-ai/schemastery": "^3.18.1",
39
+ "typescript": "^5.6.0",
40
+ "@types/node": "^22.0.0"
41
+ },
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/Wenaixi/dsh-superpower"
46
+ },
47
+ "homepage": "https://github.com/Wenaixi/dsh-superpower",
48
+ "bugs": {
49
+ "url": "https://github.com/Wenaixi/dsh-superpower/issues"
50
+ },
51
+ "keywords": [
52
+ "dsh",
53
+ "dsh-plugin",
54
+ "superpowers",
55
+ "skills",
56
+ "agent",
57
+ "methodology"
58
+ ],
59
+ "engines": {
60
+ "node": ">=20"
61
+ }
62
+ }
@@ -0,0 +1,207 @@
1
+ ---
2
+ name: brainstorming
3
+ description: "创意工作前必用:创建功能、构建组件、新增能力或变更行为前,先澄清用户意图、需求与设计,再进入实现。"
4
+ ---
5
+
6
+ # 将想法头脑风暴为设计
7
+
8
+ 通过自然的协作对话,将想法转化为完整、可落地的设计与规格说明。
9
+
10
+ 首先判断本次请求需要多少流程,然后按对应路径推进:理解上下文、细化想法、呈现设计、并获得协作方的确认。
11
+
12
+ <HARD-GATE>
13
+ 严禁在告知协作方你的意图并获得其批准之前,调用任何实现类 skill、编写任何代码、搭建任何项目或执行任何实现动作。该约束适用于下方所有路径中的所有任务——流程的繁简可随任务伸缩,审批关卡绝不放宽。
14
+ </HARD-GATE>
15
+
16
+ ## 三条路径
17
+
18
+ 在提出第一个问题前,先对请求进行分类并大声说出分类结果——例如“这看起来是受限任务,我会在对话中直接给出简短设计,而不是编写规格文档”——以便协作方及时纠正:
19
+
20
+ - **Spike 探索** — 可行性问题(“能否……”“是否可能……”“快速粗糙实现即可”),产出是答案,而非可保留的代码。用 2-3 句话说明问题及验证方式,获得认可后,以满足正确性前提下的最低成本去验证。无需设计文档与规格文件。以建议形式汇报发现,任何为验证而构建的代码均标注为“一次性/可丢弃”。
21
+ - **Bounded 受限** — 对本仓库已有代码的明确范围变更:新增开关、小型接口、单文件修复。仅了解应用类型是不够的——“受限”意味着你要改的流程已在仓库中可查可读。若没有可改的既有流程,则不属于受限任务。提出关键的澄清问题,在对话中直接呈现简短设计(几句话到几段短文),然后停止。仅在协作方对该设计明确说“同意”后方可开始实现——受限任务的审批与架构级任务一样严格。无需规格文件与实现计划文档。
22
+ - **Architectural 架构** — 新项目、新子系统,或会重塑组件间协作方式、改变他人依赖接口的变更。遵循完整流程:提问、提供方案、分节设计、编写规格文档,然后进入 writing-plans skill。
23
+
24
+ 当在两条路径间犹豫时,选择更重的那一条。棘轮单向生效:任务中途发现隐藏复杂度即升级路径——立即停下、说明情况、提升等级。任务中途不允许降级。
25
+
26
+ ## 反模式:“太简单,不需要审批”
27
+
28
+ 每条路径都以“协作方在实现前批准你的意图”作为结束。待办清单、单函数工具、配置变更——设计或许只有对话中的两句话,但必须呈现并获得批准。“简单”任务恰恰最容易因未经审视的假设而造成返工。随简易程度伸缩的是产出物,而非审批环节。
29
+
30
+ ## 红线信号
31
+
32
+ | 想法 | 实际情况 |
33
+ |---------|---------|
34
+ | “这太简单,不需要设计” | 简单意味着设计要短,而不是没有设计。在对话中用两句话说明,然后等待批准。 |
35
+ | “我把它算作受限任务,就可以跳过规格了” | 刻意找标签来省事,本身就是存疑的信号——选择更重的路径。 |
36
+ | “这是受限任务,设计很明显——我边写边让他们看就行” | 关卡在于“批准”,而非设计长短。先呈现,然后停下,直到听到明确的“同意”。 |
37
+ | “我了解这类应用,所以算是受限任务” | “受限”衡量的是仓库现状,而非你的熟悉程度。新项目没有既有流程——属于架构级。 |
38
+ | “探索验证跑通了,就把代码留下来吧” | 探索的产出是答案。保留代码属于新需求——需重新分类。 |
39
+ | “需求膨胀了,但快做完了——没必要重新分类” | 隐藏复杂度会中途升级路径。立即停下并说明。 |
40
+ | “他们已经批准了探索,后续改动也算批准了” | 每个任务都需独立分类与独立批准。 |
41
+
42
+ ## 检查清单
43
+
44
+ 先分类、宣告路径,然后为所在路径的每一项创建任务并按顺序完成。
45
+
46
+ **Spike 探索:**
47
+ 1. **探索项目上下文** — 充分到足以界定验证问题
48
+ 2. **呈现问题与验证计划** — 2-3 句话
49
+ 3. **获得批准** — 点头认可即可
50
+ 4. **开展验证** — 在保证正确性的前提下以最低成本进行
51
+ 5. **汇报发现** — 给出建议;将所有为验证而构建的内容标注为一次性产物
52
+
53
+ **Bounded 受限:**
54
+ 1. **探索项目上下文** — 检查文件、文档、近期提交
55
+ 2. **提出澄清问题** — 逐个提出,只问关键问题
56
+ 3. **在对话中呈现简短设计** — 方案、涉及文件、测试方式
57
+ 4. **获得批准** — 停下并等待明确的“同意”;一边呈现设计一边就开始动手,等同于跳过关卡
58
+ 5. **实现** — 按常规开发流程推进(适用 TDD);无需计划文档
59
+
60
+ **Architectural 架构:**
61
+ 1. **探索项目上下文** — 检查文件、文档、近期提交
62
+ 2. **按需提供可视化协作** — 不要一开始就提供。仅当某个问题“看图比看文字更清楚”时,才在当时单独发一条消息提出;获准后为你打开浏览器标签页。若始终未出现需要可视化的问题,则全程不提。详见下文“可视化协作”一节。
63
+ 3. **提出澄清问题** — 逐个提问,厘清目标、约束与成功标准
64
+ 4. **提出 2-3 种方案** — 含权衡分析与你的推荐
65
+ 5. **呈现设计** — 按复杂度分节呈现,每节后征求用户确认
66
+ 6. **编写设计文档** — 保存至 `docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md` 并提交
67
+ 7. **规格自检** — 快速行内检查占位符、矛盾、歧义与范围(见下文)
68
+ 8. **用户复核书面规格** — 请用户在继续前复核规格文件
69
+ 9. **转入实现** — 调用 writing-plans skill 创建实现计划
70
+
71
+ ## 流程图
72
+
73
+ ```dot
74
+ digraph brainstorming {
75
+ "分类:spike 探索 / bounded 受限 / architectural 架构" [shape=diamond];
76
+ "呈现问题与验证计划(2-3 句话)" [shape=box];
77
+ "提出澄清问题(受限)" [shape=box];
78
+ "在对话中呈现简短设计" [shape=box];
79
+ "协作方是否批准?" [shape=diamond];
80
+ "验证并汇报建议" [shape=doublecircle];
81
+ "按常规流程实现(无计划文档)" [shape=doublecircle];
82
+ "探索项目上下文" [shape=box];
83
+ "提出澄清问题" [shape=box];
84
+ "提出 2-3 种方案" [shape=box];
85
+ "分节呈现设计" [shape=box];
86
+ "用户是否批准设计?" [shape=diamond];
87
+ "编写设计文档" [shape=box];
88
+ "规格自检\n(行内修复)" [shape=box];
89
+ "用户是否复核规格?" [shape=diamond];
90
+ "调用 writing-plans skill" [shape=doublecircle];
91
+ "发现隐藏复杂度?升级路径" [shape=box];
92
+
93
+ "分类:spike 探索 / bounded 受限 / architectural 架构" -> "呈现问题与验证计划(2-3 句话)" [label="spike 探索"];
94
+ "分类:spike 探索 / bounded 受限 / architectural 架构" -> "提出澄清问题(受限)" [label="bounded 受限"];
95
+ "分类:spike 探索 / bounded 受限 / architectural 架构" -> "探索项目上下文" [label="architectural 架构"];
96
+ "呈现问题与验证计划(2-3 句话)" -> "协作方是否批准?";
97
+ "提出澄清问题(受限)" -> "在对话中呈现简短设计";
98
+ "在对话中呈现简短设计" -> "协作方是否批准?";
99
+ "协作方是否批准?" -> "验证并汇报建议" [label="spike 探索:是"];
100
+ "协作方是否批准?" -> "按常规流程实现(无计划文档)" [label="bounded 受限:是"];
101
+ "发现隐藏复杂度?升级路径" -> "分类:spike 探索 / bounded 受限 / architectural 架构";
102
+ "探索项目上下文" -> "提出澄清问题";
103
+ "提出澄清问题" -> "提出 2-3 种方案";
104
+ "提出 2-3 种方案" -> "分节呈现设计";
105
+ "分节呈现设计" -> "用户是否批准设计?";
106
+ "用户是否批准设计?" -> "分节呈现设计" [label="否,修订"];
107
+ "用户是否批准设计?" -> "编写设计文档" [label="是"];
108
+ "编写设计文档" -> "规格自检\n(行内修复)";
109
+ "规格自检\n(行内修复)" -> "用户是否复核规格?";
110
+ "用户是否复核规格?" -> "编写设计文档" [label="需修改"];
111
+ "用户是否复核规格?" -> "调用 writing-plans skill" [label="已批准"];
112
+ }
113
+ ```
114
+
115
+ **终态与路径绑定。** 架构路径:头脑风暴后唯一可调用的 skill 是 writing-plans——严禁调用 frontend-design、mcp-builder 或任何其他实现类 skill。受限路径:获批后直接按常规开发流程实现;无需计划文档。Spike 探索:终态为汇报建议。
116
+
117
+ ## 详细流程
118
+
119
+ 以下小节服务于受限与架构两条路径(探索路径在“呈现验证计划并获得认可”后即结束)。自 **探索方案** 起为架构路径的深度内容——对于受限任务,上下文探索加上几个问题再加对话中的简短设计即为全部流程。
120
+
121
+ **理解想法:**
122
+
123
+ - 首先查看当前项目状态(文件、文档、近期提交)
124
+ - 在深入提问前先评估范围:若需求描述了多个独立子系统(例如“构建一个包含聊天、文件存储、计费与数据分析的平台”),需立即指出。不要在需要先拆解的项目上浪费时间细化细节。
125
+ - 若项目过大不适合用单一规格承载,帮助用户拆解为子项目:有哪些独立部分、它们之间如何关联、应按何种顺序构建?然后按常规设计流程对首个子项目进行头脑风暴。每个子项目各自拥有独立的 规格 → 计划 → 实现 周期。
126
+ - 对于范围合适的项目,逐个提问以细化想法
127
+ - 尽可能使用选择题,但开放性问题也可以
128
+ - 每条消息只问一个问题——若某主题需深入探讨,拆成多个问题逐条提出
129
+ - 聚焦理解:目标、约束、成功标准
130
+
131
+ **探索方案:**
132
+
133
+ - 提出 2-3 种不同方案并说明权衡
134
+ - 以对话方式呈现选项,给出你的推荐及理由
135
+ - 优先呈现推荐方案并解释原因
136
+ - 严格遵循 YAGNI 原则——从每个方案与设计中剔除不必要的功能
137
+
138
+ **呈现设计:**
139
+
140
+ - 当你认为已理解要构建的内容后,呈现设计
141
+ - 按复杂度伸缩每节篇幅:简单处几句话即可,复杂处可写 200-300 字
142
+ - 每节结束后询问是否符合预期
143
+ - 覆盖:架构、组件、数据流、错误处理、测试
144
+ - 随时准备回头澄清不清晰之处
145
+
146
+ **为隔离性与清晰性而设计:**
147
+
148
+ - 将系统拆分为职责单一的小单元,各单元通过定义良好的接口通信,且可独立理解与测试
149
+ - 对每个单元,都应能回答:它是做什么的、如何使用、依赖什么?
150
+ - 能否不读内部实现就理解单元的用途?能否在不破坏调用方的情况下修改内部实现?若不能,说明边界需要调整。
151
+ - 小而边界清晰的单元也更便于你协作——你更容易一次性在上下文中理解代码,聚焦文件的编辑也更可靠。当文件变得过大时,往往意味着它承担了过多职责。
152
+
153
+ **在现有代码库中工作:**
154
+
155
+ - 提出变更前先探索现有结构,遵循既有模式。
156
+ - 若现有代码中存在影响当前工作的问题(例如文件过大、边界不清、职责纠缠),应在设计中包含针对性的改进——如同优秀开发者在工作区域内顺手改善代码。
157
+ - 不要提出与当前目标无关的重构。保持聚焦,只做服务于当前目标的事。
158
+
159
+ ## 设计之后(架构路径)
160
+
161
+ **文档:**
162
+
163
+ - 将已验证的设计(规格)写入 `docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md`
164
+ - (若用户对规格存放位置有偏好,以其偏好为准)
165
+ - 如可用,使用 elements-of-style:writing-clearly-and-concisely skill 优化表达
166
+ - 将设计文档提交至 git
167
+
168
+ **规格自检:**
169
+ 编写完规格文档后,以全新视角审视一遍:
170
+
171
+ 1. **占位符扫描:** 是否存在 “TBD”、“TODO”、未完成章节或模糊需求?立即修复。
172
+ 2. **内部一致性:** 各章节是否相互矛盾?架构是否与功能描述一致?
173
+ 3. **范围检查:** 是否足够聚焦、适合单一实现计划承载,或需要进一步拆解?
174
+ 4. **歧义检查:** 是否存在可被两种方式解读的需求?若有,选定一种并明确表述。
175
+
176
+ 发现问题直接行内修复,无需再次复审——改完即继续。
177
+
178
+ **用户复核关卡:**
179
+ 规格自检通过后,请用户在继续前复核书面规格:
180
+
181
+ > “规格已编写并提交至 `<path>`。请复核,如需变更请告知,确认后再进入实现计划的编写。”
182
+
183
+ 等待用户回复。若用户提出修改,完成修改后重新执行规格自检循环。仅在用户批准后方可继续。
184
+
185
+ **实现:**
186
+
187
+ - 调用 writing-plans skill 创建详细的实现计划
188
+ - 不要调用任何其他 skill。下一步仅为 writing-plans。
189
+
190
+ ## 可视化协作
191
+
192
+ 基于浏览器的可视化协作工具,用于在头脑风暴期间展示原型、图表与可视化选项。这是一个工具,而非模式。接受协作意味着在适合可视化的问题上可使用它;并不意味着每个问题都要走浏览器。
193
+
194
+ **提供协作的时机(按需提供):** 不要一开始就提供。仅当某个问题确实“看比说更清楚”——即真正涉及原型/布局/图表的问题,而不仅仅是聊到 UI 话题——才在首次出现时单独发一条消息提供:
195
+ > “接下来的部分或许看图会更清楚——我可以在浏览器标签页中为你实时准备原型、图表与对比方案。该功能仍较新且较耗 token。需要我打开吗?我会为你自动打开。”
196
+
197
+ **该提议必须单独成一条消息。** 仅包含提议——不要附带澄清问题、总结或其他内容。等待用户回复。若用户接受,以 `--open` 启动服务,使其浏览器自动打开首屏。若用户拒绝,则继续纯文本协作,除非用户主动提起,否则不再提议。
198
+
199
+ **逐题决策:** 即使用户已接受,仍需针对每个问题决定使用浏览器还是终端。判断标准:**用户看图是否比看文字更易理解?**
200
+
201
+ - **使用浏览器** 处理视觉内容——原型、线框、布局对比、架构图、并排视觉设计
202
+ - **使用终端** 处理文本内容——需求问题、概念抉择、权衡清单、A/B/C/D 文本选项、范围决策
203
+
204
+ 涉及 UI 话题的问题不一定是视觉问题。“在此上下文中 personality 指什么?”是概念问题——使用终端。“哪种向导布局更合适?”是视觉问题——使用浏览器。
205
+
206
+ 若用户同意使用协作,请在继续前阅读详细指南:
207
+ `skills/brainstorming/visual-companion.md`