@captain_z/zsk-skills 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +263 -0
  2. package/bundles.yaml +104 -0
  3. package/design-handoff/.gitkeep +0 -0
  4. package/design-handoff/figma-to-code/SKILL.md +265 -0
  5. package/design-handoff/ue-mcp/SKILL.md +184 -0
  6. package/frontend/.gitkeep +0 -0
  7. package/frontend/a11y-web/SKILL.md +169 -0
  8. package/frontend/api-contract-ts/SKILL.md +275 -0
  9. package/frontend/css-bem/SKILL.md +268 -0
  10. package/frontend/design-frontend/SKILL.md +163 -0
  11. package/frontend/dor-dod-frontend/SKILL.md +114 -0
  12. package/frontend/feature-tasks-frontend/SKILL.md +246 -0
  13. package/frontend/i18n/SKILL.md +296 -0
  14. package/frontend/nfr-web/SKILL.md +258 -0
  15. package/frontend/performance-web/SKILL.md +299 -0
  16. package/frontend/react-components/SKILL.md +211 -0
  17. package/frontend/react-naming/SKILL.md +224 -0
  18. package/frontend/review-frontend/SKILL.md +126 -0
  19. package/frontend/security-web/SKILL.md +286 -0
  20. package/frontend/spec-frontend/SKILL.md +141 -0
  21. package/frontend/testing-web/SKILL.md +252 -0
  22. package/frontend/typescript/SKILL.md +219 -0
  23. package/meta/.gitkeep +0 -0
  24. package/meta/philosophy/SKILL.md +221 -0
  25. package/package.json +24 -0
  26. package/quality/.gitkeep +0 -0
  27. package/quality/a11y-principles/SKILL.md +155 -0
  28. package/quality/code-hygiene/SKILL.md +126 -0
  29. package/quality/release/SKILL.md +209 -0
  30. package/quality/security-owasp/SKILL.md +157 -0
  31. package/quality/testing-pyramid/SKILL.md +173 -0
  32. package/sdlc/.gitkeep +0 -0
  33. package/sdlc/archive/SKILL.md +267 -0
  34. package/sdlc/bugfix/SKILL.md +181 -0
  35. package/sdlc/bugfix-tasks/SKILL.md +232 -0
  36. package/sdlc/coding/SKILL.md +177 -0
  37. package/sdlc/design/SKILL.md +299 -0
  38. package/sdlc/dor-dod/SKILL.md +120 -0
  39. package/sdlc/feature/SKILL.md +162 -0
  40. package/sdlc/proposal/SKILL.md +271 -0
  41. package/sdlc/refactor/SKILL.md +220 -0
  42. package/sdlc/refactor-tasks/SKILL.md +265 -0
  43. package/sdlc/reviewing/SKILL.md +197 -0
  44. package/sdlc/spec/SKILL.md +235 -0
  45. package/sdlc/task/SKILL.md +116 -0
  46. package/sdlc/task-evidence/SKILL.md +178 -0
  47. package/sdlc/task-structure/SKILL.md +153 -0
  48. package/sdlc/task-tracking/SKILL.md +192 -0
  49. package/sdlc/verify/SKILL.md +181 -0
  50. package/system/.gitkeep +0 -0
  51. package/system/adr/SKILL.md +169 -0
  52. package/system/architecture/SKILL.md +182 -0
  53. package/system/glossary/SKILL.md +141 -0
  54. package/system/nfr-baseline/SKILL.md +156 -0
  55. package/system/project-constraints-template/SKILL.md +241 -0
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: zsk:code-hygiene
3
+ description: Code hygiene for any language — comment policy (WHY not WHAT),
4
+ import ordering principle, formatter discipline, generic forbidden patterns
5
+ (TODO comments, commented-out code, signature-like comments). Stack-specific
6
+ rules (TypeScript red lines, React naming) are in frontend/*.
7
+ category: standard
8
+ domain: quality
9
+ tier: optional
10
+ related:
11
+ - ../../sdlc/coding/SKILL.md
12
+ - ../../sdlc/reviewing/SKILL.md
13
+ - ../../frontend/typescript/SKILL.md
14
+ - ../../frontend/react-naming/SKILL.md
15
+ triggers:
16
+ - code hygiene
17
+ - comment policy
18
+ - import order
19
+ - WHY not WHAT
20
+ - prettier discipline
21
+ - forbidden patterns
22
+ ---
23
+
24
+ # Quality: Code Hygiene(代码卫生)
25
+
26
+ > **范围**:跨栈、跨语言通用的代码卫生原则 — 注释、Import、格式化、禁止写法
27
+ > **不含**:协作流程(见 `sdlc/coding`)、栈特定规则(TypeScript 见 `frontend/typescript`;React 命名见 `frontend/react-naming`)
28
+ > **参考规范**:Google Style Guides、Airbnb 风格指南、Prettier 默认
29
+
30
+ ## 注释策略(跨栈通用)
31
+
32
+ ### 默认不写注释
33
+
34
+ 好命名 + 好结构胜过注释。**代码已经在说 WHAT,别复述。**
35
+
36
+ ### 何时该写
37
+
38
+ 只写 **WHY 非显而易见**的内容:
39
+
40
+ - **隐藏约束**(例:"此处必须同步调用,后端不支持批量")
41
+ - **非显而易见的 workaround**(例:"临时绕开 XX bug,待 YY 升级后移除")
42
+ - **业务规则来源**(例:"// 按 SRS 11.1 role 表定义")
43
+ - **微妙的不变式**(例:"保证 parentId 为真实节点或 -1")
44
+
45
+ ### 禁止
46
+
47
+ - ❌ 复述代码的"what"
48
+ - ❌ `// TODO`(改用 Issue,能追踪、能排期)
49
+ - ❌ 被注释掉的代码(用 git 历史)
50
+ - ❌ 签名样的 `@author` / `@date`(用 git blame)
51
+ - ❌ `// 解决 bug #123`(放 commit message,不放代码)
52
+
53
+ ### 公开 API 的 Docstring
54
+
55
+ 仅用于:
56
+ - 导出的公共 API(函数 / 类 / 模块)
57
+ - 需要 IDE 提示参数含义的复杂签名
58
+ - 不写完整 docstring,只写 1-2 行说清用途
59
+
60
+ ```
61
+ /** 从当前可管理范围构建虚拟根树 */
62
+ ```
63
+
64
+ ## Import 顺序原则(语言无关)
65
+
66
+ 不同语言符号不同,但**分组原则相同**:
67
+
68
+ ```text
69
+ 1. 标准库 / 内置
70
+ 2. 外部依赖(框架优先)
71
+ 3. 内部别名(按层级:services → utils → components)
72
+ 4. 同模块相对路径(./xxx)
73
+ 5. 样式 / 资源(放最后)
74
+ ```
75
+
76
+ 每组之间空一行。类型导入用语言对应的显式语法(如 TS 的 `import type`)。
77
+
78
+ ### 为什么这样
79
+
80
+ - **可读性**:按"远 → 近"组织,视线自然流动
81
+ - **冲突少**:外部与内部分层,重命名影响可控
82
+ - **工具友好**:lint / autofix 能稳定排序
83
+
84
+ ## 格式化纪律
85
+
86
+ - **统一用 Prettier 或等价格式化工具**(配置随项目预设 / 脚手架默认)
87
+ - **不手工调格式**;保存时自动 format
88
+ - 提交前 pre-commit hook 自动跑 lint + format
89
+ - 团队之间不为"括号 / 分号 / 空格"争论 — 格式化工具决定
90
+
91
+ ## 通用禁止写法(跨栈)
92
+
93
+ 以下规则命中即应视为 Review 打回:
94
+
95
+ | 模式 | 为什么禁 | 替代 |
96
+ | --- | --- | --- |
97
+ | `TODO` / `FIXME` 留在代码 | 永不处理 | 建 Issue / 任务,代码里只留 Issue 链接 |
98
+ | 被注释的代码 | 变污染;git 已有历史 | 删除 → git blame / log 能找回 |
99
+ | `@author` / `@date` 签名 | 变错 / 过时 | 用 git blame |
100
+ | 业务注释写死 commit 号 / PR 号 | 代码不该耦合历史元信息 | 放 commit message |
101
+ | 无说明的魔法常量 | 读者看不懂来源 | 抽常量 / 加 WHY 注释指向依据 |
102
+ | 复制粘贴 3+ 次同一段逻辑 | 维护地狱 | 抽函数 / 提 util |
103
+
104
+ ## Lint 通用红线(按栈扩展)
105
+
106
+ 本清单是**语言无关**的 Lint 原则。具体规则名按语言 / 生态挑选:
107
+
108
+ - **语法危险**:禁用 `eval` / `new Function` 或等价动态执行(见 `quality/security-owasp`)
109
+ - **死代码**:禁留无调用的导出 / 函数
110
+ - **未使用变量**:一律删除或加忽略前缀
111
+ - **循环复杂度**:超阈值必拆(推荐 10)
112
+ - **文件长度**:超阈值必拆(推荐 300-500 行按语言)
113
+ - **深度嵌套**:推荐 ≤ 3-4 层
114
+
115
+ 具体到栈:
116
+ - TypeScript 红线:见 [`frontend/typescript`](../../frontend/typescript/SKILL.md)
117
+ - React 命名规范:见 [`frontend/react-naming`](../../frontend/react-naming/SKILL.md)
118
+ - OWASP 安全 Lint:见 [`quality/security-owasp`](../security-owasp/SKILL.md)
119
+
120
+ ## 质量门禁
121
+
122
+ - [ ] 注释只写 WHY,不复述 WHAT
123
+ - [ ] 无 `TODO` / `FIXME` / 被注释代码
124
+ - [ ] Import 顺序符合项目约定
125
+ - [ ] Prettier / 格式化工具零 diff
126
+ - [ ] Lint 零 error
@@ -0,0 +1,209 @@
1
+ ---
2
+ name: zsk:release
3
+ description: Version release discipline — SemVer numbering, Keep a Changelog,
4
+ Conventional Changelog auto-generation, environment promotion
5
+ (dev→test→pre→prod), feature flag lifecycle, rollback strategy, hotfix
6
+ process, canary monitoring. Works across language stacks; tool names are
7
+ stack-specific examples.
8
+ category: standard
9
+ domain: quality
10
+ tier: optional
11
+ related:
12
+ - ../../sdlc/archive/SKILL.md
13
+ - ../../sdlc/bugfix/SKILL.md
14
+ triggers:
15
+ - SemVer
16
+ - changelog
17
+ - conventional changelog
18
+ - hotfix
19
+ - feature flag
20
+ - canary monitoring
21
+ - release process
22
+ - rollback
23
+ ---
24
+
25
+ # Quality: Release(发布纪律 · 跨栈)
26
+
27
+ > **范围**:版本策略、Changelog、部署、灰度、回滚、Hotfix、Canary
28
+ > **参考规范**:SemVer 2.0、Keep a Changelog、Conventional Changelog、Feature Flag Best Practices
29
+ > **跨栈适配**:具体工具名(`npm audit` / `cargo audit` / `webpack-bundle-analyzer` 等)为示例,按栈替换
30
+
31
+ ## 版本策略(SemVer)
32
+
33
+ 格式:`MAJOR.MINOR.PATCH`
34
+
35
+ | 段位 | 变更类型 | 示例 |
36
+ | --- | --- | --- |
37
+ | `MAJOR` | 破坏性变更 | 移除接口、改类型签名、改默认行为 |
38
+ | `MINOR` | 向后兼容的新功能 | 新接口、新配置项、新组件 |
39
+ | `PATCH` | 向后兼容的修复 | bug 修复、文档、内部重构 |
40
+
41
+ 预发布版本:`1.2.0-rc.1` / `1.2.0-beta.3`
42
+
43
+ ## Changelog(Keep a Changelog)
44
+
45
+ 每次 release 更新 `CHANGELOG.md`:
46
+
47
+ ```md
48
+ # Changelog
49
+
50
+ ## [Unreleased]
51
+
52
+ ## [1.2.0] - 2026-04-18
53
+
54
+ ### Added
55
+ - {新功能描述}(#PR / Refs Spec FR-x)
56
+
57
+ ### Changed
58
+ - {行为修改或重构}
59
+
60
+ ### Deprecated
61
+ - {即将移除的 API / 功能}
62
+
63
+ ### Removed
64
+ - {已移除的内容}
65
+
66
+ ### Fixed
67
+ - {bug 修复}(#issue / Refs Postmortem)
68
+
69
+ ### Security
70
+ - {安全修复 / 依赖升级}
71
+ ```
72
+
73
+ ### 从 Conventional Commits 自动生成
74
+
75
+ 按栈选工具(`conventional-changelog-cli` / `standard-version` / `git-cliff` / `towncrier` / ...):
76
+
77
+ - `feat` → Added
78
+ - `fix` → Fixed
79
+ - `perf` / `refactor` → Changed
80
+ - `BREAKING CHANGE` → 独立章节 + 触发 MAJOR 升级
81
+
82
+ ## 发布检查清单
83
+
84
+ ### 代码层
85
+
86
+ - [ ] 所有 PR 已合并到 release 分支
87
+ - [ ] 项目 lint 命令零 error(`{{config.scripts.lint}}`)
88
+ - [ ] 项目 type-check 零 error(`{{config.scripts.type_check}}`,如适用)
89
+ - [ ] 全量回归测试通过
90
+ - [ ] `CHANGELOG.md` 已更新并审阅
91
+ - [ ] 版本号已升级(按栈的版本文件:`package.json` / `Cargo.toml` / `pyproject.toml` / `Gemfile` 等)
92
+ - [ ] Git tag 已打(`vX.Y.Z`)
93
+
94
+ ### 依赖层
95
+
96
+ - [ ] 无版本漂移风险(lock 文件按栈锁定:`package-lock.json` / `Cargo.lock` / `poetry.lock` / `Gemfile.lock` / `go.sum` / ...)
97
+ - [ ] 无 P0 / P1 安全漏洞(依赖扫描工具,见 [`quality/security-owasp`](../security-owasp/SKILL.md))
98
+ - [ ] 新增依赖已记录用途与许可证
99
+
100
+ ### 文档层
101
+
102
+ - [ ] README / 接入文档已更新
103
+ - [ ] Breaking change 已写迁移指南
104
+ - [ ] API 契约(若跨服务)已同步
105
+
106
+ ### 通知层
107
+
108
+ - [ ] 使用方 / 下游团队已通知
109
+ - [ ] Breaking change 提前至少 1 个迭代通知
110
+ - [ ] 发布公告已准备
111
+
112
+ ## 部署策略
113
+
114
+ ### 环境分级
115
+
116
+ | 环境 | 用途 | 准入条件 |
117
+ | --- | --- | --- |
118
+ | `dev` | 本地开发 | 自由 |
119
+ | `test` | 集成测试 | 单元 + 集成测试通过 |
120
+ | `pre` | 预发 / UAT | 全量回归通过 + Changelog 更新 |
121
+ | `prod` | 生产 | 预发通过 + 发布检查清单全绿 + 审批 |
122
+
123
+ ### 发布方式
124
+
125
+ - **常规发布**:工作时间窗口内(避开高峰)
126
+ - **紧急发布(Hotfix)**:见下文 Hotfix 小节
127
+ - **破坏性发布**:提前公告 + 双跑期 + 回滚预案
128
+
129
+ ## 灰度 / Feature Flag
130
+
131
+ ### 何时使用
132
+
133
+ - 影响面大 / 不可逆的行为变更
134
+ - 需要 A/B 验证的新功能
135
+ - 想降低发布风险的重构
136
+
137
+ ### 使用规约
138
+
139
+ - Flag 命名:`<scope>.<feature>.<status>`(例 `core.virtualScroll.enabled`)
140
+ - 必须有默认值(保守 / 现状)
141
+ - 必须有**移除计划**(登记到 `CHANGELOG.md` 的 Deprecated)
142
+ - Flag 生命周期 ≤ 2 个迭代,过期必须清理
143
+ - 禁止 flag 嵌套 flag(组合爆炸)
144
+
145
+ ## 回滚策略
146
+
147
+ ### 触发条件
148
+
149
+ - P0 / P1 bug 无法快速修复
150
+ - 性能回退超过基线 20%
151
+ - 核心监控指标异常(错误率 / 响应时间)
152
+
153
+ ### 回滚动作
154
+
155
+ 1. **代码回滚**:revert commit 或切换到上一个 tag
156
+ 2. **版本标记**:新增 patch 版本(如 `1.2.1`)标记"回滚 1.2.0"
157
+ 3. **Changelog**:显式写明回滚原因
158
+ 4. **Postmortem**:P0 / P1 回滚必走 [`zsk:bugfix`](../../sdlc/bugfix/SKILL.md) 的 postmortem 步骤
159
+
160
+ ### 不可回滚场景
161
+
162
+ - 数据库迁移已跑(需反向迁移脚本)
163
+ - 用户数据已按新结构落库(需兼容层)
164
+
165
+ **预防**:这类变更在 `design.md` 必须预先声明"可回滚性"。
166
+
167
+ ## Hotfix 发布
168
+
169
+ 流程简化版:
170
+
171
+ 1. 从生产 tag 切分支:`hotfix/v1.2.1-xxx`
172
+ 2. 最小改动修复
173
+ 3. 补测试防回归
174
+ 4. 合并到 `master` + 主干(避免丢失)
175
+ 5. 打 tag `v1.2.1`,发布
176
+ 6. 更新 CHANGELOG 的 Fixed 章节
177
+ 7. P0 / P1 走 Postmortem
178
+
179
+ ## 发布后监控(Canary)
180
+
181
+ 发布后 30 分钟内重点观察:
182
+
183
+ - 错误率
184
+ - 核心接口响应时间
185
+ - 关键业务指标(点击 / 提交 / 转化)
186
+ - 用户反馈渠道
187
+
188
+ 异常立刻触发回滚。
189
+
190
+ ## Skill 集成
191
+
192
+ | 场景 | Primary Skill |
193
+ | --- | --- |
194
+ | 完成分支 | `superpowers:finishing-a-development-branch` |
195
+ | Ship | `ship` |
196
+ | 合并 | `merging-branches` |
197
+ | 部署 + 验证 | `land-and-deploy` |
198
+ | 灰度监控 | `canary` |
199
+ | 提交 | `code-commit` |
200
+ | 创建 PR | `github-pr` |
201
+
202
+ ## 质量门禁
203
+
204
+ - [ ] SemVer 版本号正确
205
+ - [ ] Changelog 按 Keep a Changelog 格式更新
206
+ - [ ] 发布检查清单全绿
207
+ - [ ] 有回滚预案
208
+ - [ ] Breaking change 已提前公告
209
+ - [ ] Feature flag 有移除计划
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: zsk:security-owasp
3
+ description: Cross-stack security discipline — OWASP Top 10 overview, CVE
4
+ response SLAs, dependency license whitelist, supply chain hygiene, common lint
5
+ red lines (eval/dynamic execution), and the "frontend UI is not the final
6
+ defense" principle. Web-specific XSS/CSRF/Storage red lines are in
7
+ frontend/security-web.md.
8
+ category: standard
9
+ domain: quality
10
+ tier: optional
11
+ related:
12
+ - ../../sdlc/coding/SKILL.md
13
+ - ../../sdlc/reviewing/SKILL.md
14
+ - ../../frontend/security-web/SKILL.md
15
+ triggers:
16
+ - OWASP Top 10
17
+ - CVE response
18
+ - license whitelist
19
+ - supply chain security
20
+ - dependency audit
21
+ - eval forbidden
22
+ ---
23
+
24
+ # Quality: Security (OWASP)(跨栈安全纪律)
25
+
26
+ > **范围**:跨栈的安全原则 — OWASP Top 10、CVE 响应、许可证、供应链
27
+ > **不含**:Web 前端特定红线(`dangerouslySetInnerHTML` / Storage / CSRF Token 细节)— 见 [`frontend/security-web`](../../frontend/security-web/SKILL.md)
28
+ > **参考规范**:OWASP Top 10、OWASP ASVS Level 1
29
+ > **核心原则**:**前端是便利性防线,后端是最终防线**。前端不能替代后端鉴权,但必须防止自身成为攻击入口。
30
+
31
+ ## OWASP Top 10 概览
32
+
33
+ | 风险 | 含义 | 跨栈通用防护 |
34
+ | --- | --- | --- |
35
+ | **A01 Broken Access Control** | 越权访问 | 后端强校验 + 默认拒绝 |
36
+ | **A02 Cryptographic Failures** | 加密失败 | TLS / 密钥管理 / 不自造加密 |
37
+ | **A03 Injection** | 注入(SQL / 命令 / LDAP) | 参数化查询 / 白名单校验 |
38
+ | **A04 Insecure Design** | 不安全设计 | 威胁建模 / 最小特权 |
39
+ | **A05 Security Misconfiguration** | 配置错误 | 默认安全 / 定期审计 |
40
+ | **A06 Vulnerable & Outdated Components** | 依赖漏洞 | CVE 响应 + 依赖扫描(本文件) |
41
+ | **A07 Identification & Auth Failures** | 身份认证失败 | 多因素 / 会话管理 |
42
+ | **A08 Software & Data Integrity** | 软件 / 数据完整性 | 签名验证 / CI 安全 / 供应链 |
43
+ | **A09 Logging & Monitoring Failures** | 日志 / 监控不足 | 可观测性(见 `system/nfr-baseline` 第 6 节) |
44
+ | **A10 SSRF** | 服务端请求伪造 | 白名单出站 / 元数据服务隔离 |
45
+
46
+ ## 权限校验原则(跨栈)
47
+
48
+ ### 前端职责
49
+ - **UI 防误操作**:根据权限隐藏 / 禁用按钮,减少无效请求
50
+ - **反馈用户**:越权操作给出明确提示
51
+ - **不是最终防线**:任何敏感操作**必须**后端校验
52
+
53
+ ### 前端不能做的
54
+ - ❌ 仅靠前端路由守卫保护私密页面
55
+ - ❌ 仅靠前端隐藏按钮保护敏感操作
56
+ - ❌ 把权限判断结果存进本地存储供"下次用"
57
+
58
+ ### 越权响应
59
+ - 401 → 跳登录
60
+ - 403 → 跳无权限页 或 显示明确文案
61
+ - 不得把越权响应当普通业务错误处理
62
+
63
+ ## 依赖安全(CVE 响应)
64
+
65
+ ### 引入新依赖
66
+
67
+ PR 必须说明:
68
+
69
+ - 用途 / 替代方案
70
+ - **许可证**(默认禁 GPL / AGPL;MIT / Apache 2.0 / BSD 默认可)
71
+ - 包体积影响
72
+ - 来源验证(发布者 / 下载量 / 维护活跃度)
73
+ - 是否有已知 CVE
74
+
75
+ ### 持续监测(按栈选工具)
76
+
77
+ | 栈 | 扫描命令 |
78
+ | --- | --- |
79
+ | Node / JS | `npm audit` / `pnpm audit` / `yarn audit` / Snyk / Dependabot |
80
+ | Rust | `cargo audit` |
81
+ | Python | `pip-audit` / `safety` |
82
+ | Ruby | `bundler-audit` |
83
+ | Go | `govulncheck` |
84
+ | Java | `OWASP Dependency-Check` |
85
+
86
+ ### CVE 响应时限
87
+
88
+ | 严重度 | 响应 |
89
+ | --- | --- |
90
+ | Critical / High | 24h 内响应(升级 / 替换 / 临时豁免并登记) |
91
+ | Moderate | 当迭代内处理 |
92
+ | Low | 排期处理 |
93
+
94
+ ## 供应链防护
95
+
96
+ - **锁定版本**:按栈的 lock 文件(`package-lock.json` / `Cargo.lock` / `poetry.lock` / `Gemfile.lock` / `go.sum` / ...)
97
+ - **谨慎 micro-package**:增加供应链面(小包越多,攻击面越大)
98
+ - **优先使用项目统一 SDK**(`{{config.stack.sdk_packages}}`)
99
+ - **审核发布者**:对陌生 maintainer 的包保持警惕
100
+ - **订阅安全公告**:GitHub Security Advisories / PyPI / Crate.io 等
101
+
102
+ ### 许可证白名单(默认)
103
+
104
+ ✅ 允许:MIT / Apache 2.0 / BSD (2/3) / ISC / MPL 2.0
105
+
106
+ ❌ 默认禁:GPL / AGPL / LGPL(LGPL 在部分场景可用需 ADR 豁免)
107
+
108
+ ⚠️ 评估:CC-BY(文档 ok;代码需审)/ 自研商业许可
109
+
110
+ ## 代码层通用红线(Lint 可兜底)
111
+
112
+ 以下是**跨栈通用**的危险模式:
113
+
114
+ - `eval` / 等价动态执行(危险代码注入)
115
+ - `new Function(...)` / 等价
116
+ - `Function` 构造器接收外部字符串
117
+ - 访问 `process.env.*` 后未校验的危险操作(按栈)
118
+ - 外部字符串直接拼 shell / SQL / 路径
119
+
120
+ 按栈具体 Lint 规则(如 `no-eval` / `no-new-func` 等)在项目 Lint 配置中启用。
121
+
122
+ > Web 前端特定的 `react/no-danger` / `no-restricted-globals` 等见 [`frontend/security-web`](../../frontend/security-web/SKILL.md)
123
+
124
+ ## 安全测试
125
+
126
+ - **静态扫描**:按栈的 security lint 插件
127
+ - **依赖扫描**:每次 CI 跑(见上文工具表)
128
+ - **渗透测试**:由安全团队负责,开发协助修复
129
+ - **威胁建模**:大型改动走 STRIDE / DREAD
130
+
131
+ ## PR 门禁
132
+
133
+ 以下任一项命中即不通过:
134
+
135
+ 1. 新增依赖含已知高危 CVE(Critical / High 未处理)
136
+ 2. 引入 GPL / AGPL 许可证依赖(无 ADR 豁免)
137
+ 3. 新增 `eval` / 等价动态执行(无 ADR 豁免)
138
+ 4. 外部输入直接拼 shell / SQL / 路径
139
+ 5. 生产代码保留开发态日志(见 `quality/code-hygiene`)
140
+
141
+ ## Skill 集成
142
+
143
+ | 场景 | Primary Skill |
144
+ | --- | --- |
145
+ | 安全审计 | `cso`(CSO 模式审计) |
146
+ | 依赖漏洞排查 | `investigate` + 栈对应扫描 |
147
+ | PR 安全 Review | `codex` challenge 模式 + `merge-review` |
148
+
149
+ ## 质量门禁
150
+
151
+ - [ ] 新增依赖说明完整(用途 / 许可 / 体积 / CVE 核查)
152
+ - [ ] 锁文件已提交
153
+ - [ ] 无高危 CVE 未处理
154
+ - [ ] 无禁用许可证依赖
155
+ - [ ] 无 `eval` / 动态执行(或有 ADR 豁免)
156
+ - [ ] 权限判断不依赖前端作为最终防线
157
+ - [ ] (Web)见 `frontend/security-web` 的补充门禁
@@ -0,0 +1,173 @@
1
+ ---
2
+ name: zsk:testing-pyramid
3
+ description: Cross-language test strategy & discipline — test pyramid ratio
4
+ (unit 70 / integration 20 / e2e 10), AAA/GWT structure, coverage targets, and
5
+ the three hard principles (evidence before assertion, Red-Green-Refactor, bug
6
+ confidence questioning). Stack-specific tooling (Jest/RTL/MSW/Playwright) is
7
+ in frontend/testing-web.md.
8
+ category: standard
9
+ domain: quality
10
+ tier: optional
11
+ related:
12
+ - ../../sdlc/coding/SKILL.md
13
+ - ../../sdlc/verify/SKILL.md
14
+ - ../../sdlc/dor-dod/SKILL.md
15
+ - ../../frontend/testing-web/SKILL.md
16
+ triggers:
17
+ - test pyramid
18
+ - TDD discipline
19
+ - test coverage target
20
+ - AAA GWT structure
21
+ - evidence before assertion
22
+ - bug confidence questions
23
+ - test independence
24
+ ---
25
+
26
+ # Quality: Testing Pyramid(测试金字塔 · 跨栈纪律)
27
+
28
+ > **范围**:跨栈的测试方法论 — 金字塔分布、用例结构、覆盖率目标、三大硬原则
29
+ > **不含**:具体工具链(Jest / RTL / Playwright / axe 等见 [`frontend/testing-web`](../../frontend/testing-web/SKILL.md))
30
+ > **参考规范**:测试金字塔(Mike Cohn)、Testing Trophy(Kent C. Dodds)、ISTQB
31
+ > **吸收原则(来自 Superpowers)**:
32
+ > - 证据先于断言(verification-before-completion)
33
+ > - Red-Green-Refactor(test-driven-development)
34
+ > - Bug 置信度质疑(systematic-debugging)
35
+
36
+ ## 核心哲学
37
+
38
+ ### 证据先于断言(硬规则)
39
+
40
+ - 没跑过的命令不得声称"通过"
41
+ - 没看过的输出不得声称"修复"
42
+ - 没截过的图不得声称"视觉一致"
43
+ - 没回归过的改动不得声称"无副作用"
44
+
45
+ 未验证的断言等于无效断言。
46
+
47
+ ### Red-Green-Refactor(默认纪律)
48
+
49
+ - **Red**:先写一个**必然失败**的测试(覆盖目标行为)
50
+ - **Green**:写最少的代码让测试通过
51
+ - **Refactor**:在测试保护下清理代码
52
+
53
+ Bugfix 与 Refactor 默认使用 TDD;Feature 视情况(复杂逻辑建议 TDD,UI 可接受 test-after)。
54
+
55
+ ### Bug 置信度质疑
56
+
57
+ 修 bug 前先问三个问题:
58
+
59
+ 1. 这个 bug **确实存在**吗?(有复现证据吗)
60
+ 2. 这个原因**真的是根因**吗?(还是上游问题的表现)
61
+ 3. 我的修复**真的会生效**吗?(有没有测试能断言)
62
+
63
+ 三问都有答案再动手。
64
+
65
+ ## 测试金字塔
66
+
67
+ | 层级 | 建议占比 | 覆盖范围 |
68
+ | --- | --- | --- |
69
+ | 单元测试 | ~70% | 纯函数、工具、归一化函数 |
70
+ | 集成测试 | ~20% | 模块组合、外部依赖(mock 过)|
71
+ | E2E / 系统测试 | ~10% | 关键用户路径、真实环境 |
72
+
73
+ > 具体工具选型(Jest / Vitest / pytest / JUnit / RSpec / Go test / 等)按语言栈;前端参考 [`frontend/testing-web`](../../frontend/testing-web/SKILL.md)
74
+
75
+ ## 测试用例设计
76
+
77
+ ### 结构:AAA 或 GWT(语言无关)
78
+
79
+ ```text
80
+ AAA(Arrange - Act - Assert)
81
+ Arrange:准备数据与依赖
82
+ Act:调用被测单元
83
+ Assert:断言结果
84
+
85
+ GWT(Given - When - Then)
86
+ Given:前置条件
87
+ When:动作
88
+ Then:预期结果
89
+ ```
90
+
91
+ ### 命名规范
92
+
93
+ - 格式:`<subject> <expected behavior> when <condition>`
94
+ - 禁止模糊命名:`it('works')` / `it('test 1')`
95
+
96
+ ### 必覆盖类别
97
+
98
+ 1. **Happy Path**:正常路径
99
+ 2. **边界**:空 / 最大 / 最小 / 特殊字符
100
+ 3. **异常**:错误 / 超时 / 权限失败 / 业务错误码
101
+ 4. **契约边界**:公开接口的每个参数组合
102
+ 5. (若涉及)并发 / 幂等 / 重入
103
+
104
+ ### 独立性与确定性
105
+
106
+ - **不共享状态**:每个 test 独立 setup / teardown
107
+ - **不依赖执行顺序**:随机顺序应全部通过
108
+ - **不依赖时间**:用 fake timers
109
+ - **不依赖网络**:mock / stub / 拦截
110
+ - **不依赖环境变量**:测试内注入
111
+
112
+ ### 数据工厂
113
+
114
+ - 所有测试数据通过工厂函数生成(`makeUser({ id: 1, ...overrides })`),不散落 inline 字面量
115
+ - 失败样例必须覆盖契约中列出的所有错误 code
116
+
117
+ ## 覆盖率目标(通用基线)
118
+
119
+ - 语句覆盖率 ≥ 80%
120
+ - 关键模块(业务核心 / 归一化 / 权限判断)分支覆盖率 ≥ 85%
121
+ - **新增代码 100% 覆盖**(不降低存量覆盖率)
122
+ - 覆盖率不是目的,是**暴露未测路径**的手段;100% 覆盖 ≠ 0 bug
123
+
124
+ ## DoR / DoD(测试相关)
125
+
126
+ ### DoR(启动前)
127
+
128
+ - [ ] `spec.md` 已冻结(Props / 状态 / 验收标准无歧义)
129
+ - [ ] `design.md` 已冻结(文件职责、错误处理策略齐全)
130
+ - [ ] 验收标准可测(BDD Given/When/Then)
131
+
132
+ ### DoD(关闭前)
133
+
134
+ - [ ] 代码合并到主干
135
+ - [ ] 单元测试通过,覆盖关键分支
136
+ - [ ] 集成 / E2E 测试通过(如适用)
137
+ - [ ] `lint` / `type-check` / `build` 零 error
138
+ - [ ] PR 自检清单全部勾选
139
+
140
+ (完整 DoR/DoD 见 [`zsk:dor-dod`](../../sdlc/dor-dod/SKILL.md))
141
+
142
+ ## 严重度分级(Bug)
143
+
144
+ | 级别 | 定义 | 响应时限 |
145
+ | --- | --- | --- |
146
+ | **P0** | 核心功能不可用 / 数据损坏 / 安全漏洞 | 即时响应,24h 内修复 |
147
+ | **P1** | 主要功能受阻,无稳定绕行 | 当天响应,当迭代修复 |
148
+ | **P2** | 次要功能受阻,有绕行方案 | 下迭代修复 |
149
+ | **P3** | 优化 / 偶发 / 小缺陷 | 排期修复 |
150
+
151
+ ## 回归测试策略
152
+
153
+ - **自动化优先**:每次 CI 跑全量单元 + 集成 + 关键 E2E
154
+ - **合并前必跑**:改动涉及的模块 + 依赖该模块的上层调用方
155
+ - **发布前必跑**:全量回归
156
+
157
+ ## Skill 集成
158
+
159
+ | 场景 | Primary Skill |
160
+ | --- | --- |
161
+ | 开始写测试 | `superpowers:test-driven-development` |
162
+ | 自我验证 | `superpowers:verification-before-completion` / `zsk:verify` |
163
+ | QA 流程 | `qa` / `qa-only` |
164
+ | Bug 复现 | `superpowers:systematic-debugging` |
165
+
166
+ ## 质量门禁
167
+
168
+ - [ ] DoR / DoD 清单完整
169
+ - [ ] 测试金字塔三层均有用例
170
+ - [ ] 覆盖率达标(见上文)
171
+ - [ ] 证据链完整
172
+ - [ ] 用例独立 + 确定
173
+ - [ ] 命名清晰 `<subject> <expected> when <condition>`
package/sdlc/.gitkeep ADDED
File without changes