create-dwy 0.14.2 → 0.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +1 -1
  3. package/templates/ai-tools/rules/Global/dwy-docker.md +71 -0
  4. package/templates/ai-tools/rules/iOS/dwy-swift-style.md +9 -2
  5. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit.md +153 -0
  6. package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-postgres.md +6 -0
  7. package/templates/ai-tools/rules//346/225/260/346/215/256/345/272/223/dwy-redis.md +14 -2
  8. package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/SKILL.md +47 -7
  9. package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/references/checks-data.md +11 -0
  10. package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/references/checks-network.md +14 -0
  11. package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/references/checks-runtime.md +16 -0
  12. package/templates/ai-tools/skills//345/256/211/345/205/250/dwy-deploy-audit/references/security-doc-search.md +179 -0
  13. package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_db.sh +27 -2
  14. package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_docker.sh +10 -0
  15. package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_nginx.sh +8 -0
  16. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-0to1/SKILL.md +1 -1
  17. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/SKILL.md +3 -3
  18. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/templates/impl-plan.md +2 -2
  19. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit-safe.md +0 -66
  20. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit/SKILL.md +0 -125
  21. package/templates/ai-tools/skills//350/204/232/346/211/213/346/236/266/dwy-tech-stack/SKILL.md +0 -61
  22. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_base.sh" +0 -0
  23. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_capacity.sh" +0 -0
  24. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_env.sh" +0 -0
  25. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_https.sh" +0 -0
  26. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_logs.sh" +0 -0
  27. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_resilience.sh" +0 -0
  28. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_secrets.sh" +0 -0
  29. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_services.sh" +0 -0
  30. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/check_ssh.sh" +0 -0
  31. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/256/211/345/205/250}/dwy-deploy-audit/scripts/run_all.sh" +0 -0
  32. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/274/200/345/217/221/346/265/201/347/250/213}/dwy-publish/SKILL.md" +0 -0
  33. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/274/200/345/217/221/346/265/201/347/250/213}/dwy-publish/references/application-release.md" +0 -0
  34. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/274/200/345/217/221/346/265/201/347/250/213}/dwy-publish/references/sdk-release.md" +0 -0
  35. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/274/200/345/217/221/346/265/201/347/250/213}/dwy-semver/SKILL.md" +0 -0
  36. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/274/200/345/217/221/346/265/201/347/250/213}/dwy-semver/references/semver-spec.md" +0 -0
  37. /package/templates/ai-tools/skills//{350/277/220/347/273/264/345/217/221/345/270/203 → 345/274/200/345/217/221/346/265/201/347/250/213}/dwy-semver/scripts/bump.py" +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # create-dwy
2
2
 
3
+ ## 0.14.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 完善 Git 提交相关规范与模板文档,统一提交规则与 AI 署名治理说明。
8
+ - 优化 iOS 规则中图标策略,优先 SF Symbols,缺省使用成熟第三方 SVG 方案。
9
+ - 强化 `dwy-tdd-dev` 与 `dwy-0to1` 流程文档内的提交规范引用方式。
10
+
3
11
  ## 0.14.2
4
12
 
5
13
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-dwy",
3
- "version": "0.14.2",
3
+ "version": "0.14.3",
4
4
  "description": "项目脚手架与多平台 AI 配置同步工具",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,71 @@
1
+ ---
2
+ description: Docker 通用规则(镜像固定版本、容器内存上限、日志大小限制)
3
+ ---
4
+
5
+ # Docker 通用规则
6
+
7
+ 适用于 `Dockerfile`、`docker-compose*.yml`、`compose.yml`、Kubernetes manifest、CI 配置中的所有 `FROM` / `image:` 字段,以及容器资源与日志配置。
8
+
9
+ ## 一、Docker 镜像固定版本
10
+
11
+ - **必须**使用固定版本 tag
12
+ - **禁止** `latest`
13
+ - **禁止**省略 tag。省略 tag 等同于 `latest`
14
+ - **禁止**浮动 tag:`stable`、`mainline`、`current`、`release`、`lts`、`rolling`、`main`、`master`、`head`、`edge`、`nightly`
15
+ - **禁止**只写环境或发行版 tag:`alpine`、`slim`、`bookworm`、`bullseye`、`buster`、`jammy`、`focal`、`noble`、`trixie`
16
+ - 数据库、缓存、网关、消息队列等关键基础设施,优先固定到 `tag@sha256:...`
17
+
18
+ ### 正反例
19
+
20
+ ```dockerfile
21
+ # 反例
22
+ FROM nginx:latest
23
+ FROM python
24
+ image: redis:7
25
+ image: postgres:bookworm
26
+
27
+ # 正例
28
+ FROM nginx:1.26.2
29
+ FROM python:3.12.10-slim
30
+ image: redis:7.4.2
31
+ image: postgres:16.4
32
+ image: postgres:16.4@sha256:xxxxx
33
+ ```
34
+
35
+ ## 二、Docker 容器配置要求
36
+
37
+ ### 1. 内存设置
38
+
39
+ - 每一个容器**必须**设置最大可用内存
40
+ - 与 Redis 配合使用时,容器最大可用内存**必须大于** Redis 的 `maxmemory`
41
+ - **禁止**容器无限制使用宿主机内存
42
+
43
+ ### 2. 日志设置
44
+
45
+ - Docker 日志**必须**设置最大使用量
46
+ - **必须**限制单个日志文件大小与轮转文件数量
47
+ - **禁止**不设上限长期写入,避免占满磁盘
48
+
49
+ ### compose 示例
50
+
51
+ ```yaml
52
+ services:
53
+ app:
54
+ image: myapp:1.2.3
55
+ mem_limit: 512m
56
+ logging:
57
+ driver: json-file
58
+ options:
59
+ max-size: "10m"
60
+ max-file: "3"
61
+
62
+ redis:
63
+ image: redis:7.4.2
64
+ command: ["redis-server", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"]
65
+ mem_limit: 384m
66
+ logging:
67
+ driver: json-file
68
+ options:
69
+ max-size: "10m"
70
+ max-file: "3"
71
+ ```
@@ -72,18 +72,25 @@ withAnimation(.spring(response: 0.5, dampingFraction: 0.75)) { isBusy = true }
72
72
 
73
73
  ## 6. 图标:矢量图,禁止 emoji
74
74
 
75
- UI 图标**一律 SF Symbols 矢量图**(`Image(systemName:)`),任何视图、文案、注释都**禁止 emoji**:
75
+ UI 图标优先使用 **SF Symbols 矢量图**(`Image(systemName:)`)。系统无对应符号时,改用**成熟第三方 SVG 图标**(如已集成并维护良好的 icon 套件),禁止自行手绘或临时 PNG/emoji。
76
76
 
77
77
  ```swift
78
- // 好:SF Symbols 矢量图标
78
+ // 优先:系统 SF Symbols
79
79
  Image(systemName: "checkmark")
80
80
  .font(.system(size: 11, weight: .bold))
81
81
  .foregroundStyle(.white)
82
82
 
83
+ // 次选:成熟第三方矢量图标组件或资源
84
+ Image("icon_checkmark")
85
+ .resizable()
86
+ .frame(width: 12, height: 12)
87
+
83
88
  // 禁止:emoji 当图标
84
89
  Text("✅") // 不允许
85
90
  ```
86
91
 
92
+ 任何视图、文案、注释都**禁止 emoji**。
93
+
87
94
  ## 7. 颜色 / 字体 / 动效 token 化
88
95
 
89
96
  - 颜色集中到设计 token(如 `ColorTokens.*` / `theme.*`),**禁止在视图里散落硬编码颜色字面量**。
