@bovinphang/frontend-craft 2.5.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 (180) hide show
  1. package/.claude-plugin/marketplace.json +61 -0
  2. package/.claude-plugin/plugin.json +32 -0
  3. package/.mcp.json +44 -0
  4. package/CHANGELOG.md +229 -0
  5. package/CHANGELOG.zh-CN.md +228 -0
  6. package/CODE_OF_CONDUCT.md +34 -0
  7. package/CODE_OF_CONDUCT.zh-CN.md +34 -0
  8. package/CONTRIBUTING.md +356 -0
  9. package/CONTRIBUTING.zh-CN.md +356 -0
  10. package/LICENSE +21 -0
  11. package/README.md +467 -0
  12. package/README.openclaw.md +262 -0
  13. package/README.openclaw.zh-CN.md +262 -0
  14. package/README.zh-CN.md +467 -0
  15. package/SECURITY.md +44 -0
  16. package/SECURITY.zh-CN.md +44 -0
  17. package/agents/fec-architect.md +125 -0
  18. package/agents/fec-code-reviewer.md +152 -0
  19. package/agents/fec-debugger.md +44 -0
  20. package/agents/fec-design-token-mapper.md +75 -0
  21. package/agents/fec-doc-updater.md +30 -0
  22. package/agents/fec-e2e-runner.md +107 -0
  23. package/agents/fec-figma-implementer.md +104 -0
  24. package/agents/fec-performance-optimizer.md +293 -0
  25. package/agents/fec-refactor-cleaner.md +32 -0
  26. package/agents/fec-security-reviewer.md +116 -0
  27. package/agents/fec-test-planner.md +50 -0
  28. package/agents/fec-typescript-reviewer.md +142 -0
  29. package/agents/fec-ui-checker.md +120 -0
  30. package/commands/fec-debug.md +30 -0
  31. package/commands/fec-doc-sync.md +18 -0
  32. package/commands/fec-init.md +70 -0
  33. package/commands/fec-plan.md +94 -0
  34. package/commands/fec-refactor-clean.md +19 -0
  35. package/commands/fec-review.md +66 -0
  36. package/commands/fec-scaffold.md +205 -0
  37. package/commands/fec-tdd.md +21 -0
  38. package/dist/bin/frontend-craft.js +82 -0
  39. package/dist/hooks/fec-cleanup-claude-cache.js +4 -0
  40. package/dist/hooks/fec-format-changed-file.js +1 -0
  41. package/dist/hooks/fec-notify.js +1 -0
  42. package/dist/hooks/fec-run-tests.js +1 -0
  43. package/dist/hooks/fec-security-check.js +2 -0
  44. package/dist/hooks/fec-session-start.js +1 -0
  45. package/docs/example-prompts.md +124 -0
  46. package/docs/ja-JP/README.md +467 -0
  47. package/docs/ko-KR/README.md +467 -0
  48. package/docs/project-structure.md +119 -0
  49. package/docs/runtimes/antigravity.md +10 -0
  50. package/docs/runtimes/augment.md +10 -0
  51. package/docs/runtimes/claude.md +171 -0
  52. package/docs/runtimes/claude.zh-CN.md +169 -0
  53. package/docs/runtimes/cline.md +10 -0
  54. package/docs/runtimes/codebuddy.md +10 -0
  55. package/docs/runtimes/codex.md +10 -0
  56. package/docs/runtimes/copilot.md +10 -0
  57. package/docs/runtimes/cursor.md +10 -0
  58. package/docs/runtimes/gemini.md +10 -0
  59. package/docs/runtimes/kilo.md +10 -0
  60. package/docs/runtimes/openclaw.md +10 -0
  61. package/docs/runtimes/opencode.md +10 -0
  62. package/docs/runtimes/qoder.md +19 -0
  63. package/docs/runtimes/trae.md +10 -0
  64. package/docs/runtimes/windsurf.md +10 -0
  65. package/docs/superpowers/plans/2026-05-29-fec-debug.md +491 -0
  66. package/docs/superpowers/specs/2026-05-29-fec-debug-design.md +340 -0
  67. package/docs/zh-CN/example-prompts.md +124 -0
  68. package/docs/zh-CN/project-structure.md +119 -0
  69. package/docs/zh-TW/README.md +467 -0
  70. package/hooks/hooks.json +71 -0
  71. package/openclaw.plugin.json +26 -0
  72. package/package.json +101 -0
  73. package/skills/TEMPLATE.md +155 -0
  74. package/skills/eval_queries.json +890 -0
  75. package/skills/fec-accessibility-check/SKILL.md +39 -0
  76. package/skills/fec-accessibility-check/references/report-template.md +23 -0
  77. package/skills/fec-accessibility-check/references/screen-reader-testing.md +33 -0
  78. package/skills/fec-api-integration/SKILL.md +78 -0
  79. package/skills/fec-api-integration/references/integration-patterns.md +80 -0
  80. package/skills/fec-browser-storage/SKILL.md +34 -0
  81. package/skills/fec-browser-storage/references/storage-patterns.md +65 -0
  82. package/skills/fec-canvas-threejs/SKILL.md +66 -0
  83. package/skills/fec-canvas-threejs/references/rendering-patterns.md +67 -0
  84. package/skills/fec-canvas-threejs/references/shader-webgl-patterns.md +67 -0
  85. package/skills/fec-code-review/SKILL.md +135 -0
  86. package/skills/fec-code-review/references/report-template.md +29 -0
  87. package/skills/fec-component-testing/SKILL.md +119 -0
  88. package/skills/fec-data-fetching/SKILL.md +62 -0
  89. package/skills/fec-data-fetching/references/query-patterns.md +77 -0
  90. package/skills/fec-debug-framework/SKILL.md +162 -0
  91. package/skills/fec-dependency-upgrade/SKILL.md +34 -0
  92. package/skills/fec-dependency-upgrade/references/dependency-upgrade-workflow.md +56 -0
  93. package/skills/fec-doc-sync/SKILL.md +37 -0
  94. package/skills/fec-e2e-testing/SKILL.md +40 -0
  95. package/skills/fec-e2e-testing/references/e2e-advanced.md +176 -0
  96. package/skills/fec-e2e-testing/references/playwright-patterns.md +95 -0
  97. package/skills/fec-form-handling/SKILL.md +76 -0
  98. package/skills/fec-form-handling/references/advanced-form-patterns.md +72 -0
  99. package/skills/fec-implement-from-design/SKILL.md +122 -0
  100. package/skills/fec-implement-from-design/references/design-plan-template.md +36 -0
  101. package/skills/fec-legacy-to-modern-migration/SKILL.md +180 -0
  102. package/skills/fec-legacy-to-modern-migration/references/migration-report-template.md +41 -0
  103. package/skills/fec-legacy-web-standard/SKILL.md +35 -0
  104. package/skills/fec-legacy-web-standard/references/legacy-patterns.md +85 -0
  105. package/skills/fec-list-virtualization/SKILL.md +34 -0
  106. package/skills/fec-list-virtualization/references/virtualization-patterns.md +52 -0
  107. package/skills/fec-monorepo-project-standard/SKILL.md +142 -0
  108. package/skills/fec-motion-interaction/SKILL.md +66 -0
  109. package/skills/fec-motion-interaction/references/motion-patterns.md +112 -0
  110. package/skills/fec-nextjs-project-standard/SKILL.md +117 -0
  111. package/skills/fec-nuxt-project-standard/SKILL.md +122 -0
  112. package/skills/fec-performance-optimization/SKILL.md +72 -0
  113. package/skills/fec-pwa-implementation/SKILL.md +36 -0
  114. package/skills/fec-pwa-implementation/references/manifest-and-icons.md +53 -0
  115. package/skills/fec-pwa-implementation/references/service-worker-workbox.md +68 -0
  116. package/skills/fec-react-project-standard/SKILL.md +83 -0
  117. package/skills/fec-react-project-standard/references/react-project-details.md +642 -0
  118. package/skills/fec-refactor-clean/SKILL.md +48 -0
  119. package/skills/fec-responsive-layout/SKILL.md +34 -0
  120. package/skills/fec-responsive-layout/references/responsive-layout-patterns.md +59 -0
  121. package/skills/fec-route-protection/SKILL.md +135 -0
  122. package/skills/fec-security-review/SKILL.md +38 -0
  123. package/skills/fec-security-review/references/report-template.md +27 -0
  124. package/skills/fec-security-review/references/security-checklist.md +64 -0
  125. package/skills/fec-source-driven-development/SKILL.md +61 -0
  126. package/skills/fec-state-management/SKILL.md +140 -0
  127. package/skills/fec-state-management/references/state-patterns.md +109 -0
  128. package/skills/fec-storybook-component-doc/SKILL.md +37 -0
  129. package/skills/fec-storybook-component-doc/references/story-patterns.md +118 -0
  130. package/skills/fec-svg-animation/SKILL.md +148 -0
  131. package/skills/fec-tailwind-design-system/SKILL.md +34 -0
  132. package/skills/fec-tailwind-design-system/references/tailwind-system-patterns.md +55 -0
  133. package/skills/fec-tdd-workflow/SKILL.md +52 -0
  134. package/skills/fec-testing-strategy/SKILL.md +45 -0
  135. package/skills/fec-typescript-type-safety/SKILL.md +157 -0
  136. package/skills/fec-typescript-type-safety/references/type-safety-patterns.md +102 -0
  137. package/skills/fec-ui-design/SKILL.md +90 -0
  138. package/skills/fec-ui-design/data/product-rules.json +110 -0
  139. package/skills/fec-ui-design/data/stack-ui-rules.json +14 -0
  140. package/skills/fec-ui-design/data/style-archetypes.json +74 -0
  141. package/skills/fec-ui-design/data/ux-quality-rules.json +56 -0
  142. package/skills/fec-ui-design/references/design-intelligence.md +37 -0
  143. package/skills/fec-ui-design/references/master-page-overrides.md +30 -0
  144. package/skills/fec-ui-design/references/pre-delivery-checklist.md +33 -0
  145. package/skills/fec-ui-design/scripts/design-system.mjs +530 -0
  146. package/skills/fec-validation-fix/SKILL.md +48 -0
  147. package/skills/fec-vite-project-standard/SKILL.md +83 -0
  148. package/skills/fec-vue3-project-standard/SKILL.md +49 -0
  149. package/skills/fec-vue3-project-standard/references/vue3-project-details.md +547 -0
  150. package/skills/fec-web-workers/SKILL.md +36 -0
  151. package/skills/fec-web-workers/references/advanced-workers.md +54 -0
  152. package/skills/fec-web-workers/references/basic-worker.md +67 -0
  153. package/skills/metadata.json +1422 -0
  154. package/skills/relations.json +644 -0
  155. package/templates/claude/CLAUDE.md +106 -0
  156. package/templates/claude/settings.json +62 -0
  157. package/templates/codex/AGENTS.md +105 -0
  158. package/templates/codex/config.toml +32 -0
  159. package/templates/openclaw/AGENTS.md +101 -0
  160. package/templates/openclaw/OPENCLAW-CONFIG.md +12 -0
  161. package/templates/shared/rules/fec-agent-workflow.md +54 -0
  162. package/templates/shared/rules/fec-api-layer.md +99 -0
  163. package/templates/shared/rules/fec-ci-cd.md +128 -0
  164. package/templates/shared/rules/fec-code-comments.md +33 -0
  165. package/templates/shared/rules/fec-design-system.md +248 -0
  166. package/templates/shared/rules/fec-error-handling.md +200 -0
  167. package/templates/shared/rules/fec-git-conventions.md +73 -0
  168. package/templates/shared/rules/fec-i18n.md +112 -0
  169. package/templates/shared/rules/fec-naming-conventions.md +120 -0
  170. package/templates/shared/rules/fec-performance.md +101 -0
  171. package/templates/shared/rules/fec-react.md +82 -0
  172. package/templates/shared/rules/fec-refactoring.md +43 -0
  173. package/templates/shared/rules/fec-rendering-patterns.md +183 -0
  174. package/templates/shared/rules/fec-responsive-design.md +227 -0
  175. package/templates/shared/rules/fec-source-driven-development.md +31 -0
  176. package/templates/shared/rules/fec-state-management.md +163 -0
  177. package/templates/shared/rules/fec-testing.md +98 -0
  178. package/templates/shared/rules/fec-typescript.md +355 -0
  179. package/templates/shared/rules/fec-vue.md +64 -0
  180. package/templates/shared/rules/fec-working-modes.md +50 -0
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: fec-code-review
3
+ description: Use when the user asks for general frontend code review, PR review, merge-readiness assessment, architecture maintainability, type-safety, rendering/state risks, style consistency, testability gaps, or a cross-cutting review summary. Delegate deep security, accessibility, E2E, or performance investigations to their specialized skills; Chinese triggers include 代码审查, 代码评审, review.
4
+ ---
5
+
6
+ # 前端代码评审
7
+
8
+ ## Purpose
9
+
10
+ 从架构、类型安全、可访问性、样式一致性、性能和可测试性等 8 个维度审查前端代码质量,输出分级评审报告。
11
+
12
+ ## Review Process
13
+
14
+ 1. 先读项目事实:package scripts、框架、目录约定、最近 diff、现有测试和相关规则。
15
+ 2. 按风险找问题,而不是按个人偏好挑风格;每个发现都要能指向具体文件、行号和用户影响。
16
+ 3. 用五轴收敛结论:正确性、可维护性、类型/接口、用户体验、验证覆盖。
17
+ 4. 对安全、无障碍、E2E、性能等深水区只做初筛;需要专项调查时明确分流。
18
+ 5. 多维评审时先按职责拆分,再合并同类发现;同一文件同一根因只保留一条主发现,避免重复噪声。
19
+ 6. 报告先列阻塞问题,再列建议项;没有证据的问题不要写成确定结论。
20
+
21
+ ## 多维评审编排
22
+
23
+ 当改动跨越多个质量维度时,按“主评审 + 专项分流”组织,而不是让所有维度重复检查同一处代码。
24
+
25
+ | 维度 | 触发条件 | 分流边界 |
26
+ | ------------------- | ---------------------------------------------------- | ------------------------------------ |
27
+ | TypeScript 类型安全 | DTO、泛型、公共类型、类型守卫、`any`、断言 | 深入类型建模交给类型安全专项流程 |
28
+ | 状态管理 | 状态归属、全局 store、URL 状态、派生状态、跨页面同步 | 状态选型与迁移交给状态管理专项流程 |
29
+ | 安全 | 用户输入、HTML 渲染、token、上传、第三方脚本 | 漏洞级分析交给安全专项流程 |
30
+ | 无障碍 | 弹窗、菜单、表单、键盘操作、焦点管理 | WCAG 细查交给无障碍专项流程 |
31
+ | 性能 | 大列表、重依赖、重复请求、长任务、包体积 | 性能证据与预算交给性能专项流程 |
32
+ | E2E | 关键用户路径、登录态、支付、跨页面流程 | 浏览器用例与 trace 交给 E2E 专项流程 |
33
+
34
+ 发现合并规则:
35
+
36
+ - 同一根因出现在多个维度时,只保留最高严重级别,并在 `Dimension` 中列出相关维度。
37
+ - 同一文件多处重复模式,合并为一条模式级发现,列出代表性位置。
38
+ - 置信度不足的问题放入 Open Questions,不升级为阻塞项。
39
+ - 自动化可稳定捕获的格式问题交给 lint/format,不作为人工评审主发现。
40
+
41
+ ## 评审维度
42
+
43
+ 1. 架构
44
+
45
+ - 组件边界是否清晰
46
+ - 展示逻辑与业务逻辑是否分离
47
+ - 是否有可复用抽象
48
+ - 是否存在上帝组件
49
+
50
+ 2. 类型安全
51
+
52
+ - 是否存在不必要的 `any`
53
+ - props 类型是否明确
54
+ - hooks/composables 返回值是否稳定
55
+ - 在可行情况下 API 契约是否有类型约束
56
+
57
+ 3. 渲染与状态
58
+
59
+ - 是否存在不必要的重复渲染
60
+ - key 的使用是否稳定
61
+ - 可推导状态是否被重复存储
62
+ - 本地状态是否耦合过深
63
+ - 全局 store 是否只保存真正跨边界共享的客户端状态
64
+ - URL 状态、服务端状态、表单状态和浏览器持久化是否边界清晰
65
+
66
+ 4. 样式
67
+
68
+ - 已有 Token 时是否还在使用 magic number
69
+ - 类名是否与仓库约定一致
70
+ - 响应式处理是否明确
71
+ - 是否无必要地混用了多套样式体系
72
+
73
+ 5. 可访问性
74
+
75
+ - 语义结构是否合理
76
+ - 是否在需要时正确使用 label 和 aria
77
+ - 是否支持键盘操作
78
+ - 浮层和菜单的焦点管理是否正确
79
+
80
+ 6. 可维护性
81
+
82
+ - 组件/页面文件规模是否合理(宜约 **300 行**内;逾 **500 行**或复杂度过高须拆分,见共享 React / Vue 规则中的「组件文件规模」)
83
+ - 命名质量是否良好
84
+ - 是否有应该提取的重复逻辑
85
+ - 是否存在死代码、过期注释或临时性 hack
86
+ - 业务状态、类型、标识是否用裸数字/裸字符串(应对齐 `templates/shared/rules/fec-typescript.md`「禁止 Magic Number / Magic String」)
87
+
88
+ 7. 测试
89
+
90
+ - 是否缺少关键测试覆盖
91
+ - 是否存在脆弱的选择器或不稳定的测试模式
92
+
93
+ 8. 安全
94
+
95
+ - 无明显 XSS 风险(dangerouslySetInnerHTML / v-html 必须审查)
96
+ - 无敏感信息硬编码
97
+ - 无未校验的用户输入直接渲染
98
+
99
+ 9. 性能与体验证据
100
+
101
+ - 是否引入首屏重依赖、重复请求、大列表渲染或长任务
102
+ - loading、empty、error、disabled、focus 等状态是否完整
103
+ - 响应式布局是否有可验证断点和文本溢出保护
104
+
105
+ 10. 必检项(阻塞合并)
106
+
107
+ - [ ] TypeScript 类型完整,无 `any`
108
+ - [ ] 外部输入、DTO、公共类型边界无无守卫断言
109
+ - [ ] 无 XSS 风险
110
+ - [ ] 无敏感信息硬编码
111
+ - [ ] 核心逻辑有单元测试
112
+
113
+ 11. 质量项(建议修改)
114
+
115
+ - [ ] 组件文件规模符合约定(约 300 行内为佳;逾 500 行或高复杂度已拆子组件 / Hooks / Composables / utils)
116
+ - [ ] 无重复代码(DRY 原则)
117
+ - [ ] 无未使用的 import
118
+
119
+ 12. 规范项(风格建议)
120
+
121
+ - [ ] 命名语义清晰
122
+ - [ ] 注释覆盖复杂逻辑
123
+
124
+ ## Detailed References
125
+
126
+ 撰写代码评审报告时,加载 [references/report-template.md](references/report-template.md)。发现必须具体且可操作;不要写"优化性能"等空泛建议而不指出具体代码模式。
127
+
128
+ ## Expected Output
129
+
130
+ - 分级评审报告(CRITICAL / HIGH / MEDIUM / LOW)
131
+ - 每个问题关联具体文件和行号,附修复建议
132
+ - 阻塞项(CRITICAL)修复前不建议合并
133
+ - 评审报告保存为 `reports/code-review-YYYY-MM-DD-HHmmss.md`
134
+ - 多维评审要合并重复发现,并说明已分流到哪些专项能力
135
+ - 对不确定项标注需要的验证命令或补充上下文,不把猜测写成事实
@@ -0,0 +1,29 @@
1
+ # 代码审查报告模板
2
+
3
+ ```markdown
4
+ # 代码审查报告
5
+
6
+ > 生成时间: YYYY-MM-DD HH:mm
7
+ > 评审工具: frontend-craft
8
+
9
+ ## CRITICAL / 必须修改 (N项)
10
+ - **[文件:行号]** 问题描述 -> 建议修改
11
+
12
+ ## HIGH / 建议优化 (N项)
13
+ - ...
14
+
15
+ ## MEDIUM / 可选优化项 (N项)
16
+ - ...
17
+
18
+ ## LOW / 观察项 (N项)
19
+ - ...
20
+
21
+ ## 做得好的地方
22
+ - ...
23
+
24
+ ## 风险等级:低 / 中 / 高
25
+
26
+ **总体评价**: 可合并 / 待修改后合并 / 需要重构
27
+ ```
28
+
29
+ 评审完成后,将报告保存到 `reports/code-review-YYYY-MM-DD-HHmmss.md`,并告知用户报告路径。
@@ -0,0 +1,119 @@
1
+ ---
2
+ name: fec-component-testing
3
+ description: Use when authoring or reviewing frontend unit, component, or light integration tests close to UI code, including React Testing Library, Vue Test Utils, hooks/composables, props/emits, callbacks, accessible queries, user-event interactions, mocks, loading/error/empty states, and regression coverage. For layer planning, real-browser journeys, or existing validation failures, choose the matching testing or validation workflow first; Chinese triggers include 组件测试, 组件单测, 单元测试, 轻量集成测试.
4
+ ---
5
+
6
+ # 组件测试
7
+
8
+ ## Purpose
9
+
10
+ 用贴近代码和用户行为的测试验证纯逻辑、组件契约与轻量模块协作,减少重构和 UI 交互回归。
11
+
12
+ ## Procedure
13
+
14
+ ### 1. 先确定测试层级
15
+
16
+ - 单元测试:纯函数、hooks/composables、utils、状态逻辑、schema。
17
+ - 组件测试:props/emits、回调、用户交互、loading/error/empty、mock 边界。
18
+ - 轻量集成测试:表单 + API mock + Router/Store/Provider 上下文。
19
+
20
+ 跨页面真实浏览器流程分流到 E2E workflow;测试层选择不清楚时先做测试分层规划。
21
+
22
+ ### 2. 优先按用户可感知行为测试
23
+
24
+ 每个测试保持 Arrange / Act / Assert 清晰分段:准备数据和渲染、执行用户动作、断言用户可见结果或公开契约。
25
+
26
+ ```tsx
27
+ import { render, screen } from "@testing-library/react";
28
+ import userEvent from "@testing-library/user-event";
29
+ import { SearchBox } from "./SearchBox";
30
+
31
+ test("submits the entered keyword", async () => {
32
+ const user = userEvent.setup();
33
+ const onSearch = vi.fn();
34
+
35
+ render(<SearchBox onSearch={onSearch} />);
36
+
37
+ await user.type(screen.getByRole("searchbox", { name: /keyword/i }), "orders");
38
+ await user.click(screen.getByRole("button", { name: /search/i }));
39
+
40
+ expect(onSearch).toHaveBeenCalledWith("orders");
41
+ });
42
+ ```
43
+
44
+ ### 3. Vue 组件使用可访问查询或明确文本断言
45
+
46
+ ```ts
47
+ import { mount } from "@vue/test-utils";
48
+ import UserMenu from "./UserMenu.vue";
49
+
50
+ test("emits logout when the logout item is clicked", async () => {
51
+ const wrapper = mount(UserMenu, {
52
+ props: { userName: "Ada" },
53
+ });
54
+
55
+ await wrapper.get('[data-testid="logout-button"]').trigger("click");
56
+
57
+ expect(wrapper.emitted("logout")).toHaveLength(1);
58
+ });
59
+ ```
60
+
61
+ 优先使用角色、标签和可见文本;仅在没有稳定语义时使用 `data-testid`。
62
+
63
+ ### 4. 控制 mock 边界
64
+
65
+ ```ts
66
+ vi.mock("../api/users", () => ({
67
+ fetchUsers: vi.fn(async () => [{ id: "1", name: "Ada" }]),
68
+ }));
69
+ ```
70
+
71
+ - mock 网络、时间、路由和浏览器 API。
72
+ - 不 mock 被测组件的内部函数。
73
+ - 对设计系统基础组件只做轻量 mock,保留可访问行为。
74
+ - mock 数据应表达业务场景,不使用只有测试作者能理解的随意字符串。
75
+ - 共享 fixture 应保持可读,复杂对象用 builder 补默认值;每个测试只覆盖与场景相关的字段。
76
+ - mock 网络时优先模拟用户可见结果和错误形状,不复制后端实现细节。
77
+
78
+ ### 5. 覆盖关键状态
79
+
80
+ 每个复杂组件至少覆盖:
81
+
82
+ - 默认渲染。
83
+ - 用户交互和回调。
84
+ - loading / empty / error。
85
+ - 权限或禁用态。
86
+ - 键盘交互和焦点行为(适用时)。
87
+
88
+ ### 6. 保持测试可维护
89
+
90
+ ```ts
91
+ function setup() {
92
+ const user = userEvent.setup();
93
+ const onSubmit = vi.fn();
94
+ render(<ProfileForm onSubmit={onSubmit} />);
95
+ return { user, onSubmit };
96
+ }
97
+ ```
98
+
99
+ 将重复渲染逻辑放入 `setup`,但不要隐藏测试的核心操作和断言。
100
+
101
+ ### 7. 回归测试先证明问题
102
+
103
+ - Bug 修复先写能复现失败的最小测试。
104
+ - 失败原因应指向用户行为或公开契约,而不是导入错误、测试环境或等待方式。
105
+ - 修复后保留回归测试,避免把验证只留在手工步骤里。
106
+
107
+ ## Constraints
108
+
109
+ - 避免测试实现细节,例如内部 state 名称、私有函数调用、DOM 层级快照。
110
+ - 不把 snapshot 作为交互组件的主要断言;它只能辅助检查稳定静态输出。
111
+ - 异步断言使用 `findBy*` 或 `waitFor`,不要用固定延迟。
112
+ - 测试名称应描述用户场景,而不是函数名。
113
+ - 组件测试不能替代 E2E;路由、真实浏览器兼容和跨页流程仍需 E2E。
114
+ - 不在测试里复制组件实现逻辑;否则测试会和错误实现一起通过。
115
+ - 不在测试间共享可变 fixture、全局 store 或 fake timer 状态;每个用例独立 setup 和 cleanup。
116
+
117
+ ## Expected Output
118
+
119
+ 产出与组件同目录或项目约定目录下的测试文件,覆盖核心交互、状态和回归场景。验证时运行项目现有 test 命令,确认失败信息能定位到用户行为或组件契约。
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: fec-data-fetching
3
+ description: Use when implementing or reviewing TanStack Query/React Query server-state flows: typed queries, query keys, caching, invalidation, mutations, optimistic updates, infinite queries, prefetch, SSR hydration, or API-layer integration. Do not use for local UI state or Service Worker caching; Chinese triggers include 数据获取, 缓存, 乐观更新.
4
+ ---
5
+
6
+ # TanStack Query 数据获取
7
+
8
+ ## Purpose
9
+
10
+ 用声明式 server state 管理替代手写 `useEffect + loading`。
11
+
12
+ ## Procedure
13
+
14
+ 1. 判断状态来源:来自服务端且需要缓存、去重、刷新、分页或 mutation 时使用 TanStack Query;纯本地 UI 状态用 `useState`/store。
15
+ 2. 建立 `QueryClientProvider`,按业务数据新鲜度设置 `staleTime`、`gcTime`、retry 和窗口聚焦刷新。
16
+ 3. 设计稳定 query key:数组结构包含实体、动作和所有影响结果的参数。
17
+ 4. API 函数保持纯请求函数,Query hook 负责缓存、select、loading/error/empty 状态。
18
+ 5. mutation 成功后 invalidation;需要即时反馈时使用 optimistic update 并在 `onError` 回滚。
19
+
20
+ ## Quick Start
21
+
22
+ ```tsx
23
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
24
+
25
+ export function UserList({ keyword }: { keyword: string }) {
26
+ const query = useQuery({
27
+ queryKey: ["users", "list", { keyword }],
28
+ queryFn: () => getUserList({ keyword, page: 1, pageSize: 20 }),
29
+ select: (response) => response.list,
30
+ });
31
+
32
+ if (query.isLoading) return <Skeleton />;
33
+ if (query.isError) return <ErrorFallback onRetry={() => query.refetch()} />;
34
+ if (!query.data?.length) return <EmptyState />;
35
+
36
+ return query.data.map((user) => <UserRow key={user.id} user={user} />);
37
+ }
38
+
39
+ export function useCreateUser() {
40
+ const queryClient = useQueryClient();
41
+ return useMutation({
42
+ mutationFn: createUser,
43
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: ["users"] }),
44
+ });
45
+ }
46
+ ```
47
+
48
+ ## Detailed References
49
+
50
+ 涉及 QueryClient 默认配置、乐观更新、无限滚动查询、预取、SSR 水合和 API 层整合时,加载 [references/query-patterns.md](references/query-patterns.md)。
51
+
52
+ ## Constraints
53
+
54
+ - 相同数据必须复用相同 query key;参数缺失会造成缓存串读。
55
+ - `staleTime` 过长会显示旧数据,过短会造成频繁请求。
56
+ - TanStack Query 不管理本地 UI 状态;不要把 modal、输入框值放进 query cache。
57
+ - 乐观更新必须保存快照并在 `onError` 回滚。
58
+ - Next.js App Router SSR 需要 `dehydrate` / `HydrationBoundary`。
59
+
60
+ ## Expected Output
61
+
62
+ 数据获取层具备 loading/error/empty/data 状态,重复请求自动去重,mutation 后缓存正确失效或回滚,API 层与 UI 层边界清晰。
@@ -0,0 +1,77 @@
1
+ # TanStack Query 进阶模式
2
+
3
+ ## QueryClient 默认配置
4
+
5
+ ```tsx
6
+ const queryClient = new QueryClient({
7
+ defaultOptions: {
8
+ queries: {
9
+ staleTime: 5 * 60 * 1000,
10
+ gcTime: 30 * 60 * 1000,
11
+ retry: 2,
12
+ refetchOnWindowFocus: true,
13
+ },
14
+ },
15
+ });
16
+ ```
17
+
18
+ ## Query Key
19
+
20
+ - 推荐:`["users", "list", { page, status }]`
21
+ - 详情:`["users", "detail", userId]`
22
+ - 所有影响请求结果的参数都必须进入 key。
23
+
24
+ ## 乐观更新
25
+
26
+ ```tsx
27
+ const mutation = useMutation({
28
+ mutationFn: () => api.likePost(postId),
29
+ onMutate: async () => {
30
+ await queryClient.cancelQueries({ queryKey: ["post", postId] });
31
+ const previousPost = queryClient.getQueryData(["post", postId]);
32
+ queryClient.setQueryData(["post", postId], (old: Post) => ({
33
+ ...old,
34
+ likes: old.likes + 1,
35
+ liked: true,
36
+ }));
37
+ return { previousPost };
38
+ },
39
+ onError: (_error, _variables, context) => {
40
+ queryClient.setQueryData(["post", postId], context?.previousPost);
41
+ },
42
+ onSettled: () => {
43
+ queryClient.invalidateQueries({ queryKey: ["post", postId] });
44
+ },
45
+ });
46
+ ```
47
+
48
+ ## Infinite Query
49
+
50
+ ```tsx
51
+ const feed = useInfiniteQuery({
52
+ queryKey: ["feed"],
53
+ queryFn: ({ pageParam = 1 }) => api.fetchFeed({ page: pageParam, limit: 20 }),
54
+ getNextPageParam: (lastPage, pages) => (lastPage.hasMore ? pages.length + 1 : undefined),
55
+ initialPageParam: 1,
56
+ });
57
+ ```
58
+
59
+ 虚拟列表场景将数据分页与 DOM 虚拟化分开设计。
60
+
61
+ ## API 层整合
62
+
63
+ ```ts
64
+ export async function getUserList(params: GetUserListParams): Promise<GetUserListResponse> {
65
+ return request.get("/api/users", { params });
66
+ }
67
+
68
+ export function useUsers(params: GetUserListParams) {
69
+ return useQuery({
70
+ queryKey: ["users", "list", params],
71
+ queryFn: () => getUserList(params),
72
+ select: (response) => response.list,
73
+ });
74
+ }
75
+ ```
76
+
77
+ API 函数不包含 UI toast、loading 或缓存逻辑。
@@ -0,0 +1,162 @@
1
+ ---
2
+ name: fec-debug-framework
3
+ description: Use when diagnosing frontend build failures, runtime errors, UI anomalies, API/data problems, white screens, request failures, or unexplained production exceptions; Chinese triggers include 调试, debug, 排查, 定位, 报错, 异常, 白屏, 请求失败.
4
+ ---
5
+
6
+ # 前端诊断框架
7
+
8
+ ## 核心方法论(5 步法)
9
+
10
+ 所有前端问题诊断遵循统一流程:
11
+
12
+ ### Step 1: 分类(Classify)
13
+
14
+ 识别问题类型和影响范围:
15
+
16
+ | 类型 | 判断依据 | 诊断入口 |
17
+ | ------- | ---------------------------- | -------------- |
18
+ | build | 命令退出非零、stderr 有错误 | → Build 模块 |
19
+ | runtime | 控制台异常、白屏、功能不可用 | → Runtime 模块 |
20
+ | ui | 视觉偏差、交互不符预期 | → UI 模块 |
21
+ | api | 请求状态码异常、数据不一致 | → API 模块 |
22
+
23
+ 跨类型问题(如 API 失败导致 UI 异常)从最表层症状入手,逐层深入。
24
+
25
+ ### Step 2: 收集(Collect)
26
+
27
+ 按类型收集证据(各模块有具体策略,见下方)。
28
+
29
+ ### Step 3: 假设(Hypothesize)
30
+
31
+ 基于证据提出可能根因,按可能性排序:
32
+
33
+ - 每个假设必须可测试(有明确的验证方法)
34
+ - 最多保留 3 个假设,避免发散
35
+ - 格式:「因为 X,导致 Y,可通过 Z 验证」
36
+
37
+ ### Step 4: 验证(Verify)
38
+
39
+ 逐一测试假设:
40
+
41
+ - 从最可能的假设开始
42
+ - 每次只改一个变量
43
+ - 验证结果记录:证实 / 证伪 / 待定
44
+ - 假设全部证伪时回到 Step 2 重新收集
45
+
46
+ ### Step 5: 修复与确认(Fix & Validate)
47
+
48
+ - 应用最小修复
49
+ - 运行受影响验证命令
50
+ - 确认无回归
51
+ - 输出修复报告
52
+
53
+ ---
54
+
55
+ ## 诊断模块
56
+
57
+ ### Build 模块
58
+
59
+ **收集**:运行最小失败命令,捕获完整 stderr/stdout
60
+ **假设**:按错误类型分组(类型错误、导入失败、配置解析、依赖缺失),匹配已知模式
61
+ **验证**:修一类根因 → 重跑命令 → 确认错误减少
62
+ **特殊处理**:
63
+
64
+ - 依赖版本、peer dependency、ESM/CJS、lockfile 相关失败先作为 build 兼容性问题收集证据
65
+ - 记录 package manager、Node 版本、lockfile diff、相关包版本和完整错误日志
66
+ - 不在缺少证据时升级依赖、手工编辑 lockfile,或把依赖迁移与普通调试修复混在同一批改动
67
+ - 若任务目标本身是版本升级、CVE 修复或 lockfile 风险评审,应转入依赖升级工作流
68
+ - CI 专属失败检查 Node 版本、包管理器、环境变量差异
69
+
70
+ ### Runtime 模块
71
+
72
+ **收集**:
73
+
74
+ - 复现路径(用户操作序列)
75
+ - 控制台错误和堆栈
76
+ - 组件渲染树状态(检查关键组件是否正确挂载)
77
+ - 相关 store/state 快照
78
+
79
+ **假设**:
80
+
81
+ - 堆栈反向追踪:从异常位置回溯到触发源
82
+ - 状态流分析:检查 state 变化是否符合预期
83
+ - 生命周期分析:是否在错误的时机访问了未初始化的数据
84
+
85
+ **验证**:
86
+
87
+ - 添加临时日志确认状态值
88
+ - 在可疑路径添加断言
89
+ - 复现路径验证修复
90
+
91
+ ### UI 模块
92
+
93
+ **收集**:
94
+
95
+ - 当前截图 vs 期望效果
96
+ - DOM 结构检查(元素是否存在、层级是否正确)
97
+ - 计算样式检查(实际应用的 CSS 值)
98
+ - 响应式断点测试
99
+
100
+ **假设**:
101
+
102
+ - CSS 特异性冲突(选择器权重不够被覆盖)
103
+ - 组件状态不匹配(props/state 未正确传递)
104
+ - 布局模型问题(flex/grid 配置错误)
105
+ - 响应式断点遗漏
106
+
107
+ **验证**:
108
+
109
+ - 浏览器 DevTools 实时调整验证
110
+ - 隔离组件测试(排除外部样式干扰)
111
+ - 多断点逐一验证
112
+
113
+ ### API 模块
114
+
115
+ **收集**:
116
+
117
+ - 请求 URL、method、headers、body
118
+ - 响应 status、headers、body
119
+ - 网络瀑布时序
120
+ - 相关 store/state 中的缓存数据
121
+
122
+ **假设**:
123
+
124
+ - 请求链路逐跳检查(URL → 中间件 → 拦截器 → 服务端)
125
+ - 数据转换检查(响应解析、类型映射)
126
+ - 缓存策略检查(过期、失效、竞态)
127
+ - 并发请求竞态(race condition)
128
+
129
+ **验证**:
130
+
131
+ - curl 独立复现(排除前端干扰)
132
+ - 逐层 mock 定位问题层级
133
+ - 端到端请求验证修复
134
+
135
+ ---
136
+
137
+ ## 报告格式
138
+
139
+ 保存至 `reports/debug-YYYY-MM-DD-HHmmss.md`:
140
+
141
+ ### 诊断报告
142
+
143
+ | 项目 | 内容 |
144
+ | ---------- | -------------------------- |
145
+ | 问题类型 | build / runtime / ui / api |
146
+ | 问题描述 | 用户报告的现象 |
147
+ | 收集的证据 | 关键日志、截图、请求记录 |
148
+ | 假设与验证 | 每个假设的验证结果 |
149
+ | 根因 | 最终确认的根本原因 |
150
+ | 修复内容 | 修改的文件和具体改动 |
151
+ | 验证结果 | 修复后的验证命令和结果 |
152
+ | 剩余风险 | 未覆盖的边界或潜在回归 |
153
+
154
+ ---
155
+
156
+ ## 强约束
157
+
158
+ - 不在缺少证据时猜测根因
159
+ - 不通过关闭规则、删除测试或降低类型安全来「修复」
160
+ - 每次只改一个变量来验证假设
161
+ - 不在验证前扩大改动范围
162
+ - 同一假设连续 3 次验证失败,停止并报告阻塞
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: fec-dependency-upgrade
3
+ description: Use when planning, implementing, or reviewing frontend dependency upgrades, package migrations, lockfile changes, major framework version bumps, CVE remediation, peer dependency conflicts, ESM/CJS shifts, build-tool compatibility, or CI verification matrices; Chinese triggers include 依赖升级, 版本升级, lockfile, peer dependency, CVE 修复, 大版本迁移.
4
+ ---
5
+
6
+ # 依赖升级
7
+
8
+ 适用于前端依赖升级、漏洞修复、大版本迁移和 lockfile 风险评审。需要具体流程和检查清单时加载 [references/dependency-upgrade-workflow.md](references/dependency-upgrade-workflow.md)。
9
+
10
+ ## Purpose
11
+
12
+ 用来源驱动和小批验证的方式升级依赖,降低破坏性变更、供应链风险和 CI 回归。
13
+
14
+ ## Procedure
15
+
16
+ 1. 建立事实基线:读取 package manager、lockfile、Node 版本、workspace 范围、CI 命令和当前验证状态。
17
+ 2. 分类升级目标:安全修复、补丁升级、小版本升级、大版本迁移、框架迁移、构建工具迁移或依赖清理。
18
+ 3. 查证来源:对版本敏感的库读取官方 release notes、migration guide、peer dependency、Node/browser 支持和弃用项。
19
+ 4. 拆小批次:安全补丁可集中处理;大版本、构建工具、框架和测试工具必须单独批次验证。
20
+ 5. 处理兼容边界:检查 ESM/CJS、TypeScript 类型、CSS 处理、SSR/RSC、插件 API、peer dependency 和 polyfill 变化。
21
+ 6. 运行验证矩阵:至少覆盖 install、typecheck、unit/component tests、build;关键应用补 E2E、Storybook 或手工冒烟。
22
+ 7. 同步文档:记录升级原因、版本、破坏性变更、迁移命令、回滚方式和仍需人工验证的路径。
23
+
24
+ ## Constraints
25
+
26
+ - 不在缺少来源和验证的情况下进行大版本连跳。
27
+ - 不为了消除 audit 警告盲目升级运行时关键包;先判断可利用路径和修复影响。
28
+ - 不手工编辑 lockfile 规避依赖冲突。
29
+ - 不把依赖升级和无关重构混在一个批次。
30
+ - 不移除 peer dependency 或构建插件,除非有证据证明没有被运行时、子包或 CI 使用。
31
+
32
+ ## Expected Output
33
+
34
+ 输出升级清单、风险分类、来源依据、批次策略、修改范围、验证命令、失败处理和回滚建议。完成后 lockfile 与 package 清单一致,关键验证通过,破坏性变更有记录。
@@ -0,0 +1,56 @@
1
+ # 依赖升级工作流
2
+
3
+ ## 升级类型
4
+
5
+ | 类型 | 示例 | 验证 |
6
+ | ---- | ---- | ---- |
7
+ | 安全补丁 | 传递依赖 CVE、patch 版本 | 安装、audit、目标测试 |
8
+ | 小版本升级 | 兼容性功能版本 | typecheck、测试、构建 |
9
+ | 大版本迁移 | React/Vue/Next/Vite/Storybook 大版本 | 迁移指南、完整验证矩阵 |
10
+ | 工具链切换 | ESLint、TypeScript、bundler、test runner | 配置 diff、CI 对齐、样例失败 |
11
+ | 清理 | 移除未使用包 | 引用搜索、构建、测试 |
12
+
13
+ ## 来源检查清单
14
+
15
+ - 官方 release notes 或 migration guide。
16
+ - 包管理器兼容性和 lockfile 格式。
17
+ - Node 版本和浏览器支持范围。
18
+ - Peer dependency 版本范围。
19
+ - ESM/CJS 导出变化。
20
+ - TypeScript 最低版本和类型变化。
21
+ - SSR、RSC、edge runtime 或 browser-only 约束。
22
+
23
+ ## 分批策略
24
+
25
+ - 框架大版本升级与样式、测试、lint 升级分开处理。
26
+ - 当 peer 版本范围要求时,adapter 与宿主工具放在同一批升级。
27
+ - Monorepo 中要验证受影响包,并至少验证一个消费这些包的应用。
28
+ - 每个成功批次都记录通过的命令,必要时单独提交或单独报告。
29
+
30
+ ## 失败分诊
31
+
32
+ 1. 复现最小失败命令。
33
+ 2. 判断失败属于配置、类型表面、运行时行为还是 peer dependency。
34
+ 3. 优先采用官方迁移步骤,而不是本地临时 hack。
35
+ 4. 如果某个包阻塞当前批次,先 pin 住并记录原因;只有剩余批次仍然自洽时才继续。
36
+
37
+ ## 报告模板
38
+
39
+ ```markdown
40
+ ## 依赖升级摘要
41
+
42
+ | 包 | 从 | 到 | 原因 | 风险 | 依据 |
43
+ | -- | -- | -- | ---- | ---- | ---- |
44
+
45
+ ## 验证
46
+
47
+ - install:
48
+ - typecheck:
49
+ - test:
50
+ - build:
51
+ - e2e/storybook/manual:
52
+
53
+ ## 剩余风险
54
+
55
+ - ...
56
+ ```