create-dwy 0.15.0 → 0.16.1
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/CHANGELOG.md +16 -0
- package/bin/index.js +5 -3
- package/package.json +3 -2
- package/src/searchable-select.js +419 -0
- package/src/skills-install.js +48 -7
- package/src/sync-all.js +17 -25
- package/src/sync.js +38 -32
- package/templates/ai-tools/CHANGELOG.md +76 -0
- package/templates/ai-tools/CLAUDE.md +27 -0
- package/templates/ai-tools/VERSION +1 -0
- package/templates/ai-tools/hook-manifests/hooks.json +7 -0
- package/templates/ai-tools/hooks/Git/pre-git-commit-ai-signature-check.sh +57 -0
- package/templates/ai-tools/rules/Android/dwy-android-core.md +215 -4
- package/templates/ai-tools/rules/Android/dwy-android-pitfalls.md +52 -0
- package/templates/ai-tools/rules/Docker/dwy-docker.md +52 -1
- package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-build.md +50 -1
- package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-design.md +139 -0
- package/templates/ai-tools/rules/HarmonyOS/dwy-harmony-pitfalls.md +72 -0
- package/templates/ai-tools/rules/Python/dwy-python-backend.md +16 -63
- package/templates/ai-tools/rules/Python/dwy-python-base-lib.md +89 -0
- package/templates/ai-tools/rules/Python/dwy-python-pitfalls.md +49 -0
- package/templates/ai-tools/rules/Vue/dwy-vue-base-lib.md +127 -0
- package/templates/ai-tools/rules/Vue/dwy-vue-core.md +22 -86
- package/templates/ai-tools/rules/Vue/dwy-vue-pitfalls.md +66 -0
- package/templates/ai-tools/rules/iOS/dwy-ios-pitfalls.md +7 -0
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dependency-freshness.md +59 -0
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +9 -6
- package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-development.md +47 -2
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/SKILL.md +511 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/checks-data.md +126 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/checks-network.md +88 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/checks-runtime.md +195 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/references/security-doc-search.md +179 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_base.sh +39 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_capacity.sh +278 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_db.sh +147 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_docker.sh +230 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_env.sh +64 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_https.sh +60 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_logs.sh +209 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_nginx.sh +100 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_resilience.sh +157 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_secrets.sh +265 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_services.sh +94 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/check_ssh.sh +56 -0
- package/templates/ai-tools/skills/unitcircle/uc-deploy-audit/scripts/run_all.sh +105 -0
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-acceptance/SKILL.md +3 -2
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-architecture/SKILL.md +51 -9
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-commercial/SKILL.md +58 -0
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-competitor/SKILL.md +2 -1
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-explore/SKILL.md +83 -0
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-mvp/SKILL.md +2 -1
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prd/SKILL.md +1 -0
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/SKILL.md +14 -9
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/references/state-and-contract.md +65 -13
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prototype/SKILL.md +30 -11
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-release/SKILL.md +3 -2
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-design/SKILL.md +17 -10
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-dev/SKILL.md +42 -10
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-launch/SKILL.md +22 -10
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-prd/SKILL.md +13 -4
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-stage-ship/SKILL.md +13 -4
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-tasks/SKILL.md +12 -2
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-tdd-dev/SKILL.md +15 -6
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-validate/SKILL.md +2 -1
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-version/SKILL.md +1 -0
- package/templates/ai-tools/skills//345/205/203/345/267/245/345/205/267/dwy-shared/SKILL.md +22 -1
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/SKILL.md +1 -1
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/checks-runtime.md +2 -2
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_docker.sh +3 -3
- package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_secrets.sh +1 -1
- package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-first/SKILL.md +176 -0
- package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-first/references/chapter-01-mirrors.md +112 -0
- package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-ideate/SKILL.md +0 -21
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-0to1/SKILL.md +0 -113
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-0to1/templates/STATE.md +0 -56
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dev-qa/SKILL.md +0 -117
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-market-analysis/SKILL.md +0 -92
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-coarse/SKILL.md +0 -72
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-coarse/templates/prd-coarse.md +0 -61
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-detailed/SKILL.md +0 -76
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-detailed/templates/prd-detailed.md +0 -119
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prototype/SKILL.md +0 -104
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-spike/SKILL.md +0 -81
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/SKILL.md +0 -212
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/templates/impl-plan.md +0 -115
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tech-feasibility/SKILL.md +0 -105
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-version-plan/SKILL.md +0 -64
- package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-version-plan/templates/version-plan.md +0 -72
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
status: draft # draft | done
|
|
3
|
-
updated: <YYYY-MM-DD>
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# <产品名> · 细 PRD(页面级)
|
|
7
|
-
|
|
8
|
-
> 对着高保真原型逐页写。细到能照着写代码:每个元素、每条文案约束、每种状态、每个输入的长度上限、每个跳转。这是开发的蓝本。
|
|
9
|
-
|
|
10
|
-
## 页面索引
|
|
11
|
-
|
|
12
|
-
| # | 页面 | 对应原型文件 | 入口 |
|
|
13
|
-
|---|------|-------------|------|
|
|
14
|
-
| 1 | <页面名> | `prototype-hifi/<file>.html` | <从哪进来> |
|
|
15
|
-
| 2 | | | |
|
|
16
|
-
|
|
17
|
-
## 全局约定
|
|
18
|
-
|
|
19
|
-
<跨页面共用的约束,写一次后面引用,别每页重复。例:列表分页 page_size 默认 20、上限 100;所有 toast 文案上限 30 字;时间统一 YYYY-MM-DD HH:mm。>
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## 示例页(填好的样板,照这个颗粒度写每一页)
|
|
24
|
-
|
|
25
|
-
### 页面 2:发布动态
|
|
26
|
-
|
|
27
|
-
- **用途**:用户写一条动态并发布。
|
|
28
|
-
- **入口 / 出口**:首页右下「+」进入;发布成功 → 回首页并置顶新动态;取消 → 返回首页不保存。
|
|
29
|
-
|
|
30
|
-
**元素 & 区块清单**
|
|
31
|
-
|
|
32
|
-
| 区块 | 元素 | 说明 |
|
|
33
|
-
|---|---|---|
|
|
34
|
-
| 顶栏 | 取消按钮 / 标题「发布」/ 发布按钮 | 正文为空时发布按钮置灰禁用 |
|
|
35
|
-
| 正文区 | 多行 textarea | 占位文案「分享点什么…」 |
|
|
36
|
-
| 图片区 | 缩略图九宫格 + 加号 | 最多 9 张,加号在满 9 张时隐藏 |
|
|
37
|
-
| 字数 | 右下角计数 `0/2000` | 实时更新,超限标红 |
|
|
38
|
-
|
|
39
|
-
**列表项 / 文案约束**
|
|
40
|
-
|
|
41
|
-
| 内容 | 上限 | 行数 | 溢出处理 |
|
|
42
|
-
|---|---|---|---|
|
|
43
|
-
| 动态正文(列表态展示) | 2000 字 | 列表最多 6 行 | 超 6 行折叠,尾部「全文」展开 |
|
|
44
|
-
| 图片说明(可选) | 100 字 | 1 行 | 超出 `…` 截断 |
|
|
45
|
-
|
|
46
|
-
**各状态**
|
|
47
|
-
|
|
48
|
-
| 状态 | 表现 |
|
|
49
|
-
|---|---|
|
|
50
|
-
| 空 | textarea 显示占位文案,发布按钮置灰 |
|
|
51
|
-
| 加载中(发布请求) | 发布按钮转 loading,禁止重复点 |
|
|
52
|
-
| 成功 | toast「已发布」→ 回首页 |
|
|
53
|
-
| 错误(网络失败) | toast「发布失败,请重试」,正文不清空 |
|
|
54
|
-
| 超长(贴入超 2000 字) | 截断到 2000 + 计数标红 + toast「最多 2000 字」 |
|
|
55
|
-
|
|
56
|
-
**输入校验(长度上限,前后端双层)**
|
|
57
|
-
|
|
58
|
-
| 字段 | 前端限制 | 后端校验 | 超限行为 |
|
|
59
|
-
|---|---|---|---|
|
|
60
|
-
| 正文 text | `maxlength=2000` + schema 兜底(防粘贴绕过) | 必填,1–2000 字 | 前端截断+提示;后端拒绝返回 422 |
|
|
61
|
-
| 图片 | 最多 9 张,单张 ≤ 5MB | 数量 ≤ 9,大小 ≤ 5MB,**校验像素尺寸防 decompression bomb** | 超出禁止选择 / 后端拒收 |
|
|
62
|
-
|
|
63
|
-
**交互 & 跳转**
|
|
64
|
-
|
|
65
|
-
- 点图片缩略图 → 全屏预览,可左右滑。
|
|
66
|
-
- 点取消且正文非空 → 二次确认「放弃这条动态?」。
|
|
67
|
-
- 发布成功 → 路由回首页,新动态置顶高亮 2 秒。
|
|
68
|
-
|
|
69
|
-
**边界**
|
|
70
|
-
|
|
71
|
-
- 正文为空 + 无图:发布按钮禁用。
|
|
72
|
-
- 网络失败:保留草稿在内存,不丢用户已输入内容。
|
|
73
|
-
- 零图片:允许纯文字发布。
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## 空白页模板(每个真实页面复制一份填)
|
|
78
|
-
|
|
79
|
-
### 页面 N:<页面名>
|
|
80
|
-
|
|
81
|
-
- **用途**:<这页让用户完成什么>
|
|
82
|
-
- **入口 / 出口**:<从哪进来、各动作去哪>
|
|
83
|
-
|
|
84
|
-
**元素 & 区块清单**
|
|
85
|
-
|
|
86
|
-
| 区块 | 元素 | 说明 |
|
|
87
|
-
|---|---|---|
|
|
88
|
-
| | | |
|
|
89
|
-
|
|
90
|
-
**列表项 / 文案约束**
|
|
91
|
-
|
|
92
|
-
| 内容 | 上限 | 行数 | 溢出处理 |
|
|
93
|
-
|---|---|---|---|
|
|
94
|
-
| | | | |
|
|
95
|
-
|
|
96
|
-
**各状态**(每种都要写,没有的标「不适用」)
|
|
97
|
-
|
|
98
|
-
| 状态 | 表现 |
|
|
99
|
-
|---|---|
|
|
100
|
-
| 空 | |
|
|
101
|
-
| 加载中 | |
|
|
102
|
-
| 成功 | |
|
|
103
|
-
| 错误 | |
|
|
104
|
-
| 无权限 | |
|
|
105
|
-
| 超长 / 极端数据 | |
|
|
106
|
-
|
|
107
|
-
**输入校验(长度上限,前后端双层)**
|
|
108
|
-
|
|
109
|
-
| 字段 | 前端限制 | 后端校验 | 超限行为 |
|
|
110
|
-
|---|---|---|---|
|
|
111
|
-
| | | | |
|
|
112
|
-
|
|
113
|
-
**交互 & 跳转**
|
|
114
|
-
|
|
115
|
-
- <点 X → 去 Y>
|
|
116
|
-
|
|
117
|
-
**边界**
|
|
118
|
-
|
|
119
|
-
- <零结果 / 网络失败 / 超长 / 并发……>
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dwy-prototype
|
|
3
|
-
description: 画产品原型(低保真 + 高保真两阶段):低保真用灰阶可点线框验流程和信息架构;高保真按端套壳、真实内容、画全状态(空/加载/错误/超长),作为细 PRD 底稿。涉及以下场景**必须**使用此 skill(即使没点名 'dwy-prototype'):用户说『帮我画个原型/线框图』『做个低保真/高保真原型』『把这个页面/流程画出来看看』『做个可点的 mockup』。HTML 产出、浏览器可看。区分:本 skill 画的是验证产品形态的原型(丢弃式/底稿),不是上线代码;要写生产级前端代码用 frontend-design;完整 0→1 流水线用 dwy-0to1。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# dwy-prototype · 产品原型(低保真 + 高保真)
|
|
7
|
-
|
|
8
|
-
把产品画成能看能点的原型。两个阶段、两个不同目的:
|
|
9
|
-
|
|
10
|
-
- **低保真**:灰阶可点线框,验**「是不是用户要的流程和信息架构」**——不验视觉,快是第一目标。
|
|
11
|
-
- **高保真**:按端套壳、真实内容、全状态都画出来,①让用户确认视觉和交互细节 ②**作为细 PRD 的底稿**。
|
|
12
|
-
|
|
13
|
-
## 运行模式
|
|
14
|
-
|
|
15
|
-
上下文自适应,两种调用方式:
|
|
16
|
-
|
|
17
|
-
- **单独调用(默认)**:用户直接让你画原型。**先问要哪个阶段**——「低保真验流程,还是高保真做视觉/底稿?」(或两者都要就先低保真再高保真)。从用户描述/已有 PRD 起步;产物落 `./prototype-lowfi/`、`./prototype-hifi/` 或用户指定位置;**不读写 STATE.md、不依赖 `docs/0to1/`**。做完跑对应阶段的「门」即结束。
|
|
18
|
-
- **流水线调用**:`dwy-0to1` 调用,指令含「流水线模式」+ `phase=lowfi|hifi` + 前序产物路径 + 落盘路径。按 `phase` 只做指定阶段(编排器会在低保真、高保真各调一次、各卡一道门);**STATE 记账由 dwy-0to1 负责,本 skill 不碰 STATE.md**。
|
|
19
|
-
|
|
20
|
-
## 输入(画什么的依据)
|
|
21
|
-
|
|
22
|
-
- 流水线模式:读编排器给的粗 PRD 拿核心功能;高保真阶段还要看已验过的低保真原型(在它基础上长出来)和目标端。
|
|
23
|
-
- 单独模式:有 PRD/低保真就读;没有就先问清要画哪些页面/流程、做哪一端。
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## 阶段一:低保真原型
|
|
28
|
-
|
|
29
|
-
用最快的方式画出可点的灰阶线框,让用户在浏览器点一遍确认走向对不对。这阶段是丢弃式的,**别在好不好看上浪费一分钟**。
|
|
30
|
-
|
|
31
|
-
### 怎么做
|
|
32
|
-
|
|
33
|
-
1. 从核心功能拎出**主流程**(用户从进入到完成核心任务走的那条线)。
|
|
34
|
-
2. 列出这条线上的页面 + 页面间跳转关系。低保真只覆盖主流程,边角页面先不画。
|
|
35
|
-
3. 写**一个 HTML 文件**画出来,规范:
|
|
36
|
-
- **灰阶**:只用黑白灰,方框 + 边框代表区块。
|
|
37
|
-
- **真实文案占位**:按钮、标题写真实文字(「发布」「登录」),别用色块代替文字、别 lorem。
|
|
38
|
-
- **可点跳转**:用锚点 / 简单 JS 切换 div 模拟页面跳转,能点着走完整条流程。
|
|
39
|
-
- **无颜色、无动画、无样式打磨**:不配色、不做圆角阴影、不写过渡动效。
|
|
40
|
-
- **丢弃式**:只为这轮验证,过门后不进开发,别当代码维护。
|
|
41
|
-
4. 画完自己在浏览器点一遍,确认整条主流程能走通、没断点,再交给用户。
|
|
42
|
-
|
|
43
|
-
### 降级(无 GUI 产品 / 单页小工具)
|
|
44
|
-
|
|
45
|
-
| 产品形态 | 这阶段怎么办 |
|
|
46
|
-
|---|---|
|
|
47
|
-
| CLI 工具 | 降级为**终端会话 mock**:写一段「用户敲什么命令 → 终端回显什么」的示例对话(纯文本/markdown),验证命令设计和输出格式 |
|
|
48
|
-
| 后端 / 库 / SDK | 降级为 **API 契约示例**:列核心接口的请求/响应示例,验证接口形状和调用方式 |
|
|
49
|
-
| 完全无 UI(守护进程等) | 跳过原型(流水线模式标 `skipped(无GUI)`) |
|
|
50
|
-
| 单页小工具 | 低保真和高保真**合并成一轮**,一次画到位 |
|
|
51
|
-
|
|
52
|
-
降级产物仍落原型目录(如 `cli-session.md` / `api-contract.md`)。
|
|
53
|
-
|
|
54
|
-
### 产物 + 门
|
|
55
|
-
|
|
56
|
-
- 路径:`prototype-lowfi/index.html`(单独默认 `./prototype-lowfi/`;流水线按编排器给的路径)。
|
|
57
|
-
- HTML 顶部注释:`<!-- phase: lowfi | status: done | updated: <date +%Y-%m-%d> -->`
|
|
58
|
-
- 落盘后**先自己在浏览器验证能点通**再声称完成(先验证再声称)。
|
|
59
|
-
- 让用户**在浏览器打开点一遍**(给完整文件路径)。用 `AskUserQuestion`:摆主流程页面清单 + 跳转走向,问「流程对不对、是不是想要的信息架构?通过 / 哪步要改 / 流程重排?」要改就**迭代这个 HTML**再让用户看,直到点头。
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## 阶段二:高保真原型
|
|
64
|
-
|
|
65
|
-
把低保真验过的流程,做成**像成品一样的高保真原型**。它不是「好看一点的低保真」,是细 PRD 的事实依据——**底稿越具体、越覆盖极端情况,细 PRD 越能细到照着写代码**。
|
|
66
|
-
|
|
67
|
-
### 怎么做
|
|
68
|
-
|
|
69
|
-
1. 确定端,**按端套壳**:
|
|
70
|
-
|
|
71
|
-
| 端 | 套壳 |
|
|
72
|
-
|---|---|
|
|
73
|
-
| iOS | 手机视口(如 390×844)+ iPhone 设备框 |
|
|
74
|
-
| 安卓 | 手机视口 + 安卓设备框 |
|
|
75
|
-
| 桌面 | 窗口框(标题栏 + 内容区) |
|
|
76
|
-
| Web | 响应式,画关键断点(移动 / 桌面至少两套) |
|
|
77
|
-
|
|
78
|
-
2. 用**真实内容**填充——真实文案、真实数据、真实头像占位图,**不是 lorem**。
|
|
79
|
-
3. **每个页面把全状态都画出来**(这是底稿价值所在,别只画「正常态」):
|
|
80
|
-
- 空状态(列表为空、首次进入)
|
|
81
|
-
- 加载中(骨架屏 / loading)
|
|
82
|
-
- 错误(网络失败、请求出错)
|
|
83
|
-
- 超长文本(标题/正文塞到最长,看怎么折叠/截断)
|
|
84
|
-
- 极端数据(数字很大、列表很多项、零结果)
|
|
85
|
-
4. **仍然不做动画**——动效留到开发期,在细 PRD 里用文字描述(如「点赞后图标放大回弹 200ms」)。
|
|
86
|
-
5. 用 **HTML** 写(AI 生成 + 浏览器直接看最快),可上颜色、上真实视觉风格。
|
|
87
|
-
6. 按页面 / 状态拆多文件,方便逐页对照写细 PRD。
|
|
88
|
-
|
|
89
|
-
### 产物 + 门
|
|
90
|
-
|
|
91
|
-
- 路径:`prototype-hifi/`(多文件,如 `home.html`、`home-empty.html`、`publish.html`、`publish-error.html`),建一个 `index.html` 或 `README.md` 做导航。
|
|
92
|
-
- 每个 HTML 顶部注释:`<!-- phase: hifi | page: <页面名> | state: <normal/empty/error...> | updated: <date +%Y-%m-%d> -->`
|
|
93
|
-
- 落盘后**自己在浏览器逐页看一遍**,确认全状态都画了、套壳对、内容真实,再声称完成。
|
|
94
|
-
- 让用户**在浏览器逐页看**(给完整路径和导航)。用 `AskUserQuestion`:摆页面清单 + 每页画了哪些状态 + 套的什么端壳,问「视觉和交互细节确认吗?通过 / 哪页要改 / 哪个状态没覆盖到?」要改就迭代直到确认。
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## 边界 / 禁止
|
|
99
|
-
|
|
100
|
-
- **低保真禁止上颜色、做动画、打磨样式、用 lorem 假文、多文件工程化**——只验流程,一个丢弃式 HTML 搞定,快为先。
|
|
101
|
-
- **高保真禁止用 lorem 假数据、禁止只画正常态**——真实内容 + 空/加载/错误/超长/极端全状态,才能当细 PRD 底稿。
|
|
102
|
-
- **两阶段都不做动画**——动效留到开发期,用文字写进细 PRD。
|
|
103
|
-
- **高保真不改流程方向**——流程在低保真已定,要改回低保真重画,别在高保真里偷偷改信息架构。
|
|
104
|
-
- **原型不是上线代码**——验证产品形态用;写生产级前端代码是 frontend-design 的事。
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dwy-spike
|
|
3
|
-
description: 丢弃式技术验证(spike/POC):写最简代码只验核心流程跑不跑得通,让用户真机测,只产结论不留代码。涉及以下场景使用此 skill(即使没点名 'dwy-spike'):用户说『先写个 demo 验证下这个技术行不行』『做个 POC/spike 试试』『这个第三方 API/算法/性能能不能满足』『真机跑跑看能不能通』。代码隔离丢弃,产出实测结论(可行/不可行/换方案)。区分:本 skill 真写代码实测;只做纸面选型对比用 dwy-tech-feasibility;正式 TDD 开发落地用 dwy-tdd-dev;完整 0→1 流水线用 dwy-0to1。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# dwy-spike · 丢弃式技术实测
|
|
7
|
-
|
|
8
|
-
写一个最简版本只验证核心流程跑不跑得通,让用户真机测。这步**只产结论,不产代码**——spike 是丢弃式 POC,用完即弃。
|
|
9
|
-
|
|
10
|
-
## 运行模式
|
|
11
|
-
|
|
12
|
-
上下文自适应,两种调用方式:
|
|
13
|
-
|
|
14
|
-
- **单独调用(默认)**:用户直接让你验证某技术行不行。从用户描述的技术风险点起步;spike 代码放 `./spike/`、结论落 `./spike-result.md`(或用户指定);**不读写 STATE.md、不依赖 `docs/0to1/`**。做完跑下方「门」即结束。
|
|
15
|
-
- **流水线调用**:`dwy-0to1` 调用,指令含「流水线模式」+ 前序产物路径(技术可行性)+ 落盘路径(代码 `docs/0to1/spike/`、结论 `docs/0to1/03-spike-result.md`)。**STATE 记账(含 target_platform 记录)由 dwy-0to1 负责,本 skill 不碰 STATE.md**。
|
|
16
|
-
|
|
17
|
-
## 输入(验什么)
|
|
18
|
-
|
|
19
|
-
- 单独模式:从用户描述拎出要验的技术风险点;不清楚就问一句「主要担心哪个环节跑不通」。
|
|
20
|
-
- 流水线模式:读编排器给的技术可行性产物,看「是否实测建议」和选定方案,确定要验的风险点。
|
|
21
|
-
|
|
22
|
-
## 怎么做
|
|
23
|
-
|
|
24
|
-
1. **先确定做哪一端**(决定 spike 写哪个平台)。用 `AskUserQuestion`:
|
|
25
|
-
|
|
26
|
-
> 这个产品主要做哪一端?iOS / 安卓 / 桌面 / Web
|
|
27
|
-
|
|
28
|
-
端没定,spike 写哪个平台都是赌。(流水线模式下编排器会把选定的端记进 STATE。)
|
|
29
|
-
|
|
30
|
-
2. **写最简单的 spike(探针)**:
|
|
31
|
-
- 只验**核心流程跑不跑得通**——那个技术风险点(新算法能不能算对、第三方 API 行为符不符合预期、性能够不够、硬件能不能集成)。
|
|
32
|
-
- 砍到不能再砍:一条主链路,没 UI 美化、没边界处理、没配置项、没错误兜底。
|
|
33
|
-
- 能验证流程就行,**别追求质量、别写测试**。
|
|
34
|
-
|
|
35
|
-
3. **代码隔离在 spike 目录**(单独 `./spike/`、流水线 `docs/0to1/spike/`):
|
|
36
|
-
- 全部 spike 代码只放这个目录,跟正式工程隔开。
|
|
37
|
-
- 目录里放个 `README` 一行字标清:**这是丢弃式 POC,正式开发不继承这里的代码。**
|
|
38
|
-
|
|
39
|
-
4. **让用户真机测核心流程**:
|
|
40
|
-
- 把 spike 跑起来,让用户在**真实环境/真机**上走一遍核心流程。
|
|
41
|
-
- 收集结果:通了 / 没通 / 哪卡住了 / 性能数字。
|
|
42
|
-
|
|
43
|
-
## 产物
|
|
44
|
-
|
|
45
|
-
落盘实测结论(单独默认 `./spike-result.md`;流水线按编排器给的路径)。frontmatter:
|
|
46
|
-
|
|
47
|
-
```markdown
|
|
48
|
-
---
|
|
49
|
-
status: done
|
|
50
|
-
updated: <date +%Y-%m-%d>
|
|
51
|
-
---
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
正文**记结论,不是代码**:
|
|
55
|
-
|
|
56
|
-
| 块 | 内容 |
|
|
57
|
-
|----|------|
|
|
58
|
-
| 验的是什么 | 这次 spike 要验证的核心流程/技术风险点 |
|
|
59
|
-
| 端 | iOS / 安卓 / 桌面 / Web |
|
|
60
|
-
| 实测结论 | 核心流程**通 / 不通**,真机表现、关键性能数字 |
|
|
61
|
-
| 踩了什么 | 实测中暴露的坑、限制、意外行为 |
|
|
62
|
-
| 技术裁决 | **确认可行 / 不可行 / 要换方案**,一句话定性 |
|
|
63
|
-
|
|
64
|
-
❌ 把 spike 源码贴进结论文档
|
|
65
|
-
✅ 只写「核心流程通了,端到端 1.2s,第三方 API 偶发 429 需退避重试」这类结论
|
|
66
|
-
|
|
67
|
-
## 门(过门确认)
|
|
68
|
-
|
|
69
|
-
落盘后先**自己核一遍**(先验证再声称):结论是「通/不通」的明确定性吗、技术裁决给了吗、没把代码当结论塞进去吧。
|
|
70
|
-
|
|
71
|
-
然后 `AskUserQuestion` 摆**实测结论**,问:
|
|
72
|
-
|
|
73
|
-
> 技术验证通过,可以往下走?还是没通过,回去换方案?
|
|
74
|
-
|
|
75
|
-
## 边界 / 禁止
|
|
76
|
-
|
|
77
|
-
- **spike 是丢弃式**——只验流程,验完就扔。正式开发(dwy-tdd-dev)**只继承结论、不继承 spike 代码**。
|
|
78
|
-
- **TDD 铁律**:正式开发没有失败测试不写生产代码。spike 代码没测试、没质量,**绝不能**当成开发起点直接往上加。
|
|
79
|
-
- **spike 不写测试、不追求质量**——能跑通核心流程就够,别在这步过度工程。
|
|
80
|
-
- **产物记结论不记代码**——结论文档里写「行/不行/为什么」,源码留在 spike 目录,不进结论文档。
|
|
81
|
-
- 选端是**第一件事**,必须先问再写 spike。
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dwy-tdd-dev
|
|
3
|
-
description: 按 TDD 把一个版本/功能落地成代码:写实施计划(bite-size Task)→ 红-绿-重构 → 每个 Task 两阶段审查(spec + code)→ 版本级 code-review 修到全绿 → 完成前验证。涉及以下场景使用此 skill(即使没点名 'dwy-tdd-dev'):用户说『用 TDD 帮我实现这个』『按测试驱动开发这个功能/版本』『写实施计划再开发』『把这版做出来』。铁律:没失败测试不写生产代码。区分:本 skill 是开发实现;开发完的质量保障流程用 dwy-dev-qa;完整 0→1 流水线用 dwy-0to1。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# dwy-tdd-dev · 逐版本 TDD 开发
|
|
7
|
-
|
|
8
|
-
把一个版本(或一个功能)落地:写实施计划 → TDD 开发 → 每个 Task 两阶段审查 → 整版本 code-review 修到全绿 → 完成前验证。
|
|
9
|
-
|
|
10
|
-
> 代码进项目源码,**不进 `docs/0to1/`**;只有实施计划落 `plans/`。
|
|
11
|
-
|
|
12
|
-
## 运行模式
|
|
13
|
-
|
|
14
|
-
上下文自适应,两种调用方式:
|
|
15
|
-
|
|
16
|
-
- **单独调用(默认)**:用户直接让你按 TDD 实现某功能/版本。从用户描述或指定的需求文档起步;实施计划落 `./plans/<slug>.md` 或用户指定位置,代码进项目源码;**不读写 STATE.md、不依赖 `docs/0to1/`**。一个版本走完跑下方「完成前验证」并给交付报告。
|
|
17
|
-
- **流水线调用**:`dwy-0to1` 调用,指令含「流水线模式」+ 前序产物路径(版本规划 + 细 PRD)+ 实施计划落盘路径(如 `docs/0to1/plans/vN-<slug>.md`)+ 本次要做哪几个版本。**STATE 的版本进度记账由 dwy-0to1 负责,本 skill 不碰 STATE.md**。
|
|
18
|
-
|
|
19
|
-
## 输入
|
|
20
|
-
|
|
21
|
-
- 版本规划:确认要做哪个/哪几个版本、各版本包含什么、验收标准。
|
|
22
|
-
- 细 PRD:页面 / 功能的事实依据,写实施计划时对着它。
|
|
23
|
-
- 技术方案、端:对齐技术栈。
|
|
24
|
-
- 单独模式:用户没给 PRD/版本规划就先问清这次要实现什么、验收标准是什么。
|
|
25
|
-
|
|
26
|
-
## 总流程(对要做的每个版本循环)
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
版本 vN:
|
|
30
|
-
1. 写实施计划 → 落 plans/vN-<slug>.md
|
|
31
|
-
2. 逐 Task TDD 开发(红-绿-重构)
|
|
32
|
-
每个 Task 做完 → 两阶段审查(spec → code)→ 有问题回修再审 → 全绿才算这个 Task 完成
|
|
33
|
-
3. 整版本所有 Task 完 → 版本级 code-review → 修完所有问题(全绿)
|
|
34
|
-
4. 完成前验证(真跑测试 / 构建,拿到证据)
|
|
35
|
-
5. 进下一个版本
|
|
36
|
-
全部版本完 → 给用户交付报告
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## 1. 写实施计划
|
|
42
|
-
|
|
43
|
-
为当前版本写一份**假设执行者完全不懂这个代码库**的计划:列清每个 Task 动哪些文件、给出实际代码、怎么测、按 TDD 拆成 checkbox 步骤。DRY、YAGNI、TDD、频繁提交。
|
|
44
|
-
|
|
45
|
-
套 `templates/impl-plan.md`:
|
|
46
|
-
|
|
47
|
-
- 开头:**Goal**(一句话)/ **Architecture**(2-3 句方案)/ **Tech Stack**(关键技术栈,对齐技术方案)。
|
|
48
|
-
- 再拆**一串 Task**,每个 Task 颗粒度「小到一步只做一个动作(2-5 分钟)」:
|
|
49
|
-
- `Files:` — 列清 Create / Modify(带行号)/ Test 的**确切路径**。
|
|
50
|
-
- 5 个 checkbox 步骤,强制 TDD 顺序:
|
|
51
|
-
1. 写失败测试(贴实际测试代码)
|
|
52
|
-
2. 运行看到失败(给确切命令 + 预期失败输出)
|
|
53
|
-
3. 最小实现(贴实际实现代码)
|
|
54
|
-
4. 运行看到通过(给确切命令 + 预期 PASS)
|
|
55
|
-
5. commit(按 Git 提交规范:敏感扫描 + 规范 message + 禁 AI 署名;该规范未生效时至少做敏感扫描 + 规范 message,给确切命令)
|
|
56
|
-
|
|
57
|
-
**禁止占位符**——以下都是计划失败,绝不允许:
|
|
58
|
-
|
|
59
|
-
- ❌「TODO」「待补充」「类似 Task N」「加适当的错误处理」「为上面写测试」(不给实际代码)
|
|
60
|
-
- ❌ 引用了任何 Task 里都没定义过的类型 / 函数 / 方法
|
|
61
|
-
- ✅ 每个改代码的步骤都贴出完整代码;每个运行步骤都给确切命令 + 预期输出
|
|
62
|
-
|
|
63
|
-
写完自检:① 版本验收标准每条都能指到某个 Task ② 全文搜一遍上面的占位符红旗 ③ 后面 Task 用的类型 / 方法名和前面定义的一致(Task 3 叫 `clearLayers()`、Task 7 叫 `clearFullLayers()` 就是 bug)。有问题就地改。
|
|
64
|
-
|
|
65
|
-
落盘 `plans/vN-<slug>.md`,frontmatter:
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
---
|
|
69
|
-
status: in-progress
|
|
70
|
-
updated: <date +%Y-%m-%d>
|
|
71
|
-
version: vN
|
|
72
|
-
---
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## 2. TDD 开发(红-绿-重构铁律)
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
没有失败测试,不写一行生产代码
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
每个 Task 按红-绿-重构走,**一步都不能省**:
|
|
82
|
-
|
|
83
|
-
| 阶段 | 动作 | 强制 |
|
|
84
|
-
|------|------|------|
|
|
85
|
-
| 🔴 RED | 写一个最小失败测试(测真实行为,别测 mock) | — |
|
|
86
|
-
| 🔴 验证 RED | 跑测试,**亲眼看到它失败** | 失败原因必须是「功能没实现」,不是手滑 typo。测试直接过了 = 测错了东西,重写 |
|
|
87
|
-
| 🟢 GREEN | 写**最小**实现让它过(别提前加没要求的功能) | — |
|
|
88
|
-
| 🟢 验证 GREEN | 跑测试,**亲眼看到它通过**,且其它测试不挂、输出干净无 warning | 没看到通过不算过 |
|
|
89
|
-
| 🔵 REFACTOR | 绿了之后才重构:去重、改名、抽 helper,保持全绿 | 重构不加新行为 |
|
|
90
|
-
|
|
91
|
-
**核心原则**:没亲眼看测试失败,就不知道它测的是不是对的东西。
|
|
92
|
-
|
|
93
|
-
常见借口都是自欺,一律「删掉,重来」:
|
|
94
|
-
|
|
95
|
-
- 「先写代码回头补测试」→ 后补的测试一上来就过,证明不了任何东西
|
|
96
|
-
- 「太简单不用测」→ 简单代码也会坏,写个测试 30 秒
|
|
97
|
-
- 「我手动测过了」→ 手动测不成系统、不可复跑、压力下会漏 case
|
|
98
|
-
- 「已经花了 X 小时删了可惜」→ 沉没成本,留着不可信的代码才是技术债
|
|
99
|
-
|
|
100
|
-
改 bug 同理:**先写一个复现 bug 的失败测试**,再按红-绿修。不写测试不修 bug。
|
|
101
|
-
|
|
102
|
-
## 3. 每个 Task 两阶段审查
|
|
103
|
-
|
|
104
|
-
每个 Task 实现完(已 commit),按顺序做两道审查,**顺序不能反**:
|
|
105
|
-
|
|
106
|
-
### 3.1 spec 审查(先做)— 验「做对了没、有没有多做」
|
|
107
|
-
|
|
108
|
-
不看实现者的自述,**亲自读实现的代码**,逐条对版本 / Task 要求核对:
|
|
109
|
-
|
|
110
|
-
- **漏做**:要求的功能都实现了吗?有没有声称实现其实没写的?
|
|
111
|
-
- **多做**:有没有做要求之外的东西?过度设计、塞「顺手加的」功能?
|
|
112
|
-
- **理解偏差**:是不是把需求理解歪了、解错了问题、对的功能用了错的方式?
|
|
113
|
-
|
|
114
|
-
结论二选一:`✅ spec 通过` / `❌ 发现问题:<逐条列,带 文件:行>`。有问题 → 回修 → **再审一遍**,直到 ✅。
|
|
115
|
-
|
|
116
|
-
### 3.2 code 质量审查(spec ✅ 后才做)— 验「建得好不好」
|
|
117
|
-
|
|
118
|
-
对这个 Task 的改动(`git diff BASE..HEAD`)审:
|
|
119
|
-
|
|
120
|
-
- 职责单一、单元能独立理解和测试、按计划的文件结构落地、本次改动没把文件撑得过大
|
|
121
|
-
- 错误处理、类型安全、DRY 不过度抽象、边界 case
|
|
122
|
-
- 测试测的是真实行为不是 mock、覆盖边界、全绿
|
|
123
|
-
|
|
124
|
-
### 3.3 审查分级与状态机
|
|
125
|
-
|
|
126
|
-
审查问题按严重度分级,决定何时修:
|
|
127
|
-
|
|
128
|
-
| 级别 | 处理 |
|
|
129
|
-
|------|------|
|
|
130
|
-
| **Critical**(bug / 安全 / 数据丢失 / 功能坏) | **立即修** |
|
|
131
|
-
| **Important**(架构问题 / 缺功能 / 错误处理差 / 测试缺口) | **进下一步前修** |
|
|
132
|
-
| **Minor**(代码风格 / 优化点 / 文档润色) | 记下,可later |
|
|
133
|
-
|
|
134
|
-
实现者报告状态机(控制循环用):
|
|
135
|
-
|
|
136
|
-
| 状态 | 含义 → 怎么办 |
|
|
137
|
-
|------|------|
|
|
138
|
-
| `DONE` | 完成 → 进 spec 审查 |
|
|
139
|
-
| `DONE_WITH_CONCERNS` | 完成但有疑虑 → 先读疑虑,涉及正确性 / 范围的先处理再审 |
|
|
140
|
-
| `BLOCKED` | 卡住做不下去 → 补上下文 / 换更强模型 / 拆小 Task / 升级给用户,**别让它原样重试** |
|
|
141
|
-
| `NEEDS_CONTEXT` | 缺信息 → 补齐缺的上下文再继续 |
|
|
142
|
-
|
|
143
|
-
**两道审查全 ✅、Critical/Important 全修完、且本 Task 已 commit(按 Git 提交规范),这个 Task 才算完成,进下一个 Task。** commit 是 Task 的硬收尾——别把多个 Task 攒着不提交,漏 commit 等于 Task 没完成。
|
|
144
|
-
|
|
145
|
-
> **自包含 + 可增强**:上面这套 spec / code 审查逻辑已内嵌,能独立跑。如果检测到项目里有 `/code-review` 命令或 `dwy-dev-qa` skill,Task 级或下面版本级的 code-review 可委托给它们做增强(更全面),没有就用内嵌逻辑。
|
|
146
|
-
|
|
147
|
-
## 4. 版本级 code-review(修到全绿才进下一版本)
|
|
148
|
-
|
|
149
|
-
一个版本**所有 Task 做完**后,对整个版本做一次完整 code-review:
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
BASE_SHA=<本版本第一个 commit 之前>
|
|
153
|
-
HEAD_SHA=$(git rev-parse HEAD)
|
|
154
|
-
git diff --stat $BASE_SHA..$HEAD_SHA
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
审查范围(对整版本 diff):
|
|
158
|
-
|
|
159
|
-
- **计划对齐**:实现和实施计划 / 版本验收标准一致吗?偏差是合理改进还是问题?计划的功能都在吗?
|
|
160
|
-
- **代码质量**:职责分离、错误处理、类型安全、DRY 不过度抽象、边界 case
|
|
161
|
-
- **架构**:设计合理、性能可接受、安全、和周边代码集成干净
|
|
162
|
-
- **测试**:测真实行为、覆盖边界、全绿
|
|
163
|
-
- **production**:schema 变更有迁移、向后兼容、文档齐、无明显 bug
|
|
164
|
-
|
|
165
|
-
输出:Strengths / Issues(Critical / Important / Minor,每条带 文件:行 + 为什么 + 怎么修)/ Assessment。
|
|
166
|
-
|
|
167
|
-
**按级别修**:Critical + Important **全部修完**,每修一条跑相关测试确认无回归。Minor 记下。
|
|
168
|
-
|
|
169
|
-
> 项目有 `/code-review` 命令或 `dwy-dev-qa` skill → 委托它做版本级审查(增强);没有就用上面内嵌逻辑。
|
|
170
|
-
|
|
171
|
-
**修完所有 Critical / Important(全绿)才进下一个版本。** 还有未修的 Critical/Important 就停在这一版。
|
|
172
|
-
|
|
173
|
-
## 5. 完成前验证(声称做完前,先拿证据)
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
没有刚跑出来的验证证据,不许声称「版本做完了」
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
声称这一版完成 / 进下一版 / 给交付报告**之前**,对照版本验收标准逐条验,**亲自跑命令看输出**:
|
|
180
|
-
|
|
181
|
-
| 要声称 | 必须有 | 不算数 |
|
|
182
|
-
|------|------|------|
|
|
183
|
-
| 测试通过 | 刚跑的测试命令输出:0 失败 | 「应该过了」「上次跑过」 |
|
|
184
|
-
| 构建通过 | 构建命令 exit 0 | 「lint 过了」「日志看着没问题」 |
|
|
185
|
-
| bug 修了 | 跑原始复现测试:通过 | 「改了代码,估计好了」 |
|
|
186
|
-
| 验收达标 | 逐条核对验收标准 checklist | 「测试过了就算完」 |
|
|
187
|
-
|
|
188
|
-
红旗——出现就停下先去验证:用了「应该 / 大概 / 似乎」、还没跑命令就说「搞定 / 完美 / 做完了」、准备 commit / 进下一版却没验证、信了 agent 的「成功」自述没自己核对。
|
|
189
|
-
|
|
190
|
-
**先跑命令 → 读完整输出 → 再下结论。** 不可逆操作(强推等)和声称完成,这条不许精简。
|
|
191
|
-
|
|
192
|
-
## 产物
|
|
193
|
-
|
|
194
|
-
- `plans/vN-<slug>.md` — 每个版本一份实施计划。
|
|
195
|
-
- 实际代码 + 测试 — **进项目源码**,频繁 commit。
|
|
196
|
-
|
|
197
|
-
## 交付报告(全部版本做完)
|
|
198
|
-
|
|
199
|
-
给用户交付报告:做了哪几个版本、各版本测试 / 构建结果(带证据)、code-review 全绿、代码落在哪、遗留的 Minor 项清单。
|
|
200
|
-
|
|
201
|
-
> 单版本内部修复用最小回归(仅相关测试);改了共享工具 / 导出入口 / 基础设施,按影响面扩大到包级全量回归。
|
|
202
|
-
|
|
203
|
-
## 边界 / 禁止
|
|
204
|
-
|
|
205
|
-
- **禁止没有失败测试就写生产代码**——红-绿-重构铁律,违反就删掉重来。
|
|
206
|
-
- **禁止跳审查**——spec 和 code 两道都要,且 spec 在前 code 在后,顺序不能反。
|
|
207
|
-
- **禁止带未修的 Critical / Important 进下一个 Task 或下一个版本。**
|
|
208
|
-
- **禁止 Task 未 commit 就开下一个 Task**——红-绿-审查全过后必须当场 commit(按 Git 提交规范),不许把多个 Task 的改动攒到最后一次性提交。
|
|
209
|
-
- **禁止没跑验证就声称完成**——「应该过了」不算证据,必须有刚跑的命令输出。
|
|
210
|
-
- **禁止实施计划留占位符**(TODO / 待补充 / 类似 Task N)——每步给实际代码 + 确切命令。
|
|
211
|
-
- **禁止把代码写进 `docs/0to1/`**——只有实施计划进 `plans/`,代码进项目源码。
|
|
212
|
-
- **禁止在 main / master 上直接动手**(按项目分支规范走)。
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
status: in-progress # in-progress | done
|
|
3
|
-
updated: <YYYY-MM-DD>
|
|
4
|
-
version: vN
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# <版本名> 实施计划
|
|
8
|
-
|
|
9
|
-
> 假设执行者完全不懂这个代码库:每个 Task 写清动哪些文件、给出实际代码、确切命令 + 预期输出。DRY、YAGNI、TDD、频繁提交。每步是一个动作(2-5 分钟),用 `- [ ]` checkbox 跟踪。
|
|
10
|
-
|
|
11
|
-
**Goal**:<一句话,这个版本要建成什么>
|
|
12
|
-
|
|
13
|
-
**Architecture**:<2-3 句说清方案:模块怎么分、数据怎么流>
|
|
14
|
-
|
|
15
|
-
**Tech Stack**:<关键技术 / 库,对齐选定的技术方案>
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 示例 Task(填好的样板,照这个颗粒度写每个 Task)
|
|
20
|
-
|
|
21
|
-
### Task 1:笔记正文长度校验(前后端双层)
|
|
22
|
-
|
|
23
|
-
Files:
|
|
24
|
-
- Create: `src/validators/note.ts`
|
|
25
|
-
- Modify: `src/api/notes.ts:40-58`
|
|
26
|
-
- Test: `tests/validators/note.test.ts`
|
|
27
|
-
|
|
28
|
-
- [ ] **步骤 1:写失败测试**
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
import { validateNoteBody } from '@/validators/note'
|
|
32
|
-
|
|
33
|
-
test('超过 5000 字的正文返回校验错误', () => {
|
|
34
|
-
const body = 'a'.repeat(5001)
|
|
35
|
-
const result = validateNoteBody(body)
|
|
36
|
-
expect(result.ok).toBe(false)
|
|
37
|
-
expect(result.error).toBe('正文最多 5000 字')
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
test('5000 字以内的正文通过', () => {
|
|
41
|
-
const result = validateNoteBody('a'.repeat(5000))
|
|
42
|
-
expect(result.ok).toBe(true)
|
|
43
|
-
})
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
- [ ] **步骤 2:运行看到失败**
|
|
47
|
-
|
|
48
|
-
Run: `pnpm vitest run tests/validators/note.test.ts`
|
|
49
|
-
Expected: FAIL —「validateNoteBody is not a function」(模块还没建)
|
|
50
|
-
|
|
51
|
-
- [ ] **步骤 3:最小实现**
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
// src/validators/note.ts
|
|
55
|
-
const MAX_BODY = 5000
|
|
56
|
-
|
|
57
|
-
export function validateNoteBody(body: string): { ok: boolean; error?: string } {
|
|
58
|
-
if (body.length > MAX_BODY) {
|
|
59
|
-
return { ok: false, error: '正文最多 5000 字' }
|
|
60
|
-
}
|
|
61
|
-
return { ok: true }
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
- [ ] **步骤 4:运行看到通过**
|
|
66
|
-
|
|
67
|
-
Run: `pnpm vitest run tests/validators/note.test.ts`
|
|
68
|
-
Expected: PASS(2 passed),其它测试不受影响
|
|
69
|
-
|
|
70
|
-
- [ ] **步骤 5:commit(按 Git 提交规范:敏感扫描 + 规范 message + 禁 AI 署名)**
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
git add src/validators/note.ts tests/validators/note.test.ts
|
|
74
|
-
git commit -m "feat: 笔记正文 5000 字长度校验"
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 空白 Task 模板(每个真实 Task 复制一份填)
|
|
80
|
-
|
|
81
|
-
### Task N:<名称>
|
|
82
|
-
|
|
83
|
-
Files:
|
|
84
|
-
- Create: `<确切路径>`
|
|
85
|
-
- Modify: `<确切路径:起止行>`
|
|
86
|
-
- Test: `<确切测试路径>`
|
|
87
|
-
|
|
88
|
-
- [ ] **步骤 1:写失败测试**(贴实际测试代码,测真实行为)
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
<测试代码>
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
- [ ] **步骤 2:运行看到失败**
|
|
95
|
-
|
|
96
|
-
Run: `<确切测试命令>`
|
|
97
|
-
Expected: FAIL — <预期失败原因,必须是「功能没实现」>
|
|
98
|
-
|
|
99
|
-
- [ ] **步骤 3:最小实现**(只写让测试过的最小代码)
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
<实现代码>
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
- [ ] **步骤 4:运行看到通过**
|
|
106
|
-
|
|
107
|
-
Run: `<确切测试命令>`
|
|
108
|
-
Expected: PASS,其它测试不挂、输出无 warning
|
|
109
|
-
|
|
110
|
-
- [ ] **步骤 5:commit(按 Git 提交规范:敏感扫描 + 规范 message + 禁 AI 署名)**
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
git add <文件>
|
|
114
|
-
git commit -m "<type: 描述>"
|
|
115
|
-
```
|