@@ -0,0 +1,153 @@
1
+ ---
2
+ description: Git Commit 规范(提交安全、敏感扫描、Scope、消息规范、AI 署名治理)
3
+ ---
4
+
5
+ # Git Commit 规范(强制)
6
+
7
+ ## 1. 适用范围
8
+
9
+ 适用于所有 Git 提交流程,覆盖:
10
+
11
+ - `git add`
12
+ - `git commit`
13
+ - 为提交生成或校验 commit message 的场景
14
+
15
+ 任一步骤不通过:中止当前提交流交付流程。
16
+
17
+ ## 2. 执行顺序(硬约束)
18
+
19
+ 1. 安全写法检查
20
+ 2. Stage 级敏感扫描
21
+ 3. 变更范围确认
22
+ 4. Scope 与 message 格式校验
23
+ 5. AI 署名与生成声明校验
24
+
25
+ ## 3. 安全写法(命令注入防护)
26
+
27
+ `git commit -m "..."` 会对双引号内内容做 shell 展开。出现反引号或 `$(...)` 时,禁止直接使用双引号形式。
28
+
29
+ ### 3.1 推荐:消息文件提交(优先)
30
+
31
+ ```bash
32
+ git commit -F /tmp/commit-msg.txt
33
+ ```
34
+
35
+ ```bash
36
+ cat > /tmp/commit-msg.txt <<'EOF'
37
+ feat: 示例提交说明
38
+
39
+ - 修改点 A
40
+ - 修改点 B
41
+ EOF
42
+ git commit -F /tmp/commit-msg.txt
43
+ ```
44
+
45
+ ### 3.2 允许:单引号提交
46
+
47
+ ```bash
48
+ git commit -m 'feat: 支持 runConcurrent'
49
+ ```
50
+
51
+ 前提:message 内无单引号字符。
52
+
53
+ ### 3.3 禁止:双引号直接携带反引号
54
+
55
+ ```bash
56
+ git commit -m "feat: run `build-tool`"
57
+ ```
58
+
59
+ 上例存在命令替换风险。
60
+
61
+ ### 3.4 兜底:转义(不推荐)
62
+
63
+ ```bash
64
+ git commit -m "feat: run \`build-tool\`"
65
+ ```
66
+
67
+ ## 4. Stage 级敏感扫描(强制)
68
+
69
+ 同时扫描:
70
+ - `git diff --cached`
71
+ - `git diff --cached --name-only`
72
+
73
+ ### 4.1 禁止提交文件
74
+
75
+ `.env*`、`*.pem`、`*.key`、`*.p12`、`*.pfx`、`*.jks`、`*.keystore`、`*.sql`(真实数据)、`*.dump`、`*.sqlite`、`*.xlsx`、`*.csv`(敏感表)、`*.log`、`pgdata/`、`cache/*.json`。
76
+
77
+ ### 4.2 禁止内容片段(示例)
78
+
79
+ `sk-` 开头 API Key、`AKIA` 开头 AWS Key、`ghp_` GitHub Token、`password=...`、`token=...`、`secret=...`、明文数据库连接串、私钥头、`IP:端口`、`ssh user@ip`。
80
+
81
+ ### 4.3 例外
82
+
83
+ `.env.example`、环境变量读取方式、`localhost`/`127.0.0.1` 示例连接串可保留。
84
+
85
+ ### 4.4 处理失败
86
+
87
+ 1. 立即停止。
88
+ 2. 输出 `文件名:行号:命中片段`。
89
+ 3. 给出修复建议(`.gitignore`、改环境变量、替换占位符)。
90
+ 4. 用户确认后继续;用户强制提交时,message body 追加:
91
+ - `GIT-SECURITY: 用户已确认提交此内容`
92
+
93
+ ## 5. 变更范围与提交拆分
94
+
95
+ 先执行 `git diff --cached`,明确:修改了哪些模块、影响边界、是否一次可归因。
96
+
97
+ 若单条 message 无法在 `subject` 中清晰表达,必须拆分 commit。
98
+
99
+ ## 6. Commit Scope
100
+
101
+ Scope 由 AI 根据变更模块与项目语义自行决定,保持与现有提交习惯一致且可读。
102
+
103
+ - 单模块改动:优先加 scope,名称贴近主改动模块(如 `eui` / `backend` / `cli` 等)。
104
+ - 跨模块改动:可不带 scope。
105
+ - 无法稳定归类:短期使用无 scope,避免强行造新约束。
106
+
107
+ ## 7. Commit Message 规则
108
+
109
+ 格式:
110
+
111
+ `<type>(<scope>): <subject>`
112
+
113
+ 或
114
+
115
+ `<type>: <subject>`
116
+
117
+ 或
118
+
119
+ `<type>!: <subject>`
120
+
121
+ 或
122
+
123
+ `<type>(<scope>)!: <subject>`
124
+
125
+ `type` 限定为:`feat`、`fix`、`refactor`、`chore`、`docs`、`test`、`perf`、`style`、`ci`。
126
+
127
+ `subject` 规则:
128
+
129
+ - 中文、动宾短语。
130
+ - ≤72 字符。
131
+ - 不用句号、不用“了”。
132
+ - 不得含 emoji。
133
+ - 可选 body 仅说明 why,不要复述 what。
134
+ - 破坏性变更:`feat!:` / `fix!:`(带 scope 时写成 `feat(<scope>)!:` / `fix(<scope>)!:`) + `BREAKING CHANGE: ...`
135
+
136
+ ## 8. AI 署名与生成声明治理
137
+
138
+ commit 的 subject、body、footer、trailer 中禁止出现:
139
+
140
+ - `Co-Authored-By: Claude ...`
141
+ - `Generated with Claude Code`
142
+ - `Generated with ...`
143
+ - `Claude`、`ChatGPT`、`GPT`、`Copilot`、`Cursor`、`AI`、`LLM`
144
+ - `noreply@anthropic.com`、`noreply@openai.com`
145
+
146
+ `git commit -m "..."` 不得附带 AI 署名 trailer。
147
+
148
+ ## 9. 参考示例
149
+
150
+ - `feat(eui): 添加 Image 组件懒加载支持`
151
+ - `refactor(backend): 提取分页逻辑为共享工具`
152
+ - `fix(eui)!: 重构 EDialog open 属性为 v-model:open`
153
+ - `BREAKING CHANGE: EDialog 不再接受 visible 属性,请改用 v-model:open`
@@ -14,6 +14,8 @@ description: PostgreSQL 安全与配置规范(参数化查询、应用用户
14
14
  |------|------|
15
15
  | 参数化查询 | **禁止**字符串拼接 SQL(用 ORM 或 `text(... :param)` 参数绑定) |
16
16
  | 应用用户权限 | 只授予 SELECT / INSERT / UPDATE / DELETE,**不给** DROP / CREATE / ALTER / SUPERUSER |
17
+ | 端口暴露 | **禁止**将 `5432` 直接暴露到公网;仅允许 VPC / 内网 / 跳板机访问 |
18
+ | 运行权限 | PostgreSQL 服务进程**禁止**以 `root` 用户运行,必须使用专用低权限系统用户 |
17
19
  | 连接池 | `pool_size ≤ 20`,`max_overflow ≤ 10` |
18
20
  | SSL 连接 | 生产环境启用 `sslmode=require` |
19
21
  | 敏感字段加密 | 身份证号 / 银行卡 / 手机号原文等使用 AES 加密**存储**,不仅展示脱敏 |
@@ -25,6 +27,8 @@ description: PostgreSQL 安全与配置规范(参数化查询、应用用户
25
27
 
26
28
  生产环境**禁止**使用 `postgres` 超级用户跑应用;为每个应用创建独立用户,授权严格限定到 DML。
27
29
 
30
+ 数据库服务自身也**禁止**由 `root` 直接启动或托管,统一使用 `postgres` 或发行版默认专用系统账号运行。
31
+
28
32
  ```sql
29
33
  -- 创建应用专用用户(非超级用户)
30
34
  CREATE USER app_user WITH PASSWORD 'strong_password';
@@ -83,6 +87,8 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public
83
87
  | SQL 拼接 | f-string / `%` / 字符串相加构造 SQL | **致命 → STOP** |
84
88
  | 应用用户超权 | 应用账号拥有 DROP / CREATE / ALTER / SUPERUSER | **致命 → STOP** |
85
89
  | 超级用户跑应用 | 应用以 `postgres` 或其他超级用户身份连接 | **致命 → STOP** |
90
+ | 公网开放 5432 | 安全组 / 防火墙 / LB 允许公网直连 PostgreSQL 端口 | **致命 → STOP** |
91
+ | root 运行数据库 | PostgreSQL 服务进程以 `root` 身份运行 | **致命 → STOP** |
86
92
  | 连接池超限 | `pool_size > 20` 或 `max_overflow > 10` | 高 |
87
93
  | 无 SSL | 生产环境连接串无 `sslmode=require` | 高 |
88
94
  | 敏感字段明文 | 身份证 / 银行卡等明文落库 | 高 |
@@ -21,15 +21,18 @@ description: Redis 安全与使用规范(必须用 dwyeapi 客户端、密码
21
21
  | 规则 | 说明 |
22
22
  |------|------|
23
23
  | 认证 | **必须**设置 `requirepass`,无密码 Redis 一律拒绝接入生产 |
24
- | 绑定地址 | `bind 127.0.0.1` 或内网地址,**禁止** `bind 0.0.0.0` |
24
+ | 绑定地址 | `bind 127.0.0.1` 或内网地址,**禁止** `bind 0.0.0.0`,**禁止**通过安全组 / 防火墙 / LB 直接暴露 `6379` 到公网 |
25
+ | 运行权限 | Redis 进程**禁止**以 `root` 用户运行,必须使用专用低权限用户 |
25
26
  | 危险命令 | **禁用**或重命名 `FLUSHALL` / `FLUSHDB` / `CONFIG` / `KEYS` / `DEBUG` |
26
- | 内存上限 | 设 `maxmemory` 与 `maxmemory-policy`(推荐 `allkeys-lru`),防止 OOM |
27
+ | 内存上限 | Redis 运行**必须**显式设置 `maxmemory` 与 `maxmemory-policy`(推荐 `allkeys-lru`),防止缓存无限膨胀或 OOM |
27
28
  | 持久化 | 根据用途选择:缓存可关 AOF;会话 / 黑名单需 AOF everysec |
28
29
 
29
30
  ```conf
30
31
  # redis.conf 关键项示例
31
32
  requirepass <strong-password>
32
33
  bind 127.0.0.1
34
+ port 6379
35
+ maxclients 10000
33
36
  rename-command FLUSHALL ""
34
37
  rename-command FLUSHDB ""
35
38
  rename-command CONFIG ""
@@ -39,6 +42,12 @@ maxmemory 256mb
39
42
  maxmemory-policy allkeys-lru
40
43
  ```
41
44
 
45
+ ```ini
46
+ # systemd/service 示例
47
+ User=redis
48
+ Group=redis
49
+ ```
50
+
42
51
  ---
43
52
 
44
53
  ## 三、Key 设计规范(强制)
@@ -79,10 +88,13 @@ await redis.set("myapp:cache:user:uuid:f7e2", json_data, ex=300)
79
88
  | 检查项 | 违规模式 | 严重程度 |
80
89
  |--------|---------|---------|
81
90
  | 绑定 0.0.0.0 | 服务对公网暴露 | **致命 → STOP** |
91
+ | 公网开放 6379 | 安全组 / 防火墙 / LB 允许公网直连 Redis 端口 | **致命 → STOP** |
82
92
  | 无密码 | 生产 Redis 未设 `requirepass` | **致命 → STOP** |
93
+ | root 运行 | Redis 进程以 `root` 身份启动 | **致命 → STOP** |
83
94
  | 存敏感原文 | 密码 / 身份证 / token 明文存 Redis | **致命 → STOP** |
84
95
  | 自建连接池 | 业务代码 `aioredis.from_url(...)`,未走 dwyeapi 缓存模块 | 高 |
85
96
  | 危险命令未禁 | `FLUSHALL` / `KEYS` / `CONFIG` 等可在生产执行 | 高 |
97
+ | 未设 `maxmemory` | Redis 未设置缓存最大可用内存或未配置淘汰策略 | **致命 → STOP** |
86
98
  | Key 无 TTL | `redis.set()` 没有 `ex` 参数(业务上明确永久存储除外) | 中 |
87
99
  | Key 无前缀 | Key 无项目前缀,污染共享 Redis | 中 |
88
100
  | Pub/Sub 当队列 | 业务关键消息走 Pub/Sub | 高 |
@@ -26,6 +26,7 @@ description: "部署后线上环境基础安全巡检:远程 SSH 到目标服
26
26
  | `references/checks-network.md` | 即将运行 4.1 / 4.2 / 4.4 / 4.7 类检查或解读其输出时 | SSH / Nginx / HTTPS / 依赖服务连通性 |
27
27
  | `references/checks-data.md` | 即将运行 4.3 / 4.5 / 4.11 类检查或解读其输出时 | 数据库暴露 / 环境变量 / 凭证强度 |
28
28
  | `references/checks-runtime.md` | 即将运行 4.6 / 4.8 / 4.9 / 4.10 类检查或解读其输出时 | Docker / 自愈 / 日志防爆 / 资源推荐 |
29
+ | `references/security-doc-search.md` | 本地 checks 不够判定、需要查官方安全文档、需要按版本追 CVE、或需要把新规则沉淀回 skill 时 | 权威文档检索策略 / 官方来源清单 / 沉淀规则 |
29
30
 
30
31
  ---
31
32
 
@@ -46,12 +47,13 @@ description: "部署后线上环境基础安全巡检:远程 SSH 到目标服
46
47
  1. 收集目标信息 → 确认 SSH 连接、目标服务范围
47
48
  2. 连通性测试 → SSH 登录、sudo 权限确认
48
49
  3. 基础环境识别 → 系统版本、已部署服务清单
49
- 4. 分类检查 → SSH / Nginx / DB / HTTPS / Env / Docker / Services / Resilience / Logs / Capacity / Secrets(主 Bash 调用 run_all.sh,12 路并行)
50
- 5. 生成报告 → 按等级聚合,Markdown 格式
51
- 6. 修复建议 → 每条问题给出修复方向(不执行)
50
+ 4. 权威文档检索 → 必要时查官方文档 / CVE / OWASP,补足判定依据
51
+ 5. 分类检查 → SSH / Nginx / DB / HTTPS / Env / Docker / Services / Resilience / Logs / Capacity / Secrets(主 Bash 调用 run_all.sh,12 路并行)
52
+ 6. 生成报告 → 按等级聚合,Markdown 格式
53
+ 7. 修复建议 → 每条问题给出修复方向(不执行)
52
54
  ```
53
55
 
54
- **共 6 步,按顺序执行。**
56
+ **共 7 步,按顺序执行。**
55
57
 
56
58
  ---
57
59
 
@@ -115,7 +117,44 @@ ssh ${TARGET} "
115
117
 
116
118
  ---
117
119
 
118
- ## Step 4: 分类检查(并行执行)
120
+ ## Step 4: 权威文档检索(必要时执行)
121
+
122
+ 当出现以下任一情况,**先读** `references/security-doc-search.md`,再用 WebSearch / 官方站点检索:
123
+
124
+ 1. `references/checks-*.md` 里只有抽象规则,没有给出当前版本依据
125
+ 2. audit 输出出现了明确版本号,需要判断是否存在已知高危 CVE
126
+ 3. 配置项语义、默认值、版本门槛不确定
127
+ 4. 用户明确要求“按官方安全文档”解释
128
+ 5. 本次发现适合沉淀回长期规则
129
+
130
+ ### 强制来源顺序
131
+
132
+ 1. 官方产品文档 / 官方 security 页面
133
+ 2. 官方 release notes / advisories
134
+ 3. CISA KEV / NVD / CVE
135
+ 4. OWASP Cheat Sheet
136
+
137
+ **禁止**把论坛、博客、AI 聚合页当唯一依据。
138
+
139
+ ### 强制检索输出
140
+
141
+ 每次外部检索至少产出 3 个字段:
142
+
143
+ | 字段 | 说明 |
144
+ |------|------|
145
+ | `source` | 权威来源 URL |
146
+ | `claim` | 从文档得到的明确结论 |
147
+ | `impact` | 这条结论如何影响本次分级 / 判定 / 修复建议 |
148
+
149
+ ### 需要沉淀时怎么做
150
+
151
+ - 可复用的配置语义 / 检查基线 → 回写对应 `references/checks-*.md`
152
+ - 可复用的检索方法 / 来源入口 → 回写 `references/security-doc-search.md`
153
+ - 单次版本漏洞情报 → 只写进本次报告,不固化成长期规则
154
+
155
+ ---
156
+
157
+ ## Step 5: 分类检查(并行执行)
119
158
 
120
159
  **主 Claude 直接用 Bash 调用 `run_all.sh`,12 路并行跑完全部检查类目**,把原始输出落到 `/tmp/dwy_audit_<host>.txt`,再由主 Claude `Read` 文件后做分析。
121
160
 
@@ -251,7 +290,7 @@ bash {scripts}/check_db.sh <target> [ssh_opts...]
251
290
 
252
291
  ---
253
292
 
254
- ## Step 5: 生成报告
293
+ ## Step 6: 生成报告
255
294
 
256
295
  报告必须为 Markdown 格式,**核心是"完整检查清单 + 状态可视化"** — 让用户一眼看到"检查了哪些 / 通过哪些 / 失败哪些 / 跳过哪些 / 未覆盖哪些"。
257
296
 
@@ -441,7 +480,7 @@ bash {scripts}/check_db.sh <target> [ssh_opts...]
441
480
 
442
481
  ---
443
482
 
444
- ## Step 6: 修复建议(只输出,不执行)
483
+ ## Step 7: 修复建议(只输出,不执行)
445
484
 
446
485
  **严格禁止:**
447
486
 
@@ -455,6 +494,7 @@ bash {scripts}/check_db.sh <target> [ssh_opts...]
455
494
  - 在报告中给出修复命令片段(供用户复制)
456
495
  - 解释修复后的影响和验证方法
457
496
  - 推荐修复优先级
497
+ - 给出本次实际引用过的权威文档 URL
458
498
 
459
499
  ---
460
500
 
@@ -35,6 +35,17 @@
35
35
  | `rename-command` | 危险命令(FLUSHALL/CONFIG)已重命名 | medium |
36
36
  | Redis 版本 | 非已知 CVE 版本 | medium |
37
37
 
38
+ **Redis 版本判定补充:**
39
+
40
+ - 配置语义先看官方安全文档:`https://redis.io/docs/latest/operate/oss_and_stack/management/security/`
41
+ - 版本安全再搜:`redis <version> CVE`、`redis <version> security advisory`
42
+ - 优先来源:Redis 官方、NVD、CISA KEV
43
+ - 分级规则:
44
+ - Redis 外网暴露 + 命中高危 CVE / KEV → **critical**
45
+ - Redis 仅内网暴露,但命中高危 CVE → high
46
+ - 未命中高危 CVE,但版本明显偏旧且无安全维护依据 → medium
47
+ - 如 `bind`、`protected-mode`、公网暴露本身已不合规,按对应配置项分级;不要把“版本风险”和“暴露风险”混成一条。
48
+
38
49
  ---
39
50
 
40
51
  ## 4.5 环境变量 / 文件权限 — `{scripts}/check_env.sh`
@@ -49,6 +49,20 @@
49
49
  | 暴露的 location | 排查 `/.git`、`/.env`、`/admin` 是否泄漏 | **critical** |
50
50
  | Nginx 版本 | 非已知 CVE 版本 | medium |
51
51
 
52
+ **Nginx 版本判定补充:**
53
+
54
+ - 先查官方配置语义:
55
+ - headers 模块:`https://nginx.org/en/docs/http/ngx_http_headers_module.html`
56
+ - SSL 模块:`https://nginx.org/en/docs/http/ngx_http_ssl_module.html`
57
+ - 再查版本安全:
58
+ - 搜索词:`nginx <version> security advisory`、`nginx <version> CVE`
59
+ - 优先来源:Nginx 官方公告、NVD、CISA KEV
60
+ - 分级规则:
61
+ - 命中 **CISA KEV** 或存在明确在野利用记录 → **critical**
62
+ - 命中高危 CVE(建议按 CVSS ≥ 7.0 参考),但未见在野利用 → high
63
+ - 未命中高危 CVE,但版本明显老旧且缺少后续安全修复依据 → medium
64
+ - 如果只是配置项(如 `ssl_protocols`、`ssl_stapling`、`add_header ... always`)语义不清,不按“版本风险”报,改为引用官方模块文档解释配置风险。
65
+
52
66
  ---
53
67
 
54
68
  ## 4.4 HTTPS 证书 — `{scripts}/check_https.sh`
@@ -34,6 +34,22 @@
34
34
  | **daemon `registry-mirrors`**(时区在 PRC 时) | 至少 1 个国内源(daocloud / aliyun / ustc / tsinghua) | high(PRC 无配置)/ info(境外) |
35
35
  | **运行容器使用境外 registry**(`gcr.io` `ghcr.io` `k8s.gcr.io` `quay.io` `mcr.microsoft.com` `nvcr.io` `docker.elastic.co`)且时区在 PRC | 改用 `<registry>.m.daocloud.io` 前缀(`registry-mirrors` **不**对它们生效) | high |
36
36
 
37
+ **Docker 版本与暴露面判定补充:**
38
+
39
+ - 官方基础文档:
40
+ - Engine security:`https://docs.docker.com/engine/security/`
41
+ - daemon remote access:`https://docs.docker.com/engine/daemon/remote-access/`
42
+ - logging driver:`https://docs.docker.com/engine/logging/configure/`
43
+ - OWASP Docker Security Cheat Sheet:`https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html`
44
+ - 版本安全搜索词:
45
+ - `docker engine <version> CVE`
46
+ - `docker <version> security advisory`
47
+ - 分级规则:
48
+ - 命中 **CISA KEV**,或 Docker daemon TCP 端口公网暴露且无充分保护 → **critical**
49
+ - 命中高危 CVE(建议按 CVSS ≥ 7.0 参考),但当前未见在野利用 → high
50
+ - 未命中高危 CVE,但版本过旧且缺少持续维护依据 → medium
51
+ - `docker.sock` 挂载、`--privileged`、2375/2376 暴露属于**配置暴露面**,优先按当前表里的配置项分级,不要被“版本没问题”掩盖。
52
+
37
53
  ---
38
54
 
39
55
  ## 4.8 自愈与资源耗尽防护 — `{scripts}/check_resilience.sh`
@@ -0,0 +1,179 @@
1
+ ## 权威安全文档检索
2
+
3
+ 当 `references/checks-*.md` 无法覆盖以下场景时,先查权威文档,再下结论:
4
+
5
+ - 目标版本是否存在已知高危 CVE
6
+ - 某个配置项语义不确定
7
+ - audit 输出与经验规则冲突
8
+ - 用户要求“按官方安全文档”解释
9
+ - 需要把新发现沉淀回本 skill
10
+
11
+ ---
12
+
13
+ ## 检索优先级
14
+
15
+ 1. **官方产品文档 / 官方安全页**
16
+ 2. **官方维护的版本公告 / 安全公告 / release notes**
17
+ 3. **CISA KEV / NVD / CVE 记录**
18
+ 4. **OWASP Cheat Sheet**
19
+
20
+ 禁止把论坛、博客、聚合站当一手依据。
21
+
22
+ ---
23
+
24
+ ## 固定检索策略
25
+
26
+ ### 1. 先查“配置语义”
27
+
28
+ 按产品名 + 配置项名搜索,优先官方文档:
29
+
30
+ - `OpenSSH sshd_config PermitRootLogin PasswordAuthentication official`
31
+ - `nginx ssl_protocols ssl_stapling add_header official`
32
+ - `PostgreSQL listen_addresses ssl official`
33
+ - `Redis protected mode bind requirepass official`
34
+ - `Docker daemon remote access docker.sock log-driver official`
35
+
36
+ 目标:确认该配置项的**官方含义、默认值、启用条件、版本约束**。
37
+
38
+ ### 2. 再查“版本安全”
39
+
40
+ 当 audit 输出包含版本号时,按 `产品 + 版本 + CVE` 搜:
41
+
42
+ - `nginx 1.24.0 CVE`
43
+ - `postgresql 15.6 CVE`
44
+ - `redis 7.2.4 CVE`
45
+ - `docker engine 26.1.4 CVE`
46
+
47
+ 目标:确认是否存在:
48
+
49
+ - 高危未修复漏洞
50
+ - 该版本已被官方宣布 EOL
51
+ - 配置项依赖的最小版本门槛
52
+
53
+ ### 3. 最后查“硬化基线”
54
+
55
+ 当官方文档只解释语义、不直接给安全基线时,补查:
56
+
57
+ - `OWASP Docker Security Cheat Sheet`
58
+ - `CISA Known Exploited Vulnerabilities`
59
+ - 产品官方 security / advisories 页面
60
+
61
+ 目标:把“语义”转成“审计期望值”。
62
+
63
+ ---
64
+
65
+ ## 推荐来源清单
66
+
67
+ ### SSH / OpenSSH
68
+
69
+ - OpenSSH `sshd_config` 手册:`https://man.openbsd.org/sshd_config`
70
+
71
+ 重点看:
72
+
73
+ - `PermitRootLogin`
74
+ - `PasswordAuthentication`
75
+ - `PermitEmptyPasswords`
76
+ - `AllowUsers` / `AllowGroups`
77
+
78
+ ### Nginx / HTTPS
79
+
80
+ - Nginx headers 模块:`https://nginx.org/en/docs/http/ngx_http_headers_module.html`
81
+ - Nginx SSL 模块:`https://nginx.org/en/docs/http/ngx_http_ssl_module.html`
82
+
83
+ 重点看:
84
+
85
+ - `add_header ... always`
86
+ - `ssl_protocols`
87
+ - `ssl_stapling`
88
+ - `ssl_stapling_verify`
89
+
90
+ ### PostgreSQL
91
+
92
+ - 连接与认证:`https://www.postgresql.org/docs/current/runtime-config-connection.html`
93
+
94
+ 重点看:
95
+
96
+ - `listen_addresses`
97
+ - `port`
98
+ - `ssl`
99
+
100
+ ### Redis
101
+
102
+ - Redis Security:`https://redis.io/docs/latest/operate/oss_and_stack/management/security/`
103
+
104
+ 重点看:
105
+
106
+ - `bind`
107
+ - `protected mode`
108
+ - 外网暴露风险
109
+
110
+ ### Docker
111
+
112
+ - Docker Engine security:`https://docs.docker.com/engine/security/`
113
+ - Docker daemon remote access:`https://docs.docker.com/engine/daemon/remote-access/`
114
+ - Docker logging drivers:`https://docs.docker.com/engine/logging/configure/`
115
+ - OWASP Docker Security Cheat Sheet:`https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html`
116
+
117
+ 重点看:
118
+
119
+ - daemon attack surface
120
+ - `docker.sock`
121
+ - TCP remote API
122
+ - capabilities / privileged
123
+ - `log-driver`
124
+
125
+ ### CVE / 漏洞情报
126
+
127
+ - CISA KEV:`https://www.cisa.gov/known-exploited-vulnerabilities-catalog`
128
+ - NVD:`https://nvd.nist.gov/`
129
+
130
+ 用途:
131
+
132
+ - 判断某版本是否已有**被在野利用**漏洞
133
+ - 给 critical / high 分级补外部依据
134
+
135
+ ---
136
+
137
+ ## 审计时何时必须检索
138
+
139
+ 以下情况不得只靠本地规则:
140
+
141
+ 1. `references/checks-*.md` 写着“非已知 CVE 版本”,但当前没附具体依据
142
+ 2. audit 输出出现明确版本号,且版本看起来偏旧
143
+ 3. 某项默认值与当前发行版可能有漂移
144
+ 4. 需要判断某项该算 `critical` 还是 `high`
145
+ 5. 用户要求“给官方文档链接”
146
+
147
+ ---
148
+
149
+ ## 沉淀规则
150
+
151
+ 如果检索得到**稳定、可复用、非一次性**的信息,必须回写:
152
+
153
+ - 配置语义类 → 更新对应 `references/checks-network.md` / `references/checks-data.md` / `references/checks-runtime.md`
154
+ - 检索方法类 → 更新本文件
155
+ - 仅某产品某版本临时漏洞 → 不写入长期规则,只在本次报告引用
156
+
157
+ 判断“适合沉淀”的标准:
158
+
159
+ - 下次审计大概率还会遇到
160
+ - 不是某个用户私有环境特例
161
+ - 可以转化为明确检查项、期望值或检索模板
162
+
163
+ ---
164
+
165
+ ## 输出要求
166
+
167
+ 当使用了外部文档,报告里的失败项详情至少补 1 个权威链接:
168
+
169
+ - 官方文档优先
170
+ - 漏洞项可追加 CISA KEV 或 NVD
171
+ - 不引用二手博客作唯一依据
172
+
173
+ 格式建议:
174
+
175
+ ```markdown
176
+ - 参考:
177
+ - https://www.postgresql.org/docs/current/runtime-config-connection.html
178
+ - https://nvd.nist.gov/
179
+ ```
@@ -42,7 +42,19 @@ else
42
42
 
43
43
  echo ""
44
44
  echo "--- PG 版本 & 数据库列表 ---"
45
- sudo -n -u postgres psql -tAc "SELECT version()" 2>/dev/null | head -1 || echo "[i] 无法连接 PG"
45
+ PG_VERSION_RAW=$(sudo -n -u postgres psql -tAc "SELECT version()" 2>/dev/null | head -1 || true)
46
+ if [[ -n "$PG_VERSION_RAW" ]]; then
47
+ echo "$PG_VERSION_RAW"
48
+ PG_VERSION=$(echo "$PG_VERSION_RAW" | grep -oE 'PostgreSQL[[:space:]]+[0-9]+(\.[0-9]+){0,2}' | awk '{print $2}' | head -1)
49
+ echo "postgresql_version_normalized=${PG_VERSION:-unknown}"
50
+ echo "official_doc_pg_runtime=https://www.postgresql.org/docs/current/runtime-config-connection.html"
51
+ if [[ -n "$PG_VERSION" ]]; then
52
+ echo "search_hint_1=postgresql ${PG_VERSION} CVE"
53
+ echo "search_hint_2=postgresql ${PG_VERSION} security advisory"
54
+ fi
55
+ else
56
+ echo "[i] 无法连接 PG"
57
+ fi
46
58
  sudo -n -u postgres psql -tAc "SELECT datname FROM pg_database WHERE datistemplate=false" 2>/dev/null || true
47
59
  fi
48
60
 
@@ -109,7 +121,20 @@ else
109
121
 
110
122
  echo ""
111
123
  echo "--- Redis INFO server (需 auth, 跳过若失败) ---"
112
- timeout 3 redis-cli -h 127.0.0.1 INFO server 2>/dev/null | grep -E "redis_version|os|arch_bits" | head -5 || echo "[i] 需要密码或无法连接"
124
+ REDIS_INFO=$(timeout 3 redis-cli -h 127.0.0.1 INFO server 2>/dev/null || true)
125
+ if [[ -n "$REDIS_INFO" ]]; then
126
+ echo "$REDIS_INFO" | grep -E "redis_version|os|arch_bits" | head -5
127
+ REDIS_VERSION=$(echo "$REDIS_INFO" | sed -n 's/^redis_version://p' | head -1)
128
+ echo "redis_version_normalized=${REDIS_VERSION:-unknown}"
129
+ echo "official_doc_redis_security=https://redis.io/docs/latest/operate/oss_and_stack/management/security/"
130
+ if [[ -n "$REDIS_VERSION" ]]; then
131
+ echo "search_hint_redis_1=redis ${REDIS_VERSION} CVE"
132
+ echo "search_hint_redis_2=redis ${REDIS_VERSION} security advisory"
133
+ fi
134
+ else
135
+ echo "[i] 需要密码或无法连接"
136
+ echo "official_doc_redis_security=https://redis.io/docs/latest/operate/oss_and_stack/management/security/"
137
+ fi
113
138
  fi
114
139
 
115
140
  echo ""
@@ -11,6 +11,16 @@ fi
11
11
 
12
12
  echo "--- docker version ---"
13
13
  docker version --format '{{.Server.Version}} (client: {{.Client.Version}})' 2>/dev/null || docker --version
14
+ DOCKER_SERVER_VERSION=$(docker version --format '{{.Server.Version}}' 2>/dev/null || docker --version | grep -oE '[0-9]+(\.[0-9]+){1,3}' | head -1)
15
+ echo "docker_server_version_normalized=${DOCKER_SERVER_VERSION:-unknown}"
16
+ echo "official_doc_docker_security=https://docs.docker.com/engine/security/"
17
+ echo "official_doc_docker_remote_access=https://docs.docker.com/engine/daemon/remote-access/"
18
+ echo "official_doc_docker_logging=https://docs.docker.com/engine/logging/configure/"
19
+ echo "official_doc_docker_owasp=https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html"
20
+ if [[ -n "$DOCKER_SERVER_VERSION" ]]; then
21
+ echo "search_hint_1=docker engine ${DOCKER_SERVER_VERSION} CVE"
22
+ echo "search_hint_2=docker ${DOCKER_SERVER_VERSION} security advisory"
23
+ fi
14
24
 
15
25
  echo ""
16
26
  echo "--- docker daemon 监听 ---"
@@ -11,6 +11,14 @@ fi
11
11
 
12
12
  echo "--- nginx version ---"
13
13
  nginx -v 2>&1
14
+ NGINX_VERSION=$(nginx -v 2>&1 | sed -n 's#.*nginx/\([^ ]*\).*#\1#p' | head -1)
15
+ echo "nginx_version_normalized=${NGINX_VERSION:-unknown}"
16
+ echo "official_doc_headers=https://nginx.org/en/docs/http/ngx_http_headers_module.html"
17
+ echo "official_doc_ssl=https://nginx.org/en/docs/http/ngx_http_ssl_module.html"
18
+ if [[ -n "$NGINX_VERSION" ]]; then
19
+ echo "search_hint_1=nginx ${NGINX_VERSION} security advisory"
20
+ echo "search_hint_2=nginx ${NGINX_VERSION} CVE"
21
+ fi
14
22
 
15
23
  echo ""
16
24
  echo "--- nginx 进程运行用户 ---"
@@ -58,7 +58,7 @@ description: 端到端「0→1 产品孵化」编排器。用户丢一个产品
58
58
 
59
59
  **Step 5/6 同一个 skill 两道门**:`dwy-prototype` 在低保真(`phase=lowfi`)、高保真(`phase=hifi`)各调一次、各卡一道门,目的不同(验流程 vs 做底稿),别合并。
60
60
 
61
- **Step 9 循环**:对 STATE「选定版本」里的每个版本依次调 `dwy-tdd-dev` 走完,编排器更新「版本开发进度」表;全部版本完,Step 9 标 `done`,给交付报告。每版完成的 commit 由 `dwy-tdd-dev` 走 `dwy-git-commit` 规范(敏感扫描 + 格式 + 禁 AI 署名),不裸 commit。
61
+ **Step 9 循环**:对 STATE「选定版本」里的每个版本依次调 `dwy-tdd-dev` 走完,编排器更新「版本开发进度」表;全部版本完,Step 9 标 `done`,给交付报告。每版完成的 commit 由 `dwy-tdd-dev` 按 Git 提交规范执行(敏感扫描 + 格式 + 禁 AI 署名),不裸 commit。
62
62
 
63
63
  ## 产物目录(项目内 docs/0to1/)
64
64
 
@@ -52,7 +52,7 @@ description: 按 TDD 把一个版本/功能落地成代码:写实施计划(b
52
52
  2. 运行看到失败(给确切命令 + 预期失败输出)
53
53
  3. 最小实现(贴实际实现代码)
54
54
  4. 运行看到通过(给确切命令 + 预期 PASS)
55
- 5. commit(优先走 `dwy-git-commit`:敏感扫描 + 规范 message + 禁 AI 署名;该 skill 不在则至少做敏感扫描 + 规范 message,给确切命令)
55
+ 5. commit(按 Git 提交规范:敏感扫描 + 规范 message + 禁 AI 署名;该规范未生效时至少做敏感扫描 + 规范 message,给确切命令)
56
56
 
57
57
  **禁止占位符**——以下都是计划失败,绝不允许:
58
58
 
@@ -140,7 +140,7 @@ version: vN
140
140
  | `BLOCKED` | 卡住做不下去 → 补上下文 / 换更强模型 / 拆小 Task / 升级给用户,**别让它原样重试** |
141
141
  | `NEEDS_CONTEXT` | 缺信息 → 补齐缺的上下文再继续 |
142
142
 
143
- **两道审查全 ✅、Critical/Important 全修完、且本 Task 已 commit(步骤 5,走 dwy-git-commit),这个 Task 才算完成,进下一个 Task。** commit 是 Task 的硬收尾——别把多个 Task 攒着不提交,漏 commit 等于 Task 没完成。
143
+ **两道审查全 ✅、Critical/Important 全修完、且本 Task 已 commit(按 Git 提交规范),这个 Task 才算完成,进下一个 Task。** commit 是 Task 的硬收尾——别把多个 Task 攒着不提交,漏 commit 等于 Task 没完成。
144
144
 
145
145
  > **自包含 + 可增强**:上面这套 spec / code 审查逻辑已内嵌,能独立跑。如果检测到项目里有 `/code-review` 命令或 `dwy-dev-qa` skill,Task 级或下面版本级的 code-review 可委托给它们做增强(更全面),没有就用内嵌逻辑。
146
146
 
@@ -205,7 +205,7 @@ git diff --stat $BASE_SHA..$HEAD_SHA
205
205
  - **禁止没有失败测试就写生产代码**——红-绿-重构铁律,违反就删掉重来。
206
206
  - **禁止跳审查**——spec 和 code 两道都要,且 spec 在前 code 在后,顺序不能反。
207
207
  - **禁止带未修的 Critical / Important 进下一个 Task 或下一个版本。**
208
- - **禁止 Task 未 commit 就开下一个 Task**——红-绿-审查全过后必须当场 commit(走 dwy-git-commit),不许把多个 Task 的改动攒到最后一次性提交。
208
+ - **禁止 Task 未 commit 就开下一个 Task**——红-绿-审查全过后必须当场 commit(按 Git 提交规范),不许把多个 Task 的改动攒到最后一次性提交。
209
209
  - **禁止没跑验证就声称完成**——「应该过了」不算证据,必须有刚跑的命令输出。
210
210
  - **禁止实施计划留占位符**(TODO / 待补充 / 类似 Task N)——每步给实际代码 + 确切命令。
211
211
  - **禁止把代码写进 `docs/0to1/`**——只有实施计划进 `plans/`,代码进项目源码。
@@ -67,7 +67,7 @@ export function validateNoteBody(body: string): { ok: boolean; error?: string }
67
67
  Run: `pnpm vitest run tests/validators/note.test.ts`
68
68
  Expected: PASS(2 passed),其它测试不受影响
69
69
 
70
- - [ ] **步骤 5:commit(走 `dwy-git-commit`:敏感扫描 + 规范 message + 禁 AI 署名)**
70
+ - [ ] **步骤 5:commit(按 Git 提交规范:敏感扫描 + 规范 message + 禁 AI 署名)**
71
71
 
72
72
  ```bash
73
73
  git add src/validators/note.ts tests/validators/note.test.ts
@@ -107,7 +107,7 @@ Expected: FAIL — <预期失败原因,必须是「功能没实现」>
107
107
  Run: `<确切测试命令>`
108
108
  Expected: PASS,其它测试不挂、输出无 warning
109
109
 
110
- - [ ] **步骤 5:commit(走 `dwy-git-commit`:敏感扫描 + 规范 message + 禁 AI 署名)**
110
+ - [ ] **步骤 5:commit(按 Git 提交规范:敏感扫描 + 规范 message + 禁 AI 署名)**
111
111
 
112
112
  ```bash
113
113
  git add <文件>
@@ -1,66 +0,0 @@
1
- ---
2
- description: git commit message 安全写法(防反引号被 shell 命令替换误执行)
3
- ---
4
-
5
- # git commit 安全写法
6
-
7
- ## 核心风险
8
-
9
- AI 生成的 commit message 爱用 Markdown 风格反引号包代码标识符。经 shell 执行 `git commit -m "..."` 时,**双引号内**的反引号会被当成命令替换实际执行:
10
-
11
- ```bash
12
- # 危险:`bun install` 被 shell 当成 $(bun install) 执行
13
- git commit -m "fix: support `bun install` on windows"
14
- ```
15
-
16
- shell 实际跑了 `bun install`,把输出塞进 message,甚至误执行破坏性命令导致丢代码。`$(...)` 同理。
17
-
18
- ## 强制规则
19
-
20
- commit message 含反引号 `` ` `` / `$(...)` / 多行 / emoji 等特殊字符时,**禁止** `git commit -m "..."`,必须走以下安全写法:
21
-
22
- ### 1. 文件提交(首选,多行 / 特殊字符一律用它)
23
-
24
- ```bash
25
- git commit -F <msg-file>
26
-
27
- # 或 stdin
28
- printf '%s\n' "$MSG" | git commit --file=-
29
-
30
- # 或 heredoc 写文件再提交
31
- cat > /tmp/commit-msg.txt <<'EOF'
32
- feat(agent): add `runConcurrent`
33
-
34
- - support drain-all-before-throw
35
- EOF
36
- git commit -F /tmp/commit-msg.txt
37
- ```
38
-
39
- ### 2. 单引号包裹(单行、无单引号时可用)
40
-
41
- ```bash
42
- # 单引号内所有字符字面,反引号原样保留
43
- git commit -m 'fix: support `bun install` on windows'
44
- ```
45
-
46
- ### 3. 转义反引号(不推荐,易漏)
47
-
48
- ```bash
49
- git commit -m "fix: support \`bun install\` on windows"
50
- ```
51
-
52
- ## 安全速查
53
-
54
- | 方式 | 反引号风险 |
55
- |---|---|
56
- | `git commit -m "...`...`..."` | 危险(双引号内被求值) |
57
- | `git commit -m '...`...`...'` | 安全(单引号不展开) |
58
- | `git commit -F <file>` | 安全(Git 直读文件,不过 shell) |
59
- | `git commit --file=-` | 安全 |
60
-
61
- ## 禁止
62
-
63
- - **禁止**把含反引号 / `$(...)` 的 message 拼进 `git commit -m "..."` 双引号
64
- - **禁止**为图省事忽略此约束 —— 误执行后果是丢代码,不可逆
65
-
66
- > PreToolUse hook `pre-git-commit-backtick-check.sh` 会在双引号 message 含未转义反引号 / `$(...)` 时硬拦截(exit 2),但 hook 是兜底,写法本身就该走安全方式。
@@ -1,125 +0,0 @@
1
- ---
2
- name: dwy-git-commit
3
- description: "Git commit 强制规范(敏感数据扫描 + message 格式 + 禁 AI 署名)。触发场景:用户说'提交' / 'commit' / 'git commit' / 'git add';AI 准备执行 `git add` / `git commit` 之前;用户让你帮忙写 commit message;review 已有 commit message。强制:先扫描暂存物是否含 .env / 密钥 / API Key / 连接串等敏感数据;再检查 CLAUDE.md 的 Git Commit Scope 段;subject 用中文动宾短语 ≤72 字符;message 任何位置禁止 Claude / GPT / Copilot / AI / LLM 字样及 Co-Authored-By trailer。"
4
- ---
5
-
6
- # Git Commit 强制规范
7
-
8
- 每次 `git add` / `git commit` 前按顺序执行以下检查,任一步未通过 → **STOP,不得提交**。
9
-
10
- ## Step 0: 敏感数据扫描
11
-
12
- `git diff --cached` + `git diff --cached --name-only` 同时扫文件名和内容。
13
-
14
- ### 禁止提交的文件
15
-
16
- | 类型 | 示例 |
17
- |---|---|
18
- | 环境变量 | `.env`, `.env.*`, `*.env` |
19
- | SSH 密钥 | `id_rsa`, `id_ed25519`, `*.pem`, `*.key` |
20
- | 证书 | `*.p12`, `*.pfx`, `*.jks`, `*.keystore` |
21
- | 数据库 | `*.sql`(含真实数据)、`*.dump`, `*.sqlite` |
22
- | 原始数据 | `*.xlsx`, `*.csv`(含用户/学生等敏感数据) |
23
- | 日志 | `*.log` |
24
- | Docker 卷 | `pgdata/`, `cache/*.json` |
25
-
26
- ### 禁止出现的敏感内容
27
-
28
- **总则**:代码、文档、规则文件、注释里禁止出现真实的 API Key / Token / 密码 / IP / 凭证,即使作为"示例"也不行。GitHub Secret Scanning 不区分上下文,真实格式的 key 写在文档里也会触发泄露告警。示例必须用明显假值(`sk-xxxxxxxxxxxx`、`your-key-here`、`192.168.x.x`)。
29
-
30
- | 类型 | 匹配模式 |
31
- |---|---|
32
- | API Key | `sk-[a-zA-Z0-9]{20,}` |
33
- | AWS Key | `AKIA[0-9A-Z]{16}` |
34
- | GitHub Token | `ghp_[a-zA-Z0-9]{36}` |
35
- | 密码赋值 | `password\s*[:=]\s*["'][^"']{4,}` |
36
- | 数据库连接串 | `://\w+:[^@\s]+@`(含密码) |
37
- | 私钥内容 | `-----BEGIN (RSA \|EC )?PRIVATE KEY-----` |
38
- | Token 赋值 | `token\s*[:=]\s*["'][a-zA-Z0-9_\-]{20,}` |
39
- | Secret 赋值 | `secret\s*[:=]\s*["'][^"']{8,}` |
40
- | 服务器 IP+端口 | `\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+` |
41
- | SSH 连接 | `ssh\s+.*@\d{1,3}\.\d{1,3}` |
42
-
43
- **例外(不算违规)**:`.env.example` 占位符;从环境变量读取(`os.getenv("API_KEY")`);`localhost` / `127.0.0.1` 的连接串;文档假数据;配置文件空字符串默认值。
44
-
45
- ### 违规处理
46
-
47
- 1. **立即停止** `git add` / `git commit`
48
- 2. **列出违规项**:文件 + 行号 + 匹配的敏感模式 + 脱敏摘要(如 `sk-5522****dc3`)
49
- 3. **建议修复**:加入 `.gitignore` / 移到 `.env` / 改用环境变量 / 替换为占位符
50
- 4. **等用户明确确认**后才能继续;确认强制提交时,commit body 附 `GIT-SECURITY: 用户已确认提交此内容`
51
-
52
- ## Step 1: 分析变更
53
-
54
- `git diff --cached` 回答:这次改做了几件事?涉及哪些模块?
55
-
56
- **做了多件事(无法用 ≤72 字符 subject 清晰描述)→ 必须拆成多个 commit。**
57
-
58
- ## Step 2: 确定 scope
59
-
60
- 读当前项目 CLAUDE.md 的 `## Git Commit Scope` 段:
61
-
62
- - **找到** → scope 从枚举值中选,不得自造
63
- - **没找到** → 提醒用户「当前项目 CLAUDE.md 未定义 Git Commit Scope,建议添加」,scope 可省略
64
-
65
- 单模块变更 → **必须**带 scope;跨模块变更 → 省略 scope。
66
-
67
- ## Step 3: 生成 message
68
-
69
- 格式:`<type>(<scope>): <subject>` 或(无 scope)`<type>: <subject>`
70
-
71
- **type 枚举(只能从中选)**:
72
-
73
- | type | 用途 |
74
- |------|------|
75
- | feat | 新功能 |
76
- | fix | 修复 bug |
77
- | refactor | 重构(不改外部行为) |
78
- | chore | 构建/依赖/配置/发版等杂务 |
79
- | docs | 文档 |
80
- | test | 测试 |
81
- | perf | 性能优化 |
82
- | style | 代码格式(不影响逻辑) |
83
- | ci | CI/CD 配置 |
84
-
85
- **subject**:中文、无句号、≤72 字符、动宾短语(添加/修复/移除/重构/升级)。
86
-
87
- **body(可选)**:空一行后写;中文;只写 why 不复述 what;破坏性变更加 `BREAKING CHANGE:` 前缀(subject 用 `feat!:` / `fix!:` 标记)。
88
-
89
- ## Step 4: 禁止大模型署名
90
-
91
- commit message(subject、body、footer、trailer)**禁止出现任何大模型 / AI 工具相关内容**,覆盖系统默认的 `Co-Authored-By` 追加行为。
92
-
93
- **禁止出现(不完全列举)**:
94
-
95
- - `Co-Authored-By: Claude ...` / `Co-Authored-By: GPT ...` / `Co-Authored-By: Copilot ...` 等 AI 署名 trailer
96
- - `Generated with Claude Code` / `🤖 Generated with ...` 等生成声明
97
- - `noreply@anthropic.com` / `noreply@openai.com` 等 AI 厂商邮箱
98
- - 任何提到 Claude / ChatGPT / GPT / Copilot / Cursor / AI / 大模型 / LLM 的字样
99
-
100
- **执行要点**:
101
-
102
- - `git commit -m "..."` 只写规范内容,**绝不**附加 `Co-Authored-By` trailer
103
- - HEREDOC 传 message 时,HEREDOC 内容也不得包含上述字样
104
- - 暂存的 message 含大模型信息 → **立即删除**后再提交
105
-
106
- ## 常见错误 vs 正确
107
-
108
- | 错误 | 正确 |
109
- |------|------|
110
- | `feat: add user login`(英文) | `feat: 添加用户登录功能` |
111
- | `fix(eui): 修复了按钮样式。` | `fix(eui): 修复按钮样式`(无句号、不用"了") |
112
- | `feat: 添加登录并修复登出 bug` | 拆成两个 commit |
113
- | `update: 修改配置` | `update` 不在枚举,应为 `chore` |
114
- | `feat(auth): ...`(项目无 auth scope) | 用项目已定义的 scope 值 |
115
- | message 末尾加 `Co-Authored-By: Claude ...` | 不加任何 AI 署名 trailer |
116
- | `🤖 Generated with Claude Code` | 不加任何生成声明 |
117
-
118
- ## 正确示例
119
-
120
- - `feat(eui): 添加 Image 组件,支持懒加载`
121
- - `fix: 修复 token 刷新竞态条件`
122
- - `refactor(backend): 提取分页逻辑为共享工具`
123
- - `chore: 升级 Vite 至 8.x`
124
- - `feat(eui)!: 重命名 EDialog open 属性为 v-model:open`
125
- - body:`BREAKING CHANGE: EDialog 不再接受 visible 属性,请改用 v-model:open`
@@ -1,61 +0,0 @@
1
- ---
2
- name: dwy-tech-stack
3
- description: 跨栈技术选型强制约束(FastAPI / Vue 3 / Flutter / UV / pnpm / Docker / S3 / DolphinDB 等)。触发场景:用户提到「用什么 ORM / 缓存 / 状态管理 / 路由 / 包管理 / 组件库」/ 引入新依赖 / 替换现有库 / 调研选型 / 新项目初始化 / 架构评估;AI 准备执行 `pnpm add` / `uv add` / `pip install` / `flutter pub add` / `npm install` 前;讨论涉及后端 Web 框架、ORM、关系数据库、缓存、消息队列、异步任务、JWT / 密码哈希、Linter;前端 Vue 框架、构建工具、组件库、状态管理、样式方案、表单校验、测试;移动端 Flutter、状态管理、HTTP 客户端、路由、本地存储、代码生成;容器化、对象存储、时序数据库时。强制:每个领域只有唯一方案,AI 不得选替代,不得「建议改用 XX」。
4
- ---
5
-
6
- # 跨栈技术选型强制约束
7
-
8
- 每个领域只有一个方案,AI 不得选替代,不得「建议改用 XX」。
9
-
10
- ## 后端
11
-
12
- | 领域 | 唯一方案 | 禁止替代 |
13
- |------|---------|---------|
14
- | Web 框架 | FastAPI | Django, Flask, Tornado, Sanic |
15
- | ORM | SQLAlchemy 2.0 (异步) | Tortoise ORM, Peewee, Django ORM |
16
- | 关系数据库 | PostgreSQL | MySQL, MariaDB, SQLite(生产) |
17
- | 缓存 / 消息队列 | Redis | Memcached, RabbitMQ, Kafka |
18
- | 异步任务 | ARQ (eapi[tasks]) | Celery, Dramatiq, Huey |
19
- | 数据库迁移 | Alembic | 手动 DDL, Django migrations |
20
- | 包管理 | UV | pip, Poetry, Pipenv |
21
- | 密码哈希 | bcrypt (eapi security) | argon2, scrypt, 自实现 |
22
- | JWT | python-jose (eapi security) | PyJWT, 自实现 |
23
- | 数据校验 | Pydantic v2 | marshmallow, attrs, 手动校验 |
24
- | 基础设施层 | dwyeapi | 自造框架、手写基础设施 |
25
- | Linter/Formatter | Ruff | Black, isort, flake8, pylint |
26
-
27
- ## 前端(Web)
28
-
29
- | 领域 | 唯一方案 | 禁止替代 |
30
- |------|---------|---------|
31
- | 框架 | Vue 3 (Composition API) | React, Svelte, Angular, Vue 2 |
32
- | 构建工具 | Vite | Webpack, Rollup, esbuild 直接用 |
33
- | 组件库 | @dwydev/eui | Element Plus, Ant Design Vue, Naive UI |
34
- | 工具库 | @dwydev/ekit | 手写 request/storage/validators |
35
- | 状态管理 | Pinia (Setup Store) | Vuex, 手动 reactive/provide |
36
- | 样式 | Tailwind CSS 4 | Sass/Less 手写、CSS Modules、UnoCSS |
37
- | 包管理 | pnpm | npm, yarn |
38
- | 项目结构 | pnpm monorepo (workspace) | Lerna, Nx, Turborepo |
39
- | 表单校验 | vee-validate + zod | 手动 v-model 校验 |
40
- | 路由 | Vue Router 4 | — |
41
- | 测试 | Vitest | Jest |
42
-
43
- ## 移动端 / 桌面端
44
-
45
- | 领域 | 唯一方案 | 禁止替代 |
46
- |------|---------|---------|
47
- | 框架 | Flutter | React Native, Kotlin Multiplatform, MAUI |
48
- | 状态管理 | Riverpod | GetX, Bloc, Provider, MobX |
49
- | HTTP 客户端 | Dio | http, Chopper, Retrofit |
50
- | 路由 | GoRouter | auto_route, Routemaster |
51
- | 本地存储 | shared_preferences + flutter_secure_storage | Hive, Isar, sqflite(非必要时) |
52
- | 代码生成 | riverpod_generator + freezed + json_serializable | 手写 fromJson/toJson |
53
-
54
- ## 基础设施
55
-
56
- | 领域 | 唯一方案 |
57
- |------|---------|
58
- | 容器化 | Docker + Docker Compose |
59
- | 对象存储(开发) | MinIO (S3 协议) |
60
- | 对象存储(生产) | 任何 S3 兼容云服务 |
61
- | 时序数据库(量化金融) | DolphinDB |