create-dwy 0.19.1 → 0.20.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 (98) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/package.json +1 -1
  3. package/src/cli-help.js +28 -2
  4. package/src/sync-all.js +95 -583
  5. package/src/sync-codex.js +14 -7
  6. package/src/sync-opencode.js +8 -22
  7. package/src/sync.js +60 -149
  8. package/src/tab-multiselect.js +15 -53
  9. package/templates/ai-tools/CHANGELOG.md +195 -0
  10. package/templates/ai-tools/CLAUDE.md +39 -58
  11. package/templates/ai-tools/VERSION +1 -1
  12. package/templates/ai-tools/hooks/Git/pre-git-commit-ai-signature-check.sh +5 -4
  13. package/templates/ai-tools/rules/Android/dwy-android-core.md +147 -13
  14. package/templates/ai-tools/rules/Android/dwy-android-layering.md +142 -0
  15. package/templates/ai-tools/rules/Android/dwy-android-mvp.md +55 -0
  16. package/templates/ai-tools/rules/Android/dwy-android-support-only.md +2 -0
  17. package/templates/ai-tools/rules/Docker/dwy-docker.md +23 -1
  18. package/templates/ai-tools/rules/Flutter/dwy-flutter-core.md +2 -0
  19. package/templates/ai-tools/rules/Flutter/dwy-flutter-testing.md +1 -1
  20. package/templates/ai-tools/rules/HarmonyOS/dwy-arkts-ui-build.md +12 -8
  21. package/templates/ai-tools/rules/Python/dwy-python-backend.md +4 -43
  22. package/templates/ai-tools/rules/Python/dwy-python-layering.md +169 -0
  23. package/templates/ai-tools/rules/Vue/dwy-vue-core.md +11 -49
  24. package/templates/ai-tools/rules/Vue/dwy-vue-layering.md +153 -0
  25. package/templates/ai-tools/rules/iOS/dwy-apple-layering.md +133 -0
  26. package/templates/ai-tools/rules/iOS/dwy-swift-core.md +2 -0
  27. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-code-craft.md +83 -0
  28. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-dependency-freshness.md +27 -66
  29. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +8 -219
  30. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-oss-commercial-license.md +27 -123
  31. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-prod-branch.md +31 -0
  32. package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-postgres.md +17 -10
  33. package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-redis.md +6 -3
  34. package/templates/ai-tools/skills/Docker/dwy-deploy-first/SKILL.md +14 -14
  35. package/templates/ai-tools/skills/Docker/dwy-deploy-first/references/chapter-01-mirrors.md +2 -2
  36. package/templates/ai-tools/skills/Docker/dwy-docker/SKILL.md +21 -13
  37. package/templates/ai-tools/skills/Docker/dwy-docker/references/ask-templates.md +13 -12
  38. package/templates/ai-tools/skills/Docker/dwy-docker/references/templates.md +3 -1
  39. package/templates/ai-tools/skills/Docker/dwy-docker/references/version-rules.md +10 -6
  40. package/templates/ai-tools/skills/Docker/dwy-docker/scripts/query_dockerhub.py +21 -6
  41. package/templates/ai-tools/skills/Docker/dwy-docker/scripts/scan_images.sh +2 -2
  42. package/templates/ai-tools/skills/Docker/dwy-mirror-source/SKILL.md +44 -30
  43. package/templates/ai-tools/skills/Docker/dwy-mirror-source/references/dockerfile-snippets.md +2 -0
  44. package/templates/ai-tools/skills/Docker/dwy-mirror-source/references/mirror-providers.md +8 -8
  45. package/templates/ai-tools/skills/Docker/dwy-mirror-source/scripts/apply_mirrors.py +14 -1
  46. package/templates/ai-tools/skills/Docker/dwy-mirror-source/scripts/check_mirrors.py +4 -0
  47. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/SKILL.md +8 -6
  48. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/digest/python-sdk.md +3 -3
  49. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/digest/stream-engine.md +2 -2
  50. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/anti-patterns.md +3 -1
  51. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/change-checklist.md +4 -4
  52. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/lethal-violations.md +5 -5
  53. package/templates/ai-tools/skills/DolphinDB/dwy-dolphindb/references/review-rules/perf-baselines.md +5 -5
  54. package/templates/ai-tools/skills/Python/dwy-eapi/SKILL.md +2 -2
  55. package/templates/ai-tools/skills/Python/dwy-eapi/v0/breaking.md +3 -0
  56. package/templates/ai-tools/skills/Python/dwy-eapi/v0/email-canonical.md +28 -3
  57. package/templates/ai-tools/skills/Python/dwy-eapi/v0/index.md +2 -2
  58. package/templates/ai-tools/skills/Python/dwy-eapi/v0/providers-email.md +12 -2
  59. package/templates/ai-tools/skills/Vue/dwy-eui/references/eui-design-guide.md +1 -1
  60. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-architecture/SKILL.md +11 -14
  61. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-product-launcher/references/state-and-contract.md +1 -1
  62. package/templates/ai-tools/skills//344/272/247/345/223/2010/345/210/2601/dwy-prototype/SKILL.md +1 -1
  63. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-github-action-publish/SKILL.md +32 -15
  64. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-github-action-publish/references/electron-release-workflow-template.yml +3 -1
  65. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-github-action-publish/references/release-workflow-template.yml +8 -5
  66. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-ios-app-store-release/SKILL.md +1 -1
  67. 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 +1 -1
  68. 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 +2 -0
  69. 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
  70. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/SKILL.md +4 -3
  71. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/android.md +1 -1
  72. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/backend-deploy.md +1 -1
  73. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/changelog.md +45 -27
  74. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/frontend-deploy.md +1 -1
  75. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/generic-release.md +1 -1
  76. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/git-tag.md +1 -1
  77. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/harmony.md +1 -1
  78. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-publish/references/ios.md +1 -1
  79. package/templates/ai-tools/skills//345/217/221/345/270/203/345/217/221/347/211/210/dwy-semver/SKILL.md +8 -0
  80. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/SKILL.md +7 -7
  81. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/checks-runtime.md +63 -59
  82. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_base.sh +10 -1
  83. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_capacity.sh +21 -23
  84. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_db.sh +9 -1
  85. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_docker.sh +20 -24
  86. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/scripts/check_logs.sh +3 -3
  87. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/SKILL.md +4 -2
  88. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/references/api.md +1 -1
  89. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/dwy-doubao-tts/scripts/synthesize.py +1 -0
  90. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/SKILL.md +7 -5
  91. package/templates/ai-tools/skills//350/207/252/345/252/222/344/275/223/media-platform-packaging/references/platform-copy-examples.md +5 -3
  92. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-dependency-choice/SKILL.md +140 -0
  93. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-git-commit/SKILL.md +113 -0
  94. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-shared/SKILL.md +16 -13
  95. package/templates/ai-tools/skills//351/200/232/347/224/250/dwy-whiteboard-prototype/SKILL.md +1 -1
  96. package/src/sync-packs.js +0 -223
  97. package/src/sync-scene.js +0 -178
  98. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-development.md +0 -115
