create-dwy 0.14.2 → 0.14.4

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 (38) hide show
  1. package/CHANGELOG.md +16 -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-core.md +75 -0
  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/iOS/dwy-swift-style.md +0 -96
  20. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit-safe.md +0 -66
  21. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit/SKILL.md +0 -125
  22. package/templates/ai-tools/skills//350/204/232/346/211/213/346/236/266/dwy-tech-stack/SKILL.md +0 -61
  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_base.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_capacity.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_env.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_https.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_logs.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_resilience.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_secrets.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_services.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/check_ssh.sh" +0 -0
  32. /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
  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/SKILL.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/application-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-publish/references/sdk-release.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/SKILL.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/references/semver-spec.md" +0 -0
  38. /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
@@ -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,96 +0,0 @@
1
- ---
2
- paths:
3
- - "**/*.swift"
4
- ---
5
-
6
- # Swift 代码规范
7
-
8
- 编辑任何 `.swift` 时遵守。本规则仅覆盖代码写法层(缩进、命名、注释、控制流、UI token 化),是与具体业务无关的通用约定。
9
-
10
- ## 1. 缩进与格式
11
-
12
- - **4 空格缩进**,不用 Tab。
13
- - 类型 / 函数声明参数过长时换行,每参数一行,右括号与返回类型 `) -> X` 单起一行。
14
- - 一行只做一件事,避免把多个 `if` 挤进一行。
15
-
16
- ## 2. 命名
17
-
18
- - 类型 `UpperCamelCase`,属性 / 方法 / 局部变量 `lowerCamelCase`。
19
- - **局部短生命周期变量可用短名**(`i` = index、`f` = formatter、`cal` = calendar),同一文件内保持一致。
20
- - 名字表达意图,避免无信息量的 `data` / `info` / `tmp` 当主力变量名。
21
-
22
- ## 3. 类型声明(iOS 17)
23
-
24
- 状态对象统一 iOS 17 写法,不要 `ObservableObject / @Published / @StateObject`:
25
-
26
- ```swift
27
- @MainActor // 所有触碰 UI / 主线程隔离状态的类型都标
28
- @Observable // 替代 ObservableObject
29
- final class ListViewModel { // 非继承类一律 final
30
- private let store: DataStore // 依赖私有 + 构造注入
31
- }
32
- ```
33
-
34
- ## 4. 注释(中文,强制全量)
35
-
36
- **所有代码都要加注释,包括每个类型和每个方法**。注释说明**意图**(为什么这么做、约束是什么),而非复述代码字面。
37
-
38
- - **类型顶部必加** `///` 文档注释:说明该类型的职责、它在数据流里的位置或关键约束。`class` / `struct` / `enum` / `protocol` / 有逻辑的 `extension` 都算。
39
- - **每个方法 / 函数必加** `///` 文档注释(公开和私有都要),说明它做什么、入参出参的语义、可能抛出的错误。
40
- - 关键属性、反直觉分支、易踩坑处用行内 `//` 标注触发条件。
41
- - 注释里**禁止 emoji**。
42
- - 不写废话注释(`// 设置 name` 这种复述赋值的删掉),注释要补充代码没说出口的信息。
43
-
44
- ```swift
45
- /// 列表数据源。负责从持久层读取并按时间分组,供视图直接渲染。
46
- @MainActor
47
- @Observable
48
- final class ListViewModel {
49
-
50
- /// 重新加载全部数据并写回 `grouped`。
51
- /// 失败时透传持久层错误,由调用方决定提示策略。
52
- func reload() throws {
53
- let items = try store.all() // 持久层已保证非 nil,无需兜底
54
- grouped = group(items)
55
- }
56
- }
57
- ```
58
-
59
- ## 5. 控制流:信任上游,不过度防御
60
-
61
- 只在系统外边界(用户输入、文件 / 网络读入、外部 API)校验;内部调用信任类型签名。
62
-
63
- ```swift
64
- // 好:early return,无多余 else
65
- guard !isBusy else { return }
66
- withAnimation(.spring(response: 0.5, dampingFraction: 0.75)) { isBusy = true }
67
- ```
68
-
69
- - 不写 `value ?? default` 兜已有明确来源的值。
70
- - 不写 `try? { ... }` 吞异常掩盖 bug;只 catch 预期的具体错误,其余让它抛。
71
- - 持久 / IO 层方法用 `throws` 透传错误,由调用方决定处理,不在底层吞。
72
-
73
- ## 6. 图标:矢量图,禁止 emoji
74
-
75
- UI 图标**一律 SF Symbols 矢量图**(`Image(systemName:)`),任何视图、文案、注释都**禁止 emoji**:
76
-
77
- ```swift
78
- // 好:SF Symbols 矢量图标
79
- Image(systemName: "checkmark")
80
- .font(.system(size: 11, weight: .bold))
81
- .foregroundStyle(.white)
82
-
83
- // 禁止:emoji 当图标
84
- Text("✅") // 不允许
85
- ```
86
-
87
- ## 7. 颜色 / 字体 / 动效 token 化
88
-
89
- - 颜色集中到设计 token(如 `ColorTokens.*` / `theme.*`),**禁止在视图里散落硬编码颜色字面量**。
90
- - 字体用 `.font(.system(size:weight:))` 或集中的字体 token。
91
- - 动效统一用一组 `.spring(response:dampingFraction:)` 参数,不用 `.easeInOut`,保持全局手感一致。
92
-
93
- ## 8. 文案与时间
94
-
95
- - 所有 UI 文案走 `String(localized: "some_key")`,**禁止硬编码字面量**;key 命名风格全项目统一。
96
- - 业务逻辑里「现在」作为依赖注入(`now: @escaping () -> Date = { Date() }`),方便单测固定时间,禁止在逻辑里直接散用 `Date()`。
@@ -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 |