create-dwy 0.14.1 → 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 (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-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-publish/SKILL.md +50 -0
  18. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-publish/references/application-release.md +106 -0
  19. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-publish/references/sdk-release.md +93 -0
  20. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-tdd-dev/SKILL.md +3 -3
  21. 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
  22. package/templates/ai-tools/rules//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit-safe.md +0 -66
  23. package/templates/ai-tools/skills//345/274/200/345/217/221/346/265/201/347/250/213/dwy-git-commit/SKILL.md +0 -125
  24. package/templates/ai-tools/skills//350/204/232/346/211/213/346/236/266/dwy-tech-stack/SKILL.md +0 -61
  25. package/templates/ai-tools/skills//350/277/220/347/273/264/345/217/221/345/270/203/dwy-publish/SKILL.md +0 -145
  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_base.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_capacity.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_env.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_https.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_logs.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_resilience.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/check_secrets.sh" +0 -0
  33. /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
  34. /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
  35. /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
  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
 
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: dwy-publish
3
+ description: "部署应用、发布版本、发布 SDK 的通用发版入口。触发条件:用户说“部署”“发版”“发布”“release”“publish”“bump version”时。先根据仓库上下文判断目标是应用部署还是 SDK 发版,再分别读取对应流程文件执行。"
4
+ ---
5
+
6
+ # 发布入口
7
+
8
+ 通用发布 skill。默认进入本 skill 前,测试已经完成。
9
+
10
+ ## 第 0 步:读取仓库发布上下文
11
+
12
+ 执行前先从仓库里定位发布相关信息。
13
+
14
+ 优先查看这些信息源:
15
+
16
+ - `package.json`、`pyproject.toml`、`Cargo.toml`、`Makefile`、发布脚本
17
+ - `.github/workflows/`、CI 配置、Docker 构建文件
18
+ - `README.md`、发布文档、变更日志
19
+ - 现有 tag 格式、历史 release commit、历史 workflow 运行方式
20
+
21
+ 如果仍然无法判断发布方式或版本来源,停止并要求用户明确,不猜命令。
22
+
23
+ ## 第 1 步:先判断发布类型
24
+
25
+ 先确认:
26
+
27
+ 1. 发布哪个应用或包
28
+ 2. 目标是应用部署还是 SDK 发版
29
+ 3. 目标版本号是什么;如果用户没给,判断是 `major` / `minor` / `patch`
30
+
31
+ 归类规则:
32
+
33
+ - **应用部署**:目标是某个服务、站点、容器、镜像、二进制或线上环境
34
+ - **SDK 发版**:目标是 npm、PyPI、私有包仓库或对外库版本
35
+
36
+ 多包场景按仓库已有依赖关系、workspace 拓扑、历史发布顺序执行,不自定顺序。
37
+
38
+ ## 第 2 步:读取对应流程文件
39
+
40
+ - **应用部署**:读取 `references/application-release.md`
41
+ - **SDK 发版**:读取 `references/sdk-release.md`
42
+
43
+ 不要把两条流程混在一起执行。先判类型,再只读对应流程文件。
44
+
45
+ ## 通用约束
46
+
47
+ - 禁止在未读清仓库发布上下文时猜发布命令
48
+ - 禁止测试未完成就进入本发布流程
49
+ - 禁止构建失败后继续发布
50
+ - 禁止发布失败后对当前状态含糊表述
@@ -0,0 +1,106 @@
1
+ # 应用部署流程
2
+
3
+ 适用:发布目标是某个服务、站点、容器、镜像、二进制或线上环境。
4
+
5
+ ## 主流程
6
+
7
+ 流程骨架:
8
+
9
+ 1. `bump`
10
+ 2. `CHANGELOG`
11
+ 3. `build`
12
+ 4. `deploy`
13
+ 5. `verify env`
14
+
15
+ ## 1. 判断是否需要 bump
16
+
17
+ 不要一上来改版本号。先判断这次部署是否需要 bump:
18
+
19
+ - **需要 bump**:带显式版本号的应用发布、镜像 tag 升级、二进制版本升级、对外可见版本变化
20
+ - **可不 bump**:纯重发、仅重跑 workflow、仅补环境配置、仅回滚到已有构建
21
+ - **拿不准**:调用 `dwy-semver` 决定升级位和新版本号
22
+
23
+ 如果需要 bump:
24
+
25
+ 1. 读取当前版本
26
+ 2. 算出新版本号
27
+ 3. 修改版本文件、镜像 tag 或其他版本来源
28
+
29
+ 不要用会自动 commit 的版本命令。直接编辑版本来源,保持提交边界可控。
30
+
31
+ ## 2. 写 CHANGELOG
32
+
33
+ 判断完 bump 后,再处理 `CHANGELOG`。
34
+
35
+ - **需要正式版本发布**:必须写
36
+ - **仅部署且无版本变化**:按项目约定决定是否跳过
37
+
38
+ 处理顺序:
39
+
40
+ 1. 找上一个 release tag
41
+ 2. 查看 `git log <last-tag>..HEAD --oneline`
42
+ 3. 按 `feat` / `fix` / `refactor` / `chore` 分组
43
+ 4. 写入 `CHANGELOG.md` 或项目指定的 release notes 文件
44
+
45
+ 如果仓库已有自动生成命令,优先使用;没有再手写。
46
+
47
+ `CHANGELOG` 未完成,不继续。
48
+
49
+ ## 3. 确认测试已完成并执行 build
50
+
51
+ 本流程不重复跑测试,只确认当前变更已经过项目要求的测试。
52
+
53
+ 然后执行 build,确保发布产物可生成。
54
+
55
+ 构建失败则停止。
56
+
57
+ ## 4. 决定 deploy 入口
58
+
59
+ 不要把 deploy 写死成某种命令。根据仓库上下文自行判断:
60
+
61
+ - 是推镜像、发二进制、跑部署脚本,还是触发 CI/CD
62
+ - 是 GitHub Actions、其他 CI,还是本地脚本
63
+ - 是否需要先 commit、tag、push 才能触发部署
64
+
65
+ 判断标准示例:
66
+
67
+ - 存在明确 workflow、触发方式、部署 job,且部署由 CI 完成 → 走 CI
68
+ - 仓库里有明确部署脚本、命令或运维入口 → 走本地部署流程
69
+
70
+ ## 5. 执行 deploy
71
+
72
+ 如果是 CI 驱动:
73
+
74
+ 1. 提交 release 相关文件
75
+ 2. 按项目规则创建 tag;如果不是 tag 触发,则按配置触发 workflow
76
+ 3. 推送分支和 tag
77
+ 4. 观察部署运行状态直到成功或失败
78
+
79
+ 如果是本地驱动:
80
+
81
+ 1. 提交 release 相关文件
82
+ 2. 按项目规则创建 tag
83
+ 3. 推送分支和 tag
84
+ 4. 执行本地部署命令
85
+
86
+ 失败则停止,并给出失败阶段和关键报错。
87
+
88
+ ## 6. verify env
89
+
90
+ 部署完成后,按仓库约定验证环境已生效。可用信号包括:
91
+
92
+ - 健康检查
93
+ - 版本接口
94
+ - 页面访问
95
+ - 运行日志
96
+ - 镜像 tag
97
+ - 发布平台状态
98
+ - 其他项目约定信号
99
+
100
+ 验证失败,部署不算完成。
101
+
102
+ ## 禁止事项
103
+
104
+ - 禁止跳过“是否需要 bump”的判断
105
+ - 禁止先部署后补 `CHANGELOG`
106
+ - 禁止把环境验证替换成包仓库验证
@@ -0,0 +1,93 @@
1
+ # SDK 发版流程
2
+
3
+ 适用:发布目标是 npm、PyPI、私有包仓库或对外库版本。
4
+
5
+ ## 主流程
6
+
7
+ 流程骨架:
8
+
9
+ 1. `bump`
10
+ 2. `CHANGELOG`
11
+ 3. `build`
12
+ 4. `publish package`
13
+ 5. `verify registry`
14
+
15
+ ## 1. 判断是否需要 bump
16
+
17
+ SDK 发版默认需要判断版本升级。
18
+
19
+ - **需要 bump**:正式发布新版本、预发布版本、修复发布产物并重发
20
+ - **拿不准**:调用 `dwy-semver` 决定升级位和新版本号
21
+
22
+ 执行顺序:
23
+
24
+ 1. 读取当前版本
25
+ 2. 算出新版本号
26
+ 3. 修改版本文件
27
+
28
+ 不要用会自动 commit 的版本命令。直接编辑版本文件。
29
+
30
+ ## 2. 写 CHANGELOG
31
+
32
+ SDK 发版必须写 `CHANGELOG`。
33
+
34
+ 处理顺序:
35
+
36
+ 1. 找上一个 release tag
37
+ 2. 查看 `git log <last-tag>..HEAD --oneline`
38
+ 3. 按 `feat` / `fix` / `refactor` / `chore` 分组
39
+ 4. 写入 `CHANGELOG.md` 或项目指定的 release notes 文件
40
+
41
+ 如果仓库已有自动生成命令,优先使用;没有再手写。
42
+
43
+ `CHANGELOG` 未完成,不继续。
44
+
45
+ ## 3. 确认测试已完成并执行 build
46
+
47
+ 本流程不重复跑测试,只确认当前变更已经过项目要求的测试。
48
+
49
+ 然后执行 build,确保包产物可生成。
50
+
51
+ 构建失败则停止。
52
+
53
+ ## 4. 决定 publish 入口
54
+
55
+ 根据仓库上下文判断:
56
+
57
+ - **CI 发布**:workflow、release job、tag push、workflow_dispatch、release please、cibuildwheel
58
+ - **本地发布**:`pnpm publish`、`uv publish`、`twine upload` 或其他本地发包命令
59
+
60
+ ## 5. 执行 publish package
61
+
62
+ 如果是 CI 驱动:
63
+
64
+ 1. 提交 release 相关文件
65
+ 2. 按项目规则创建 tag;如果不是 tag 触发,则按配置触发 workflow
66
+ 3. 推送分支和 tag
67
+ 4. 观察发布运行状态直到成功或失败
68
+
69
+ 如果是本地驱动:
70
+
71
+ 1. 提交 release 相关文件
72
+ 2. 按项目规则创建 tag
73
+ 3. 推送分支和 tag
74
+ 4. 执行本地发包命令
75
+
76
+ 失败则停止,并给出失败阶段和关键报错。
77
+
78
+ ## 6. verify registry
79
+
80
+ 发布完成后,确认目标仓库中的新版本已可见。验证方式包括:
81
+
82
+ - npm:`npm view <pkg> version`
83
+ - PyPI:`pip index versions <pkg>` 或项目定义的检查命令
84
+ - 私有仓库:项目约定的版本查询方式
85
+ - GitHub Release:确认 release/tag 已生成
86
+
87
+ 验证失败,发版不算完成。
88
+
89
+ ## 禁止事项
90
+
91
+ - 禁止跳过版本升级判断
92
+ - 禁止先发包后补 `CHANGELOG`
93
+ - 禁止把包仓库验证替换成环境健康检查
@@ -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 是兜底,写法本身就该走安全方式。