@@ -1,224 +1,13 @@
1
1
  ---
2
- description: Git Commit 规范(提交前同步远程、冲突处理、提交安全、敏感扫描、Scope、消息规范、AI 署名治理)
2
+ description: Git 提交硬约束(先同步远程、敏感信息、message 格式、AI 署名)。命令和冲突步骤见 skill dwy-git-commit。无 paths,每次注入;不提交时忽略。
3
3
  ---
4
4
 
5
- # Git Commit 规范(强制)
5
+ # Git 提交(硬约束)
6
6
 
7
- ## 1. 适用范围
7
+ 只在本次任务包含提交、commit message、`git pull` / rebase 冲突、提交前检查时遵守。只改代码、不提交时忽略本文件。命令、冲突步骤、敏感名单见 skill `dwy-git-commit`。和本文件冲突时以该 skill 为准。
8
8
 
9
- 适用于所有 Git 提交流程,覆盖:
10
-
11
- - `git fetch` / `git pull`
12
- - `git add`
13
- - `git commit`(含 `--amend`)
14
- - 为提交生成或校验 commit message 的场景
15
-
16
- 项目按多人协作处理:本地未基于最新远程提交前,禁止产生新 commit。
17
-
18
- 任一步骤不通过:中止当前提交流交付流程。
19
-
20
- ## 2. 执行顺序(硬约束)
21
-
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 顶掉远程 | 禁止用强推代替拉取与消冲突 |
92
-
93
- ## 4. 安全写法(命令注入防护)
94
-
95
- `git commit -m "..."` 会对双引号内内容做 shell 展开。出现反引号或 `$(...)` 时,禁止直接使用双引号形式。
96
-
97
- ### 4.1 推荐:消息文件提交(优先)
98
-
99
- ```bash
100
- git commit -F /tmp/commit-msg.txt
101
- ```
102
-
103
- ```bash
104
- cat > /tmp/commit-msg.txt <<'EOF'
105
- feat: 示例提交说明
106
-
107
- - 修改点 A
108
- - 修改点 B
109
- EOF
110
- git commit -F /tmp/commit-msg.txt
111
- ```
112
-
113
- ### 4.2 允许:单引号提交
114
-
115
- ```bash
116
- git commit -m 'feat: 支持 runConcurrent'
117
- ```
118
-
119
- 前提:message 内无单引号字符。
120
-
121
- ### 4.3 禁止:双引号直接携带反引号
122
-
123
- ```bash
124
- git commit -m "feat: run `build-tool`"
125
- ```
126
-
127
- 上例存在命令替换风险。
128
-
129
- ### 4.4 兜底:转义(不推荐)
130
-
131
- ```bash
132
- git commit -m "feat: run \`build-tool\`"
133
- ```
134
-
135
- ## 5. Stage 级敏感扫描(强制)
136
-
137
- 同时扫描:
138
- - `git diff --cached`
139
- - `git diff --cached --name-only`
140
-
141
- ### 5.1 禁止提交文件
142
-
143
- `.env*`、`*.pem`、`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、`*.sql`(真实数据)、`*.dump`、`*.sqlite`、`*.xlsx`、`*.csv`(敏感表)、`*.log`、`pgdata/`、`cache/*.json`。
144
-
145
- ### 5.2 禁止内容片段(示例)
146
-
147
- `sk-` 开头 API Key、`AKIA` 开头 AWS Key、`ghp_` GitHub Token、`password=...`、`token=...`、`secret=...`、明文数据库连接串、私钥头、`IP:端口`、`ssh user@ip`。
148
-
149
- ### 5.3 例外
150
-
151
- `.env.example`、环境变量读取方式、`localhost`/`127.0.0.1` 示例连接串可保留。
152
-
153
- ### 5.4 处理失败
154
-
155
- 1. 立即停止。
156
- 2. 输出 `文件名:行号:命中片段`。
157
- 3. 给出修复建议(`.gitignore`、改环境变量、替换占位符)。
158
- 4. 用户确认后继续;用户强制提交时,message body 追加:
159
- - `GIT-SECURITY: 用户已确认提交此内容`
160
-
161
- ## 6. 变更范围与提交拆分
162
-
163
- 先执行 `git diff --cached`,明确:修改了哪些模块、影响边界、是否一次可归因。
164
-
165
- 若单条 message 无法在 `subject` 中清晰表达,必须拆分 commit。
166
-
167
- ## 7. Commit Scope
168
-
169
- Scope 由 AI 根据变更模块与项目语义自行决定,保持与现有提交习惯一致且可读。
170
-
171
- - 单模块改动:优先加 scope,名称贴近主改动模块(如 `eui` / `backend` / `cli` 等)。
172
- - 跨模块改动:可不带 scope。
173
- - 无法稳定归类:短期使用无 scope,避免强行造新约束。
174
-
175
- ## 8. Commit Message 规则
176
-
177
- 格式:
178
-
179
- `<type>(<scope>): <subject>`
180
-
181
- 或
182
-
183
- `<type>: <subject>`
184
-
185
- 或
186
-
187
- `<type>!: <subject>`
188
-
189
- 或
190
-
191
- `<type>(<scope>)!: <subject>`
192
-
193
- `type` 限定为:`feat`、`fix`、`refactor`、`chore`、`docs`、`test`、`perf`、`style`、`ci`。
194
-
195
- `subject` 规则:
196
-
197
- - 中文、动宾短语。
198
- - ≤72 字符。
199
- - 不用句号、不用“了”。
200
- - 不得含 emoji。
201
- - 可选 body 仅说明 why,不要复述 what。
202
- - 破坏性变更:`feat!:` / `fix!:`(带 scope 时写成 `feat(<scope>)!:` / `fix(<scope>)!:`) + `BREAKING CHANGE: ...`
203
-
204
- ## 9. AI 署名与生成声明治理
205
-
206
- commit 的 subject、body、footer、trailer 中禁止出现任何形式的 AI 署名或生成声明。AI 应自行判断:凡由 AI 工具(Claude、ChatGPT、GPT、Copilot、Cursor、Gemini、Llama、LLM 等)生成或参与撰写的署名、尾随声明、自动生成标记,均不得写入 commit message。
207
-
208
- 包括但不限于:
209
-
210
- - `Co-Authored-By: <AI 名称> <noreply@...>`(任何 AI 产品 + 邮箱组合)
211
- - `Generated with Claude Code` / `Generated with ...`(任何"由 XX 生成"声明)
212
- - 含 AI 产品名的署名行(Claude、ChatGPT、GPT、Copilot、Cursor、Gemini、LLM 等)
213
- - AI 平台noreply 邮箱(noreply@anthropic.com、noreply@openai.com 等)
214
-
215
- `git commit -m "..."` 不得附带 AI 署名 trailer。
216
-
217
- > PreToolUse hook `pre-git-commit-ai-signature-check.sh` 会在 commit message 中检出 Co-Authored-By / Generated with 等 AI 署名模式时硬拦截(exit 2),规则约束 + 工程兜底双保险。
218
-
219
- ## 10. 参考示例
220
-
221
- - `feat(eui): 添加 Image 组件懒加载支持`
222
- - `refactor(backend): 提取分页逻辑为共享工具`
223
- - `fix(eui)!: 重构 EDialog open 属性为 v-model:open`
224
- - `BREAKING CHANGE: EDialog 不再接受 visible 属性,请改用 v-model:open`
9
+ 1. 先 `git fetch origin`,再 `git pull --rebase --autostash`。冲突未清零禁止新 commit。没有 remote,或远程没有同名分支,可以跳过并写明原因。
10
+ 2. message 用 `git commit -F` 或单引号。禁止双引号里带反引号或 `$(...)`。
11
+ 3. 提交前看暂存区。密钥、证书、真实数据、明文连接串不进仓库。
12
+ 4. 格式 `<type>(<scope>): <subject>`。`type` 只用 `feat` / `fix` / `refactor` / `chore` / `docs` / `test` / `perf` / `style` / `ci`。subject 用中文动宾,不超过 72 字。
13
+ 5. 删掉 AI 署名和「由 AI 生成」声明,含环境自动塞入的 `Co-authored-by`。hook 拦住就删掉再交,不绕过。
@@ -1,128 +1,32 @@
1
1
  ---
2
- description: 商用/销售类应用的开源依赖许可合规(禁不可商用与强 copyleft;仅强制署名时在隐私协议附录声明含版本)
2
+ description: 闭源商用新装依赖的许可硬约束。声明模板和许可表见 skill dwy-dependency-choice。只在改依赖清单时注入。开源库仓库按该库自身许可证评估。
3
+ paths:
4
+ - "**/package.json"
5
+ - "**/pnpm-lock.yaml"
6
+ - "**/yarn.lock"
7
+ - "**/package-lock.json"
8
+ - "**/pyproject.toml"
9
+ - "**/uv.lock"
10
+ - "**/requirements*.txt"
11
+ - "**/Podfile"
12
+ - "**/Package.swift"
13
+ - "**/Package.resolved"
14
+ - "**/build.gradle"
15
+ - "**/build.gradle.kts"
16
+ - "**/libs.versions.toml"
17
+ - "**/oh-package.json5"
18
+ - "**/pubspec.yaml"
19
+ - "**/go.mod"
20
+ - "**/Cargo.toml"
21
+ - "**/Dockerfile"
22
+ - "**/Dockerfile.*"
3
23
  ---
