create-vibe-workflow 0.1.0 → 0.2.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 (120) hide show
  1. package/README.md +248 -57
  2. package/dist/adapters/next-only/skills.recommend.json +1 -0
  3. package/dist/adapters/node-api/skills.recommend.json +1 -0
  4. package/dist/cli.js +163 -5
  5. package/dist/cli.js.map +1 -1
  6. package/dist/generator.d.ts.map +1 -1
  7. package/dist/generator.js +255 -44
  8. package/dist/generator.js.map +1 -1
  9. package/dist/questions.d.ts +11 -1
  10. package/dist/questions.d.ts.map +1 -1
  11. package/dist/questions.js +103 -16
  12. package/dist/questions.js.map +1 -1
  13. package/dist/templates/claude-md/CLAUDE.zh-CN.md +51 -46
  14. package/dist/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
  15. package/dist/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
  16. package/dist/templates/commands/gstack/cso.md.ejs +213 -0
  17. package/dist/templates/commands/gstack/office-hours.md.ejs +109 -0
  18. package/dist/templates/commands/gstack/review.md.ejs +192 -0
  19. package/dist/templates/commands/gstack/ship.md.ejs +256 -0
  20. package/dist/templates/commands/opsx/apply.md.ejs +106 -0
  21. package/dist/templates/commands/opsx/archive.md.ejs +88 -0
  22. package/dist/templates/commands/opsx/explore.md.ejs +84 -0
  23. package/dist/templates/commands/opsx/propose.md.ejs +185 -0
  24. package/dist/templates/commands/superpowers/brainstorm.md.ejs +240 -0
  25. package/dist/templates/commands/superpowers/tdd.md.ejs +230 -0
  26. package/dist/templates/commands/superpowers/verify.md.ejs +211 -0
  27. package/dist/templates/commands/workflow/plan.md.ejs +219 -0
  28. package/dist/templates/hooks/check-deps.mjs +66 -65
  29. package/dist/templates/memory/.gitkeep +0 -0
  30. package/dist/templates/memory/MEMORY.md.ejs +88 -0
  31. package/dist/templates/memory/dev-notes.md.ejs +61 -0
  32. package/dist/templates/memory/troubleshooting.md.ejs +30 -0
  33. package/dist/templates/rules/agents.md +49 -49
  34. package/dist/templates/rules/coding-style.md +156 -117
  35. package/dist/templates/rules/development-workflow.md +103 -50
  36. package/dist/templates/rules/git-workflow.md +103 -47
  37. package/dist/templates/rules/hooks.md +159 -0
  38. package/dist/templates/rules/hooks.md.ejs +159 -0
  39. package/dist/templates/rules/memory.md +106 -0
  40. package/dist/templates/rules/memory.md.ejs +106 -0
  41. package/dist/templates/rules/patterns.md +117 -48
  42. package/dist/templates/rules/performance.md +108 -0
  43. package/dist/templates/rules/performance.md.ejs +108 -0
  44. package/dist/templates/rules/security.md +52 -37
  45. package/dist/templates/rules/testing.md +83 -30
  46. package/dist/templates/settings/settings.template.json +18 -2
  47. package/dist/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
  48. package/dist/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
  49. package/dist/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
  50. package/dist/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
  51. package/dist/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
  52. package/dist/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
  53. package/dist/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
  54. package/dist/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
  55. package/dist/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
  56. package/dist/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
  57. package/dist/templates/skills/skill-manifest.json +59 -0
  58. package/dist/templates/skills/skills-lock.template.json +12 -0
  59. package/dist/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
  60. package/dist/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
  61. package/dist/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
  62. package/dist/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
  63. package/dist/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
  64. package/dist/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
  65. package/dist/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
  66. package/dist/utils.d.ts +40 -0
  67. package/dist/utils.d.ts.map +1 -0
  68. package/dist/utils.js +110 -0
  69. package/dist/utils.js.map +1 -0
  70. package/package.json +2 -2
  71. package/templates/claude-md/CLAUDE.zh-CN.md +51 -46
  72. package/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
  73. package/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
  74. package/templates/commands/gstack/cso.md.ejs +213 -0
  75. package/templates/commands/gstack/office-hours.md.ejs +109 -0
  76. package/templates/commands/gstack/review.md.ejs +192 -0
  77. package/templates/commands/gstack/ship.md.ejs +256 -0
  78. package/templates/commands/opsx/apply.md.ejs +106 -0
  79. package/templates/commands/opsx/archive.md.ejs +88 -0
  80. package/templates/commands/opsx/explore.md.ejs +84 -0
  81. package/templates/commands/opsx/propose.md.ejs +185 -0
  82. package/templates/commands/superpowers/brainstorm.md.ejs +240 -0
  83. package/templates/commands/superpowers/tdd.md.ejs +230 -0
  84. package/templates/commands/superpowers/verify.md.ejs +211 -0
  85. package/templates/commands/workflow/plan.md.ejs +219 -0
  86. package/templates/hooks/check-deps.mjs +66 -65
  87. package/templates/memory/.gitkeep +0 -0
  88. package/templates/memory/MEMORY.md.ejs +88 -0
  89. package/templates/memory/dev-notes.md.ejs +61 -0
  90. package/templates/memory/troubleshooting.md.ejs +30 -0
  91. package/templates/rules/agents.md +49 -49
  92. package/templates/rules/coding-style.md +156 -117
  93. package/templates/rules/development-workflow.md +103 -50
  94. package/templates/rules/git-workflow.md +103 -47
  95. package/templates/rules/hooks.md +159 -0
  96. package/templates/rules/memory.md +106 -0
  97. package/templates/rules/patterns.md +117 -48
  98. package/templates/rules/performance.md +108 -0
  99. package/templates/rules/security.md +52 -37
  100. package/templates/rules/testing.md +83 -30
  101. package/templates/settings/settings.template.json +18 -2
  102. package/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
  103. package/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
  104. package/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
  105. package/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
  106. package/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
  107. package/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
  108. package/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
  109. package/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
  110. package/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
  111. package/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
  112. package/templates/skills/skill-manifest.json +59 -0
  113. package/templates/skills/skills-lock.template.json +12 -0
  114. package/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
  115. package/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
  116. package/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
  117. package/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
  118. package/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
  119. package/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
  120. package/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
