create-dwy 0.17.1 → 0.18.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 (34) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/bin/index.js +18 -20
  3. package/package.json +1 -1
  4. package/src/cli-help.js +5 -25
  5. package/src/self-upgrade.js +158 -0
  6. package/src/sync-all.js +159 -5
  7. package/src/sync-packs.js +191 -0
  8. package/src/sync-scene.js +146 -0
  9. package/src/sync.js +9 -1
  10. package/templates/ai-tools/CHANGELOG.md +32 -0
  11. package/templates/ai-tools/VERSION +1 -1
  12. package/templates/ai-tools/rules/Android/dwy-android-core.md +67 -1
  13. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dependency-freshness.md +26 -14
  14. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +90 -22
  15. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-acceptance/SKILL.md +1 -1
  16. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-commercial/SKILL.md +1 -1
  17. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-competitor/SKILL.md +1 -1
  18. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-mvp/SKILL.md +1 -1
  19. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prd/SKILL.md +1 -1
  20. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/SKILL.md +1 -1
  21. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/references/state-and-contract.md +3 -3
  22. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-release/SKILL.md +1 -1
  23. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-tasks/SKILL.md +1 -1
  24. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-tdd-dev/SKILL.md +1 -1
  25. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-validate/SKILL.md +1 -1
  26. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-version/SKILL.md +1 -1
  27. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/SKILL.md +39 -20
  28. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/assets/appstore-submission.yaml +28 -1
  29. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/api-workflow.md +31 -1
  30. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/aso.md +52 -0
  31. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/in-app-purchase-review.md +1 -1
  32. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/screenshot-specs.yaml +98 -0
  33. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/references/screenshot-workflow.md +62 -6
  34. package/templates/ai-tools/skills//345/237/272/347/241/200/345/272/223/dwy-eui/references/eui-design-guide.md +3 -2
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Git Commit 规范(提交安全、敏感扫描、Scope、消息规范、AI 署名治理)
2
+ description: Git Commit 规范(提交前同步远程、冲突处理、提交安全、敏感扫描、Scope、消息规范、AI 署名治理)
3
3
  ---
4
4
 
5
5
  # Git Commit 规范(强制)
