sdd-full 3.2.0 → 4.2.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.
- package/bin.js +63 -31
- package/package.json +1 -1
- package/skills/brainstorming/SKILL.md +164 -0
- package/skills/brainstorming/scripts/frame-template.html +214 -0
- package/skills/brainstorming/scripts/helper.js +88 -0
- package/skills/brainstorming/scripts/server.cjs +338 -0
- package/skills/brainstorming/scripts/start-server.sh +153 -0
- package/skills/brainstorming/scripts/stop-server.sh +55 -0
- package/skills/brainstorming/spec-document-reviewer-prompt.md +48 -0
- package/skills/brainstorming/visual-companion.md +286 -0
- package/skills/chinese-code-review/SKILL.md +277 -0
- package/skills/chinese-commit-conventions/SKILL.md +364 -0
- package/skills/chinese-documentation/SKILL.md +448 -0
- package/skills/chinese-git-workflow/SKILL.md +510 -0
- package/skills/design-planning/enterprise-spec/SKILL.md +3 -52
- package/skills/design-planning/flutter-av/SKILL.md +34 -44
- package/skills/design-planning/flutter-map/SKILL.md +31 -41
- package/skills/design-planning/ui-sdd-specialized/SKILL.md +40 -46
- package/skills/development-execution/flutter-errors/SKILL.md +34 -44
- package/skills/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/executing-plans/SKILL.md +175 -0
- package/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/skills/mcp-builder/SKILL.md +255 -0
- package/skills/quality-assurance/bdd-acceptance/SKILL.md +37 -44
- package/skills/receiving-code-review/SKILL.md +213 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +146 -0
- package/skills/requirement-analysis/sdd-full/SKILL.md +36 -717
- package/skills/requirement-analysis/unified-flow/SKILL.md +26 -128
- package/skills/rules/skill-map.md +97 -0
- package/skills/rules/user_rules.md +69 -223
- package/skills/special-tools/env-check/SKILL.md +34 -40
- package/skills/subagent-driven-development/SKILL.md +277 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/systematic-debugging/find-polluter.sh +63 -0
- package/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/test-driven-development/SKILL.md +371 -0
- package/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/using-git-worktrees/SKILL.md +218 -0
- package/skills/using-superpowers/SKILL.md +134 -0
- package/skills/using-superpowers/references/codex-tools.md +25 -0
- package/skills/using-superpowers/references/gemini-tools.md +33 -0
- package/skills/verification-before-completion/SKILL.md +139 -0
- package/skills/workflow-runner/SKILL.md +172 -0
- package/skills/writing-plans/SKILL.md +152 -0
- package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/writing-skills/SKILL.md +654 -0
- package/skills/writing-skills/anthropic-best-practices.md +1149 -0
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/writing-skills/persuasion-principles.md +187 -0
- package/skills/writing-skills/render-graphs.js +168 -0
- package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/README.md +0 -97
- package/skills/call-adaptation/SKILL.md +0 -23
- package/skills/call-adaptation/call-adaptation-guide.md +0 -136
- package/skills/call-adaptation/claude-code-call-spec.md +0 -50
- package/skills/call-adaptation/trae-call-spec.md +0 -56
- package/skills/checklist.md +0 -154
- package/skills/design-planning/ai-coding-rules/SKILL.md +0 -52
- package/skills/design-planning/design-to-code/SKILL.md +0 -53
- package/skills/design-planning/function-sdd/SKILL.md +0 -54
- package/skills/design-planning/sdd-code/SKILL.md +0 -347
- package/skills/design-planning/sdd-deploy/SKILL.md +0 -501
- package/skills/design-planning/sdd-ops/SKILL.md +0 -306
- package/skills/design-planning/sdd-test/SKILL.md +0 -383
- package/skills/design-planning/ui-sdd/SKILL.md +0 -291
- package/skills/design-planning/writing-plans/SKILL.md +0 -144
- package/skills/development-execution/sdd-add/SKILL.md +0 -540
- package/skills/development-execution/systematic-debugging/SKILL.md +0 -298
- package/skills/development-execution/test-driven-development/SKILL.md +0 -373
- package/skills/development-execution/verification-before-completion/SKILL.md +0 -141
- package/skills/knowledge-precipitation/claudeception/SKILL.md +0 -96
- package/skills/knowledge-precipitation/mempalace-auto-saver/SKILL.md +0 -302
- package/skills/quality-assurance/flutter-test/SKILL.md +0 -56
- package/skills/quality-assurance/quality-gate/SKILL.md +0 -350
- package/skills/quality-assurance/security-audit/SKILL.md +0 -386
- package/skills/release-ops/finishing-a-development-branch/SKILL.md +0 -202
- package/skills/release-ops/release-flow/SKILL.md +0 -404
- package/skills/requirement-analysis/brainstorming/SKILL.md +0 -166
- package/skills/requirement-analysis/competitive-brief/SKILL.md +0 -121
- package/skills/requirement-analysis/market-research/SKILL.md +0 -143
- package/skills/requirement-analysis/prd-write/SKILL.md +0 -111
- package/skills/requirement-analysis/requirement-completion-officer/SKILL.md +0 -124
- package/skills/requirement-analysis/sdd/SKILL.md +0 -1044
- package/skills/rules/project_rules.md +0 -167
- package/skills/sdd-framework/SKILL.md +0 -90
- package/skills/special-tools/receiving-code-review/SKILL.md +0 -215
- package/skills/special-tools/requesting-code-review/SKILL.md +0 -107
- package/skills/special-tools/using-superpowers/SKILL.md +0 -117
- package/skills/templates/API-SDD.md +0 -31
- package/skills/templates/Andrej Karpathy AI/347/274/226/347/240/201/350/247/204/345/210/231/350/220/275/345/234/260SDD.md" +0 -117
- package/skills/templates/BDD/351/243/216/346/240/274/351/252/214/346/224/266/346/240/207/345/207/206SDD.md +0 -147
- package/skills/templates/Base-SDD.md +0 -38
- package/skills/templates/Brain-SDD.md +0 -36
- package/skills/templates/Code-SDD.md +0 -41
- package/skills/templates/Competitor-SDD.md +0 -34
- package/skills/templates/Env-SDD.md +0 -37
- package/skills/templates/Flutter/345/205/250/347/261/273/345/236/213/346/265/213/350/257/225/347/255/226/347/225/245SDD.md +0 -162
- package/skills/templates/Flutter/345/234/260/345/233/276/345/257/274/350/210/252/344/270/232/345/212/241SDD.md +0 -136
- package/skills/templates/Flutter/345/270/270/350/247/201/345/274/202/345/270/270/344/270/223/351/241/271SDD.md +0 -159
- package/skills/templates/Flutter/351/237/263/350/247/206/351/242/221/345/205/250/346/240/210SDD.md +0 -121
- package/skills/templates/PRD-SDD.md +0 -45
- package/skills/templates/SKILL.md +0 -29
- package/skills/templates/Test-SDD.md +0 -34
- package/skills/templates/UI-SDD.md +0 -38
- package/skills/templates/UI-SDD/344/270/223/347/224/250/346/250/241/346/235/277.md +0 -141
- package/skills/templates/UI/350/265/204/346/272/220/346/217/220/347/244/272/350/257/215/347/224/237/346/210/220SDD.md +0 -67
- package/skills/templates//344/274/201/344/270/232/347/272/247/345/205/250/346/240/210/345/267/245/347/250/213/350/247/204/350/214/203SDD.md +0 -152
- package/skills/templates//345/212/237/350/203/275SDD/344/270/223/347/224/250/346/250/241/346/235/277.md +0 -132
- package/skills/templates//347/216/257/345/242/203/351/242/204/346/243/200/346/240/207/345/207/206/345/214/226SDD.md +0 -153
- package/skills/templates//351/253/230/344/277/235/347/234/237/350/256/276/350/256/241/350/275/254/344/273/243/347/240/201SDD.md +0 -119
- package/skills//345/256/214/346/225/264/345/274/200/345/217/221/346/265/201/347/250/213/346/211/213/345/206/214.md +0 -408
- package/skills//346/212/200/350/203/275/344/275/223/347/263/273/345/256/214/345/226/204/345/273/272/350/256/256.md +0 -305
- package/skills//346/212/200/350/203/275/344/275/277/347/224/250/346/214/207/345/215/227.md +0 -265
- package/skills//346/212/200/350/203/275/345/206/263/347/255/226/346/240/221.md +0 -294
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# 视觉伴侣指南
|
|
2
|
+
|
|
3
|
+
基于浏览器的视觉头脑风暴伴侣,用于展示原型、图表和选项。
|
|
4
|
+
|
|
5
|
+
## 何时使用
|
|
6
|
+
|
|
7
|
+
逐问题决定,而非按会话决定。判断标准:**用户看到它是否比读到它更容易理解?**
|
|
8
|
+
|
|
9
|
+
**使用浏览器** 当内容本身是视觉的:
|
|
10
|
+
|
|
11
|
+
- **UI 原型** — 线框图、布局、导航结构、组件设计
|
|
12
|
+
- **架构图** — 系统组件、数据流、关系图
|
|
13
|
+
- **并排视觉对比** — 对比两种布局、两种配色方案、两种设计方向
|
|
14
|
+
- **设计细节打磨** — 当问题涉及外观感受、间距、视觉层次
|
|
15
|
+
- **空间关系** — 状态机、流程图、实体关系图
|
|
16
|
+
|
|
17
|
+
**使用终端** 当内容是文字或表格的:
|
|
18
|
+
|
|
19
|
+
- **需求和范围问题** — "X 是什么意思?"、"哪些功能在范围内?"
|
|
20
|
+
- **概念性 A/B/C 选择** — 在用文字描述的方案之间做选择
|
|
21
|
+
- **权衡列表** — 优缺点、对比表
|
|
22
|
+
- **技术决策** — API 设计、数据建模、架构方案选择
|
|
23
|
+
- **澄清问题** — 任何回答是文字而非视觉偏好的问题
|
|
24
|
+
|
|
25
|
+
关于 UI 主题的问题不一定是视觉问题。"你想要什么样的向导?"是概念性的——使用终端。"这些向导布局中哪个感觉对?"是视觉性的——使用浏览器。
|
|
26
|
+
|
|
27
|
+
## 工作原理
|
|
28
|
+
|
|
29
|
+
服务器监视一个目录中的 HTML 文件,将最新的文件提供给浏览器。你写入 HTML 内容,用户在浏览器中看到它,并可以点击选择选项。选择结果被记录到一个 `.events` 文件中,你在下一轮会话中读取它。
|
|
30
|
+
|
|
31
|
+
**内容片段 vs 完整文档:** 如果你的 HTML 文件以 `<!DOCTYPE` 或 `<html` 开头,服务器会原样提供(仅注入辅助脚本)。否则,服务器会自动将你的内容包裹在框架模板中——添加头部、CSS 主题、选择指示器和所有交互基础设施。**默认写内容片段即可。** 只有当你需要完全控制页面时才写完整文档。
|
|
32
|
+
|
|
33
|
+
## 启动会话
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 启动服务器并持久化(原型保存到项目中)
|
|
37
|
+
scripts/start-server.sh --project-dir /path/to/project
|
|
38
|
+
|
|
39
|
+
# 返回:{"type":"server-started","port":52341,"url":"http://localhost:52341",
|
|
40
|
+
# "screen_dir":"/path/to/project/.superpowers/brainstorm/12345-1706000000"}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
保存响应中的 `screen_dir`。告诉用户打开该 URL。
|
|
44
|
+
|
|
45
|
+
**查找连接信息:** 服务器将其启动 JSON 写入 `$SCREEN_DIR/.server-info`。如果你在后台启动了服务器且没有捕获 stdout,读取该文件以获取 URL 和端口。使用 `--project-dir` 时,检查 `<project>/.superpowers/brainstorm/` 获取会话目录。
|
|
46
|
+
|
|
47
|
+
**注意:** 传入项目根目录作为 `--project-dir`,这样原型会持久化在 `.superpowers/brainstorm/` 中,不会因服务器重启而丢失。不传的话,文件会保存到 `/tmp` 并在清理时被删除。提醒用户将 `.superpowers/` 添加到 `.gitignore`(如果尚未添加)。
|
|
48
|
+
|
|
49
|
+
**按平台启动服务器:**
|
|
50
|
+
|
|
51
|
+
**Claude Code (macOS / Linux):**
|
|
52
|
+
```bash
|
|
53
|
+
# 默认模式即可——脚本会自动将服务器放到后台
|
|
54
|
+
scripts/start-server.sh --project-dir /path/to/project
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Claude Code (Windows):**
|
|
58
|
+
```bash
|
|
59
|
+
# Windows 会自动检测并使用前台模式,这会阻塞工具调用。
|
|
60
|
+
# 在 Bash 工具调用上设置 run_in_background: true,
|
|
61
|
+
# 让服务器在会话轮次之间存活。
|
|
62
|
+
scripts/start-server.sh --project-dir /path/to/project
|
|
63
|
+
```
|
|
64
|
+
通过 Bash 工具调用时,设置 `run_in_background: true`。然后在下一轮读取 `$SCREEN_DIR/.server-info` 获取 URL 和端口。
|
|
65
|
+
|
|
66
|
+
**Codex:**
|
|
67
|
+
```bash
|
|
68
|
+
# Codex 会回收后台进程。脚本会自动检测 CODEX_CI 并
|
|
69
|
+
# 切换到前台模式。正常运行即可——不需要额外标志。
|
|
70
|
+
scripts/start-server.sh --project-dir /path/to/project
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Gemini CLI:**
|
|
74
|
+
```bash
|
|
75
|
+
# 使用 --foreground 并在 shell 工具调用上设置 is_background: true,
|
|
76
|
+
# 让进程在轮次之间存活
|
|
77
|
+
scripts/start-server.sh --project-dir /path/to/project --foreground
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**其他环境:** 服务器必须在会话轮次之间持续在后台运行。如果你的环境会回收分离的进程,使用 `--foreground` 并通过平台的后台执行机制启动命令。
|
|
81
|
+
|
|
82
|
+
如果浏览器无法访问该 URL(在远程/容器化环境中常见),绑定一个非回环主机:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
scripts/start-server.sh \
|
|
86
|
+
--project-dir /path/to/project \
|
|
87
|
+
--host 0.0.0.0 \
|
|
88
|
+
--url-host localhost
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
使用 `--url-host` 控制返回的 URL JSON 中显示的主机名。
|
|
92
|
+
|
|
93
|
+
## 工作循环
|
|
94
|
+
|
|
95
|
+
1. **检查服务器存活**,然后**将 HTML 写入** `screen_dir` 中的新文件:
|
|
96
|
+
- 每次写入前,检查 `$SCREEN_DIR/.server-info` 是否存在。如果不存在(或 `.server-stopped` 存在),服务器已关闭——在继续之前用 `start-server.sh` 重启。服务器在 30 分钟无活动后会自动退出。
|
|
97
|
+
- 使用语义化文件名:`platform.html`、`visual-style.html`、`layout.html`
|
|
98
|
+
- **绝不复用文件名** — 每个屏幕用一个新文件
|
|
99
|
+
- 使用 Write 工具 — **绝不使用 cat/heredoc**(会在终端产生噪音)
|
|
100
|
+
- 服务器自动提供最新的文件
|
|
101
|
+
|
|
102
|
+
2. **告诉用户预期内容并结束你的回合:**
|
|
103
|
+
- 每一步都提醒他们 URL(不仅仅是第一次)
|
|
104
|
+
- 简要文字说明屏幕上的内容(例如"展示了 3 个首页布局选项")
|
|
105
|
+
- 请他们在终端中回复:"看一下,告诉我你的想法。如果你愿意,可以点击选择一个选项。"
|
|
106
|
+
|
|
107
|
+
3. **在你的下一轮** — 用户在终端回复后:
|
|
108
|
+
- 如果存在 `$SCREEN_DIR/.events`,读取它——其中包含用户的浏览器交互(点击、选择),格式为 JSON 行
|
|
109
|
+
- 将终端文字和事件合并以获得完整信息
|
|
110
|
+
- 终端消息是主要反馈;`.events` 提供结构化的交互数据
|
|
111
|
+
|
|
112
|
+
4. **迭代或推进** — 如果反馈要求修改当前屏幕,写入新文件(例如 `layout-v2.html`)。只有当前步骤验证通过后才进入下一个问题。
|
|
113
|
+
|
|
114
|
+
5. **回到终端时卸载** — 当下一步不需要浏览器时(例如澄清问题、权衡讨论),推送一个等待屏幕以清除过时内容:
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<!-- 文件名:waiting.html(或 waiting-2.html 等)-->
|
|
118
|
+
<div style="display:flex;align-items:center;justify-content:center;min-height:60vh">
|
|
119
|
+
<p class="subtitle">在终端中继续...</p>
|
|
120
|
+
</div>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
这样可以防止用户盯着一个已经解决的选择,而对话已经继续了。当下一个视觉问题出现时,照常推送新的内容文件。
|
|
124
|
+
|
|
125
|
+
6. 重复直到完成。
|
|
126
|
+
|
|
127
|
+
## 编写内容片段
|
|
128
|
+
|
|
129
|
+
只写放在页面内部的内容。服务器会自动用框架模板包裹它(头部、主题 CSS、选择指示器和所有交互基础设施)。
|
|
130
|
+
|
|
131
|
+
**最简示例:**
|
|
132
|
+
|
|
133
|
+
```html
|
|
134
|
+
<h2>哪种布局更好?</h2>
|
|
135
|
+
<p class="subtitle">考虑可读性和视觉层次</p>
|
|
136
|
+
|
|
137
|
+
<div class="options">
|
|
138
|
+
<div class="option" data-choice="a" onclick="toggleSelect(this)">
|
|
139
|
+
<div class="letter">A</div>
|
|
140
|
+
<div class="content">
|
|
141
|
+
<h3>单栏</h3>
|
|
142
|
+
<p>简洁、专注的阅读体验</p>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<div class="option" data-choice="b" onclick="toggleSelect(this)">
|
|
146
|
+
<div class="letter">B</div>
|
|
147
|
+
<div class="content">
|
|
148
|
+
<h3>双栏</h3>
|
|
149
|
+
<p>侧边栏导航加主内容区</p>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
就这些。不需要 `<html>`,不需要 CSS,不需要 `<script>` 标签。服务器会提供这一切。
|
|
156
|
+
|
|
157
|
+
## 可用的 CSS 类
|
|
158
|
+
|
|
159
|
+
框架模板为你的内容提供以下 CSS 类:
|
|
160
|
+
|
|
161
|
+
### 选项(A/B/C 选择)
|
|
162
|
+
|
|
163
|
+
```html
|
|
164
|
+
<div class="options">
|
|
165
|
+
<div class="option" data-choice="a" onclick="toggleSelect(this)">
|
|
166
|
+
<div class="letter">A</div>
|
|
167
|
+
<div class="content">
|
|
168
|
+
<h3>标题</h3>
|
|
169
|
+
<p>描述</p>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**多选:** 在容器上添加 `data-multiselect` 让用户选择多个选项。每次点击切换选中状态。指示栏显示数量。
|
|
176
|
+
|
|
177
|
+
```html
|
|
178
|
+
<div class="options" data-multiselect>
|
|
179
|
+
<!-- 相同的选项标记——用户可以选择/取消选择多个 -->
|
|
180
|
+
</div>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 卡片(视觉设计)
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<div class="cards">
|
|
187
|
+
<div class="card" data-choice="design1" onclick="toggleSelect(this)">
|
|
188
|
+
<div class="card-image"><!-- 原型内容 --></div>
|
|
189
|
+
<div class="card-body">
|
|
190
|
+
<h3>名称</h3>
|
|
191
|
+
<p>描述</p>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 原型容器
|
|
198
|
+
|
|
199
|
+
```html
|
|
200
|
+
<div class="mockup">
|
|
201
|
+
<div class="mockup-header">预览:仪表盘布局</div>
|
|
202
|
+
<div class="mockup-body"><!-- 你的原型 HTML --></div>
|
|
203
|
+
</div>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 分屏视图(并排)
|
|
207
|
+
|
|
208
|
+
```html
|
|
209
|
+
<div class="split">
|
|
210
|
+
<div class="mockup"><!-- 左侧 --></div>
|
|
211
|
+
<div class="mockup"><!-- 右侧 --></div>
|
|
212
|
+
</div>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 优缺点
|
|
216
|
+
|
|
217
|
+
```html
|
|
218
|
+
<div class="pros-cons">
|
|
219
|
+
<div class="pros"><h4>优点</h4><ul><li>好处</li></ul></div>
|
|
220
|
+
<div class="cons"><h4>缺点</h4><ul><li>不足</li></ul></div>
|
|
221
|
+
</div>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 模拟元素(线框图构建块)
|
|
225
|
+
|
|
226
|
+
```html
|
|
227
|
+
<div class="mock-nav">Logo | 首页 | 关于 | 联系我们</div>
|
|
228
|
+
<div style="display: flex;">
|
|
229
|
+
<div class="mock-sidebar">导航</div>
|
|
230
|
+
<div class="mock-content">主内容区域</div>
|
|
231
|
+
</div>
|
|
232
|
+
<button class="mock-button">操作按钮</button>
|
|
233
|
+
<input class="mock-input" placeholder="输入框">
|
|
234
|
+
<div class="placeholder">占位区域</div>
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 排版和区块
|
|
238
|
+
|
|
239
|
+
- `h2` — 页面标题
|
|
240
|
+
- `h3` — 章节标题
|
|
241
|
+
- `.subtitle` — 标题下方的辅助文字
|
|
242
|
+
- `.section` — 带底部边距的内容块
|
|
243
|
+
- `.label` — 小号大写标签文字
|
|
244
|
+
|
|
245
|
+
## 浏览器事件格式
|
|
246
|
+
|
|
247
|
+
当用户在浏览器中点击选项时,交互记录会保存到 `$SCREEN_DIR/.events`(每行一个 JSON 对象)。推送新屏幕时文件会自动清空。
|
|
248
|
+
|
|
249
|
+
```jsonl
|
|
250
|
+
{"type":"click","choice":"a","text":"选项 A - 简单布局","timestamp":1706000101}
|
|
251
|
+
{"type":"click","choice":"c","text":"选项 C - 复杂网格","timestamp":1706000108}
|
|
252
|
+
{"type":"click","choice":"b","text":"选项 B - 混合方案","timestamp":1706000115}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
完整的事件流展示了用户的探索路径——他们可能在确定之前点击了多个选项。最后一个 `choice` 事件通常是最终选择,但点击模式可以揭示犹豫或值得询问的偏好。
|
|
256
|
+
|
|
257
|
+
如果 `.events` 不存在,说明用户没有与浏览器交互——仅使用他们的终端文字。
|
|
258
|
+
|
|
259
|
+
## 设计技巧
|
|
260
|
+
|
|
261
|
+
- **保真度匹配问题** — 布局问题用线框图,细节打磨问题用精细设计
|
|
262
|
+
- **在每个页面上解释问题** — "哪种布局看起来更专业?"而不仅仅是"选一个"
|
|
263
|
+
- **推进前先迭代** — 如果反馈修改了当前屏幕,写入新版本
|
|
264
|
+
- 每个屏幕最多 **2-4 个选项**
|
|
265
|
+
- **必要时使用真实内容** — 对于摄影作品集,使用实际图片(Unsplash)。占位内容会掩盖设计问题。
|
|
266
|
+
- **保持原型简洁** — 专注于布局和结构,而非像素级精确的设计
|
|
267
|
+
|
|
268
|
+
## 文件命名
|
|
269
|
+
|
|
270
|
+
- 使用语义化名称:`platform.html`、`visual-style.html`、`layout.html`
|
|
271
|
+
- 绝不复用文件名——每个屏幕必须是新文件
|
|
272
|
+
- 迭代版本:添加版本后缀如 `layout-v2.html`、`layout-v3.html`
|
|
273
|
+
- 服务器按修改时间提供最新文件
|
|
274
|
+
|
|
275
|
+
## 清理
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
scripts/stop-server.sh $SCREEN_DIR
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
如果会话使用了 `--project-dir`,原型文件会持久化在 `.superpowers/brainstorm/` 中以供日后参考。只有 `/tmp` 会话会在停止时被删除。
|
|
282
|
+
|
|
283
|
+
## 参考
|
|
284
|
+
|
|
285
|
+
- 框架模板(CSS 参考):`scripts/frame-template.html`
|
|
286
|
+
- 辅助脚本(客户端):`scripts/helper.js`
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chinese-code-review
|
|
3
|
+
description: 中文代码审查规范——在保持专业严谨的同时,用符合国内团队文化的方式给出有效反馈
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 中文代码审查规范
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
国内团队做 Code Review 常遇到两个极端:要么过度客气导致关键问题被放过,要么照搬西方直白风格让同事下不来台。本技能帮你找到平衡点——**既不回避问题,又让人愿意接受反馈**。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 用"建议"代替"命令",用"提问"代替"否定",但绝不因为面子而放过 bug。
|
|
13
|
+
|
|
14
|
+
## 审查反馈的表达方式
|
|
15
|
+
|
|
16
|
+
### 用建议代替命令
|
|
17
|
+
|
|
18
|
+
| 避免(命令式) | 推荐(建议式) |
|
|
19
|
+
|---------------|---------------|
|
|
20
|
+
| 你必须改成 X | 建议考虑用 X,因为 Y |
|
|
21
|
+
| 这里写错了 | 这里可能存在一个问题,是否考虑过 Z 的情况? |
|
|
22
|
+
| 不要用这个方法 | 这个方法在 A 场景下可能有性能问题,可以看看 B 方案 |
|
|
23
|
+
| 这段代码不行 | 这段逻辑我理解得对吗?如果输入为空的话会怎样? |
|
|
24
|
+
|
|
25
|
+
### 用提问代替否定
|
|
26
|
+
|
|
27
|
+
当你不确定对方意图时,先问再评:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
# 好的方式
|
|
31
|
+
这里用 sync 方式读文件是出于什么考虑?如果并发量上来,可能会阻塞事件循环。
|
|
32
|
+
|
|
33
|
+
# 不好的方式
|
|
34
|
+
这里不应该用 sync 方式读文件。
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 分级标注
|
|
38
|
+
|
|
39
|
+
统一使用优先级标记,让作者快速判断轻重缓急:
|
|
40
|
+
|
|
41
|
+
- **[必须修复]** — 安全漏洞、数据丢失风险、逻辑错误(不修不能合)
|
|
42
|
+
- **[建议修改]** — 性能问题、可维护性、缺少校验(本次或下次迭代修复)
|
|
43
|
+
- **[仅供参考]** — 命名优化、风格建议、替代方案(不改也行)
|
|
44
|
+
- **[问题]** — 不确定的地方,需要作者解释意图
|
|
45
|
+
|
|
46
|
+
### 审查评论模板
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
[必须修复] SQL 注入风险
|
|
50
|
+
|
|
51
|
+
第 42 行:用户输入直接拼接到 SQL 语句中。
|
|
52
|
+
|
|
53
|
+
原因:攻击者可以通过 name 参数注入 `'; DROP TABLE users; --`。
|
|
54
|
+
|
|
55
|
+
建议:使用参数化查询:
|
|
56
|
+
db.query('SELECT * FROM users WHERE name = $1', [name])
|
|
57
|
+
|
|
58
|
+
参考:https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 中英混排代码注释规范
|
|
62
|
+
|
|
63
|
+
### 何时用中文
|
|
64
|
+
|
|
65
|
+
- **业务逻辑说明** — 用中文解释业务背景和需求来源
|
|
66
|
+
- **复杂算法注释** — 用中文写思路,确保团队成员都能理解
|
|
67
|
+
- **TODO / FIXME** — 用中文描述待办事项,方便搜索和追踪
|
|
68
|
+
- **文档注释(内部项目)** — JSDoc / Javadoc 中的描述文字用中文
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
/**
|
|
72
|
+
* 计算用户的会员等级折扣
|
|
73
|
+
*
|
|
74
|
+
* 业务规则:
|
|
75
|
+
* - 普通会员 9.5 折
|
|
76
|
+
* - 银卡会员 9 折
|
|
77
|
+
* - 金卡会员 8.5 折
|
|
78
|
+
* - 钻石会员 8 折
|
|
79
|
+
*
|
|
80
|
+
* @param level - 会员等级(MemberLevel enum)
|
|
81
|
+
* @param amount - 原始金额(单位:分)
|
|
82
|
+
* @returns 折后金额(单位:分)
|
|
83
|
+
*/
|
|
84
|
+
function calculateDiscount(level: MemberLevel, amount: number): number {
|
|
85
|
+
// ...
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 何时用英文
|
|
90
|
+
|
|
91
|
+
- **变量名、函数名、类名** — 始终用英文命名,遵循团队命名规范
|
|
92
|
+
- **Git commit message** — 参考下方 commit 规范
|
|
93
|
+
- **开源项目注释** — 面向国际社区的项目,注释统一用英文
|
|
94
|
+
- **错误信息和日志** — 生产环境的 error message 用英文(避免编码问题)
|
|
95
|
+
- **API 接口文档** — 对外暴露的 API 用英文
|
|
96
|
+
|
|
97
|
+
### 混排格式要求
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
// 好:中英文之间加空格
|
|
101
|
+
// 使用 Redis 缓存来减少 MySQL 的查询压力
|
|
102
|
+
|
|
103
|
+
// 坏:中英文之间没有空格
|
|
104
|
+
// 使用Redis缓存来减少MySQL的查询压力
|
|
105
|
+
|
|
106
|
+
// 好:技术术语保留英文
|
|
107
|
+
// 这里用 debounce 防抖处理,避免频繁触发 API 请求
|
|
108
|
+
|
|
109
|
+
// 坏:强行翻译技术术语
|
|
110
|
+
// 这里用防抖动处理,避免频繁触发应用程序接口请求
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Commit Message 中英双语格式
|
|
114
|
+
|
|
115
|
+
### 推荐格式
|
|
116
|
+
|
|
117
|
+
团队内部项目使用中文 commit message,采用约定式提交(Conventional Commits)的中文版:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
<类型>(<范围>): <简要描述>
|
|
121
|
+
|
|
122
|
+
<详细说明(可选)>
|
|
123
|
+
|
|
124
|
+
<关联信息(可选)>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 类型对照表
|
|
128
|
+
|
|
129
|
+
| 类型 | 含义 | 示例 |
|
|
130
|
+
|------|------|------|
|
|
131
|
+
| feat | 新功能 | feat(用户): 新增手机号登录功能 |
|
|
132
|
+
| fix | 修复 Bug | fix(支付): 修复微信支付回调重复处理的问题 |
|
|
133
|
+
| docs | 文档变更 | docs: 更新 API 接口文档 |
|
|
134
|
+
| style | 代码格式 | style: 统一缩进为 2 个空格 |
|
|
135
|
+
| refactor | 重构 | refactor(订单): 拆分订单服务,提取公共逻辑 |
|
|
136
|
+
| perf | 性能优化 | perf(列表): 虚拟滚动优化长列表渲染性能 |
|
|
137
|
+
| test | 测试 | test(auth): 补充登录模块单元测试 |
|
|
138
|
+
| chore | 构建/工具 | chore: 升级 Node.js 至 v20 |
|
|
139
|
+
|
|
140
|
+
### 示例
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
fix(支付): 修复支付宝异步回调签名校验失败的问题
|
|
144
|
+
|
|
145
|
+
原因:升级 SDK 后签名算法从 RSA 变为 RSA2,但回调校验仍使用旧算法。
|
|
146
|
+
方案:回调处理中同时兼容 RSA 和 RSA2 签名校验。
|
|
147
|
+
|
|
148
|
+
Closes #1234
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 面向国际社区的项目
|
|
152
|
+
|
|
153
|
+
如果项目面向国际社区或有外籍成员,commit message 用英文,PR 描述中可附加中文说明:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
fix(payment): fix Alipay async callback signature verification failure
|
|
157
|
+
|
|
158
|
+
The SDK upgrade changed the signature algorithm from RSA to RSA2,
|
|
159
|
+
but the callback handler still used the old algorithm.
|
|
160
|
+
|
|
161
|
+
Closes #1234
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 常见反模式与对策
|
|
165
|
+
|
|
166
|
+
### 反模式一:过度客气
|
|
167
|
+
|
|
168
|
+
**表现:** 所有评论都是"我觉得可能也许大概好像这里有个小问题"。
|
|
169
|
+
|
|
170
|
+
**后果:** 关键 bug 被隐藏在一堆委婉语里,作者根本不知道哪些必须改。
|
|
171
|
+
|
|
172
|
+
**对策:** 使用分级标注。[必须修复] 就是必须修复,语气可以温和,但级别必须准确。
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
# 坏:过度客气
|
|
176
|
+
不知道我理解得对不对,这里好像可能有一点点并发问题,不过也许我看错了...
|
|
177
|
+
|
|
178
|
+
# 好:温和但清晰
|
|
179
|
+
[必须修复] 并发安全问题
|
|
180
|
+
|
|
181
|
+
这里的 map 在多个 goroutine 中同时读写,会触发 panic。
|
|
182
|
+
建议加 sync.RWMutex,或者换成 sync.Map。
|
|
183
|
+
|
|
184
|
+
复现方式:加 -race flag 跑测试就能看到。
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 反模式二:不敢给高级开发者提意见
|
|
188
|
+
|
|
189
|
+
**表现:** 高级开发者或 Leader 的代码直接 Approve,不仔细看。
|
|
190
|
+
|
|
191
|
+
**后果:** 代码质量双标,团队对 Code Review 失去信任。
|
|
192
|
+
|
|
193
|
+
**对策:** Code Review 对事不对人。可以换个表达方式:
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
# 提问式(适合给资深同事的反馈)
|
|
197
|
+
想请教一下,这里选择用递归而不是迭代,是出于什么考虑?
|
|
198
|
+
我在想如果递归深度超过 1000 层会不会有栈溢出的风险?
|
|
199
|
+
|
|
200
|
+
# 学习式
|
|
201
|
+
学到了一个新写法!不过有个小疑问——这里的类型断言在运行时不会做检查,
|
|
202
|
+
如果上游数据结构变了,这里会静默通过。是否考虑加个 runtime validation?
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 反模式三:审查变成风格之争
|
|
206
|
+
|
|
207
|
+
**表现:** 大量评论纠结于缩进、空格、花括号位置。
|
|
208
|
+
|
|
209
|
+
**后果:** 浪费时间,忽略真正的问题。
|
|
210
|
+
|
|
211
|
+
**对策:** 风格问题交给 ESLint / Prettier / gofmt 等工具自动处理。Code Review 聚焦逻辑、安全、性能。
|
|
212
|
+
|
|
213
|
+
### 反模式四:只写"LGTM"
|
|
214
|
+
|
|
215
|
+
**表现:** 随手一个 LGTM 就 Approve,没有实质性审查。
|
|
216
|
+
|
|
217
|
+
**后果:** Code Review 形同虚设,出了问题没人兜底。
|
|
218
|
+
|
|
219
|
+
**对策:** 即使代码质量很好,也要写出你关注了哪些方面:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
LGTM
|
|
223
|
+
|
|
224
|
+
审查了以下方面:
|
|
225
|
+
- 并发安全:锁的粒度合理
|
|
226
|
+
- 错误处理:所有外部调用都有 error handling
|
|
227
|
+
- 向下兼容:新增字段都有默认值,不影响老版本
|
|
228
|
+
|
|
229
|
+
一个小建议 [仅供参考]:第 78 行的变量名 `d` 可以改成 `duration`,更易读。
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 审查流程建议
|
|
233
|
+
|
|
234
|
+
### 开始审查前
|
|
235
|
+
|
|
236
|
+
1. **先看 PR 描述**,理解改动的背景和目的
|
|
237
|
+
2. **看关联的 Issue 或需求文档**
|
|
238
|
+
3. **先整体浏览**,再逐文件细看
|
|
239
|
+
|
|
240
|
+
### 审查顺序
|
|
241
|
+
|
|
242
|
+
1. **架构层面** — 方案是否合理?有没有更好的方式?
|
|
243
|
+
2. **正确性** — 逻辑对不对?边界条件处理了吗?
|
|
244
|
+
3. **安全性** — 有没有注入、越权、信息泄露?
|
|
245
|
+
4. **性能** — 有没有 N+1 查询、内存泄漏、不必要的循环?
|
|
246
|
+
5. **可维护性** — 半年后能看懂吗?测试覆盖了吗?
|
|
247
|
+
6. **风格** — 只关注工具无法自动处理的部分
|
|
248
|
+
|
|
249
|
+
### 给出总结
|
|
250
|
+
|
|
251
|
+
审查结束后,给一段总结,包括:
|
|
252
|
+
- 整体评价(一句话)
|
|
253
|
+
- 值得学习的地方(先扬后抑)
|
|
254
|
+
- 主要问题列表(按优先级)
|
|
255
|
+
- 建议的修改方向
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
总结:整体实现思路清晰,支付回调的幂等处理很到位。
|
|
259
|
+
|
|
260
|
+
主要问题:
|
|
261
|
+
1. [必须修复] 并发写 map 的问题(2 处)
|
|
262
|
+
2. [建议修改] 缺少对空值的校验(3 处)
|
|
263
|
+
3. [仅供参考] 几个变量命名可以更语义化
|
|
264
|
+
|
|
265
|
+
建议先修复并发问题,校验的部分可以本次一起改或者拆到下个迭代。
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 检查清单
|
|
269
|
+
|
|
270
|
+
在提交审查意见前,确认:
|
|
271
|
+
|
|
272
|
+
- [ ] 每条评论都标注了优先级
|
|
273
|
+
- [ ] [必须修复] 的问题都给出了具体的修复建议
|
|
274
|
+
- [ ] 没有因为面子而跳过关键问题
|
|
275
|
+
- [ ] 没有纠结于工具能自动处理的风格问题
|
|
276
|
+
- [ ] 对好的代码给予了肯定
|
|
277
|
+
- [ ] 给出了整体总结
|