create-dwy 0.16.0 → 0.17.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/CHANGELOG.md +17 -0
- package/bin/index.js +1 -1
- package/package.json +3 -2
- package/src/searchable-select.js +419 -0
- package/src/sync-all.js +313 -65
- package/src/sync-global-skills.js +167 -0
- package/src/sync.js +59 -43
- package/templates/ai-tools/CHANGELOG.md +210 -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 +280 -5
- 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-core.md +47 -0
- package/templates/ai-tools/rules/Vue/dwy-vue-core.md +55 -0
- package/templates/ai-tools/rules/iOS/dwy-ios-pitfalls.md +7 -0
- package/templates/ai-tools/rules/iOS/dwy-swift-core.md +46 -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-oss-commercial-license.md +128 -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/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/SKILL.md +65 -0
- 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 +43 -0
- 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 +17 -0
- 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 +16 -0
- 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 +16 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/scripts/appstore_config.sh +140 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/SKILL.md +11 -8
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/android.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/backend-deploy.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/changelog.md +24 -4
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/frontend-deploy.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/generic-release.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/git-tag.md +82 -0
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/harmony.md +2 -1
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/ios.md +3 -2
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/monitor-notify.md +2 -2
- package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-semver/SKILL.md +1 -1
- package/templates/ai-tools/skills//345/237/272/347/241/200/345/272/223/dwy-eapi/references/tasks-integration-guide.md +2 -2
- 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/207/252/345/252/222/344/275/223/README.md +57 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/SKILL.md +147 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/api.md +43 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/config.example.yaml +33 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/global_config.py +89 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/setup_config.py +175 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/synthesize.py +339 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/SKILL.md +127 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/assets/cover-style-master-v1.png +0 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-copy-examples.md +37 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-posting-times.md +193 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0005-ideation/SKILL.md +42 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0005-ideation/templates/topic-backlog.template.md +50 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0005-ideation/templates//351/200/211/351/242/230/346/261/240.template.md +16 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0010-product/SKILL.md +106 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0010-product/templates/channel-profile.template.md +52 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0010-product/templates//344/272/247/345/223/201/345/215/241.template.md +132 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/SKILL.md +60 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/build_facts_html.py +430 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/generate_html.py +1287 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/scripts/generate_report.py +189 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0030-facts/templates//344/272/213/345/256/236/350/265/204/346/226/231/345/272/223.template.md +55 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/SKILL.md +36 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates/README.md +10 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//344/272/213/345/256/236.template.md +82 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//345/215/225/351/233/206/346/226/207/346/241/243.template.md +175 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//350/204/232/346/234/254.template.md +69 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0040-script/templates//351/252/250/346/236/266-v1.1.md +174 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0050-design/SKILL.md +55 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0060-assets/SKILL.md +29 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/SKILL.md +42 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/scripts/validate_shots.py +207 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package/shots.schema.json +186 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package//344/272/272/345/256/241/345/214/205.template.md +1 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package//344/272/272/345/256/241/350/257/264/346/230/216.md +15 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0070-package//346/210/220/347/211/207/345/214/205.template.md +49 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-0080-factory/SKILL.md +58 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-comic-kit/SKILL.md +424 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-comic-kit/evals.md +41 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow/CONTRACT.md +123 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow/SKILL.md +81 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-flow//346/211/247/350/241/214/346/270/205/345/215/225.template.md +60 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/SKILL.md +78 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/agents/openai.yaml +4 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/knowledge-town-paper-film-v1.json +80 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/AudioTracks.tsx +20 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/CaptionLayer.tsx +18 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/CueTimeline.ts +24 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/assets/remotion/KnowledgeTownComposition.tsx +21 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/cinematic-direction.md +73 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/sticker-asset-production.md +30 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/references/style-guide.md +43 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/scripts/build_cue_timeline.py +75 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/scripts/validate_cue_timeline.py +68 -0
- package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/uc-media-knowledge-town/scripts/validate_style_preset.py +22 -0
- 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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 鸿蒙踩坑四栏归档(现象/根因/正确做法/适用)。事前规范见 dwy-arkts-ui-design / dwy-arkts-ui-build / dwy-arkts-strict
|
|
3
|
+
paths:
|
|
4
|
+
- "**/*.ets"
|
|
5
|
+
- "**/build-profile.json5"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 鸿蒙开发坑清单(归档)
|
|
9
|
+
|
|
10
|
+
> **事前约束**请先读:
|
|
11
|
+
>
|
|
12
|
+
> | 文件 | 用途 |
|
|
13
|
+
> |---|---|
|
|
14
|
+
> | `dwy-arkts-strict.md` | 语言禁用语法 |
|
|
15
|
+
> | `dwy-arkts-ui-build.md` | 组件 API / 构建 / 设备与运行时 |
|
|
16
|
+
> | `dwy-arkts-ui-design.md` | UI 弹层/顶栏/加载态规范 |
|
|
17
|
+
>
|
|
18
|
+
> 本文件只记 **已踩过的坑**(四栏)。新坑:先按格式追加 → 再把「正确做法」回写到对应规范文件,避免规范与归档脱节。
|
|
19
|
+
|
|
20
|
+
## 分类索引
|
|
21
|
+
|
|
22
|
+
- ArkUI 弹层 / 出码
|
|
23
|
+
- 工程与设备网络
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## ArkUI 弹层 / 出码
|
|
28
|
+
|
|
29
|
+
### bindSheet 系统 × 与内容自绘 × / 顶栏按钮重叠
|
|
30
|
+
|
|
31
|
+
- **现象**:右上两颗 ×,或系统 × 与「扫码/配对码」「新增」「复制全部」贴在一起。
|
|
32
|
+
- **根因**:`showClose` 与内容自绘关闭/右侧操作同区叠放。
|
|
33
|
+
- **正确做法**:见 `dwy-arkts-ui-design.md` §2(二选一);禁止省略 `showClose`。
|
|
34
|
+
- **适用**:所有 `bindSheet`。
|
|
35
|
+
|
|
36
|
+
### 内容区 × 是清空不是关 sheet
|
|
37
|
+
|
|
38
|
+
- **现象**:键盘输入框旁 × 被当成关弹层。
|
|
39
|
+
- **根因**:语义是清空输入。
|
|
40
|
+
- **正确做法**:见 `dwy-arkts-ui-design.md` §3。
|
|
41
|
+
- **适用**:Keyboard / 搜索。
|
|
42
|
+
|
|
43
|
+
### ScanKit 二维码模拟器空白 + 永久 spinner
|
|
44
|
+
|
|
45
|
+
- **现象**:配对扫码页只转圈,无码图。
|
|
46
|
+
- **根因**:HVD 上 `generateBarcode` 常失败;失败 UI 仍 loading。
|
|
47
|
+
- **正确做法**:见 `dwy-arkts-ui-build.md` §14 + `dwy-arkts-ui-design.md` §4(兜底出图 + 三态)。
|
|
48
|
+
- **适用**:出码展示。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 工程与设备网络
|
|
53
|
+
|
|
54
|
+
### unsigned.hap 真机装不上
|
|
55
|
+
|
|
56
|
+
- **现象**:CLI 打包成功,真机安装失败。
|
|
57
|
+
- **根因**:未配置 `signingConfigs`。
|
|
58
|
+
- **正确做法**:见 `dwy-arkts-ui-build.md` §11。
|
|
59
|
+
- **适用**:真机分发。
|
|
60
|
+
|
|
61
|
+
### 模拟器代理设置无法让 ADB 连局域网电视
|
|
62
|
+
|
|
63
|
+
- **现象**:在 HVD「代理设置」里配代理/DNS,仍连不上 `192.168.x.x:5555`。
|
|
64
|
+
- **根因**:代理只走 HTTP 出网;app 用原始 TCP;HVD 为 NAT 非 LAN peer。
|
|
65
|
+
- **正确做法**:见 `dwy-arkts-ui-build.md` §13;真机同 Wi-Fi。
|
|
66
|
+
- **适用**:局域网调试类产品。
|
|
67
|
+
|
|
68
|
+
### HVD 命令行启停
|
|
69
|
+
|
|
70
|
+
- **现象**:不会脱离 IDE 起模拟器。
|
|
71
|
+
- **正确做法**:见 `dwy-arkts-ui-build.md` §12。
|
|
72
|
+
- **适用**:脚本化调试。
|
|
@@ -282,6 +282,53 @@ class CreateUserRequest(BaseModel):
|
|
|
282
282
|
- 所有类、所有方法/函数(含私有)**必须**有 docstring
|
|
283
283
|
- docstring 统一使用 **Google 风格**
|
|
284
284
|
|
|
285
|
+
### 临时代码标识(强制)
|
|
286
|
+
|
|
287
|
+
产品源码中的业务待办、调试旁路、假数据**必须**用固定标签,便于编辑器全局搜索。`tests/` 内正规 mock / fixture **不强制**。
|
|
288
|
+
|
|
289
|
+
| 标签 | 用途 | 格式 |
|
|
290
|
+
|---|---|---|
|
|
291
|
+
| `TODO` | 业务/技术未完成 | `# TODO(name, YYYY-MM-DD): 说明`(推荐带责任人与日期) |
|
|
292
|
+
| `TESTCODE` | 临时调试、跳过校验、试验开关 | `# TESTCODE: 说明 + 移除条件` |
|
|
293
|
+
| `MOCK` | 假数据、假接口、stub 实现 | `# MOCK: 说明 + 将来替换点` |
|
|
294
|
+
|
|
295
|
+
- 写 mock/调试代码的**同一 diff 必须带标**;接真实现后**删标签与包夹**
|
|
296
|
+
- 禁止无标签假返回;禁止自造 `# 假数据`、`# test only` 等替代词
|
|
297
|
+
- 发版/提测前 `rg 'MOCK|TESTCODE'`,清单交给负责人确认(允许残留但须知情)
|
|
298
|
+
|
|
299
|
+
**单行**(仅一行代码):
|
|
300
|
+
|
|
301
|
+
```python
|
|
302
|
+
# MOCK: 登录假 token,接 POST /auth/login 后删除
|
|
303
|
+
return {"token": "fake-token"}
|
|
304
|
+
|
|
305
|
+
# TESTCODE: 强制测试账号,提测前删除
|
|
306
|
+
user_id = 1
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**多行 / 大段(≥2 行逻辑)强制包夹**:
|
|
310
|
+
|
|
311
|
+
```text
|
|
312
|
+
# MOCK BEGIN: <说明 + 将来替换点>
|
|
313
|
+
...
|
|
314
|
+
# MOCK END
|
|
315
|
+
|
|
316
|
+
# TESTCODE BEGIN: <说明 + 移除条件>
|
|
317
|
+
...
|
|
318
|
+
# TESTCODE END
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
```python
|
|
322
|
+
# MOCK BEGIN: 用户详情假数据,接 UserRepository.get 后删除
|
|
323
|
+
user = {
|
|
324
|
+
"id": 1,
|
|
325
|
+
"name": "张三",
|
|
326
|
+
"roles": ["admin"],
|
|
327
|
+
}
|
|
328
|
+
return user
|
|
329
|
+
# MOCK END
|
|
330
|
+
```
|
|
331
|
+
|
|
285
332
|
### 完整示例(模块 / 类 / 方法 / 私有方法 docstring)
|
|
286
333
|
|
|
287
334
|
```python
|
|
@@ -453,6 +453,60 @@ import type { UserInfo } from '@/features/users/types'
|
|
|
453
453
|
5. 全部使用**中文**,**禁止**混用中英文
|
|
454
454
|
6. 代码改了,注释**必须**同步更新
|
|
455
455
|
|
|
456
|
+
### 临时代码标识(强制 · TS / Vue)
|
|
457
|
+
|
|
458
|
+
产品源码(`src/`)中的业务待办、调试旁路、假数据**必须**用固定标签。`tests/` 内 Vitest mock **不强制**。
|
|
459
|
+
|
|
460
|
+
| 标签 | 用途 | 格式 |
|
|
461
|
+
|---|---|---|
|
|
462
|
+
| `TODO` | 业务/技术未完成 | `// TODO(name, YYYY-MM-DD): 说明`(推荐) |
|
|
463
|
+
| `TESTCODE` | 临时调试、`console` 后门、试验开关 | `// TESTCODE: 说明 + 移除条件` |
|
|
464
|
+
| `MOCK` | 假数据、假接口、stub | `// MOCK: 说明 + 将来替换点` |
|
|
465
|
+
|
|
466
|
+
- `<script>` / `.ts` 用 `//`;模板用 `<!-- ... -->`
|
|
467
|
+
- 写 mock/调试的**同一 diff 必须带标**;接真实现后**删标签与包夹**
|
|
468
|
+
- 禁止无标签假返回;禁止自造 `// 假数据` 等替代词
|
|
469
|
+
- 发版前搜 `MOCK`、`TESTCODE`,清单确认(允许残留但须知情)
|
|
470
|
+
|
|
471
|
+
**单行**(仅一行代码):
|
|
472
|
+
|
|
473
|
+
```ts
|
|
474
|
+
// MOCK: 首页 banner 假数据,接 GET /banners 后删除
|
|
475
|
+
const banners = ref([{ id: 1, title: 'demo' }])
|
|
476
|
+
|
|
477
|
+
// TESTCODE: 打开时 dump store,上线前删除
|
|
478
|
+
// console.log(store.$state)
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
**多行 / 大段(≥2 行逻辑)强制包夹**:
|
|
482
|
+
|
|
483
|
+
```text
|
|
484
|
+
// MOCK BEGIN: <说明 + 将来替换点>
|
|
485
|
+
...
|
|
486
|
+
// MOCK END
|
|
487
|
+
|
|
488
|
+
// TESTCODE BEGIN: <说明 + 移除条件>
|
|
489
|
+
...
|
|
490
|
+
// TESTCODE END
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
```ts
|
|
494
|
+
// MOCK BEGIN: 首页假数据,接 GET /home 后删除
|
|
495
|
+
const banners = ref([
|
|
496
|
+
{ id: 1, title: 'demo-a' },
|
|
497
|
+
{ id: 2, title: 'demo-b' },
|
|
498
|
+
])
|
|
499
|
+
const user = ref({ name: '张三' })
|
|
500
|
+
// MOCK END
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
```vue
|
|
504
|
+
<!-- MOCK BEGIN: 无接口时的占位,接 CMS 后删除 -->
|
|
505
|
+
<div>占位标题</div>
|
|
506
|
+
<div>占位副标题</div>
|
|
507
|
+
<!-- MOCK END -->
|
|
508
|
+
```
|
|
509
|
+
|
|
456
510
|
### 示例
|
|
457
511
|
|
|
458
512
|
```typescript
|
|
@@ -509,6 +563,7 @@ AI 编写或审查 Vue 代码时,**必须**检查以下违规模式:
|
|
|
509
563
|
| 解构 store 丢响应性 | `const { x } = store`(应用 `storeToRefs`) | 高 |
|
|
510
564
|
| 注释缺失 | 导出函数 / 类型 / 接口字段无中文注释 | 中 |
|
|
511
565
|
| 注释为英文 | 项目中文环境下写英文注释 | 中 |
|
|
566
|
+
| 无标签 mock/调试 | `src/` 假数据或调试旁路未标 `MOCK:` / `TESTCODE:` | 高 |
|
|
512
567
|
| 硬编码 API 地址 | URL 直接写在代码里,未走 `import.meta.env` | 高 |
|
|
513
568
|
| 相对路径回溯 | `../../../` 跨层导入 | 中 |
|
|
514
569
|
| scoped 替代 Tailwind | 大段 scoped CSS 实现可用 Tailwind 表达的样式 | 中 |
|
|
@@ -157,3 +157,10 @@ paths:
|
|
|
157
157
|
- **根因**:`switch` 在视图树里每次只保留当前 case 的子树,切 tab 时 SwiftUI **销毁**旧 tab 视图、**重建**新 tab 视图,`@State` 随之重置。它不是缓存容器。
|
|
158
158
|
- **正确做法**:用系统 `TabView(selection:)` + 每页 `.tag(...)`。TabView 保活所有 tab 页,切换只是显隐,状态天然保留。隐藏系统 tab bar(`.toolbar(.hidden, for: .tabBar)`)后用自绘底栏,`selection` 与自绘栏共用同一 `@State`。注意别用 `.tabViewStyle(.page)`(会引入左右滑动切页,与边缘返回手势冲突)。
|
|
159
159
|
- **适用**:iOS 16+ SwiftUI 多 tab 且需保留各 tab 页内状态时。
|
|
160
|
+
|
|
161
|
+
### Mac(Designed for iPhone/iPad)上 sheet 不继承 Observable environment,弹层即崩
|
|
162
|
+
|
|
163
|
+
- **现象**:iPhone 真机正常;把 iOS app 装到 macOS(「在 Mac 上使用 iPhone/iPad App」)后,一点「解锁」/付费墙/编辑设备/键盘 sheet 就崩。崩溃报告 `EXC_BREAKPOINT` / `SIGTRAP`,栈顶 `libswiftCore _assertionFailure` → `SwiftUICore EnvironmentValues.subscript.getter` → `SheetBridge.present` / `PresentationHostingController`。应用日志只到 `app 启动`。
|
|
164
|
+
- **根因**:`@Environment(Store.self)` / `@Environment(AppRouter.self)` 在未注入时会 fatal。iPhone 上 sheet 内容通常继承父树的 `.environment(...)`;Mac 上 UIKitMacHelper 走 `PresentationHostingController`,**不把父视图的 Observable environment 传进 sheet**,于是 `PaywallView` 等一 present 就 assertionFailure。
|
|
165
|
+
- **正确做法**:凡 sheet / fullScreenCover 内容里读了 `@Environment(SomeObservable.self)`,在 content 上**显式** `.environment(store)` / `.environment(router)` 重注入,不要依赖继承。嵌套 sheet 同样要再注一次。例:`PaywallView().environment(store)`、`DeviceEditSheet(...).environment(router)`、`KeyboardSheet().environment(router)`。
|
|
166
|
+
- **适用**:iOS 17+ `@Observable` + `.environment(instance)`,且 app 会在 Mac 上以 Designed for iPhone/iPad 运行时。iPhone 上不重注入多数也能跑,但为跨平台一致应一律重注入。
|
|
@@ -36,6 +36,52 @@ final class TaskListViewModel {}
|
|
|
36
36
|
- 统一 `guard` + early return,不要多层 `else`。
|
|
37
37
|
- 禁止 `try?` 吞异常;不写无意义 `value ?? default`。
|
|
38
38
|
|
|
39
|
+
### 临时代码标识(强制)
|
|
40
|
+
|
|
41
|
+
产品源码中的业务待办、调试旁路、假数据**必须**用固定标签(`//`,勿写进正式 `///` 文档注释)。单元测试 / UITest 正规 mock **不强制**。
|
|
42
|
+
|
|
43
|
+
| 标签 | 用途 | 格式 |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| `TODO` | 业务/技术未完成 | `// TODO(name, YYYY-MM-DD): 说明`(推荐) |
|
|
46
|
+
| `TESTCODE` | 临时调试、跳过生物识别/鉴权等 | `// TESTCODE: 说明 + 移除条件` |
|
|
47
|
+
| `MOCK` | 假数据、stub Service | `// MOCK: 说明 + 将来替换点` |
|
|
48
|
+
|
|
49
|
+
- 写 mock/调试的**同一 diff 必须带标**;接真实现后**删标签与包夹**
|
|
50
|
+
- 禁止无标签假返回;禁止自造 `// 假数据` 等替代词
|
|
51
|
+
- 发版/提测前搜 `MOCK`、`TESTCODE`,清单确认(允许残留但须知情)
|
|
52
|
+
|
|
53
|
+
**单行**(仅一行代码):
|
|
54
|
+
|
|
55
|
+
```swift
|
|
56
|
+
// MOCK: 个人资料假数据,接 ProfileService.fetch 后删除
|
|
57
|
+
let profile = Profile(name: "Demo", avatarURL: nil)
|
|
58
|
+
|
|
59
|
+
// TESTCODE: 跳过生物识别,提测包删除
|
|
60
|
+
// return true
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**多行 / 大段(≥2 行逻辑)强制包夹**:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
// MOCK BEGIN: <说明 + 将来替换点>
|
|
67
|
+
...
|
|
68
|
+
// MOCK END
|
|
69
|
+
|
|
70
|
+
// TESTCODE BEGIN: <说明 + 移除条件>
|
|
71
|
+
...
|
|
72
|
+
// TESTCODE END
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```swift
|
|
76
|
+
// MOCK BEGIN: 个人资料假数据,接 ProfileService.fetch 后删除
|
|
77
|
+
let profile = Profile(
|
|
78
|
+
name: "Demo",
|
|
79
|
+
avatarURL: nil,
|
|
80
|
+
roles: ["user"]
|
|
81
|
+
)
|
|
82
|
+
// MOCK END
|
|
83
|
+
```
|
|
84
|
+
|
|
39
85
|
## 全面屏与布局
|
|
40
86
|
|
|
41
87
|
- 默认尊重安全区;固定内容区用 `safeAreaInset` / `safeAreaPadding`。
|
package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md
CHANGED
|
@@ -135,16 +135,19 @@ Scope 由 AI 根据变更模块与项目语义自行决定,保持与现有提
|
|
|
135
135
|
|
|
136
136
|
## 8. AI 署名与生成声明治理
|
|
137
137
|
|
|
138
|
-
commit 的 subject、body、footer、trailer
|
|
138
|
+
commit 的 subject、body、footer、trailer 中禁止出现任何形式的 AI 署名或生成声明。AI 应自行判断:凡由 AI 工具(Claude、ChatGPT、GPT、Copilot、Cursor、Gemini、Llama、LLM 等)生成或参与撰写的署名、尾随声明、自动生成标记,均不得写入 commit message。
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
- `
|
|
143
|
-
- `Claude
|
|
144
|
-
-
|
|
140
|
+
包括但不限于:
|
|
141
|
+
|
|
142
|
+
- `Co-Authored-By: <AI 名称> <noreply@...>`(任何 AI 产品 + 邮箱组合)
|
|
143
|
+
- `Generated with Claude Code` / `Generated with ...`(任何"由 XX 生成"声明)
|
|
144
|
+
- 含 AI 产品名的署名行(Claude、ChatGPT、GPT、Copilot、Cursor、Gemini、LLM 等)
|
|
145
|
+
- AI 平台noreply 邮箱(noreply@anthropic.com、noreply@openai.com 等)
|
|
145
146
|
|
|
146
147
|
`git commit -m "..."` 不得附带 AI 署名 trailer。
|
|
147
148
|
|
|
149
|
+
> PreToolUse hook `pre-git-commit-ai-signature-check.sh` 会在 commit message 中检出 Co-Authored-By / Generated with 等 AI 署名模式时硬拦截(exit 2),规则约束 + 工程兜底双保险。
|
|
150
|
+
|
|
148
151
|
## 9. 参考示例
|
|
149
152
|
|
|
150
153
|
- `feat(eui): 添加 Image 组件懒加载支持`
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 商用/销售类应用的开源依赖许可合规(禁不可商用与强 copyleft;仅强制署名时在隐私协议附录声明含版本)
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 商用开源依赖许可合规(强制)
|
|
6
|
+
|
|
7
|
+
> 销售、SaaS、付费 App、对外交付的商业产品引入开源库时,
|
|
8
|
+
> 许可不合规会带来版权/违约风险。本规则约束:选型禁区 + 强制署名时的声明义务。
|
|
9
|
+
|
|
10
|
+
## 一、适用边界
|
|
11
|
+
|
|
12
|
+
- **适用**:任何面向收费/销售/对外商用的应用(含内部先试用后商用的产品)
|
|
13
|
+
- **不适用**:纯学习/练手/未商用的 builder 原型(一旦要上架/收费,必须补齐本规则)
|
|
14
|
+
- **覆盖栈**:npm/pnpm、PyPI/uv、CocoaPods/SPM、Gradle/Maven、ohpm、pub、Docker 基础镜像、字体/图标/素材、模型权重与 SDK
|
|
15
|
+
- **声明范围**:仅 **直接依赖**;不强制盘传递依赖
|
|
16
|
+
|
|
17
|
+
## 二、核心原则(三条)
|
|
18
|
+
|
|
19
|
+
1. **先查许可,再装依赖** — 未确认 license 的包禁止引入
|
|
20
|
+
2. **明确不可商用 / 强 copyleft → 禁止直接使用** — 换可商用替代,或购买商业授权
|
|
21
|
+
3. **仅当许可强制要求署名 / NOTICE 时**,才在隐私协议附录中声明(含版本);**不强制署名的库不必写**
|
|
22
|
+
|
|
23
|
+
## 三、禁止引入(不可商用 / 高法律风险)
|
|
24
|
+
|
|
25
|
+
以下类型**默认禁止**写入依赖树(直接依赖必须查;已知会把禁区 license 顶进运行时链接的包也不得引):
|
|
26
|
+
|
|
27
|
+
| 类型 | 常见标识 | 原因 |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| 明确非商业 | `CC-BY-NC*`、`CC-NC`、`PolyForm-Noncommercial`、许可证写 Non-Commercial / No Commercial Use | 商用即侵权 |
|
|
30
|
+
| 强传染 copyleft(闭源商用) | `GPL-2.0`、`GPL-3.0`、`AGPL-3.0`、`SSPL` | 可能强制整包开源或限制网络服务形态;**闭源商用一律禁止** |
|
|
31
|
+
| 限制竞争/生产用途 | `BUSL`(未到 Change Date 且限制 Production)、Commons Clause、部分 Source-Available | 表面开源,实则禁商用或禁竞争 |
|
|
32
|
+
| 仅免费个人/评估 | 字体/图标/SDK 写 "free for personal use only"、"evaluation only" | 商用需买授权 |
|
|
33
|
+
| 无 license / 自定义模糊条款 | 仓库无 LICENSE、或 "all rights reserved" 却当开源用 | 默认不可用 |
|
|
34
|
+
|
|
35
|
+
### 例外(必须显式记录)
|
|
36
|
+
|
|
37
|
+
- 已购买**商业授权**且合同覆盖当前用途 → 可引入,记录授权方、合同编号、到期日
|
|
38
|
+
- LGPL 等边界许可 → 不得默认通过,须单独评估后再定
|
|
39
|
+
|
|
40
|
+
### 选型动作(强制)
|
|
41
|
+
|
|
42
|
+
引入新依赖时在选型对比中增加一列 **License**,并标注:
|
|
43
|
+
|
|
44
|
+
- `OK-商用`(可商用;若无强制署名义务则声明页可不写)
|
|
45
|
+
- `OK-商用+强制署名`(MIT/BSD/Apache-2.0/ISC 等要求保留版权与许可声明 → 须进隐私协议附录)
|
|
46
|
+
- `OK-商用+额外义务`(如 Apache NOTICE、MPL 文件级 copyleft 等 → 按义务处理,署名类进附录)
|
|
47
|
+
- `禁-不可商用/高风险`(上表)→ **不得推荐为默认项**
|
|
48
|
+
|
|
49
|
+
## 四、强制署名时的声明义务
|
|
50
|
+
|
|
51
|
+
### 4.1 何时必须声明(仅此场景)
|
|
52
|
+
|
|
53
|
+
直接依赖的 license **明确要求** attribution / copyright notice / NOTICE / 保留许可文本时,必须声明。
|
|
54
|
+
|
|
55
|
+
**不强制署名则不写**:无保留声明义务的可商用库,不必塞进隐私协议或开源列表。
|
|
56
|
+
|
|
57
|
+
### 4.2 声明落点
|
|
58
|
+
|
|
59
|
+
- **唯一约定落点**:隐私协议 **附录**「第三方开源组件」
|
|
60
|
+
- 不与个人信息处理条款正文混写;附录与正文分节
|
|
61
|
+
- 若产品另有「关于 / 法律信息」页,可链到该附录,不替代附录本身
|
|
62
|
+
|
|
63
|
+
### 4.3 每条声明最低字段(强制)
|
|
64
|
+
|
|
65
|
+
| 字段 | 说明 | 示例 |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| 组件名 | 直接依赖包名 | `axios` |
|
|
68
|
+
| 版本 | **实际锁定版本**(lockfile / 构建锁定) | `1.7.9` |
|
|
69
|
+
| 许可证 | SPDX 标识 | `MIT` |
|
|
70
|
+
| 版权声明 | 来自 LICENSE / 包元数据 | `Copyright (c) 2014-present Matt Zabriskie` |
|
|
71
|
+
| 许可全文或链接 | 全文或稳定 URL | `https://opensource.org/licenses/MIT` |
|
|
72
|
+
|
|
73
|
+
**版本必须写锁定版本**,禁止只写 `latest` 或不写版本。
|
|
74
|
+
|
|
75
|
+
### 4.4 声明模板(可直接贴进隐私协议附录)
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
附录:第三方开源组件
|
|
79
|
+
|
|
80
|
+
本产品直接使用的、且许可证要求保留声明的开源组件如下:
|
|
81
|
+
|
|
82
|
+
1. axios 1.7.9
|
|
83
|
+
License: MIT
|
|
84
|
+
Copyright (c) 2014-present Matt Zabriskie
|
|
85
|
+
https://github.com/axios/axios/blob/v1.7.9/LICENSE
|
|
86
|
+
|
|
87
|
+
2. dayjs 1.11.13
|
|
88
|
+
License: MIT
|
|
89
|
+
Copyright (c) 2018-present, iamkun
|
|
90
|
+
https://github.com/iamkun/dayjs/blob/v1.11.13/LICENSE
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
仅列 **直接依赖 + 许可强制署名** 的项;无强制署名义务的直接依赖不列。
|
|
94
|
+
|
|
95
|
+
### 4.5 何时更新声明
|
|
96
|
+
|
|
97
|
+
- 新增/替换直接依赖,且其许可强制署名
|
|
98
|
+
- 已声明组件的主版本或锁定版本变更
|
|
99
|
+
- 发版前:附录中的版本 vs lockfile **必须一致**;已移除的组件从附录删掉
|
|
100
|
+
|
|
101
|
+
## 五、执行检查清单(引入依赖 / 发版前)
|
|
102
|
+
|
|
103
|
+
- [ ] 直接依赖均有明确 SPDX license(或等价官方许可文本)
|
|
104
|
+
- [ ] 无 NC / 非商业 / GPL / AGPL / SSPL / 评估版字体图标等禁区
|
|
105
|
+
- [ ] 无未评估的 LGPL / 商业授权到期风险
|
|
106
|
+
- [ ] 仅对「许可强制署名」的直接依赖写入隐私协议附录(含版本号)
|
|
107
|
+
- [ ] 不强制署名的库未滥写进附录
|
|
108
|
+
- [ ] 附录版本与 lockfile 一致
|
|
109
|
+
|
|
110
|
+
## 六、AI 行为约束
|
|
111
|
+
|
|
112
|
+
- 推荐开源方案时:**必须带 license 与商用结论**(OK / OK+强制署名 / 禁 / 需商业授权)
|
|
113
|
+
- 候选为 NC / GPL / AGPL / SSPL / 无 license:**不得作为推荐默认项**;列出可商用替代
|
|
114
|
+
- 生成/修改隐私协议时:扫描直接依赖,**只把强制署名的项**写入附录「第三方开源组件」
|
|
115
|
+
- 不得以「业界都在用」跳过 license 核查
|
|
116
|
+
- 不得把无强制署名义务的库整表刷进隐私协议
|
|
117
|
+
|
|
118
|
+
## 七、常见许可速查(非穷尽)
|
|
119
|
+
|
|
120
|
+
| SPDX | 商用闭源 | 是否强制进隐私协议附录 |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| MIT / ISC / BSD-2/3 | 可 | **是**(要求保留版权与许可声明) |
|
|
123
|
+
| Apache-2.0 | 可 | **是**(保留 NOTICE / 声明) |
|
|
124
|
+
| MPL-2.0 | 通常可 | 按义务;修改过的 MPL 文件另有开源义务 |
|
|
125
|
+
| LGPL-2.1/3.0 | 须单独评估 | 评估通过后再定声明 |
|
|
126
|
+
| GPL / AGPL / SSPL | **禁** | —(不得引入) |
|
|
127
|
+
| CC-BY-NC* | **禁** | —(不得引入) |
|
|
128
|
+
| 无 license | **禁** | —(不得引入) |
|
|
@@ -153,10 +153,31 @@ git -C "$REPO_PATH" mv <仓库内相对路径> <new-相对路径>
|
|
|
153
153
|
|
|
154
154
|
**冲突处理**:目标已存在 → AskUserQuestion 让用户选「覆盖 / 改名 / 取消」。
|
|
155
155
|
|
|
156
|
+
### 步骤 6.5:bump ai-tools 内部版本 + CHANGELOG(强制)
|
|
157
|
+
|
|
158
|
+
凡改动 `$REPO_PATH/dwy-cli/templates/ai-tools/` 下任意内容,**必须**同批更新:
|
|
159
|
+
|
|
160
|
+
| 文件 | 动作 |
|
|
161
|
+
| ---- | ---- |
|
|
162
|
+
| `dwy-cli/templates/ai-tools/VERSION` | 按 `CHANGELOG.md` 内维护约定 bump(MAJOR / MINOR / PATCH) |
|
|
163
|
+
| `dwy-cli/templates/ai-tools/CHANGELOG.md` | 顶部追加 `## x.y.z — YYYY-MM-DD` 段 + Added/Changed/Fixed/Removed |
|
|
164
|
+
|
|
165
|
+
约定全文见:`$REPO_PATH/dwy-cli/templates/ai-tools/CHANGELOG.md`「维护约定」。
|
|
166
|
+
|
|
167
|
+
- 新增 skill/rule/hook/command 或新增强制约束 → 至少 **MINOR**
|
|
168
|
+
- 仅修正文案 / 链接 / 不改强制语义 → **PATCH**
|
|
169
|
+
- 破坏同步结构 / 删除广泛依赖项且无迁移 → **MAJOR**
|
|
170
|
+
|
|
171
|
+
**禁止**只提交模板文件而不改 `VERSION` + `CHANGELOG.md`。
|
|
172
|
+
|
|
156
173
|
### 步骤 7:staged + 显示 diff
|
|
157
174
|
|
|
158
175
|
```bash
|
|
159
176
|
git -C "$REPO_PATH" add <精准路径>
|
|
177
|
+
# 务必包含 VERSION 与 CHANGELOG
|
|
178
|
+
git -C "$REPO_PATH" add \
|
|
179
|
+
"$REPO_PATH/dwy-cli/templates/ai-tools/VERSION" \
|
|
180
|
+
"$REPO_PATH/dwy-cli/templates/ai-tools/CHANGELOG.md"
|
|
160
181
|
git -C "$REPO_PATH" status --short
|
|
161
182
|
git -C "$REPO_PATH" diff --cached --stat
|
|
162
183
|
```
|
|
@@ -170,7 +191,7 @@ git -C "$REPO_PATH" diff --cached --stat
|
|
|
170
191
|
按项目 `CLAUDE.md` 中 Git Commit Scope 规范:
|
|
171
192
|
- scope: `cli`
|
|
172
193
|
- type: `feat`(新模板)/ `fix`(修复模板)/ `docs`(仅文档)
|
|
173
|
-
- subject: 中文动宾短语 ≤72
|
|
194
|
+
- subject: 中文动宾短语 ≤72 字符;可附 ai-tools 版本号(如 `ai-tools 0.2.0`)
|
|
174
195
|
- **禁** AI 署名 / Co-Authored-By trailer
|
|
175
196
|
|
|
176
197
|
模板:
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
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 配置。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# iOS/macOS App Store 上架
|
|
7
|
+
|
|
8
|
+
将开发完成的 Apple 应用整理为可确认、可审计、可重复执行的发布包。API 优先;新建 App Record、App Privacy 等 API 外页面才使用已登录 Playwright。
|
|
9
|
+
|
|
10
|
+
## 安全边界
|
|
11
|
+
|
|
12
|
+
- Skill 模板目录禁止保存任何 API Key、`.p8` 私钥、Cookie、审核账号密码或税务材料。
|
|
13
|
+
- 只从 `/Users/chances/.dwy/app-store-connect/` 读取用户私有配置。首次运行时询问 Issuer ID、Key ID、团队和私钥文件位置,再调用 `scripts/appstore_config.sh` 写入。
|
|
14
|
+
- 不将秘密写入项目、Git、`appstore-submission.yaml` 或执行日志。审核账号在发布包中只能使用钥匙串或环境变量引用。
|
|
15
|
+
- 提交审核、正式发布、价格上调前,必须显示变更并获得用户二次确认。
|
|
16
|
+
|
|
17
|
+
## 首次配置
|
|
18
|
+
|
|
19
|
+
1. 执行 `scripts/appstore_config.sh init`,创建权限 `0700` 的用户私有目录。
|
|
20
|
+
2. 逐项询问用户,再执行 `set --issuer-id <id> --key-id <id> [--team-id <id>]`。
|
|
21
|
+
3. 用户提供现有 `.p8` 文件路径后,执行 `import-key --path <absolute-path>`;禁止让用户在聊天中粘贴私钥内容。
|
|
22
|
+
4. 使用 `get` 验证非秘密标识;不要打印私钥或会话文件。
|
|
23
|
+
|
|
24
|
+
## 发布包与资料收集
|
|
25
|
+
|
|
26
|
+
将 `assets/appstore-submission.yaml` 复制到用户私有目录下 `submissions/<bundle-id>/`,逐步收集并在每步确认:
|
|
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. 商业:应用价格、全地区可售、内购或订阅的权益、价格、地区和审核截图。
|
|
33
|
+
|
|
34
|
+
## 地区、ICP 与本地化
|
|
35
|
+
|
|
36
|
+
- 默认应用、内购和订阅均为 `all_territories`;产品页本地化仅 `zh-Hans`、`en-US`。
|
|
37
|
+
- ICP/APP 备案号为非阻塞字段。缺失时继续配置其它全部地区,并在执行报告标记中国大陆待办。
|
|
38
|
+
- 用户后续提供备案号后,单独写入并启用中国大陆;不得重新填写其它已确认资料。
|
|
39
|
+
|
|
40
|
+
## 自动化顺序
|
|
41
|
+
|
|
42
|
+
1. 读取发布包、项目构建信息和 API 配置,先输出完整 diff。
|
|
43
|
+
2. 用 API 写入 App 信息、版本本地化、价格、地区、年龄分级、审核资料、截图、内购和订阅。
|
|
44
|
+
3. 对 API 未覆盖项复用用户已登录 Playwright 会话:创建 App Record、填写 App Privacy 或处理网页专属确认。
|
|
45
|
+
4. 关联构建与审核提交。仅在用户再次确认后调用提交审核或发布动作。
|
|
46
|
+
5. 输出成功、失败、待补 ICP 和人工确认项,保存无秘密执行记录。
|
|
47
|
+
|
|
48
|
+
## 内购与订阅
|
|
49
|
+
|
|
50
|
+
- 校验 `product_id` 与 StoreKit 代码一致,再创建消耗型、非消耗型内购或自动续期订阅。
|
|
51
|
+
- 每个内购必须提交一张用于审核的 `1280 × 800` 像素截图;按 [内购审核截图](references/in-app-purchase-review.md) 从真实购买流程采集并校验。
|
|
52
|
+
- 默认全地区可售;以美国区目标价格查询 Apple 价格点,并由 Apple 自动等价换算其它地区价格。
|
|
53
|
+
- 价格修改必须展示旧价、新价、生效时间和受影响地区;用户二次确认后才执行。
|
|
54
|
+
|
|
55
|
+
## 网页自动化限制
|
|
56
|
+
|
|
57
|
+
- 只使用用户已登录会话,不索取 Apple ID 密码或二次验证码。
|
|
58
|
+
- 遇到验证码、实名核验、协议、税务、银行、证照上传或法律声明时暂停并交由用户完成。
|
|
59
|
+
- App Review 拒审后整理证据、修复清单与回复草稿;回复或重新提交前确认。
|
|
60
|
+
|
|
61
|
+
## 参考资料
|
|
62
|
+
|
|
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)。
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 已确认的发布包模板;秘密仅使用外部引用,不能填入此文件。
|
|
2
|
+
schema_version: 1
|
|
3
|
+
application:
|
|
4
|
+
bundle_id: ""
|
|
5
|
+
sku: ""
|
|
6
|
+
platforms: [ios, macos]
|
|
7
|
+
availability: all_territories
|
|
8
|
+
china_mainland:
|
|
9
|
+
icp_status: not_started
|
|
10
|
+
icp_filing_number: ""
|
|
11
|
+
localizations:
|
|
12
|
+
zh-Hans:
|
|
13
|
+
name: ""
|
|
14
|
+
subtitle: ""
|
|
15
|
+
description: ""
|
|
16
|
+
keywords: ""
|
|
17
|
+
support_url: ""
|
|
18
|
+
privacy_policy_url: ""
|
|
19
|
+
en-US:
|
|
20
|
+
name: ""
|
|
21
|
+
subtitle: ""
|
|
22
|
+
description: ""
|
|
23
|
+
keywords: ""
|
|
24
|
+
support_url: ""
|
|
25
|
+
privacy_policy_url: ""
|
|
26
|
+
screenshots:
|
|
27
|
+
ios: { zh-Hans: [], en-US: [] }
|
|
28
|
+
macos: { zh-Hans: [], en-US: [] }
|
|
29
|
+
# 每个内购条目必须带 `review_screenshot`,尺寸固定为 1280x800 像素。
|
|
30
|
+
in_app_purchases: []
|
|
31
|
+
subscriptions: []
|
|
32
|
+
review:
|
|
33
|
+
contact_name: ""
|
|
34
|
+
contact_email: ""
|
|
35
|
+
contact_phone: ""
|
|
36
|
+
demo_credentials_reference: ""
|
|
37
|
+
notes: ""
|
|
38
|
+
confirmations:
|
|
39
|
+
metadata_confirmed: false
|
|
40
|
+
privacy_confirmed: false
|
|
41
|
+
pricing_confirmed: false
|
|
42
|
+
submit_for_review_confirmed: false
|
|
43
|
+
release_confirmed: false
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# App Store Connect API 与网页补齐
|
|
2
|
+
|
|
3
|
+
## API 优先动作
|
|
4
|
+
|
|
5
|
+
使用 App Store Connect API 创建或更新版本本地化、App 信息、分类、年龄分级、地区可售性、应用价格、内购、订阅、审核资料、截图和审核提交。每次写入前读取当前资源并生成字段 diff。
|
|
6
|
+
|
|
7
|
+
## 网页补齐动作
|
|
8
|
+
|
|
9
|
+
只在 API 无法覆盖时,使用用户已登录的 Playwright 会话:创建 App Record、App Privacy 问卷和 Apple 要求的网页专属确认。不得自动绕过验证码或复用未授权会话。
|
|
10
|
+
|
|
11
|
+
## 中国大陆
|
|
12
|
+
|
|
13
|
+
默认请求全地区可售。若 Apple 返回 ICP 缺失或无效状态,保留其它地区配置并在执行记录中登记备案待办。用户提供有效备案号后,单独重试中国大陆。
|
|
14
|
+
|
|
15
|
+
## 最终门禁
|
|
16
|
+
|
|
17
|
+
下列动作必须再次询问用户:提交审核、正式发布、提高价格、启用中国大陆(当备案资料刚补齐时)。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 内购审核截图
|
|
2
|
+
|
|
3
|
+
## 本项目固定规格
|
|
4
|
+
|
|
5
|
+
每个内购项目提交一张 `1280 × 800` 像素、16:10 的审核截图。图片必须来自真实购买路径,清晰展示商品或服务、价格入口与购买后的可获得权益;禁止使用与应用不一致的概念图。
|
|
6
|
+
|
|
7
|
+
## 采集与上传
|
|
8
|
+
|
|
9
|
+
1. 使用审核账号或 StoreKit 测试环境进入目标商品购买页。
|
|
10
|
+
2. 在 macOS 16:10 画布导出 `1280 × 800` PNG 或 JPG,移除用户身份、支付凭据和生产数据。
|
|
11
|
+
3. 上传前校验精确像素、RGB、无透明通道和单张文件约束。
|
|
12
|
+
4. 通过 `inAppPurchaseAppStoreReviewScreenshots` 的预留、上传、提交流程写入对应内购;上传后读取资源状态确认成功。
|
|
13
|
+
|
|
14
|
+
## Apple 规格关系
|
|
15
|
+
|
|
16
|
+
Apple 将内购审核截图用于审核而非商店展示,并要求它符合应用支持的平台截图规格。本项目将 `1280 × 800` 作为固定的 macOS 审核画布;如果 Apple 后续针对目标平台返回更严格的校验错误,停止上传并提示用户确认平台规格,不擅自缩放或裁剪。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# iOS/macOS 截图工作流
|
|
2
|
+
|
|
3
|
+
## 采集
|
|
4
|
+
|
|
5
|
+
从真实 iOS 模拟器和 macOS 应用构建采集截图。先向用户确认截图剧本:启动方式、测试账号引用、页面路径、测试数据、脱敏规则和中英文文案。禁止以与实际应用不一致的生成图替代功能展示。
|
|
6
|
+
|
|
7
|
+
## 分平台输出
|
|
8
|
+
|
|
9
|
+
- iOS 和 macOS 必须分别采集、设计、校验和上传,不能将同一图片简单缩放复用。
|
|
10
|
+
- 每种平台、设备尺寸和语言输出 1 到 10 张 JPEG/JPG/PNG;不得包含 Alpha 通道。
|
|
11
|
+
- macOS 使用 16:10:`1280x800`、`1440x900`、`2560x1600` 或 `2880x1800`。
|
|
12
|
+
- iOS 根据目标 iPhone 展示尺寸选择 Apple 当前接受的规格;执行时先读取 Apple 官方截图规格,避免使用过期机型尺寸。
|
|
13
|
+
|
|
14
|
+
## 上传前检查
|
|
15
|
+
|
|
16
|
+
检查尺寸、方向、格式、无透明通道、语言目录、页面顺序、隐私脱敏和平台归属。先生成本地预览和上传清单,用户确认后才上传。
|