@@ -8,25 +8,93 @@ description: Git Commit 规范(提交安全、敏感扫描、Scope、消息规
8
8
 
9
9
  适用于所有 Git 提交流程,覆盖:
10
10
 
11
+ - `git fetch` / `git pull`
11
12
  - `git add`
12
- - `git commit`
13
+ - `git commit`(含 `--amend`)
13
14
  - 为提交生成或校验 commit message 的场景
14
15
 
16
+ 项目按多人协作处理:本地未基于最新远程提交前,禁止产生新 commit。
17
+
15
18
  任一步骤不通过:中止当前提交流交付流程。
16
19
 
17
20
  ## 2. 执行顺序(硬约束)
18
21
 
19
- 1. 安全写法检查
20
- 2. Stage 级敏感扫描
21
- 3. 变更范围确认
22
- 4. Scope 与 message 格式校验
23
- 5. AI 署名与生成声明校验
22
+ 1. 拉取远程并处理完全部冲突
23
+ 2. 安全写法检查
24
+ 3. Stage 级敏感扫描
25
+ 4. 变更范围确认
26
+ 5. Scope 与 message 格式校验
27
+ 6. AI 署名与生成声明校验
28
+
29
+ ## 3. 提交前同步远程(强制)
30
+
31
+ 多人同时改同一仓库。未拉远程就提交,会把过期基线写进历史,后续推送非快进或把冲突甩给别人。
32
+
33
+ **未完成同步、冲突未清零:禁止 `git commit`。**
34
+
35
+ ### 3.1 命令
36
+
37
+ 先 fetch,再 rebase 到上游。工作区有未提交改动时必须带 `--autostash`,禁止为了拉代码丢弃本地改动。
38
+
39
+ ```bash
40
+ git fetch origin
41
+ git pull --rebase --autostash
42
+ ```
43
+
44
+ 当前分支已设置上游时,上面两条即可。未设置上游但远程存在同名分支:
45
+
46
+ ```bash
47
+ git fetch origin
48
+ git pull --rebase --autostash origin "$(git branch --show-current)"
49
+ ```
50
+
51
+ 无 `origin` 时,对实际存在的 remote 执行同等操作。
52
+
53
+ ### 3.2 冲突处理
54
+
55
+ 同步产生冲突后,必须先处理完,才能做新提交:
56
+
57
+ 1. 打开全部冲突文件,逐处消解 `<<<<<<<` / `=======` / `>>>>>>>`。
58
+ 2. `git add` 已解决文件。
59
+ 3. rebase 进行中:`git rebase --continue`(不要另开 `git commit` 顶掉 rebase)。
60
+ 4. stash 弹出后再次冲突:同样消解并 `git add`。
61
+ 5. 全库确认无冲突标记、无 `REBASE_HEAD` / 未结束 merge,再进入后续检查与 `git commit`。
62
+
63
+ 禁止用 `git rebase --abort` / `git merge --abort` 躲冲突后直接提交。
64
+
65
+ ### 3.3 可跳过的唯一情况
66
+
67
+ 仅以下任一成立才可跳过同步:
68
+
69
+ - 仓库没有任何 remote
70
+ - `git fetch` 后当前分支在所有 remote 上都不存在对应分支(全新本地分支,远程无同名分支)
71
+
72
+ 跳过时在回复里写明原因。其余情况一律同步。
73
+
74
+ ### 3.4 失败即停
75
+
76
+ | 情况 | 处理 |
77
+ | --- | --- |
78
+ | fetch / pull 网络失败 | 中止提交,不得在「不知是否落后」时 commit |
79
+ | 仍有冲突标记或 rebase/merge 未结束 | 中止提交 |
80
+ | 已落后远程却未 rebase 完成 | 中止提交 |
81
+
82
+ ### 3.5 禁止借口
83
+
84
+ | 借口 | 处理 |
85
+ | --- | --- |
86
+ | 改动很小不用拉 | 改动大小与是否落后无关,先拉 |
87
+ | 刚才 / 早上拉过了 | 每次准备 commit 前重新 fetch |
88
+ | 先提交再拉 | 顺序写死:先同步,再 commit |
89
+ | 有冲突先把本地提交保住 | 冲突未清零禁止新 commit |
90
+ | 远程大概没人推 | 必须 fetch,不许猜 |
91
+ | 用 force push 顶掉远程 | 禁止用强推代替拉取与消冲突 |
24
92
 
25
- ## 3. 安全写法(命令注入防护)
93
+ ## 4. 安全写法(命令注入防护)
26
94
 
27
95
  `git commit -m "..."` 会对双引号内内容做 shell 展开。出现反引号或 `$(...)` 时,禁止直接使用双引号形式。
28
96
 
29
- ### 3.1 推荐:消息文件提交(优先)
97
+ ### 4.1 推荐:消息文件提交(优先)
30
98
 
31
99
  ```bash
32
100
  git commit -F /tmp/commit-msg.txt
@@ -42,7 +110,7 @@ EOF
42
110
  git commit -F /tmp/commit-msg.txt
43
111
  ```
44
112
 
45
- ### 3.2 允许:单引号提交
113
+ ### 4.2 允许:单引号提交
46
114
 
47
115
  ```bash
48
116
  git commit -m 'feat: 支持 runConcurrent'
@@ -50,7 +118,7 @@ git commit -m 'feat: 支持 runConcurrent'
50
118
 
51
119
  前提:message 内无单引号字符。
52
120
 
53
- ### 3.3 禁止:双引号直接携带反引号
121
+ ### 4.3 禁止:双引号直接携带反引号
54
122
 
55
123
  ```bash
56
124
  git commit -m "feat: run `build-tool`"
@@ -58,31 +126,31 @@ git commit -m "feat: run `build-tool`"
58
126
 
59
127
  上例存在命令替换风险。
60
128
 
61
- ### 3.4 兜底:转义(不推荐)
129
+ ### 4.4 兜底:转义(不推荐)
62
130
 
63
131
  ```bash
64
132
  git commit -m "feat: run \`build-tool\`"
65
133
  ```
66
134
 
67
- ## 4. Stage 级敏感扫描(强制)
135
+ ## 5. Stage 级敏感扫描(强制)
68
136
 
69
137
  同时扫描:
70
138
  - `git diff --cached`
71
139
  - `git diff --cached --name-only`
72
140
 
73
- ### 4.1 禁止提交文件
141
+ ### 5.1 禁止提交文件
74
142
 
75
143
  `.env*`、`*.pem`、`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、`*.sql`(真实数据)、`*.dump`、`*.sqlite`、`*.xlsx`、`*.csv`(敏感表)、`*.log`、`pgdata/`、`cache/*.json`。
76
144
 
77
- ### 4.2 禁止内容片段(示例)
145
+ ### 5.2 禁止内容片段(示例)
78
146
 
79
147
  `sk-` 开头 API Key、`AKIA` 开头 AWS Key、`ghp_` GitHub Token、`password=...`、`token=...`、`secret=...`、明文数据库连接串、私钥头、`IP:端口`、`ssh user@ip`。
80
148
 
81
- ### 4.3 例外
149
+ ### 5.3 例外
82
150
 
83
151
  `.env.example`、环境变量读取方式、`localhost`/`127.0.0.1` 示例连接串可保留。
84
152
 
85
- ### 4.4 处理失败
153
+ ### 5.4 处理失败
86
154
 
87
155
  1. 立即停止。
88
156
  2. 输出 `文件名:行号:命中片段`。
@@ -90,13 +158,13 @@ git commit -m "feat: run \`build-tool\`"
90
158
  4. 用户确认后继续;用户强制提交时,message body 追加:
91
159
  - `GIT-SECURITY: 用户已确认提交此内容`
92
160
 
93
- ## 5. 变更范围与提交拆分
161
+ ## 6. 变更范围与提交拆分
94
162
 
95
163
  先执行 `git diff --cached`,明确:修改了哪些模块、影响边界、是否一次可归因。
96
164
 
97
165
  若单条 message 无法在 `subject` 中清晰表达,必须拆分 commit。
98
166
 
99
- ## 6. Commit Scope
167
+ ## 7. Commit Scope
100
168
 
101
169
  Scope 由 AI 根据变更模块与项目语义自行决定,保持与现有提交习惯一致且可读。
102
170
 
@@ -104,7 +172,7 @@ Scope 由 AI 根据变更模块与项目语义自行决定,保持与现有提
104
172
  - 跨模块改动:可不带 scope。
105
173
  - 无法稳定归类:短期使用无 scope,避免强行造新约束。
106
174
 
107
- ## 7. Commit Message 规则
175
+ ## 8. Commit Message 规则
108
176
 
109
177
  格式:
110
178
 
@@ -133,7 +201,7 @@ Scope 由 AI 根据变更模块与项目语义自行决定,保持与现有提
133
201
  - 可选 body 仅说明 why,不要复述 what。
134
202
  - 破坏性变更:`feat!:` / `fix!:`(带 scope 时写成 `feat(<scope>)!:` / `fix(<scope>)!:`) + `BREAKING CHANGE: ...`
135
203
 
136
- ## 8. AI 署名与生成声明治理
204
+ ## 9. AI 署名与生成声明治理
137
205
 
138
206
  commit 的 subject、body、footer、trailer 中禁止出现任何形式的 AI 署名或生成声明。AI 应自行判断:凡由 AI 工具(Claude、ChatGPT、GPT、Copilot、Cursor、Gemini、Llama、LLM 等)生成或参与撰写的署名、尾随声明、自动生成标记,均不得写入 commit message。
139
207
 
@@ -148,7 +216,7 @@ commit 的 subject、body、footer、trailer 中禁止出现任何形式的 AI
148
216
 
149
217
  > PreToolUse hook `pre-git-commit-ai-signature-check.sh` 会在 commit message 中检出 Co-Authored-By / Generated with 等 AI 署名模式时硬拦截(exit 2),规则约束 + 工程兜底双保险。
150
218
 
151
- ## 9. 参考示例
219
+ ## 10. 参考示例
152
220
 
153
221
  - `feat(eui): 添加 Image 组件懒加载支持`
154
222
  - `refactor(backend): 提取分页逻辑为共享工具`
@@ -16,7 +16,7 @@ description: "【dwy·验收测试】产品 0 到 1 上架迭代阶段。触发
16
16
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方式与用户交互/提问,产出按下方「产出契约」落地。
17
17
  - **提问形式(Claude Code 下强制)**:借用外部 skill 的「问什么、怎么一步步收敛」方法论,但**每个要用户选择/拍板的问题用 `AskUserQuestion` 工具弹点选卡片**,不在正文列 A/B/C/D 让用户打字;保留「一次一问、答完再问下一个」的节奏,开放式补充靠卡片的「Other」兜底。其他工具(Codex 等无此组件)退回外部 skill 原生的正文问答。
18
18
  - 本 skill 依赖的外部 skill:`test-scenarios`、`intended-vs-implemented`(各对应 `~/.dwy/skills/<名>/`)
19
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
19
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
20
20
 
21
21
  ## 产出契约(硬约束)
22
22
  - 落到:`.dwy/prod/[项目]/05-上线交付/验收报告.md`
@@ -27,7 +27,7 @@ description: "【dwy·商业分析】产品 0 到 1 立项阶段(闸1 之后
27
27
  - `pricing-strategy` — 定价模型选型 + 分层 + 价值计量 + 价格敏感度
28
28
  - `porters-five-forces` — 赛道竞争结构(补「赛道」维度,判断利润空间是否被结构压扁)
29
29
  - `gtm-strategy` — 首批用户从哪来、渠道、获客成本估算、90 天路线
30
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
30
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
31
31
 
32
32
  ### 推荐跑法(顺序,可按上下文跳)
33
33
  1. `startup-canvas` 先出整体画布(摸商业全貌 + 战略一致性)
@@ -15,7 +15,7 @@ description: "【dwy·竞品分析】产品 0 到 1 立项阶段。触发场景
15
15
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方式与用户交互/提问,产出按下方「产出契约」落地。
16
16
  - **提问形式(Claude Code 下强制)**:借用外部 skill 的「问什么、怎么一步步收敛」方法论,但**每个要用户选择/拍板的问题用 `AskUserQuestion` 工具弹点选卡片**,不在正文列 A/B/C/D 让用户打字;保留「一次一问、答完再问下一个」的节奏,开放式补充靠卡片的「Other」兜底。其他工具(Codex 等无此组件)退回外部 skill 原生的正文问答。
17
17
  - 本 skill 依赖的外部 skill:`competitor-analysis`、`market-sizing`(各对应 `~/.dwy/skills/<名>/`)
18
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
18
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
19
19
 
20
20
  ## 产出契约(硬约束)
21
21
  - 落到:`.dwy/prod/[项目]/01-立项/竞品分析.md`
@@ -15,7 +15,7 @@ description: "【dwy·MVP定义】产品 0 到 1 立项阶段(闸3)。触发
15
15
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方式与用户交互/提问,产出按下方「产出契约」落地。
16
16
  - **提问形式(Claude Code 下强制)**:借用外部 skill 的「问什么、怎么一步步收敛」方法论,但**每个要用户选择/拍板的问题用 `AskUserQuestion` 工具弹点选卡片**,不在正文列 A/B/C/D 让用户打字;保留「一次一问、答完再问下一个」的节奏,开放式补充靠卡片的「Other」兜底。其他工具(Codex 等无此组件)退回外部 skill 原生的正文问答。
17
17
  - 本 skill 依赖的外部 skill:`prioritize-features`、`opportunity-solution-tree`(各对应 `~/.dwy/skills/<名>/`)
18
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
18
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
19
19
 
20
20
  ## 产出契约(硬约束)
21
21
  - 落到:`.dwy/prod/[项目]/01-立项/MVP清单.md`
@@ -15,7 +15,7 @@ description: "【dwy·PRD生成】产品 0 到 1 需求规划阶段。触发场
15
15
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方式与用户交互/提问,产出按下方「产出契约」落地。
16
16
  - **提问形式(Claude Code 下强制)**:借用外部 skill 的「问什么、怎么一步步收敛」方法论,但**每个要用户选择/拍板的问题用 `AskUserQuestion` 工具弹点选卡片**,不在正文列 A/B/C/D 让用户打字;保留「一次一问、答完再问下一个」的节奏,开放式补充靠卡片的「Other」兜底。其他工具(Codex 等无此组件)退回外部 skill 原生的正文问答。
17
17
  - 本 skill 依赖的外部 skill:`create-prd`(对应 `~/.dwy/skills/create-prd/`)
18
- - 若 `~/.dwy/skills/create-prd/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
18
+ - 若 `~/.dwy/skills/create-prd/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
19
19
 
20
20
  ## 产出契约(硬约束)
21
21
  - 落到:`.dwy/prod/[项目]/02-需求规划/PRD.md`
@@ -46,7 +46,7 @@ description: "【dwy·全流程总控】从模糊想法到上线产品的唯一
46
46
  - 建项目根目录 `.dwy/prod/[项目]/`(不建 01~05 任何阶段子目录)
47
47
  - 初始化 `state.json`(写 `schema_version = "3"`)
48
48
 
49
- 产品产出 `.dwy/prod/[项目]/` 入库,无需改 `.gitignore`(外部 skill 在全局 `~/.dwy/skills/`,不落项目)。若包装型原子 skill 触发时 `~/.dwy/skills/<name>/` 不存在,提示用户先跑 `dwy skills install`。
49
+ 产品产出 `.dwy/prod/[项目]/` 入库,无需改 `.gitignore`(外部 skill 在全局 `~/.dwy/skills/`,不落项目)。若包装型原子 skill 触发时 `~/.dwy/skills/<name>/` 不存在,提示用户先跑 `dwy`,选「刷新全局外部 skill」。
50
50
 
51
51
  **阶段目录渐进式按需建**:`01-立项/` 进立项时才建,`02-需求规划/` 进需求阶段才建……不要一次把五个阶段目录全建出来(那不是渐进式)。state schema、各 skill 的 `confirmed.*` 字段契约、外部 skill 全局安装见 `references/state-and-contract.md`。
52
52
 
@@ -37,7 +37,7 @@
37
37
  state.json # 进度 + 已确认结论,入库
38
38
  ```
39
39
 
40
- **外部 skill 不在项目内**:pm-skills / superpowers 的副本装在**全局** `~/.dwy/skills/<name>/`(一台机一份、全项目共享),由 `dwy skills install` 维护,`dwy claude sync` 自检缺失时自动装。包装型原子 skill 运行时直接读这个全局路径,不在项目里缓存。
40
+ **外部 skill 不在项目内**:pm-skills / superpowers 的副本装在**全局** `~/.dwy/skills/<name>/`(一台机一份、全项目共享),由 `dwy` 选「刷新全局外部 skill」维护,日常同步自检缺失时自动装。包装型原子 skill 运行时直接读这个全局路径,不在项目里缓存。
41
41
 
42
42
  ## 二、.gitignore 规则(总控初始化项目时写入)
43
43
 
@@ -105,10 +105,10 @@
105
105
  包装型原子 skill(dwy-competitor / dwy-validate / dwy-commercial / dwy-mvp / dwy-prd / dwy-version / dwy-tasks / dwy-tdd-dev / dwy-acceptance / dwy-release)依赖 pm-skills / superpowers 的外部 skill,装在**全局** `~/.dwy/skills/<name>/`:
106
106
 
107
107
  - 每个外部 skill 是**整个目录**(含 scripts/ 与配套 .md,不止 SKILL.md)
108
- - 由 cli 命令 `dwy skills install` 安装/更新(clone 两仓库的指定 stable tag → 搬整目录 + LICENSE → 写 `VERSIONS.json`)
108
+ - 由 `dwy` 选「刷新全局外部 skill」安装/更新(clone 两仓库的指定 stable tag → 搬整目录 + LICENSE → 写 `VERSIONS.json`)
109
109
  - `dwy claude sync` 自检:`~/.dwy/skills/` 缺失时自动装一次
110
110
  - 当前 stable:pm-skills **v2.0.0** | superpowers **v6.0.3**(升级改 cli 的 `skills-install.js` 清单 tag)
111
- - 原子 skill 运行时**只读** `~/.dwy/skills/<name>/`,缺失则提示用户先 `dwy skills install`,不自己拉、不降级
111
+ - 原子 skill 运行时**只读** `~/.dwy/skills/<name>/`,缺失则提示用户先跑 `dwy`,选「刷新全局外部 skill」,不自己拉、不降级
112
112
 
113
113
  ## 五、运行模式与流转(run_mode)
114
114
 
@@ -16,7 +16,7 @@ description: "【dwy·上架迭代】产品 0 到 1 上架迭代阶段(终点
16
16
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方式与用户交互/提问,产出按下方「产出契约」落地。
17
17
  - **提问形式(Claude Code 下强制)**:借用外部 skill 的「问什么、怎么一步步收敛」方法论,但**每个要用户选择/拍板的问题用 `AskUserQuestion` 工具弹点选卡片**,不在正文列 A/B/C/D 让用户打字;保留「一次一问、答完再问下一个」的节奏,开放式补充靠卡片的「Other」兜底。其他工具(Codex 等无此组件)退回外部 skill 原生的正文问答。
18
18
  - 本 skill 依赖的外部 skill:`release-notes`、`gtm-strategy`、`metrics-dashboard`、`north-star-metric`(各对应 `~/.dwy/skills/<名>/`)
19
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
19
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
20
20
 
21
21
  ## 产出契约(硬约束)
22
22
  - 落到:`.dwy/prod/[项目]/05-上线交付/上架物料.md`、`埋点与指标.md`、`下一版迭代规划.md`
@@ -15,7 +15,7 @@ description: "【dwy·任务拆解】产品 0 到 1 需求规划阶段。触发
15
15
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方法论产出,落到下方「产出契约」。
16
16
  - **AI 自主拆解**:架构阶段文档(`技术架构.md`/`数据库设计.md`/`接口契约.md` + `PRD.md`/`版本路线图.md`)已建好,AI 据此**自行判断**模块怎么切、方案怎么选,按 writing-plans 方法论直接产出,不再逐点弹 `AskUserQuestion` 找用户拍板。仅当文档间出现**实质冲突或硬缺口**(无法据现有文档推断)时才向用户确认。
17
17
  - 本 skill 依赖的外部 skill:`writing-plans`(对应 `~/.dwy/skills/writing-plans/`)
18
- - 若 `~/.dwy/skills/writing-plans/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
18
+ - 若 `~/.dwy/skills/writing-plans/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
19
19
 
20
20
  ## 产出契约(硬约束)
21
21
  - 落到:`.dwy/prod/[项目]/02-需求规划/开发任务拆解.md`
@@ -16,7 +16,7 @@ description: "【dwy·TDD开发】产品 0 到 1 开发阶段。触发场景:
16
16
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方法论产出,落到下方「产出契约」。
17
17
  - **AI 自主开发**:架构阶段文档(`技术架构.md`/`数据库设计.md`/`接口契约.md`)+ `开发任务拆解.md` 已建好,AI 据此**自行**按模块循环 RED→GREEN→REFACTOR,测试通过自动进下一模块,不再逐点弹 `AskUserQuestion` 找用户拍板。仅当文档间出现**实质冲突或硬缺口**(无法据现有文档推断)时才向用户确认。
18
18
  - 本 skill 依赖的外部 skill:`test-driven-development`、`systematic-debugging`(各对应 `~/.dwy/skills/<名>/`)
19
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
19
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
20
20
 
21
21
  每任务循环:RED 写失败测试 → GREEN 最小实现通过 → REFACTOR 重构。
22
22
 
@@ -15,7 +15,7 @@ description: "【dwy·需求市场验证】产品 0 到 1 总闸门(闸1)。
15
15
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方式与用户交互/提问,产出按下方「产出契约」落地。
16
16
  - **提问形式(Claude Code 下强制)**:借用外部 skill 的「问什么、怎么一步步收敛」方法论,但**每个要用户选择/拍板的问题用 `AskUserQuestion` 工具弹点选卡片**,不在正文列 A/B/C/D 让用户打字;保留「一次一问、答完再问下一个」的节奏,开放式补充靠卡片的「Other」兜底。其他工具(Codex 等无此组件)退回外部 skill 原生的正文问答。
17
17
  - 本 skill 依赖的外部 skill:`market-sizing`、`sentiment-analysis`、`interview-script`(各对应 `~/.dwy/skills/<名>/`)
18
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
18
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
19
19
 
20
20
  验证方式三选一:
21
21
  - 搜索量/竞品热度(AI 自动)
@@ -15,7 +15,7 @@ description: "【dwy·版本规划】产品 0 到 1 需求规划阶段。触发
15
15
  读其 `SKILL.md`(及同目录 scripts/、配套 .md),按它的方式与用户交互/提问,产出按下方「产出契约」落地。
16
16
  - **提问形式(Claude Code 下强制)**:借用外部 skill 的「问什么、怎么一步步收敛」方法论,但**每个要用户选择/拍板的问题用 `AskUserQuestion` 工具弹点选卡片**,不在正文列 A/B/C/D 让用户打字;保留「一次一问、答完再问下一个」的节奏,开放式补充靠卡片的「Other」兜底。其他工具(Codex 等无此组件)退回外部 skill 原生的正文问答。
17
17
  - 本 skill 依赖的外部 skill:`outcome-roadmap`、`prioritize-features`(各对应 `~/.dwy/skills/<名>/`)
18
- - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy skills install`(或 `dwy claude sync` 会自动装),不要自己用内置能力顶替。
18
+ - 若 `~/.dwy/skills/<名>/` 不存在:提示用户先跑 `dwy`,选「刷新全局外部 skill」(日常同步也会自检安装),不要自己用内置能力顶替。
19
19
 
20
20
  ## 产出契约(硬约束)
21
21
  - 落到:`.dwy/prod/[项目]/02-需求规划/版本路线图.md`
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: dwy-ios-app-store-release
3
- description: "iOS/macOS App Store 上架编排。用户要求创建或填写 App Store Connect 应用资料、生成并上传 iOS/macOS 截图、配置全地区定价、创建内购/自动续期订阅、提交 TestFlight 或 App Review 时使用。使用 App Store Connect API 自动填充,使用已登录 Playwright 补齐网页专属步骤;首次运行在用户私有目录缓存 API 配置。"
3
+ description: "Use when 用户要上架、发 iOS/macOS 版本、填 App Store Connect、写更新说明、改关键词或 ASO、处理截图预览图、从现网拷上一版本资料、选过审即发或过审后几天再发、提交 TestFlight 或 App Review。"
4
4
  ---
5
5
 
6
- # iOS/macOS App Store 上架
6
+ # iOS/macOS App Store 上架与版本更新
7
7
 
8
- 将开发完成的 Apple 应用整理为可确认、可审计、可重复执行的发布包。API 优先;新建 App Record、App Privacy 等 API 外页面才使用已登录 Playwright。
8
+ 首次上架和后续版本走同一套发布包。后续版本必须先拉现网全部资料,再按本版增量改;禁止从空模板重写。
9
9
 
10
10
  ## 安全边界
11
11
 
12
12
  - Skill 模板目录禁止保存任何 API Key、`.p8` 私钥、Cookie、审核账号密码或税务材料。
13
- - 只从 `/Users/chances/.dwy/app-store-connect/` 读取用户私有配置。首次运行时询问 Issuer ID、Key ID、团队和私钥文件位置,再调用 `scripts/appstore_config.sh` 写入。
13
+ - 凭据先读当前仓库已有约定(`AGENTS.md` / `CLAUDE.md` / 项目规则)。已写明路径则用该路径,不再询问。没有仓内约定才用 `/Users/chances/.dwy/app-store-connect/`,首次运行询问 Issuer ID、Key ID、团队和私钥文件位置,再调用 `scripts/appstore_config.sh` 写入。
14
14
  - 不将秘密写入项目、Git、`appstore-submission.yaml` 或执行日志。审核账号在发布包中只能使用钥匙串或环境变量引用。
15
15
  - 提交审核、正式发布、价格上调前,必须显示变更并获得用户二次确认。
16
16
 
@@ -21,15 +21,31 @@ description: "iOS/macOS App Store 上架编排。用户要求创建或填写 App
21
21
  3. 用户提供现有 `.p8` 文件路径后,执行 `import-key --path <absolute-path>`;禁止让用户在聊天中粘贴私钥内容。
22
22
  4. 使用 `get` 验证非秘密标识;不要打印私钥或会话文件。
23
23
 
24
- ## 发布包与资料收集
24
+ ## 判定首次还是更新
25
25
 
26
- 将 `assets/appstore-submission.yaml` 复制到用户私有目录下 `submissions/<bundle-id>/`,逐步收集并在每步确认:
26
+ 将 `assets/appstore-submission.yaml` 复制到 `submissions/<bundle-id>/` 后,用 Bundle ID 查 Connect:
27
27
 
28
- 1. 应用身份:Bundle ID、SKU、名称、分类、版权、年龄分级和构建。
29
- 2. 产品页:只维护 `zh-Hans`、`en-US` 的名称、副标题、描述、关键词、支持/营销/隐私 URL。
30
- 3. 截图:按 [截图工作流](references/screenshot-workflow.md) 从真实应用采集 iOS 与 macOS 图,分别校验后上传。
31
- 4. 合规:隐私、第三方 SDK、内容权利、加密、审核账号和测试路径。法律真实性由用户确认。
32
- 5. 商业:应用价格、全地区可售、内购或订阅的权益、价格、地区和审核截图。
28
+ - 没有任何 `appStoreVersions` → `version.source=first`,`screenshots.update=true`
29
+ - 已有版本 → `version.source=live_inherit`,按 [api-workflow.md](references/api-workflow.md) 把现网资料整份写入发布包,再优化
30
+
31
+ ## 现网继承
32
+
33
+ 更新时拷过来的字段包括:名称、副标题、描述、关键词、推广文本、更新说明、支持/营销/隐私 URL、截图、价格与地区、内购/订阅、审核备注。先给用户看现网原文,再改本版增量。
34
+
35
+ ## 每版本处理
36
+
37
+ 1. **推广文本不向用户询问**。现网有内容则原样拷进 `promotional_text`。与本版卖点明显不符时自行改写,改前可上网核对卖点是否仍准确;双语各 ≤170 字。首次无现网则按名称/副标题/描述生成。细则见 [aso.md](references/aso.md)。
38
+ 2. **更新说明**:后续版本 `whats_new` 双语必填。给用户看的概览,写「新增某某功能」这类句子,机制细节不写,可用「等等」。禁止把 `dwy-publish` 的 git `CHANGELOG` 或实现细节贴进商店。首次上架可空。
39
+ 3. **截图**:默认 `screenshots.update=false`,拷上一版本,不问。出现任一情况必须更新:新主界面、新核心能力、旧图已不能代表产品、**What's New 写了的能力在现网截图里看不到**。按 [screenshot-specs.yaml](references/screenshot-specs.yaml) 处理;已送审版本改图见 [screenshot-workflow.md](references/screenshot-workflow.md)「送审后锁死」。
40
+ 4. **发布策略**:向用户确认二选一——过审即发(`AFTER_APPROVAL`),或过审后几天再发(`SCHEDULED` + `delay_days`)。选几天则再问天数。未选不得提交。
41
+
42
+ ## ASO
43
+
44
+ 名称、副标题、关键词按 [aso.md](references/aso.md) 优化。现网词表为底,补本版可搜词,不重复标题/副标题已覆盖词。输出旧/新关键词和剩余字符数,`aso_confirmed` 后才写。
45
+
46
+ ## 截图规格
47
+
48
+ P 图与上传只读 [screenshot-specs.yaml](references/screenshot-specs.yaml) 的 `processing.canonical` 与各 display 的 `preferred`。流程见 [screenshot-workflow.md](references/screenshot-workflow.md)。
33
49
 
34
50
  ## 地区、ICP 与本地化
35
51
 
@@ -39,16 +55,17 @@ description: "iOS/macOS App Store 上架编排。用户要求创建或填写 App
39
55
 
40
56
  ## 自动化顺序
41
57
 
42
- 1. 读取发布包、项目构建信息和 API 配置,先输出完整 diff。
43
- 2. 用 API 写入 App 信息、版本本地化、价格、地区、年龄分级、审核资料、截图、内购和订阅。
44
- 3. 对 API 未覆盖项复用用户已登录 Playwright 会话:创建 App Record、填写 App Privacy 或处理网页专属确认。
45
- 4. 关联构建与审核提交。仅在用户再次确认后调用提交审核或发布动作。
46
- 5. 输出成功、失败、待补 ICP 和人工确认项,保存无秘密执行记录。
58
+ 1. 判定 first / live_inherit;更新则先拉现网。
59
+ 2. 收齐更新说明与 `release.type`;推广文本自处理;截图仅功能变化很大(含 What's New 与现网图不符)才问或必更;做 ASO,输出完整 diff。
60
+ 3. 用 API 写入 App 信息、版本本地化、价格、地区、年龄分级、审核资料、截图、内购和订阅。
61
+ 4. 对 API 未覆盖项复用用户已登录 Playwright 会话:创建 App Record、填写 App Privacy 或处理网页专属确认。
62
+ 5. 关联构建与审核提交。仅在用户再次确认后调用提交审核或发布动作。
63
+ 6. 输出成功、失败、待补 ICP 和人工确认项,保存无秘密执行记录。
47
64
 
48
65
  ## 内购与订阅
49
66
 
50
67
  - 校验 `product_id` 与 StoreKit 代码一致,再创建消耗型、非消耗型内购或自动续期订阅。
51
- - 每个内购必须提交一张用于审核的 `1280 × 800` 像素截图;按 [内购审核截图](references/in-app-purchase-review.md) 从真实购买流程采集并校验。
68
+ - 每个内购必须提交一张审核截图;按 [内购审核截图](references/in-app-purchase-review.md) 从真实购买流程采集并校验。
52
69
  - 默认全地区可售;以美国区目标价格查询 Apple 价格点,并由 Apple 自动等价换算其它地区价格。
53
70
  - 价格修改必须展示旧价、新价、生效时间和受影响地区;用户二次确认后才执行。
54
71
 
@@ -60,6 +77,8 @@ description: "iOS/macOS App Store 上架编排。用户要求创建或填写 App
60
77
 
61
78
  ## 参考资料
62
79
 
63
- - API 与网页动作:见 [references/api-workflow.md](references/api-workflow.md)。
64
- - iOS/macOS 截图采集与规格:见 [references/screenshot-workflow.md](references/screenshot-workflow.md)。
65
- - 内购审核截图:见 [references/in-app-purchase-review.md](references/in-app-purchase-review.md)。
80
+ - API 与现网继承:[references/api-workflow.md](references/api-workflow.md)
81
+ - ASO 与字段上限:[references/aso.md](references/aso.md)
82
+ - 截图规格(P 图单一数据源):[references/screenshot-specs.yaml](references/screenshot-specs.yaml)
83
+ - 截图流程:[references/screenshot-workflow.md](references/screenshot-workflow.md)
84
+ - 内购审核截图:[references/in-app-purchase-review.md](references/in-app-purchase-review.md)
@@ -1,5 +1,6 @@
1
1
  # 已确认的发布包模板;秘密仅使用外部引用,不能填入此文件。
2
- schema_version: 1
2
+ # 后续版本必须先拉现网再改;禁止对着空模板重写产品页。
3
+ schema_version: 2
3
4
  application:
4
5
  bundle_id: ""
5
6
  sku: ""
@@ -8,6 +9,29 @@ application:
8
9
  china_mainland:
9
10
  icp_status: not_started
10
11
  icp_filing_number: ""
12
+ # source=first 仅当 Connect 上还没有该 Bundle ID 的版本。
13
+ # 已上架必须 source=live_inherit,inherited_from 填现网 versionString。
14
+ version:
15
+ source: live_inherit
16
+ inherited_from: ""
17
+ version_string: ""
18
+ # 推广文本不向用户询问。现网有则原样拷;需更新时 agent 自改,各 ≤170 字。
19
+ promotional_text:
20
+ zh-Hans: ""
21
+ en-US: ""
22
+ # 商店「此版本的新内容」:给用户看的概览。后续版本必填;首次可空。
23
+ whats_new:
24
+ zh-Hans: ""
25
+ en-US: ""
26
+ screenshots:
27
+ # 默认 false=拷上一版本。仅功能变化很大时才问是否改为 true。
28
+ # source=first 时必须为 true。
29
+ update: false
30
+ release:
31
+ # AFTER_APPROVAL=过审即发;SCHEDULED=过审后等到 delay_days 再发。
32
+ # 提交前向用户确认二选一;选几天则再问天数。
33
+ type: ""
34
+ delay_days: 0
11
35
  localizations:
12
36
  zh-Hans:
13
37
  name: ""
@@ -16,6 +40,7 @@ localizations:
16
40
  keywords: ""
17
41
  support_url: ""
18
42
  privacy_policy_url: ""
43
+ marketing_url: ""
19
44
  en-US:
20
45
  name: ""
21
46
  subtitle: ""
@@ -23,6 +48,7 @@ localizations:
23
48
  keywords: ""
24
49
  support_url: ""
25
50
  privacy_policy_url: ""
51
+ marketing_url: ""
26
52
  screenshots:
27
53
  ios: { zh-Hans: [], en-US: [] }
28
54
  macos: { zh-Hans: [], en-US: [] }
@@ -39,5 +65,6 @@ confirmations:
39
65
  metadata_confirmed: false
40
66
  privacy_confirmed: false
41
67
  pricing_confirmed: false
68
+ aso_confirmed: false
42
69
  submit_for_review_confirmed: false
43
70
  release_confirmed: false
@@ -4,6 +4,33 @@
4
4
 
5
5
  使用 App Store Connect API 创建或更新版本本地化、App 信息、分类、年龄分级、地区可售性、应用价格、内购、订阅、审核资料、截图和审核提交。每次写入前读取当前资源并生成字段 diff。
6
6
 
7
+ ## 现网继承(`source=live_inherit`)
8
+
9
+ Connect 上已有该 Bundle ID 的版本时必须走这条路径。禁止从空模板重写产品页。API 创建新版本不会自动带上旧资料,要自己拷。
10
+
11
+ 1. `GET /v1/apps?filter[bundleId]=`
12
+ 2. `GET /v1/apps/{id}/appStoreVersions?filter[appStoreState]=READY_FOR_SALE`。没有在售版本时,改取最新一条(`PREPARE_FOR_SUBMISSION` / `WAITING_FOR_REVIEW` / `PENDING_DEVELOPER_RELEASE` / `REJECTED` / `DEVELOPER_REJECTED`)。
13
+ 3. `GET /v1/appStoreVersions/{id}/appStoreVersionLocalizations` → `promotionalText`、`whatsNew`、`description`、`keywords`、`supportUrl`、`marketingUrl`
14
+ 4. `GET /v1/apps/{id}/appInfos` 与 `appInfoLocalizations` → `name`、`subtitle`、`privacyPolicyUrl`
15
+ 5. `GET` 各本地化的 `appScreenshotSets` / `appScreenshots`(含 `imageAsset`)
16
+ 6. `GET` 价格、地区、内购、订阅、审核备注
17
+ 7. 写入 `submissions/<bundle-id>/appstore-submission.yaml`:`source=live_inherit`,`inherited_from=<现网 versionString>`,其它字段填现网原文
18
+ 8. 先展示现网原文,再只改本版增量:`whats_new`、ASO、`release.type`。推广文本默认原样继承,仅卖点过时时自改。截图默认拷现网,仅功能变化很大才问是否更新
19
+
20
+ `source=first` 仅当第 1 步找不到 App,或 App 还没有任何 `appStoreVersions`。
21
+
22
+ 本地发布包 `schema_version` < 2 时:保留已确认的 ICP/内购/审核引用,按现网补齐 `version` 段(含推广文本、更新说明、截图开关、发布策略),再升到 2。不要对着旧骨架继续填。
23
+
24
+ ## 新版本写入
25
+
26
+ 1. `POST /v1/appStoreVersions` 创建 `version_string`
27
+ 2. 按发布包把上一版本本地化 `POST` 到新版本,再 PATCH 本版改动(推广文本、更新说明、关键词等)
28
+ 3. 截图:`screenshots.update=false` 时下载现网各 `displayType` 图,在新版本重建 screenshot set 并上传。禁止空截图集提交。`update=true` 时按 [screenshot-specs.yaml](screenshot-specs.yaml) 处理后上传
29
+ 4. `PATCH` 新版本 `releaseType`:`AFTER_APPROVAL`,或 `SCHEDULED` 且写入 `earliestReleaseDate`(提交时刻 + `delay_days`,UTC)。未写入不得提交
30
+ 5. 关联构建。提交审核、正式发布、涨价仍走最终门禁
31
+
32
+ 已送审后要改截图:不要对 `WAITING_FOR_REVIEW` 硬 POST/DELETE(必 409)。按 [screenshot-workflow.md](screenshot-workflow.md)「送审后锁死」撤审 → 换图 → 新 submission 再送。`promotionalText` 审核中仍可 PATCH,截图不行。
33
+
7
34
  ## 网页补齐动作
8
35
 
9
36
  只在 API 无法覆盖时,使用用户已登录的 Playwright 会话:创建 App Record、App Privacy 问卷和 Apple 要求的网页专属确认。不得自动绕过验证码或复用未授权会话。
@@ -14,4 +41,7 @@
14
41
 
15
42
  ## 最终门禁
16
43
 
17
- 下列动作必须再次询问用户:提交审核、正式发布、提高价格、启用中国大陆(当备案资料刚补齐时)。
44
+ 下列动作必须再次询问用户:提交审核、正式发布、提高价格、启用中国大陆(当备案资料刚补齐时)。用户已明确要求改**已送审**截图时,撤审重提视为该指令的必要步骤,仍须先说明审核队列会重排、定时发布日期可保留。
45
+
46
+ `release.type=AFTER_APPROVAL`:提交前确认「审核通过即发布」。
47
+ `release.type=SCHEDULED`:提交前确认「审核通过后等 N 天再发」,并把 `delay_days` 换成 `earliestReleaseDate`。若实际过审日晚于该日期,Apple 会在过审时发布。
@@ -0,0 +1,52 @@
1
+ # App Store 搜索优化
2
+
3
+ 目标:提高名称、副标题、关键词被搜到的概率,并保住产品页转化。搜索流量主要来自索引字段,不是更新说明。
4
+
5
+ ## 字数(按字符计,含中文一字)
6
+
7
+ | 字段 | 上限 | 每版本 |
8
+ |------|------|--------|
9
+ | 名称 | 30 | 继承后可优化 |
10
+ | 副标题 | 30 | 继承后可优化 |
11
+ | 关键词 | 100 | 继承后可优化 |
12
+ | 推广文本 | 170 | 继承;需更新时自改,不向用户询问 |
13
+ | 描述 | 4000 | 继承后可优化 |
14
+ | 更新说明 | 4000 | 后续版本必填;给用户读,不为堆词 |
15
+
16
+ ## 索引权重
17
+
18
+ 1. 名称
19
+ 2. 副标题
20
+ 3. 关键词(逗号分隔,逗号后不要空格)
21
+ 4. 内购显示名
22
+
23
+ 推广文本影响产品页转化,不作为主要索引。描述、更新说明对搜索贡献弱。
24
+
25
+ ## 关键词
26
+
27
+ - 先列出名称 + 副标题已覆盖的词,关键词里不再重复,把 100 字留给新词。
28
+ - `zh-Hans` 与 `en-US` 各自选用户会搜的词,禁止英中一对一硬译。
29
+ - 优先:功能、场景、问题词。禁止竞品商标、无关热词、重复词。
30
+ - 现网已有关键词时:以现网词表为底,按本版新能力补漏、删无效词。禁止推倒重写。
31
+ - 首次:从产品能力生成候选,再压进 100 字。
32
+ - 交给用户确认前必须给出:旧关键词、新关键词、剩余字符数。
33
+
34
+ ## 名称与副标题
35
+
36
+ - 名称:品牌 + 一个可搜的品类词(放得下才加)。
37
+ - 副标题:一句收益或场景,补名称没覆盖的搜索词。
38
+ - 已上架应用改名/副标题要展示现网对照;用户确认后才写。
39
+
40
+ ## 推广文本
41
+
42
+ 不向用户询问。
43
+
44
+ - 现网 `promotionalText` 有内容:原样继承。
45
+ - 与本版卖点明显不符(旧活动过期、主功能已换):自行改写,改前可上网核对卖点、竞品表述是否仍准确。不要为改而改。
46
+ - 首次无现网:按名称、副标题、描述生成一句卖点,不要复述整篇描述。
47
+ - `zh-Hans` / `en-US` 各 ≤170 字;有现网底稿时保持双语都有内容。
48
+
49
+ ## 禁止
50
+
51
+ - 把 `dwy-publish` 的 git `CHANGELOG` 塞进关键词或更新说明。
52
+ - 为冲搜索把更新说明写成实现细节或关键词堆砌。
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 本项目固定规格
4
4
 
5
- 每个内购项目提交一张 `1280 × 800` 像素、16:10 的审核截图。图片必须来自真实购买路径,清晰展示商品或服务、价格入口与购买后的可获得权益;禁止使用与应用不一致的概念图。
5
+ 每个内购项目提交一张审核截图。画布以 [screenshot-specs.yaml](screenshot-specs.yaml) 的 `macos_iap_review` 为准(`1280 × 800`,16:10)。图片必须来自真实购买路径,清晰展示商品或服务、价格入口与购买后的可获得权益;禁止使用与应用不一致的概念图。
6
6
 
7
7
  ## 采集与上传
8
8