4
24
 
5
- # 商用开源依赖许可合规(强制)
25
+ # 商用依赖许可(硬约束)
6
26
 
7
- > 销售、SaaS、付费 App、对外交付的商业产品引入开源库时,
8
- > 许可不合规会带来版权/违约风险。本规则约束:选型禁区 + 强制署名时的声明义务。
27
+ 闭源商用产品新装直接依赖时遵守。学习原型在上架或收费前补齐。当前仓库本身是对外开源库时,按该库自己的许可证评估,GPL 不因此自动禁止。附录模板和许可表见 skill `dwy-dependency-choice`。和本文件冲突时以该 skill 为准。
9
28
 
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 | **禁** | —(不得引入) |
29
+ - 先查许可证再装。无 LICENSE,或 all rights reserved 却当开源用:禁止。
30
+ - 禁止直接依赖:`CC-BY-NC*`、`PolyForm-Noncommercial`、`GPL-2.0`、`GPL-3.0`、`AGPL-3.0`、`SSPL`、未到期且限制生产的 `BUSL`、Commons Clause、仅个人或评估可用的字体 / 图标 / SDK。
31
+ - LGPL 和已购商业授权不默认通过,单独记一笔再定。
32
+ - 只有许可证强制署名或 NOTICE 的直接依赖才写入隐私协议附录,并写 lockfile 里的版本。不强制署名的不写。
@@ -0,0 +1,31 @@
1
+ ---
2
+ description: 只有 develop 和 preview。develop 只发 beta/rc 到测试环境,正式版只从 preview 发。仓库没按这个来要先提醒。只在部署和发版相关文件上注入。
3
+ paths:
4
+ - "**/.github/workflows/**"
5
+ - "**/docker-compose*.yml"
6
+ - "**/docker-compose*.yaml"
7
+ - "**/compose.yml"
8
+ - "**/compose.yaml"
9
+ - "**/deploy*"
10
+ - "**/Dockerfile"
11
+ - "**/Dockerfile.*"
12
+ ---
13
+
14
+ # 正式环境分支
15
+
16
+ 只在部署、发版时遵守。日常改业务代码时忽略本文件。
17
+
18
+ 只有两条长期分支,不另建 release / hotfix 分支。
19
+
20
+ - `develop`:开发,只更新测试环境。这里发出的版本只能是 `beta` 或 `rc`。还在改用 `beta`,准备进 `preview` 用 `rc`。
21
+ - `preview`:正式环境。只有这里发正式版,版本号不带 `-beta` / `-rc`。
22
+
23
+ 仓库没有这两条分支,或正式环境不是从 `preview` 发:先提醒,不要自行建分支,不要把 `main` / `master` 当成 `preview`。
24
+
25
+ 用 `develop` 部署正式环境,或在 `develop` 上打不带预发布的正式号:先停,按下面这段问。确认前不要做。
26
+
27
+ > 当前在 develop。develop 只更新测试环境,版本只能是 beta 或 rc。
28
+ > 正式版要到 preview 上发。
29
+ > 请确认这次是否仍要继续。
30
+
31
+ 用户不确认:不要部署,不要打正式号。用户明确确认后,才可以继续这一次。
@@ -1,5 +1,11 @@
1
1
  ---