@@ -0,0 +1,195 @@
1
+ # Frontend Patterns — 前端开发模式
2
+
3
+ > 使用此 skill 时:实现 UI 组件、管理状态、优化前端性能时。
4
+
5
+ ## 组件组合模式
6
+
7
+ ### 原则
8
+
9
+ ```text
10
+ 【组合优于继承】
11
+ - 小组件组合成复杂 UI
12
+ - 每个组件只有一个职责
13
+ - 组件不应知道父组件的内部细节
14
+
15
+ 【容器 vs 展示】
16
+ - 容器组件:管理状态和数据获取
17
+ - 展示组件:纯渲染,通过属性接收数据和回调
18
+ ```
19
+
20
+ ### 组件结构模板
21
+
22
+ ```text
23
+ Component/
24
+ ├── Component.{ext} # 主组件
25
+ ├── Component.types.{ext} # 类型定义
26
+ ├── Component.styles.{ext} # 样式
27
+ ├── Component.test.{ext} # 测试
28
+ ├── parts/ # 子组件
29
+ │ ├── PartA.{ext}
30
+ │ └── PartB.{ext}
31
+ └── index.{ext} # 重导出
32
+ ```
33
+
34
+ ## 状态管理决策矩阵
35
+
36
+ | 场景 | 方案 | 说明 |
37
+ |------|------|------|
38
+ | 局部 UI 状态(表单输入、折叠展开) | 组件内局部状态 | 最简单的方案,不需要外部管理 |
39
+ | 子组件需要访问父组件状态 | 属性传递(Props Drilling) | 1-2 层时适用 |
40
+ | 多个不相关组件需要共享状态 | 提升状态(Lifting State Up) | 移到最近的共同祖先 |
41
+ | 深层嵌套组件需要共享状态 | 上下文(Context) | 避免多层属性传递 |
42
+ | 上下文+复杂更新逻辑 | 上下文 + Reducer | 类似 Redux 但内置 |
43
+ | 跨页面/全局状态 | 专用状态管理库 | 如 Zustand、Pinia、Redux Toolkit |
44
+ | 服务端数据缓存 | 数据获取库 | 如 React Query、SWR、Apollo |
45
+
46
+ ### 受控 vs 非受控
47
+
48
+ ```text
49
+ 受控组件:
50
+ 值由父组件通过属性控制 + 通过回调通知变更
51
+ 适用场景:需要实时验证、条件禁用、联动逻辑
52
+
53
+ 非受控组件:
54
+ 值由组件自身管理,父组件通过 ref 获取
55
+ 适用场景:简单表单、非关键输入、第三方集成
56
+
57
+ 规则:优先受控,只在确实不需要控制时才非受控。
58
+ ```
59
+
60
+ ### 上下文 + Reducer 模式
61
+
62
+ ```text
63
+ 适用场景:多个子组件共享状态,且有复杂更新逻辑
64
+
65
+ 结构:
66
+ [Provider 组件]
67
+ - 创建上下文
68
+ - 包装 Reducer(状态 + 分发函数)
69
+ - 提供状态和方法给子组件
70
+
71
+ [子组件]
72
+ - 通过上下文读取状态
73
+ - 通过分发函数发送动作
74
+
75
+ 限制:
76
+ - 上下文值变化时所有消费者重新渲染
77
+ - 不适合高频更新场景
78
+ - 拆分上下文避免不必要的重渲染
79
+ ```
80
+
81
+ ## 自定义 Hooks / Composables 模式
82
+
83
+ ### Hook 设计规则
84
+
85
+ ```text
86
+ 1. 以 use- 前缀命名(约定)
87
+ 2. 一个 hook 只做一件事
88
+ 3. 返回对象而非数组(调用方不需要记住顺序)
89
+ 4. 副作用集中管理
90
+ 5. 暴露 loading/error/data 三元状态
91
+ ```
92
+
93
+ ### 常见 Hook 类型
94
+
95
+ ```text
96
+ 数据获取 Hook:
97
+ use{Resource}() → { data, isLoading, error, refetch }
98
+
99
+ 状态管理 Hook:
100
+ use{Feature}State() → { state, actions, reset }
101
+
102
+ 事件处理 Hook:
103
+ use{Event}(handler) → 自动绑定和清理
104
+
105
+ 交叉观察 Hook:
106
+ use{Observer}(ref, options) → { entry, isIntersecting }
107
+
108
+ 媒体查询 Hook:
109
+ useMediaQuery(query) → boolean
110
+
111
+ 定时器 Hook:
112
+ useInterval(callback, delay) → { start, stop, isRunning }
113
+ ```
114
+
115
+ ## 性能优化模式
116
+
117
+ ### 优化策略决策
118
+
119
+ | 场景 | 策略 | 实现方式 |
120
+ |------|------|---------|
121
+ | 计算开销大的纯函数 | 记忆化 | 缓存计算结果,输入不变时复用 |
122
+ | 列表渲渲染 | 虚拟化 | 只渲染可见区域的元素 |
123
+ | 大组件渲染 | 懒加载 | 按需加载组件代码 |
124
+ | 图片加载 | 懒加载 | Intersection Observer + placeholder |
125
+ | 不必要的重渲染 | 属性比较 | 减少不必要的重新渲染 |
126
+ | 首次加载过慢 | 代码分割 | 按路由/按功能分包 |
127
+
128
+ ### 通用性能检查清单
129
+
130
+ ```
131
+ [ ] 列表项有唯一且稳定的 key
132
+ [ ] 大数据列表使用虚拟化
133
+ [ ] 大文件/组件按需懒加载
134
+ [ ] 图片使用适当大小和懒加载
135
+ [ ] 计算密集型操作用记忆化
136
+ [ ] 不必要属性传递已合并或消除
137
+ [ ] 事件监听在组件卸载时清理
138
+ [ ] 动画使用 GPU 加速属性(transform/opacity)
139
+ ```
140
+
141
+ ## 表单处理模式
142
+
143
+ ```text
144
+ 【表单模式三选一】
145
+
146
+ 简单表单(3-5 个字段):
147
+ 组件内状态管理
148
+ → 手动验证 → 提交
149
+
150
+ 中等表单(5-15 字段,有联动):
151
+ 表单库
152
+ → Schema 验证 → 自动错误展示 → 提交
153
+
154
+ 复杂表单(15+ 字段,多步骤,动态字段):
155
+ 表单库 + 状态管理
156
+ → Schema 验证 → 分步保存 → 最终提交
157
+ ```
158
+
159
+ ## 错误边界模式
160
+
161
+ ```text
162
+ 策略:每层 UI 区域包裹错误边界
163
+
164
+ 布局层:
165
+ → 全局错误页面(整个应用崩溃时显示)
166
+
167
+ 功能模块层:
168
+ → 模块降级(该模块不可用但不影响其他模块)
169
+
170
+ 单个组件层:
171
+ → 组件回退(显示占位或重试按钮)
172
+
173
+ 错误边界应提供:
174
+ 1. 用户友好提示
175
+ 2. 重试按钮
176
+ 3. 错误日志上报(开发者可追溯)
177
+ ```
178
+
179
+ ## 无障碍(Accessibility)
180
+
181
+ ```text
182
+ 最低标准(必须做到):
183
+ [ ] 所有交互元素可通过键盘操作
184
+ [ ] 图片有 alt 文本
185
+ [ ] 表单输入有 label
186
+ [ ] 颜色对比度 ≥ 4.5:1
187
+ [ ] 动态内容更新有 aria-live 区域
188
+
189
+ 进阶标准(推荐做到):
190
+ [ ] 页面有合理的 heading 层级
191
+ [ ] 焦点顺序符合视觉顺序
192
+ [ ] 自定义组件有正确的 ARIA role
193
+ [ ] 错误提示通过 aria-describedby 关联
194
+ [ ] 支持减少动效(prefers-reduced-motion)
195
+ ```
@@ -0,0 +1,59 @@
1
+ {
2
+ "version": 1,
3
+ "domains": {
4
+ "workflow": {
5
+ "always": true,
6
+ "label": "工作流核心",
7
+ "desc": "开发流程强制执行",
8
+ "skills": [
9
+ "tdd-workflow",
10
+ "verification-loop",
11
+ "security-review",
12
+ "coding-standards",
13
+ "search-first",
14
+ "strategic-compact"
15
+ ]
16
+ },
17
+ "frontend": {
18
+ "projectTypes": ["web", "fullstack"],
19
+ "label": "前端开发",
20
+ "desc": "组件/状态/性能模式",
21
+ "skills": ["frontend-patterns"]
22
+ },
23
+ "backend": {
24
+ "projectTypes": ["api", "fullstack"],
25
+ "label": "后端开发",
26
+ "desc": "API/仓储/服务层模式",
27
+ "skills": ["backend-patterns"]
28
+ },
29
+ "database": {
30
+ "needsDb": true,
31
+ "label": "数据库",
32
+ "desc": "索引/迁移/查询优化",
33
+ "skills": ["postgres-patterns", "database-migrations"]
34
+ },
35
+ "testing": {
36
+ "projectTypes": ["web", "api", "fullstack"],
37
+ "label": "测试",
38
+ "desc": "E2E 自动化测试",
39
+ "skills": ["e2e-testing"]
40
+ },
41
+ "devops": {
42
+ "manual": true,
43
+ "label": "DevOps",
44
+ "desc": "Docker/CI/CD/部署",
45
+ "skills": ["docker-patterns", "deployment-patterns"]
46
+ },
47
+ "advanced": {
48
+ "userLevel": "developer",
49
+ "label": "进阶技能",
50
+ "desc": "诊断/架构审计/精简沟通",
51
+ "skills": [
52
+ "caveman",
53
+ "diagnose",
54
+ "improve-codebase-architecture",
55
+ "grill-with-docs"
56
+ ]
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 1,
3
+ "skills": {},
4
+ "_comment": "在此记录手动安装的外部技能。格式参考 _example",
5
+ "_example": {
6
+ "agent-browser": {
7
+ "source": "vercel-labs/agent-browser",
8
+ "sourceType": "github",
9
+ "computedHash": ""
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,224 @@
1
+ # E2E Testing — 端到端自动化测试
2
+
3
+ > 使用此 skill 时:编写浏览器自动化测试、设计测试套件结构、调试测试失败时。
4
+
5
+ ## 测试结构规范
6
+
7
+ ### 测试文件组织
8
+
9
+ ```text
10
+ e2e/
11
+ ├── specs/ # 测试用例文件
12
+ │ ├── auth/ # 按功能模块分组
13
+ │ │ ├── login.spec.{ext}
14
+ │ │ ├── register.spec.{ext}
15
+ │ │ └── password-reset.spec.{ext}
16
+ │ ├── checkout/
17
+ │ │ ├── cart.spec.{ext}
18
+ │ │ ├── payment.spec.{ext}
19
+ │ │ └── order-confirmation.spec.{ext}
20
+ │ └── profile/
21
+ │ └── edit-profile.spec.{ext}
22
+ ├── pages/ # Page Object 模型
23
+ │ ├── LoginPage.{ext}
24
+ │ ├── CheckoutPage.{ext}
25
+ │ └── ProfilePage.{ext}
26
+ ├── fixtures/ # 测试夹具(登录状态、测试数据)
27
+ │ ├── auth-fixtures.{ext}
28
+ │ └── test-users.json
29
+ └── helpers/ # 工具函数
30
+ ├── test-utils.{ext}
31
+ └── db-helpers.{ext}
32
+ ```
33
+
34
+ ### 测试用例命名
35
+
36
+ ```text
37
+ // 描述格式:{功能} — {场景} — {期望结果}
38
+
39
+ "用户登录 — 输入正确凭据 — 重定向到首页"
40
+ "用户登录 — 输入错误密码 — 显示错误提示"
41
+ "用户登录 — 连续 5 次失败 — 账号被临时锁定"
42
+ ```
43
+
44
+ ## Page Object 模式
45
+
46
+ ### 结构规范
47
+
48
+ ```text
49
+ 每个页面一个类,包含:
50
+ 1. 页面选择器(data-testid 优先)
51
+ 2. 页面操作(方法)
52
+ 3. 页面断言(验证方法)
53
+
54
+ 示例结构:
55
+ class LoginPage {
56
+ // === 选择器 ===
57
+ emailInput() // data-testid="login-email"
58
+ passwordInput() // data-testid="login-password"
59
+ submitButton() // data-testid="login-submit"
60
+ errorMessage() // data-testid="login-error"
61
+ loadingIndicator() // data-testid="login-loading"
62
+
63
+ // === 操作 ===
64
+ async navigate() // 导航到登录页
65
+ async login(email, password) // 执行登录流程
66
+ async getErrorMessage() // 获取错误文案
67
+
68
+ // === 断言 ===
69
+ async expectLoginSuccess() // 验证登录成功
70
+ async expectValidationError() // 验证验证错误
71
+ async expectRateLimited() // 验证限流提示
72
+ }
73
+ ```
74
+
75
+ ### Selector 策略
76
+
77
+ ```text
78
+ 【优先级从高到低】
79
+
80
+ 1. data-testid(首选)
81
+ [data-testid="login-submit"]
82
+ 优点:与样式/语义解耦,UI 变更不影响测试
83
+
84
+ 2. 文本内容(推荐)
85
+ text="提交"
86
+ 优点:接近用户视角
87
+ 注意:注意国际化文案变化
88
+
89
+ 3. ARIA 属性
90
+ [role="button"][name="提交"]
91
+ 优点:语义清晰,辅助无障碍测试
92
+
93
+ 4. CSS 选择器(次选)
94
+ .form > .actions > button.primary
95
+ 注意:对 UI 变化敏感
96
+
97
+ 5. XPath(不推荐,除非上面都不行)
98
+ 脆弱、难读、POS 维护
99
+ ```
100
+
101
+ ## Wait 策略
102
+
103
+ ```text
104
+ 【规则】
105
+ - 优先用自动等待(内置 auto-waiting)
106
+ - 特定场景用显式等待
107
+ - 禁止固定 sleep/等待
108
+
109
+ 推荐方式(按优先级):
110
+ 1. 自动等待
111
+ 点击/输入等操作自动等待元素可交互
112
+
113
+ 2. 定位器断言
114
+ expect(element).toBeVisible()
115
+ 自动重试直到断言通过
116
+
117
+ 3. 特定 URL/网络等待
118
+ waitForURL('**/dashboard')
119
+ waitForResponse(res => res.url().includes('/api/orders'))
120
+
121
+ 4. 自定义等待(最后一招)
122
+ waitForFunction(() => document.title === 'Dashboard')
123
+
124
+ 不推荐:
125
+ wait(3000) // 固定等待 — 慢且不可靠
126
+ ```
127
+
128
+ ## 测试数据管理
129
+
130
+ ```text
131
+ 【测试数据策略】
132
+
133
+ 独立数据:
134
+ 每个测试创建自己的数据
135
+ 优点:测试隔离性好
136
+ 缺点:慢
137
+
138
+ 共享数据:
139
+ beforeAll 创建一次,多个测试复用
140
+ 优点:快
141
+ 缺点:测试间耦合
142
+
143
+ 推荐:独立数据(默认)+ 共享数据(只读场景)
144
+
145
+ 数据清理:
146
+ - 每个测试清理自己创建的数据
147
+ - 或使用事务回滚(DB 测试)
148
+ - 或使用测试容器(Docker 重置)
149
+
150
+ 测试账号:
151
+ - 专用测试账号(不要用真实用户)
152
+ - 每个环境使用不同账号
153
+ - 密码使用环境变量或 CI secret
154
+ ```
155
+
156
+ ## 失败诊断机制
157
+
158
+ ```text
159
+ 失败时自动收集:
160
+
161
+ 截图(Screenshot):
162
+ - 测试失败时自动截图
163
+ - 保留失败时的页面状态
164
+ - 命名:{测试文件}-{测试名}-{时间戳}.png
165
+
166
+ 视频(Video):
167
+ - 录制整个测试运行过程
168
+ - 回放看到每一步操作
169
+ - 注意存储空间(差异压缩)
170
+
171
+ Trace(追踪):
172
+ - 记录每个操作的完整上下文
173
+ - 包括:网络请求、Console 日志、源码映射
174
+ - 可回放查看失败前的操作序列
175
+
176
+ Console 日志:
177
+ - 收集所有 console.error / console.warn
178
+ - 关联到具体测试用例
179
+ ```
180
+
181
+ ## CI 集成配置
182
+
183
+ ```text
184
+ CI 运行策略:
185
+ - 只在包含 E2E 相关变更时触发
186
+ - 并行运行(分片)减少等待时间
187
+ - 重试策略:失败自动重试 1-2 次(针对 flaky 测试)
188
+
189
+ 并行策略:
190
+ shardCount: 4 // 4 个分片并行
191
+ workers: 2 // 每个分片 2 个 worker
192
+
193
+ 重试策略:
194
+ retries: 2 // 失败重试 2 次
195
+ maxFailures: 10 // 超过 10 个失败停止
196
+
197
+ 环境变量:
198
+ BASE_URL // 测试目标 URL
199
+ CI // CI 环境标识
200
+ RETRY_COUNT // 重试次数
201
+ ```
202
+
203
+ ## Flaky 测试处理
204
+
205
+ ```text
206
+ 识别 flaky 测试:
207
+ - 同一测试有时过有时不过
208
+ - 和代码变更无关的失败
209
+
210
+ 常见原因及修复:
211
+ 原因 | 修复
212
+ ------------------------|-------------------------------
213
+ 时序问题(异步未完成) | 用显式等待代替固定等待
214
+ 测试间数据干扰 | 每个测试独立数据
215
+ 环境/网络不稳定 | 合理重试策略
216
+ 选择器脆弱 | 使用 data-testid
217
+ 状态未清理 | beforeEach 清理状态
218
+
219
+ 处理流程:
220
+ 1. 标记为 flaky 但不阻塞 CI
221
+ 2. 分析失败原因(trace + screenshot)
222
+ 3. 修复根本原因
223
+ 4. 验证不再 flaky 后取消标记
224
+ ```
@@ -0,0 +1,143 @@
1
+ # Coding Standards — 编码规范
2
+
3
+ > 使用此 skill 时:在生成代码或审查代码时,应用以下标准。
4
+
5
+ ## 不可变性(最高优先级)
6
+
7
+ **永远创建新对象,绝不修改已有对象。**
8
+
9
+ ```text
10
+ // ❌ 错误 — 直接修改原对象
11
+ updateUser(user, "name", "newName") {
12
+ user.name = "newName" // 改变了原对象
13
+ return user
14
+ }
15
+
16
+ // ✅ 正确 — 返回新副本
17
+ updateUser(user, "name", "newName") {
18
+ return { ...user, name: "newName" }
19
+ }
20
+ ```
21
+
22
+ 为什么?
23
+ - 无副作用,调用方不会被意外影响
24
+ - 调试更容易(值不会"神秘改变")
25
+ - 并发安全(多个操作可安全共享数据)
26
+
27
+ ## 文件组织
28
+
29
+ ```
30
+ 【原则】多小文件 > 少大文件
31
+ - 高内聚、低耦合
32
+ - 每个文件 200-400 行,上限 800 行
33
+ - 按功能/领域组织,不按类型组织
34
+ ```
35
+
36
+ ### 典型目录结构
37
+
38
+ ```text
39
+ src/
40
+ ├── modules/
41
+ │ └── {module-name}/
42
+ │ ├── {module}.{ext} # 模块入口
43
+ │ ├── {module}.controller.{ext} # 路由/请求处理
44
+ │ ├── {module}.service.{ext} # 业务逻辑
45
+ │ ├── {module}.schema.{ext} # 校验 schema
46
+ │ ├── {module}.types.{ext} # 类型定义
47
+ │ └── {module}.test.{ext} # 测试
48
+ ├── shared/
49
+ │ ├── utils/ # 通用工具函数
50
+ │ ├── types/ # 共享类型
51
+ │ └── constants/ # 常量
52
+ └── config/ # 配置
53
+ ```
54
+
55
+ ## 命名规范
56
+
57
+ | 类别 | 规范 | 示例 |
58
+ |------|------|------|
59
+ | 文件名 | kebab-case | `user-service.{ext}` |
60
+ | 目录名 | kebab-case | `user-module/` |
61
+ | 变量/函数 | camelCase | `getUserById` |
62
+ | 类/接口/类型 | PascalCase | `UserService` |
63
+ | 常量 | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT` |
64
+ | 枚举值 | UPPER_SNAKE_CASE | `Role.ADMIN` |
65
+ | 布尔前缀 | is/has/can/should | `isActive`, `hasPermission` |
66
+ | 私有成员 | 下划线前缀 | `_internalMethod` |
67
+
68
+ ## 错误处理
69
+
70
+ ```text
71
+ 【三条规则】
72
+ 1. 所有可能失败的 IO 操作必须用 try-catch 包裹
73
+ 2. 错误必须包含有用信息(上下文 + 原因)
74
+ 3. 边界层(API/UI)必须将错误转为用户友好的形式
75
+ ```
76
+
77
+ ### 错误分层
78
+
79
+ ```text
80
+ 系统边界层(API/Controller 等)
81
+ └─ 捕获所有异常,转为错误响应格式
82
+ └─ 业务逻辑层(Service)
83
+ └─ 抛出具名业务错误(ValidationError / NotFoundError 等)
84
+ └─ 数据访问层(Repository/DAO)
85
+ └─ 包装底层错误为数据访问错误
86
+ ```
87
+
88
+ ## 输入验证
89
+
90
+ ```text
91
+ 【所有系统入口点必须验证输入】
92
+ - API 端点参数
93
+ - 表单提交数据
94
+ - 文件导入内容
95
+ - 外部 API 回调数据
96
+ - 消息队列消息
97
+ ```
98
+
99
+ ## 代码质量自查清单
100
+
101
+ - [ ] 命名清楚表达意图(好命名不需要注释解释)
102
+ - [ ] 函数不超过 50 行(超过则提取子函数)
103
+ - [ ] 文件不超过 800 行
104
+ - [ ] 嵌套不超过 4 层(超过则提前 return 或提取函数)
105
+ - [ ] 没有死代码(未使用的变量/函数/导入)
106
+ - [ ] 没有循环依赖
107
+ - [ ] 没有魔法数字/字符串(使用命名常量)
108
+ - [ ] 错误路径已处理
109
+ - [ ] 边界情况已覆盖(空值、零值、超长值)
110
+ - [ ] 日志包含足够的上下文信息
111
+
112
+ ## 日志规范
113
+
114
+ ```text
115
+ 【禁止】在生产代码中使用 console.log / print / println
116
+
117
+ 级别使用:
118
+ error — 需要人工介入的异常(不可恢复)
119
+ warn — 可恢复但需要注意的情况(重试成功、降级)
120
+ info — 关键业务流程节点(用户注册、下单)
121
+ debug — 调试信息(仅在开发/调试环境输出)
122
+
123
+ 每条日志应包含:
124
+ 1. 操作标识(操作名、请求 ID)
125
+ 2. 上下文数据(用户 ID、资源 ID 等,不含敏感信息)
126
+ 3. 耗时/状态
127
+ ```
128
+
129
+ ## 注释规范
130
+
131
+ ```text
132
+ // 文档注释 — 公开 API 必须有
133
+ /** 描述函数行为及返回值 */
134
+
135
+ // 实现注释 — 解释"为什么"非"是什么"
136
+ // 使用轮询而非 WebSocket 因为客户端环境不支持长连接
137
+
138
+ // TODO 注释 — 必须有对应 Issue 跟踪
139
+ // TODO(#1234): 这个查询需要加索引
140
+
141
+ // 不需要的注释 — 代码本身已表达意图时
142
+ // ❌ 遍历用户列表 ← 这行代码已经说明了一切
143
+ ```