create-dwy 0.13.1 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/bin/index.js +18 -0
  3. package/package.json +6 -2
  4. package/src/sync-all.js +154 -0
  5. package/src/sync-codex.js +27 -8
  6. package/src/sync.js +25 -8
  7. package/templates/claude-global/hooks/Git/pre-git-commit-backtick-check.sh +76 -0
  8. package/templates/claude-global/hooks/Git/pre-git-commit-sensitive-check.sh +23 -27
  9. package/templates/claude-global/rules/iOS/dwy-swift-style.md +96 -0
  10. package/templates/claude-global/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit-safe.md +66 -0
  11. package/templates/claude-global/settings.json +4 -0
  12. package/templates/claude-global/skills//345/205/203/345/267/245/345/205/267/dwy-claude-code-features/scripts/lint.py +0 -0
  13. package/templates/claude-global/skills//345/205/203/345/267/245/345/205/267/dwy-claude-code-features/scripts/refresh_docs.py +0 -0
  14. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/SKILL.md +225 -0
  15. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates/README.md +55 -0
  16. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//344/270/252/344/272/272/346/204/237/346/202/237.md +21 -0
  17. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//345/267/245/345/205/267/350/265/204/346/272/220/345/256/211/345/210/251.md +26 -0
  18. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//346/212/200/346/234/257/346/225/231/347/250/213.md +46 -0
  19. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//346/226/271/346/241/210/351/200/211/345/236/213/345/257/271/346/257/224.md +28 -0
  20. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//346/246/202/345/277/265/347/247/221/346/231/256.md +28 -0
  21. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//350/241/214/344/270/232/350/247/202/345/257/237/350/257/204/350/256/272.md +21 -0
  22. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//350/270/251/345/235/221/346/216/222/351/224/231/345/256/236/345/275/225.md +28 -0
  23. package/templates/claude-global/skills//345/206/205/345/256/271/345/210/233/344/275/234/dwy-article/templates//351/241/271/347/233/256/345/244/215/347/233/230.md +26 -0
  24. package/templates/claude-global/skills//345/256/211/345/205/250/dwy-sdk-spec/SKILL.md +4 -2
  25. package/templates/claude-global/skills//345/256/211/345/205/250/dwy-sdk-spec/scripts/check_comments.py +0 -0
  26. package/templates/claude-global/skills//345/256/211/345/205/250/dwy-sdk-spec/scripts/check_js_publish.sh +0 -0
  27. package/templates/claude-global/skills//345/256/211/345/205/250/dwy-sdk-spec/scripts/check_python_publish.sh +0 -0
  28. package/templates/claude-global/skills//345/256/211/345/205/250/dwy-sdk-spec/scripts/detect_sdk.sh +0 -0
  29. package/templates/claude-global/skills//345/256/211/345/205/250/dwy-sdk-spec/scripts/init_config.sh +0 -0
  30. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-0to1/SKILL.md +113 -0
  31. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-0to1/templates/STATE.md +56 -0
  32. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-market-analysis/SKILL.md +92 -0
  33. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-coarse/SKILL.md +72 -0
  34. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-coarse/templates/prd-coarse.md +61 -0
  35. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-detailed/SKILL.md +76 -0
  36. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prd-detailed/templates/prd-detailed.md +119 -0
  37. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prototype/SKILL.md +104 -0
  38. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-spike/SKILL.md +81 -0
  39. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/SKILL.md +212 -0
  40. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/templates/impl-plan.md +115 -0
  41. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tech-feasibility/SKILL.md +105 -0
  42. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-version-plan/SKILL.md +64 -0
  43. package/templates/claude-global/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-version-plan/templates/version-plan.md +72 -0
  44. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-cibuildwheel/SKILL.md +3 -1
  45. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_base.sh +0 -0
  46. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_capacity.sh +0 -0
  47. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_db.sh +0 -0
  48. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_docker.sh +0 -0
  49. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_env.sh +0 -0
  50. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_https.sh +0 -0
  51. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_logs.sh +0 -0
  52. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_nginx.sh +0 -0
  53. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_resilience.sh +0 -0
  54. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_secrets.sh +0 -0
  55. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_services.sh +0 -0
  56. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/check_ssh.sh +0 -0
  57. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-deploy-audit/scripts/run_all.sh +0 -0
  58. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-docker/scripts/query_dockerhub.py +0 -0
  59. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-docker/scripts/scan_images.sh +0 -0
  60. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-mirror-source/scripts/apply_mirrors.py +0 -0
  61. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-mirror-source/scripts/check_mirrors.py +0 -0
  62. package/templates/claude-global/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-publish/SKILL.md +8 -0
  63. package/templates/codex-global/hooks/Git/pre-git-commit-backtick-check.sh +75 -0
  64. package/templates/codex-global/hooks/Git/pre-git-commit-sensitive-check.sh +1 -1
  65. package/templates/codex-global/hooks.json +5 -0
  66. package/templates/claude-global/skills//346/225/260/346/215/256/345/272/223/dwy-dolphindb/scripts/__pycache__/scrape_docs.cpython-311.pyc +0 -0
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: dwy-0to1
3
+ description: 端到端「0→1 产品孵化」编排器。用户丢一个产品想法进来,按九步带门流水线**逐步编排调用**同系列单点 skill:dwy-market-analysis(需求/市场)→ dwy-tech-feasibility(技术可行性)→(可选)dwy-spike(真机实测)→ dwy-prd-coarse(粗 PRD)→ dwy-prototype(低保真+高保真原型)→ dwy-prd-detailed(细 PRD)→ dwy-version-plan(版本规划)→ dwy-tdd-dev(逐版本 TDD 开发),每步卡用户确认门、产物落盘 docs/0to1/、用 STATE.md 做唯一真相源支持断点续传。涉及以下场景**必须**使用此 skill(即使用户没点名 'dwy-0to1'):用户说『我想做个 X』『帮我把这个想法做成产品』『从 0 到 1 做个 XX』『帮我孵化这个想法』,或丢一个产品概念让我判断值不值得做、怎么落地;用户说『继续做 X』『接着上次的产品』『孵化进度到哪了』时读 STATE 续传/汇报。只想单独做其中一步(只画原型、只写 PRD、只做市场分析等),直接用对应的 dwy-* 单点 skill,不必走整条流水线。核心纪律——每步卡门等用户确认才进下一步,绝不跳步、绝不未确认就写代码,所有产物落盘 docs/0to1/ 以支持断点续传。
4
+ ---
5
+
6
+ # dwy-0to1(编排器)
7
+
8
+ 把一个产品想法,按九步带门的流水线推到逐版本 TDD 开发落地。本 skill 是**编排器**:自己不实现各步细节,而是按顺序**委托调用**同系列单点 skill,并独占 STATE 真相源、统一卡门、管跨步顺序。每步落盘 `docs/0to1/`,可中断、可断点续传——这次聊到粗 PRD,下次进来从粗 PRD 接着聊。
9
+
10
+ **核心纪律**:每步有明确产物、卡用户确认门、落盘。门没过不许进下一步,更不许提前写代码。
11
+
12
+ > 单点能力可独立使用:用户只想画个原型 / 写个 PRD / 做个市场分析,直接用对应的 `dwy-*` skill 即可,不必走整条流水线。本编排器只在「完整 0→1 / 继续上次孵化」时启用。
13
+
14
+ ## 第一件事:读 STATE,决定从哪开始(断点续传)
15
+
16
+ **每次进入本 skill,先做这步,不要直接开干。**
17
+
18
+ 1. `Glob docs/0to1/STATE.md`(相对当前项目根)。
19
+ 2. **存在** → Read 它,看 `current_step` 和「进度」表、「下一步」:
20
+ - 用 `AskUserQuestion` 跟用户确认:「上次做到 Step N(名称),下一步是 X。从这接着 / 改某步 / 整个重开?」
21
+ - 按用户选择定位到对应步骤。
22
+ 3. **不存在** → 这是新想法:
23
+ - 先 `Read templates/STATE.md`,在 `docs/0to1/STATE.md` 建初始 STATE(用 `date +%Y-%m-%d` 取今天填 created/updated,current_step=1)。
24
+ - `docs/0to1/` 目录不存在就先建。
25
+ - 从 Step 1 开始。
26
+
27
+ > STATE.md 是整条流水线的**唯一真相源**。任何一步的状态、决策、产物路径都以它为准。它丢了,可以靠各产物文件名(`01-market.md`…编号即步号)+ frontmatter 重建。
28
+
29
+ ## 门规则(每步通用,强制)
30
+
31
+ 每一步都按「**委托 → 过门 → 记账**」走,缺一不可:
32
+
33
+ 1. **委托调用单点 skill**:用 Skill 工具调对应 `dwy-*`,在调用指令里带「**流水线模式**」+ 前序产物路径 + 落盘路径(见路由表)。被调 skill 负责本步的工作、完成前自检(先验证再声称)、并**自己跑领域门**(`AskUserQuestion` 把产物摆给用户问 通过/改/换方向)。
34
+ 2. **过门**:被调 skill 的门**用户点头**了,这步才算过。用户要改 → 让 skill 迭代重做再摆,**没点头不进下一步、更不许写生产代码**。
35
+ 3. **记账(编排器独占)**:门过了,**编排器立刻更新 `docs/0to1/STATE.md`**——这步状态改 `done`、gate 列填 `✅ <date>`、产物路径、按 `templates/STATE.md`「关键决策」清单填本步定下的决策(Step1 真需求结论/差异化/核心能力/硬约束、Step2 技术方案、Step3 是否实测/端、Step4 定位/定价、Step8 选定版本/全局架构骨架)、`current_step` 指向下一步、写一句「下一步」。被调 skill **不碰 STATE**,记账只由编排器做,这是一次原子 checkpoint。
36
+
37
+ 红线:**绝不跳步、绝不跳门、绝不在用户确认前写生产代码。**
38
+
39
+ ## 九步流水线(路由)
40
+
41
+ 每步:**委托调用下表的 skill(流水线模式,给前序产物路径 + 落盘路径)→ 过门 → 编排器更新 STATE**。
42
+
43
+ | # | 步骤 | 委托调用 | 流水线 args(前序 → 落盘) | 产物 |
44
+ |---|------|---------|--------------------------|------|
45
+ | 1 | 需求 & 市场分析 | `dwy-market-analysis` | 无前序 → `docs/0to1/01-market.md` | 01-market.md |
46
+ | 2 | 技术可行性 | `dwy-tech-feasibility` | 读 `01-market.md` → `docs/0to1/02-tech-feasibility.md` | 02-tech-feasibility.md |
47
+ | 3 | 实测(可选) | `dwy-spike` | 读 `02-tech-feasibility.md` → 代码 `docs/0to1/spike/`、结论 `docs/0to1/03-spike-result.md` | 03-spike-result.md + spike/ |
48
+ | 4 | 粗 PRD | `dwy-prd-coarse` | 读 `01-market.md` + `02-tech-feasibility.md`(+ 存在时 `03-spike-result.md`) → `docs/0to1/04-prd-coarse.md` | 04-prd-coarse.md |
49
+ | 5 | 低保真原型 | `dwy-prototype`(`phase=lowfi`) | 读 `04-prd-coarse.md` → `docs/0to1/prototype-lowfi/` | prototype-lowfi/index.html |
50
+ | 6 | 高保真原型 | `dwy-prototype`(`phase=hifi`) | 读 `04-prd-coarse.md` + `prototype-lowfi/` → `docs/0to1/prototype-hifi/` | prototype-hifi/ |
51
+ | 7 | 细 PRD | `dwy-prd-detailed` | 读 `04-prd-coarse.md` + `prototype-hifi/` → `docs/0to1/05-prd-detailed.md` | 05-prd-detailed.md |
52
+ | 8 | 版本规划 | `dwy-version-plan` | 读 `05-prd-detailed.md` → `docs/0to1/06-version-plan.md` | 06-version-plan.md |
53
+ | 9 | 逐版本 TDD 开发 | `dwy-tdd-dev` | 读 `06-version-plan.md` + `05-prd-detailed.md` + STATE 选定版本 → 实施计划 `docs/0to1/plans/vN-<slug>.md`,代码进项目源码 | plans/ + 代码 |
54
+
55
+ **Step 3 分支(编排器据 STATE 决策路由)**:
56
+ - Step 2 过门时记的「是否实测」= **否** → Step 3 不调 `dwy-spike`,进度表标 `skipped(无需实测)`,`current_step` 直接到 4。
57
+ - = **是** → 调 `dwy-spike`;它会先问做哪一端,编排器把答案记进 STATE 的 `target_platform`(Step 5/6/9 都按这个端走)。实测不通过 → `current_step` 回 2 重选方案。
58
+
59
+ **Step 5/6 同一个 skill 两道门**:`dwy-prototype` 在低保真(`phase=lowfi`)、高保真(`phase=hifi`)各调一次、各卡一道门,目的不同(验流程 vs 做底稿),别合并。
60
+
61
+ **Step 9 循环**:对 STATE「选定版本」里的每个版本依次调 `dwy-tdd-dev` 走完,编排器更新「版本开发进度」表;全部版本完,Step 9 标 `done`,给交付报告。每版完成的 commit 由 `dwy-tdd-dev` 走 `dwy-git-commit` 规范(敏感扫描 + 格式 + 禁 AI 署名),不裸 commit。
62
+
63
+ ## 产物目录(项目内 docs/0to1/)
64
+
65
+ ```
66
+ docs/0to1/
67
+ STATE.md # 断点真相源(编排器独占读写)
68
+ 01-market.md # Step1 需求/市场/竞品/差异化
69
+ 02-tech-feasibility.md # Step2 方案对比 + 推荐
70
+ 03-spike-result.md # Step3 实测结论(不是代码)
71
+ spike/ # Step3 丢弃式 POC(仅需实测时)
72
+ 04-prd-coarse.md # Step4 粗 PRD
73
+ prototype-lowfi/index.html # Step5 低保真原型
74
+ prototype-hifi/ # Step6 高保真原型(按端套壳)
75
+ 05-prd-detailed.md # Step7 细 PRD(页面级)
76
+ 06-version-plan.md # Step8 版本规划
77
+ plans/
78
+ v1-<slug>.md # Step9 每版本一份实施计划
79
+ ```
80
+
81
+ 各产物文件 frontmatter 由对应 skill 写(`status` / `updated`);STATE 丢失时靠文件名编号 + frontmatter 重建。
82
+
83
+ ## 关键边界 / 禁止
84
+
85
+ - **编排器只编排、不实现**:各步的「怎么做」在对应 `dwy-*` skill 里,本文件只管顺序、门、STATE。被调 skill 不碰 STATE,记账只由编排器做。
86
+ - **spike 是丢弃式**(Step 3):实测代码隔离在 `docs/0to1/spike/`,只为验证核心流程跑不跑得通。开发期(Step 9)**只继承结论,不继承 spike 代码**——TDD 铁律是没失败测试不写生产代码,spike 不算。
87
+ - **两个原型卡不同门**:低保真(Step 5)验流程方向、高保真(Step 6)做细 PRD 底稿,目的不同别合并。**例外**:单页小工具可合并成一轮;CLI / 后端 / 库类**无 GUI** 产品,原型步**优先降级**为「终端会话 mock / API 契约示例」——产出了降级产物就在 STATE 标 `done(降级:无GUI)`;**只有连 mock/契约都没意义时才直接跳过**(标 `skipped(无GUI)`)。详见 `dwy-prototype` 的降级表。
88
+ - **自包含 + 可增强**:本编排器只依赖同系列 `dwy-*` skill,不依赖 gstack / superpowers 插件。Step 9 的 `dwy-tdd-dev` 已内置 spec/code 双审 + 版本级 code-review,等价覆盖 `dwy-dev-qa` 核心;需要更全面的系统级 QA 时才额外委托 `dwy-dev-qa` 或 `/code-review`,避免重复审查。
89
+ - **流水线边界**:交付止于「可运行代码 + 交付报告」。**上线 / 部署 / 市场验证是流水线边界外的人工动作**——Step1「真需求结论」的真正验证靠上线后人工度量。要再迭代就重进本 skill:方向变回 Step 1、产品调整回 Step 4、只加版本回 Step 8。
90
+ - **不跳步、不跳门、不提前写代码**(见「门规则」)。
91
+
92
+ ## 文件结构
93
+
94
+ ```
95
+ .claude/skills/dwy-0to1/
96
+ ├── SKILL.md ← 本文件(编排骨架 + STATE 协议 + 门规则 + 路由)
97
+ └── templates/
98
+ └── STATE.md ← 状态文件模板(编排器独占)
99
+ ```
100
+
101
+ 九步的执行细则与产物模板已拆到同级独立 skill,可单独触发,也被本编排器按路由表委托调用:
102
+
103
+ ```
104
+ 开发流程/
105
+ ├── dwy-market-analysis/ ← Step1 需求/市场分析
106
+ ├── dwy-tech-feasibility/ ← Step2 技术选型可行性
107
+ ├── dwy-spike/ ← Step3 丢弃式实测
108
+ ├── dwy-prd-coarse/ ← Step4 粗 PRD(含 templates/prd-coarse.md)
109
+ ├── dwy-prototype/ ← Step5+6 低保真+高保真原型
110
+ ├── dwy-prd-detailed/ ← Step7 细 PRD(含 templates/prd-detailed.md)
111
+ ├── dwy-version-plan/ ← Step8 版本规划(含 templates/version-plan.md)
112
+ └── dwy-tdd-dev/ ← Step9 逐版本 TDD 开发(含 templates/impl-plan.md)
113
+ ```
@@ -0,0 +1,56 @@
1
+ ---
2
+ project: <产品名>
3
+ slug: <kebab-slug>
4
+ created: <YYYY-MM-DD>
5
+ updated: <YYYY-MM-DD>
6
+ current_step: 1
7
+ target_platform: none # Step3 选定后改: ios | android | desktop | web | none
8
+ ---
9
+
10
+ # <产品名> · 0→1 孵化状态
11
+
12
+ > 本文件是整条流水线的唯一真相源。每过一个门必须更新它。
13
+
14
+ ## 进度
15
+
16
+ | 步 | 名称 | 状态 | 产物 | gate |
17
+ |---|------|------|------|------|
18
+ | 1 | 需求&市场分析 | pending | 01-market.md | |
19
+ | 2 | 技术可行性 | pending | 02-tech-feasibility.md | |
20
+ | 3 | 实测spike | pending | 03-spike-result.md | |
21
+ | 4 | 粗PRD | pending | 04-prd-coarse.md | |
22
+ | 5 | 低保真原型 | pending | prototype-lowfi/ | |
23
+ | 6 | 高保真原型 | pending | prototype-hifi/ | |
24
+ | 7 | 细PRD | pending | 05-prd-detailed.md | |
25
+ | 8 | 版本规划 | pending | 06-version-plan.md | |
26
+ | 9 | 开发 | pending | plans/ | |
27
+
28
+ <!-- 状态枚举:pending | in-progress | awaiting-approval | done | skipped(原因) -->
29
+ <!-- gate 列:门过了填 ✅ + 日期(如 ✅ 2026-06-02);待用户确认填 ⏳ -->
30
+
31
+ ## 关键决策
32
+
33
+ <!-- 每步定下的、后续步骤要用的决策都记在这里 -->
34
+ - 真需求结论:<Step1,做 / 不做 / 调整方向>
35
+ - 差异化打法:<Step1>
36
+ - 核心能力/最大技术风险:<Step1,最该被 Step2 验证的技术核心>
37
+ - 硬约束:<Step1/2,合规/PII/实时性/规模水位 → 约束选型;无则写 无>
38
+ - 技术方案:<Step2 选定的库/方案>
39
+ - 是否实测:<Step3,是(端=xxx) / 否>
40
+ - 端:<Step3 选定:ios|android|desktop|web|none>
41
+ - 产品定位:<Step4>
42
+ - 定价策略:<Step4>
43
+ - 全局数据模型/架构骨架:<Step8,核心实体+关系+架构方向>
44
+ - 选定版本:<Step8,可多个,如 v1+v2>
45
+
46
+ ## 版本开发进度(Step 9)
47
+
48
+ | 版本 | 实施计划 | 状态 | code-review |
49
+ |------|---------|------|-------------|
50
+ | v1 | plans/v1-<slug>.md | pending | — |
51
+
52
+ <!-- 版本状态:pending | in-progress | done。code-review:— / 进行中 / ✅全绿 -->
53
+
54
+ ## 下一步
55
+
56
+ <一句话写清:从哪步、哪个子项接着干。例:继续 Step4,讨论粗 PRD 的定价策略部分。>
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: dwy-market-analysis
3
+ description: 需求真伪判断 + 市场/竞品调研 + 差异化建议,给「做不做」结论。涉及以下场景使用此 skill(即使没点名 'dwy-market-analysis'):用户说『帮我分析下这个需求/想法靠不靠谱』『做个市场分析/竞品调研』『这个方向值不值得做』『帮我看看有没有人做过 X』,或丢一个想法让我判断真伪需求、市场空间、怎么差异化。一次一问的协作对话摸清需求 + WebSearch 拿市场证据,产出市场分析文档。区分:完整 0→1 产品孵化流水线请用 dwy-0to1;只想写代码验证某个技术能不能跑通用 dwy-spike。
4
+ ---
5
+
6
+ # dwy-market-analysis · 需求 & 市场分析
7
+
8
+ 跟用户一起把「这是不是真需求」想清楚,再用 WebSearch 扒市场和竞品,给差异化建议和「做不做」结论。伪需求和红海早杀,省掉后面全部白干。
9
+
10
+ ## 运行模式
11
+
12
+ 上下文自适应,两种调用方式:
13
+
14
+ - **单独调用(默认)**:用户直接丢一个想法让你分析。从用户那句想法起步;产物落用户指定位置,没指定就用 `./market-analysis.md` 或问一句;**不读写 STATE.md、不依赖 `docs/0to1/`**。做完跑下方「门」即结束,不自动转入别的 skill。
15
+ - **流水线调用**:`dwy-0to1` 通过 Skill 工具调用,指令含「流水线模式」+ 落盘路径(如 `docs/0to1/01-market.md`)。按指令落盘;照常跑「门」;**STATE 记账与进入下一步由 dwy-0to1 负责,本 skill 不碰 STATE.md**。
16
+
17
+ ## 怎么做
18
+
19
+ 两部分:先**协作对话**把需求想清,再叠**市场调研**拿证据。
20
+
21
+ ### 一、协作对话(一次一问,温和把需求摸清)
22
+
23
+ 不是审问,是陪用户把模糊想法捋成清晰需求。纪律:**一条消息只问一个问题**。
24
+
25
+ 1. **探索上下文**:先弄清想法到底是什么、给谁用、解决什么痛点。当前项目有相关文件/代码就先看一眼。
26
+ 2. **评估范围,先拆再钻**:想法其实是好几个独立子系统(「做个平台,带聊天 + 存储 + 计费 + 分析」)→ **立刻指出来**,帮用户拆成独立部分,问清谁先做。别急着钻某一块的细节,那等于给一个该拆的项目修地基。
27
+ - ❌ 用户说「做个带社交的电商平台」→ 直接问「商品详情页要展示哪些字段」
28
+ - ✅ 先说「这其实是电商 + 社交两个子系统,建议先把电商主链路做通,社交后置。先聚焦电商对吗?」
29
+ 3. **一次只问一个问题**(关键纪律):
30
+ - 一条消息**只问一个**,别一次甩五个。用 `AskUserQuestion`,**优先做成选择题**(比开放题好答),开放题也行。
31
+ - 聚焦理解三件事:**目的 / 约束 / 成功标准**。
32
+ - 一个话题没问透,拆成多条消息分次问,别塞进一条。
33
+ - ❌ 「目标用户是谁?预算多少?要支持哪些平台?什么时候上线?」(一次四问)
34
+ - ✅ 「先定目标用户——主要给哪类人用?」(一次一问,等答完再问下一个)
35
+ 4. **提 2-3 个差异化方向**:摸清需求后,给 2-3 个不同切入方向,每个带取舍。**亮明推荐哪个、为什么**,别都列出来让用户自己选。
36
+ 5. **分段呈现、逐段确认**:把结论拆成几段(需求理解 / 真需求判断 / 差异化建议),一段一段摆,每段问一句「这样对吗」。哪段不对就回去改,别一口气甩完整篇。
37
+
38
+ ### 二、市场 & 竞品调研(WebSearch,对话法没有、这步独有)
39
+
40
+ 对话摸清需求后,拿外部证据验证:
41
+
42
+ 1. **WebSearch 查这个领域**:有哪些现成产品 / 竞品、它们怎么做、市场大概多大、是蓝海还是红海。多关键词搜(中英文都搜,竞品官网 / 测评 / 讨论区)。
43
+ 2. **真需求判断**(结合用户回答 + 市场证据):给三选一结论,**说清依据**——
44
+ | 结论 | 什么情况 |
45
+ |------|---------|
46
+ | 真需求 | 痛点真实、有人在为它付费/费劲找替代,市场有空间 |
47
+ | 伪需求 | 想当然的「应该有人要」,查不到真实付费意愿或替代行为 |
48
+ | 需要收窄 | 方向对但太大/太泛,得砍到一个具体人群或场景才成立 |
49
+ 3. **差异化建议**:值得做的话,差异化从哪个角度切——功能 / 人群 / 定价 / 体验,挑一两个能立住的,别样样都想赢。
50
+
51
+ ## 产物
52
+
53
+ 落盘市场分析文档(单独模式默认 `./market-analysis.md`;流水线模式按编排器给的路径,如 `docs/0to1/01-market.md`)。顶部 frontmatter:
54
+
55
+ ```markdown
56
+ ---
57
+ status: done # 落盘且过门后才填 done;过门前 awaiting-approval
58
+ updated: <date +%Y-%m-%d>
59
+ ---
60
+ ```
61
+
62
+ 正文必含八块:
63
+
64
+ | 块 | 内容 |
65
+ |----|------|
66
+ | 需求理解 | 想法是什么、给谁用、解决什么痛点(对话捋出来的) |
67
+ | 真需求判断 | 真 / 伪 / 收窄 三选一 + **依据**(用户回答 + 市场证据) |
68
+ | 市场情况 | 领域多大、蓝海还是红海、WebSearch 拿到的关键数据 |
69
+ | 竞品清单 | 表格:谁 / 怎么做 / 优 / 劣 |
70
+ | 差异化建议 | 从哪个角度切(功能/人群/定价/体验),为什么这个角度立得住 |
71
+ | 核心能力/最大技术风险 | 一句话点出最该被技术可行性验证的技术核心(供 dwy-tech-feasibility 锚定调研对象) |
72
+ | 硬约束识别 | 合规 / PII / 实时性 / 规模水位等会反向决定技术选型的硬约束;没有就写「无」 |
73
+ | 做不做建议 | 明确结论 + 一句话理由 |
74
+
75
+ ## 门(过门确认)
76
+
77
+ 落盘后先**自己核一遍**(先验证再声称):八块齐了吗、真需求判断有依据吗、竞品清单不是空表吗、核心能力/最大技术风险点出来了吗、硬约束识别过了吗(没有也要明写「无」)。核完再声称完成,别说「应该写好了」。
78
+
79
+ 然后 `AskUserQuestion` 把**「做不做 + 怎么差异化」**摆给用户,问:
80
+
81
+ > 按这个方向继续 / 调整方向 / 放弃?
82
+
83
+ 用户要调整 → 回去改文档重新摆。
84
+
85
+ ## 边界 / 禁止
86
+
87
+ - **一次只问一个问题**——这是这步的命脉,一条消息甩多问直接破坏对话节奏。
88
+ - **不用对抗式六问诊断**——温和协作,不是审问用户的想法值不值得做。
89
+ - **真需求判断必须带依据**——不能只写「这是真需求」,要有用户回答 + 市场证据支撑。
90
+ - **竞品清单不许是空表**——查不到竞品本身就是信号(要么蓝海要么伪需求),写清是哪种。
91
+ - **做不做建议必须给明确结论**——不和稀泥、不「视情况而定」。该劝退就劝退。
92
+ - 这步**只分析判断,不写任何代码、不碰技术选型**(那是 dwy-tech-feasibility / dwy-spike 的事)。
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: dwy-prd-coarse
3
+ description: 粗粒度产品定义(功能级 PRD):协作对话敲定产品定位、哲学、目标人群、定价、核心功能详述、非目标,不下到页面级。涉及以下场景使用此 skill(即使没点名 'dwy-prd-coarse'):用户说『帮我写个 PRD/产品文档』『定义下这个产品』『梳理产品定位和核心功能』『这个产品怎么定价/给谁用』。brainstorming 逐块谈定,产出粗 PRD。区分:本 skill 是功能级总纲(定位/功能/非目标),也是 PRD 的起点——用户笼统说『写个 PRD/产品文档』时默认先从这里(功能级)谈起,定稿后再用 dwy-prd-detailed 下到页面级;只有明确要页面级开发蓝本(元素/文案/状态/输入校验)才直接用 dwy-prd-detailed;完整 0→1 流水线用 dwy-0to1。
4
+ ---
5
+
6
+ # dwy-prd-coarse · 粗 PRD
7
+
8
+ 和用户一起敲定**功能级**的产品定义:定位、哲学、人群、定价、核心功能详述。这是后面原型和细 PRD 的总纲——纲领定歪了,后面全白做。颗粒度停在功能层面,**不下到页面级**(页面是细 PRD 的事)。
9
+
10
+ ## 运行模式
11
+
12
+ 上下文自适应,两种调用方式:
13
+
14
+ - **单独调用(默认)**:用户直接让你写/梳理产品 PRD。从用户描述起步;产物落 `./prd-coarse.md` 或用户指定位置;**不读写 STATE.md、不依赖 `docs/0to1/`**。做完跑下方「门」即结束。
15
+ - **流水线调用**:`dwy-0to1` 调用,指令含「流水线模式」+ 前序产物路径(市场分析)+ 落盘路径(如 `docs/0to1/04-prd-coarse.md`)。**STATE 记账由 dwy-0to1 负责,本 skill 不碰 STATE.md**。
16
+
17
+ ## 输入(定位/定价/功能边界的依据)
18
+
19
+ 定位、定价、差异化、功能边界**不能空想**,要有市场依据 + 技术依据:
20
+
21
+ - 流水线模式:**必须先 Read 编排器给的市场分析产物**,定位看市场空位、定价对标竞品价、功能边界参考竞品;**再 Read `02-tech-feasibility.md`**(定价受 license/infra 成本约束、核心功能边界受推荐方案能力约束)+ **存在时 Read `03-spike-result.md`**(spike 证伪/受限的能力 → 据此砍功能或写进非目标)。技术上做不到或太贵的,别写进核心功能。
22
+ - 单独模式:有市场分析 / 技术可行性文档就读;没有就先用一两个问题问清目标人群、已知竞品、大致定价区间、核心能力技术上有没有现成方案,别凭空拍脑袋。
23
+
24
+ ## 怎么做(brainstorming 对话法,逐块敲定)
25
+
26
+ 不要一口气甩一份完整 PRD 让用户看。用对话一块一块谈,谈一块定一块,最后才成稿。对话纪律:
27
+
28
+ - **一次只问一个问题**,优先选择题(A/B/C 带取舍),比开放题好答。
29
+ - 理解清楚后,**提 2-3 个方向带取舍、亮出推荐**那个并说为什么。别替用户默默选,也别什么都「看你」。
30
+ - **分段呈现、逐段确认**:每块(定位 / 哲学 / 人群 / 定价 / 功能)谈完先确认这块对不对,再进下一块。
31
+ - **YAGNI**:用户列的功能里,砍掉不属于核心的,问清是不是 v1 真需要。
32
+
33
+ 按这个顺序逐块敲定(套 `templates/prd-coarse.md` 的章节):
34
+
35
+ 1. **产品定位** — 一句话说清「给谁、解决什么、凭什么是你」。从市场空位推。
36
+ 2. **产品哲学** — 坚持什么、拒绝什么,3-5 条。这是后面所有取舍的判据。
37
+ 3. **目标人群** — 具体到能想象出一个真人,别写「所有需要 X 的人」。
38
+ 4. **定价策略** — 档位 + 每档含什么 + 对标竞品。**结合竞品价**,不许凭空标价。
39
+ 5. **核心功能详述** — 每个功能讲清「是什么、用户拿它干什么、关键规则、边界」。详细到功能层面(输入输出、核心规则、限制),但**不画页面、不定字段长度**。
40
+ 6. **非目标** — 明确不做什么,挡住后面无穷的「要不要也加个 X」。
41
+
42
+ 每块谈定后,把结论写进产物对应章节(边谈边落,不要等全谈完才动笔)。
43
+
44
+ ## 产物
45
+
46
+ 落盘粗 PRD(单独默认 `./prd-coarse.md`;流水线按编排器给的路径)。套 `templates/prd-coarse.md`。frontmatter:
47
+
48
+ ```
49
+ ---
50
+ status: done # 成稿前 draft,过门后 done
51
+ updated: <date +%Y-%m-%d>
52
+ ---
53
+ ```
54
+
55
+ 成稿要件:六个章节齐全;定位/定价能追溯到市场依据;功能详述到功能级;非目标非空。
56
+
57
+ ## 门(过门确认)
58
+
59
+ 分两层确认:
60
+
61
+ 1. **逐块确认**(对话中已做):每块谈完即时确认,有异议当场改。
62
+ 2. **整体过门**:六块都谈定、产物已落盘且内容完整后(先验证再声称),用 `AskUserQuestion` 把整份粗 PRD 摆给用户:
63
+ - 摆什么:定位一句话、定价档位、核心功能清单、非目标清单。
64
+ - 问什么:「粗 PRD 这样定,通过 / 哪块要改 / 换方向?」
65
+
66
+ ## 边界 / 禁止
67
+
68
+ - **禁止脱离市场依据凭空写**:定位/定价要能追溯到竞品和市场空位。
69
+ - **禁止下到页面级**:不画页面、不定字段长度/行数(那是 dwy-prd-detailed)。停在功能级。
70
+ - **禁止一次甩完整 PRD**:必须 brainstorming 逐块谈、逐块确认。
71
+ - **禁止凭空定价**:每个价格档位都要对标竞品。
72
+ - 这步**不写任何代码**。
@@ -0,0 +1,61 @@
1
+ ---
2
+ status: draft # draft | done
3
+ updated: <YYYY-MM-DD>
4
+ ---
5
+
6
+ # <产品名> · 粗 PRD
7
+
8
+ > 粗粒度,功能级。定「做什么、给谁、为什么、卖多少钱」,**不下到页面级**(页面级是细 PRD 的事)。每块都和用户分段敲定过、综合了市场分析。
9
+
10
+ ## 产品定位
11
+
12
+ <一句话说清这是什么、解决谁的什么问题。结合市场分析的市场空位和竞品差异。例:给独立开发者的「单文件部署的轻量监控面板」,主打装起来五分钟、不依赖数据库。>
13
+
14
+ ## 产品哲学
15
+
16
+ <这产品坚持什么、拒绝什么。3-5 条原则,每条一句。这是后面所有取舍的判据。例:① 默认零配置能跑 ② 数据本地优先 ③ 不做社交/不做会员等级。>
17
+
18
+ ## 目标人群(画像)
19
+
20
+ <谁会用、什么场景下用、现在用什么替代。具体到能想象出一个真人,别写「所有需要 X 的人」。>
21
+
22
+ | 维度 | 内容 |
23
+ |---|---|
24
+ | 主画像 | <身份 + 一句话场景> |
25
+ | 次画像 | <可选> |
26
+ | 现在怎么解决 | <替代方案:手动 / 竞品 / 不解决> |
27
+ | 切入的痛点 | <最痛的那一个> |
28
+
29
+ ## 定价策略
30
+
31
+ <免费 / 一次性买断 / 订阅 / 增值。给出价格档位和每档包含什么。**必须结合市场分析的竞品定价**,说清为什么这么定。>
32
+
33
+ | 档位 | 价格 | 包含 | 对标竞品 |
34
+ |---|---|---|---|
35
+ | <免费/基础> | <¥> | <功能边界> | <竞品同档> |
36
+ | <进阶> | <¥> | <多了什么> | <竞品同档> |
37
+
38
+ ## 核心功能详述(功能级)
39
+
40
+ <列核心功能,每个功能讲清「是什么、用户拿它干什么、关键规则」。详细到功能层面——输入输出、核心规则、边界都说清,但**不画页面、不定字段长度**(那是细 PRD)。一次性想全的功能,不在 v1 也先记下,标清优先级。>
41
+
42
+ ### 功能 1:<名称>
43
+
44
+ - **用户拿它干什么**:<一句话>
45
+ - **核心规则**:<关键逻辑、限制、约束>
46
+ - **优先级**:<v1 必须 / 后续>
47
+
48
+ ### 功能 2:<名称>
49
+
50
+ - **用户拿它干什么**:
51
+ - **核心规则**:
52
+ - **优先级**:
53
+
54
+ <按需继续,功能 3、4……>
55
+
56
+ ## 非目标(明确不做什么)
57
+
58
+ <刻意不做的清单,越明确越好。挡住后面无穷的「要不要也加个 X」。每条一句话,可带一句为什么不做。>
59
+
60
+ - 不做 <X>:<理由,如 偏离产品哲学第 N 条 / 留给后续版本 / 不是目标人群的需求>
61
+ - 不做 <Y>:
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: dwy-prd-detailed
3
+ description: 页面级细 PRD:对着高保真原型逐页写到能照着写代码——每页元素清单、文案字数上限/行数、每种状态、每个输入的前后端双层长度上限、跳转和边界。涉及以下场景使用此 skill(即使没点名 'dwy-prd-detailed'):用户说『把 PRD 写细一点/到页面级』『写详细的产品需求文档』『把每个页面的元素和交互列清楚』『定义各字段的校验规则』。区分:本 skill 是页面级开发蓝本(细到元素/字数/状态/校验),前提是功能级总纲已定(最好有高保真原型);用户只笼统说『写个 PRD/产品文档』、还没有功能级定义时,先用 dwy-prd-coarse 而非本 skill;功能级定位/定价/非目标也用 dwy-prd-coarse;完整 0→1 流水线用 dwy-0to1。
4
+ ---
5
+
6
+ # dwy-prd-detailed · 细 PRD(页面级)
7
+
8
+ 对着高保真原型**逐页**写到**页面级**的 PRD。颗粒度要细到开发能照着写代码:每个页面有哪些元素、每条文案的字数上限和行数、每种状态、每个输入的长度上限、每个边界和跳转。这是开发的蓝本,空一处后面就要返工一次。
9
+
10
+ ## 运行模式
11
+
12
+ 上下文自适应,两种调用方式:
13
+
14
+ - **单独调用(默认)**:用户直接让你写细 PRD。从用户给的原型/页面或描述起步;产物落 `./prd-detailed.md` 或用户指定位置;**不读写 STATE.md、不依赖 `docs/0to1/`**。做完跑下方「门」即结束。
15
+ - **流水线调用**:`dwy-0to1` 调用,指令含「流水线模式」+ 前序产物路径(粗 PRD + 高保真原型目录)+ 落盘路径(如 `docs/0to1/05-prd-detailed.md`)。**STATE 记账由 dwy-0to1 负责,本 skill 不碰 STATE.md**。
16
+
17
+ ## 输入(对着原型逐页写)
18
+
19
+ - **逐页打开高保真原型的每个 HTML** — 细 PRD 一页对一页地写,原型画了什么就写什么。原型是事实依据,**不对着原型 = 空对空,禁止**。
20
+ - 读粗 PRD(功能规则总纲)。
21
+ - 确认目标端,输入约束按端定(移动端键盘、桌面粘贴等)。
22
+ - 单独模式:用户没给原型就先问清有没有原型/设计稿可对照;实在没有就基于用户描述的页面逐页写,但要提醒「没有原型底稿,状态/极端 case 容易漏」。
23
+
24
+ ## 怎么做(具体步骤)
25
+
26
+ 套 `templates/prd-detailed.md`,**每个页面一节**,每节写全这几块:
27
+
28
+ 1. **页面名 + 用途 + 入口/出口** — 这页让用户干什么、从哪进来、各动作去哪。
29
+ 2. **元素 & 区块清单** — 对着原型把每个区块、每个元素列全(顶栏、列表、按钮、计数器…),标清各自规则(如「正文空时发布按钮置灰」)。
30
+ 3. **列表项文案约束** — 每条会展示用户内容的地方,定:**字数上限 / 行数 / 溢出处理**(折叠?`…` 截断?展开?)。对着原型里画的超长文本态定。
31
+ 4. **各状态** — 空 / 加载中 / 错误 / 无数据 / 无权限 / 超长 / 极端数据,每种写清表现。原型已画全,这里逐一文字化。
32
+ 5. **输入校验(长度上限,前后端双层)** — 见下方专节,**这是硬规范**。
33
+ 6. **交互 & 跳转** — 点什么去哪、二次确认、成功后路由。动效在这里用文字描述(原型没做动画)。
34
+ 7. **边界** — 零结果、网络失败、超长、并发、空输入……每个都写清怎么处理。
35
+
36
+ ## 特别提醒:所有用户输入必须限长(前端 + 后端双层)
37
+
38
+ dwy 全局规范硬要求——**凡接收用户输入的地方都要限长,前端即时反馈 + 后端防绕过,缺一不可**。细 PRD 里每个输入框 / textarea / 列表 / 分页都要写清:
39
+
40
+ | 位置 | 必须写明 |
41
+ |---|---|
42
+ | `input` / `textarea` / 富文本 | 字数上限(前端 `maxlength` + schema 兜底防粘贴绕过;后端再校验返回 422) |
43
+ | 列表项展示用户内容 | 字数上限 + 行数 + 溢出处理 |
44
+ | 分页 | `page_size` 默认值 + **上限**(防 DoS) |
45
+ | 文件 / 图片上传 | 数量上限 + 单个大小上限 + **图片额外校验像素尺寸**(防 decompression bomb) |
46
+ | Query / Path / Header | 长度上限 |
47
+
48
+ 按业务语义定数:用户名几十字符、描述几百、正文几千、图片几 MB。**禁止任一字段无上限就过门。**
49
+
50
+ ## 产物
51
+
52
+ 落盘细 PRD(单独默认 `./prd-detailed.md`;流水线按编排器给的路径)。套 `templates/prd-detailed.md`(含一个填好的示例页 + 空白页模板)。frontmatter:
53
+
54
+ ```
55
+ ---
56
+ status: done
57
+ updated: <date +%Y-%m-%d>
58
+ ---
59
+ ```
60
+
61
+ 成稿要件:原型里每个页面都有对应一节;每页七块齐全;每个输入都有前后端双层长度上限;每页的状态覆盖空/加载/错误/超长。落盘后**逐页核对原型**——原型有的页面 PRD 是否都写了、是否有输入漏写上限,再声称完成(先验证再声称)。
62
+
63
+ ## 门(过门确认)
64
+
65
+ 用 `AskUserQuestion` 把细 PRD 摆给用户:
66
+ - 摆什么:页面清单(与原型对齐)、关键约束(各输入长度上限、各列表折叠规则)、状态覆盖情况。
67
+ - 问什么:「细 PRD 这样定够细吗?通过 / 哪页要补 / 哪个约束要调?」
68
+
69
+ 要改就改,直到用户确认。
70
+
71
+ ## 边界 / 禁止
72
+
73
+ - **禁止脱离原型空写**——一页对一页,原型是事实依据。
74
+ - **禁止颗粒度停在功能级**——必须到页面级:具体元素、具体字数、具体行数、具体状态。
75
+ - **禁止任一用户输入无长度上限**(前端 + 后端双层),分页无 `page_size` 上限,图片不校验像素——违反 dwy 全局硬规范。
76
+ - **禁止漏状态**——空/加载/错误/超长/极端,每页都要覆盖到。
@@ -0,0 +1,119 @@
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
+ - <零结果 / 网络失败 / 超长 / 并发……>