2
- description: PostgreSQL 安全与配置规范(参数化查询、应用用户最小权限、连接池上限、SSL、敏感字段加密)
2
+ description: PostgreSQL 安全与配置规范(参数化查询、应用用户最小权限、连接池上限、SSL、敏感字段按业务决定是否 AES-GCM)。只在后端和迁移文件上注入。
3
+ paths:
4
+ - "**/*.py"
5
+ - "**/alembic.ini"
6
+ - "**/alembic/**"
7
+ - "**/docker-compose*.yml"
8
+ - "**/docker-compose*.yaml"
3
9
  ---
4
10
 
5
11
  # PostgreSQL 安全与配置规范
@@ -16,7 +22,7 @@ description: PostgreSQL 安全与配置规范(参数化查询、应用用户
16
22
  | 应用用户权限 | 只授予 SELECT / INSERT / UPDATE / DELETE,**不给** DROP / CREATE / ALTER / SUPERUSER |
17
23
  | 端口暴露 | **禁止**将 `5432` 直接暴露到公网;仅允许 VPC / 内网 / 跳板机访问 |
18
24
  | 运行权限 | PostgreSQL 服务进程**禁止**以 `root` 用户运行,必须使用专用低权限系统用户 |
19
- | 连接池 | `pool_size ≤ 20`,`max_overflow ≤ 10` |
25
+ | 连接池 | 没有实测时的冷启动先验:`pool_size` 20、`max_overflow` 10。有 `max_connections`、实例数和峰值连接后按实测定。无上限,或各实例合计能打满库的 `max_connections`,才算违规。大于 20 / 10 本身不是违规 |
20
26
  | SSL 连接 | 生产环境启用 `sslmode=require` |
21
27
  | 敏感字段加密 | 身份证号 / 银行卡 / 手机号原文等使用 AES 加密**存储**,不仅展示脱敏 |
22
28
  | 迁移 | 通过 Alembic 管理 schema,**禁止**手动执行 DDL(详见 `dwy-db-migration` rule) |
@@ -67,16 +73,17 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public
67
73
 
68
74
  ---
69
75
 
70
- ## 四、敏感字段加密
76
+ ## 四、敏感字段
71
77
 
72
- 仅展示脱敏(详见 `dwy-python-backend` 7.4 响应安全)**不足以**保护落库数据。以下字段在写入前必须用 AES 加密:
78
+ 展示脱敏(详见 `dwy-python-backend` 7.4 响应安全)只管响应,不管落库。
73
79
 
74
- - 身份证号
75
- - 银行卡号
76
- - 手机号(视业务敏感等级)
77
- - 真实姓名 + 地址组合(PII)
80
+ 身份证号、银行卡号是否在写入前加密,由业务决定,不默认上 AES。要加密时:
78
81
 
79
- 加密密钥从环境变量或 KMS 读取,**禁止**与库一起备份。
82
+ - 用 AES-GCM(或同等认证加密)。不要用 ECB,不要只写「AES」不写模式。
83
+ - 密钥从环境变量或 KMS 读取,**禁止**和库备份放在一起。
84
+ - 加密后还要等值查询或建索引的字段,先说明方案再写。不要先加密再发现查不了。
85
+
86
+ 手机号、姓名、地址默认落库明文,响应里脱敏。业务明确要求加密时再按上面三条做。
80
87
 
81
88
  ---
82
89
 
@@ -89,7 +96,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public
89
96
  | 超级用户跑应用 | 应用以 `postgres` 或其他超级用户身份连接 | **致命 → STOP** |
90
97
  | 公网开放 5432 | 安全组 / 防火墙 / LB 允许公网直连 PostgreSQL 端口 | **致命 → STOP** |
91
98
  | root 运行数据库 | PostgreSQL 服务进程以 `root` 身份运行 | **致命 → STOP** |
92
- | 连接池超限 | `pool_size > 20` 或 `max_overflow > 10` | 高 |
99
+ | 连接池 | 无上限,或各实例合计能打满 `max_connections`。大于先验 20/10 本身不是违规 | 高 |
93
100
  | 无 SSL | 生产环境连接串无 `sslmode=require` | 高 |
94
101
  | 敏感字段明文 | 身份证 / 银行卡等明文落库 | 高 |
95
102
  | 硬编码连接串 | 连接串写死在代码中 | **致命 → STOP** |
@@ -1,5 +1,8 @@
1
1
  ---
2
- description: Redis 安全与使用规范(必须用 dwyeapi 客户端、密码、绑定、危险命令禁用、key TTL 与前缀、敏感数据禁存)
2
+ description: Redis 安全与使用规范(必须用 dwyeapi 客户端、密码、绑定、危险命令禁用、缓存 key TTL 与前缀、敏感数据禁存)。只在后端代码上注入。
3
+ paths:
4
+ - "**/*.py"
5
+ - "**/redis.conf"
3
6
  ---
4
7
 
5
8
  # Redis 安全与使用规范
@@ -54,7 +57,7 @@ Group=redis
54
57
 
55
58
  | 规则 | 说明 |
56
59
  |------|------|
57
- | 必须 TTL | 所有 key **必须**显式设置过期时间(`ex` / `pexpire`),**禁止**遗留无 TTL 的 key |
60
+ | 缓存必须 TTL | 缓存、会话、限流计数**必须**设置过期时间(`ex` / `pexpire`)。故意不过期的 key(例如需要长期存在的配置)要在旁边写明原因 |
58
61
  | 必须项目前缀 | 所有 key 必须有项目前缀,格式 `{app}:{domain}:{detail}`(如 `myapp:token:blacklist:abc123`) |
59
62
  | snake_case | key 段用 snake_case,**禁止**驼峰或中文 |
60
63
  | 不存敏感原文 | **禁止**存储密码、身份证、银行卡、token 原文(token 存哈希) |
@@ -64,7 +67,7 @@ Group=redis
64
67
  ```python
65
68
  # 反例
66
69
  await redis.set("abc123", "1") # 无前缀
67
- await redis.set("myapp:data:xxx", value) # 无 TTL
70
+ await redis.set("myapp:cache:user:uuid:f7e2", json_data) # 缓存无 TTL
68
71
  await redis.set("myapp:user:password", "123456") # 存敏感原文
69
72
  await redis.set("myapp:userToken", "ey...") # 驼峰命名
70
73
 
@@ -2,7 +2,7 @@
2
2
  name: dwy-deploy-first
3
3
  description: >-
4
4
  通用「首次部署」检查清单 skill:按章节推进新服务/新镜像的国内可构建落地。
5
- 当前已开放第 1 章「镜像源」——Dockerfile / 构建环境中的 apt(阿里云)与 uv/pip(阿里云 PyPI);
5
+ 当前已开放第 1 章「镜像源」——Dockerfile / 构建环境中的 apt 与 uv/pip。候选 URL 是先验,当次探测后用延迟最低且内容正确的源;
6
6
  禁止写死具体业务项目名。触发:用户说「首次部署」「第一次上线」「部署第一步」「配置镜像源」
7
7
  「apt 换源」「uv 阿里云」「Docker 构建慢」「国内构建」;或用户执行 /dwy-deploy-first。
8
8
  与 dwy-mirror-source(本机用户级 13 类工具)互补:本 skill 聚焦「项目首次部署构建链路」。
@@ -29,7 +29,7 @@ description: >-
29
29
  ## 总原则
30
30
 
31
31
  1. **通用模板** — 示例用 `python:3.x-slim-bookworm` 等占位;路径/服务名从用户当前项目推断,不写死历史项目。
32
- 2. **默认阿里云** — 国内首次部署默认 `aliyun`;用户明确要求清华/中科大时再改。
32
+ 2. **镜像源当次探测** — 阿里云、清华、中科大是当前候选。在内容正确的源里选本次延迟最低的。用户指定某一家或已有私服时,跳过公网竞速。连通不等于可用。测速做法同 `dwy-mirror-source`。
33
33
  3. **先检查后改** — 扫描现有 `Dockerfile` / `Dockerfile.*` / CI 构建脚本;已合规则静默通过,违规再改。
34
34
  4. **与 dwy-docker 叠加** — 镜像 tag 仍须固定版本;本 skill 不替代版本规范。
35
35
  5. **禁止** `curl https://astral.sh/uv/install.sh` 作为默认装 uv 方式(GitHub 二进制,国内慢/易失败)。
@@ -53,15 +53,15 @@ Alpine / RHEL 系见 `references/chapter-01-mirrors.md`;本章默认以 **Debi
53
53
 
54
54
  | # | 检查项 | 合规 | 违规表现 |
55
55
  |---|--------|------|----------|
56
- | A1 | apt 使用国内源 | `mirrors.aliyun.com`(或团队约定的内网 apt 镜像) | 仍 `deb.debian.org` / `archive.ubuntu.com` / `security.debian.org` 且无替换 |
57
- | A2 | 装 uv 不走 astral.sh 默认 GitHub | `pip install -i https://mirrors.aliyun.com/pypi/simple/ uv` 等 | `curl … astral.sh/uv/install.sh` |
58
- | A3 | uv 索引 | `UV_INDEX_URL` / `UV_DEFAULT_INDEX` = 阿里云 simple | 未设且会访问 `pypi.org` |
59
- | A4 | pip 索引 | `PIP_INDEX_URL` 或 `pip -i` = 阿里云 simple | 默认官方 PyPI 且无 `-i` |
60
- | A5 | trusted-host | 与镜像 host 一致(`mirrors.aliyun.com`) | HTTPS 校验失败或反复警告未处理 |
56
+ | A1 | apt 使用探测通过的国内源或团队私服 | 域名是当次延迟最低且 `Release` 正确的源,或团队内网 apt | 仍 `deb.debian.org` / `archive.ubuntu.com` / `security.debian.org` 且无替换;或写了某个镜像站但没探测 |
57
+ | A2 | 装 uv 不走 astral.sh 默认 GitHub | `pip install -i <当次选出的 PyPI 镜像> uv` | `curl … astral.sh/uv/install.sh` |
58
+ | A3 | uv 索引 | `UV_INDEX_URL` / `UV_DEFAULT_INDEX` = 当次选出的源 | 未设且会访问 `pypi.org` |
59
+ | A4 | pip 索引 | `PIP_INDEX_URL` 或 `pip -i` = 当次选出的源 | 默认官方 PyPI 且无 `-i` |
60
+ | A5 | trusted-host | 与实际使用的镜像 host 一致 | HTTPS 校验失败或反复警告未处理 |
61
61
 
62
62
  **企业内网私服**(域名非公网 mirror):保留私服,不覆盖为阿里云;记录「已使用私服,本章跳过公网镜像」。
63
63
 
64
- ### 1.2 默认 URL(阿里云)
64
+ ### 1.2 当前候选 URL(阿里云,写入前替换成探测赢家)
65
65
 
66
66
  ```text
67
67
  # Debian/Ubuntu apt
@@ -76,7 +76,7 @@ trusted-host: mirrors.aliyun.com
76
76
 
77
77
  ### 1.3 落地动作(Dockerfile 模式)
78
78
 
79
- 按顺序改写(最小 diff;匹配用户现有基础镜像代号):
79
+ 按顺序改写(最小 diff;匹配用户现有基础镜像代号)。下面片段里的阿里云域名是当前示例,落地时换成当次探测选出的源。
80
80
 
81
81
  #### A. apt → 阿里云
82
82
 
@@ -138,17 +138,17 @@ RUN uv sync --frozen
138
138
 
139
139
  1. Dockerfile / 构建脚本中 **无** 未替换的官方 Debian/Ubuntu 默认源(私服除外)
140
140
  2. **无** 默认 `astral.sh/uv/install.sh`(除非用户书面坚持并接受慢/失败风险)
141
- 3. `UV_*` / `PIP_*` 指向 `mirrors.aliyun.com`(或约定私服)
142
- 4. 能完整跑通一次构建(`docker build` 或 `uv sync` / `uv pip install`)且日志显示从阿里云域名拉取
141
+ 3. `UV_*` / `PIP_*` 指向当次选出的源(或约定私服)
142
+ 4. 能完整跑通一次构建(`docker build` 或 `uv sync` / `uv pip install`),日志里的下载域名是这次选中的源
143
143
 
144
144
  输出简短验收表:
145
145
 
146
146
  ```text
147
147
  第 1 章 镜像源
148
- - [ ] apt 阿里云
149
- - [ ] uv/pip 阿里云
148
+ - [ ] apt 为当次延迟最低且内容正确的源(或私服)
149
+ - [ ] uv/pip 为当次延迟最低且内容正确的源(或私服)
150
150
  - [ ] 禁止 astral.sh 默认装 uv
151
- - [ ] 构建试跑通过
151
+ - [ ] 构建试跑通过,日志域名与所选源一致
152
152
  ```
153
153
 
154
154
  ### 1.6 完成后
@@ -1,6 +1,6 @@
1
- # 第 1 章参考:apt / uv / pip 阿里云片段
1
+ # 第 1 章参考:apt / uv / pip 片段
2
2
 
3
- 通用片段,按基础镜像选用。**默认首选阿里云。**
3
+ 通用片段,按基础镜像选用。域名是当前候选示例。写入前按 `dwy-mirror-source` 的当次探测,把域名换成延迟最低且内容正确的源。
4
4
 
5
5
  ---
6
6