@wipal/agent-team 1.0.4 → 1.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.
- package/.claude/commands/skills/discover.md +127 -0
- package/.claude/commands/skills/install.md +225 -0
- package/.claude/commands/skills/review.md +234 -0
- package/.claude/commands/utils/learn.md +142 -0
- package/.claude/commands/utils/retrospect.md +62 -0
- package/.claude/commands/utils/switch.md +113 -0
- package/.claude/commands/utils/sync.md +183 -0
- package/.claude/rules/common/general-rules.md +6 -0
- package/.claude/rules/role-rules/dev-be-rules.md +241 -0
- package/.claude/rules/role-rules/dev-fe-rules.md +76 -0
- package/.claude/skills/SKILL-INDEX.md +24 -5
- package/.claude/skills/core/knowledge-graph/SKILL.md +214 -0
- package/.claude/skills/core/sequential-thinking/SKILL.md +112 -0
- package/.claude/skills/core/sequential-thinking/references/advanced.md +122 -0
- package/.claude/skills/core/sequential-thinking/references/examples.md +274 -0
- package/.claude/skills/domain/architecture/c4-architecture/SKILL.md +314 -0
- package/.claude/skills/domain/architecture/c4-architecture/references/advanced-patterns.md +552 -0
- package/.claude/skills/domain/architecture/c4-architecture/references/c4-syntax.md +492 -0
- package/.claude/skills/domain/architecture/c4-architecture/references/common-mistakes.md +437 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/SKILL.md +238 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/advanced-features.md +556 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/architecture-diagrams.md +192 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/c4-diagrams.md +410 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/class-diagrams.md +361 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/erd-diagrams.md +510 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/flowcharts.md +450 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/sequence-diagrams.md +394 -0
- package/.claude/skills/domain/backend/testing-be/SKILL.md +121 -17
- package/.claude/skills/domain/design/design-system/SKILL.md +169 -0
- package/.claude/skills/domain/design/html-css-output/SKILL.md +253 -0
- package/.claude/skills/domain/design/mockup-creation/SKILL.md +230 -0
- package/.claude/skills/domain/design/responsive-design/SKILL.md +207 -0
- package/.claude/skills/domain/design/ui-design/SKILL.md +124 -0
- package/.claude/skills/domain/frontend/testing-fe/SKILL.md +143 -38
- package/.claude/skills/domain/frontend/ui-ux-pro-max/README.md +45 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/SKILL.md +404 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/charts.csv +26 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/colors.csv +97 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/icons.csv +101 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/landing.csv +31 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/products.csv +97 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/styles.csv +68 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/typography.csv +58 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/scripts/core.py +253 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/scripts/search.py +114 -0
- package/.claude/skills/domain/product/requirements-clarity/SKILL.md +340 -0
- package/.claude/skills/skills-registry.yaml +103 -8
- package/README.md +107 -33
- package/README.npm.md +252 -0
- package/TUTORIAL.md +256 -0
- package/bin/agent-team.js +26 -7
- package/config/roles.yaml +107 -0
- package/docs/01-architecture.md +699 -0
- package/docs/02-setup-guide.md +634 -0
- package/docs/03-skills-guide.md +628 -0
- package/docs/04-workflows.md +792 -0
- package/docs/05-model-strategy.md +550 -0
- package/docs/06-extend-guide.md +1226 -0
- package/docs/07-quick-reference.md +578 -0
- package/docs/08-skills-discovery.md +342 -0
- package/docs/README.md +134 -0
- package/docs/rqm.md +560 -0
- package/package.json +9 -3
- package/scripts/postinstall.js +46 -0
- package/src/commands/add.js +131 -67
- package/src/commands/init.js +419 -9
- package/src/commands/list.js +20 -16
- package/src/commands/projects.js +127 -0
- package/src/commands/setup-hooks.js +261 -0
- package/src/index.js +0 -1
- package/src/utils/file-utils.js +147 -50
- package/src/utils/global-registry.js +224 -0
- package/templates/CLAUDE.md.tmpl +128 -20
- package/templates/MEMORY.md.tmpl +119 -0
- package/templates/agent.md.tmpl +205 -0
- package/templates/code/nestjs-controller.ts.tmpl +49 -0
- package/templates/code/nestjs-dto.ts.tmpl +63 -0
- package/templates/code/nestjs-service.ts.tmpl +45 -0
- package/templates/code/react-component.tsx.tmpl +24 -0
- package/templates/code/react-hook.ts.tmpl +54 -0
- package/templates/code/test.spec.ts.tmpl +50 -0
- package/templates/code/vue-component.vue.tmpl +49 -0
- package/templates/code/vue-composable.ts.tmpl +54 -0
- package/templates/knowledge.md.tmpl +152 -17
- package/templates/meeting-notes.md.tmpl +110 -0
- package/templates/memory/hooks.memory.json +50 -0
- package/templates/memory/settings.memory.json +16 -0
- package/templates/reports/bug-report.md.tmpl +164 -0
- package/templates/reports/code-review.md.tmpl +201 -0
- package/templates/reports/sprint-report.md.tmpl +218 -0
- package/templates/roles/ba.md +53 -0
- package/templates/roles/designer.md +82 -0
- package/templates/roles/dev-be.md +49 -0
- package/templates/roles/dev-fe.md +49 -0
- package/templates/roles/devops.md +53 -0
- package/templates/roles/pm.md +49 -0
- package/templates/roles/qa.md +53 -0
- package/templates/roles/sa.md +49 -0
- package/templates/roles/tech-lead.md +132 -0
- package/templates/skills/memory/memory-status.md +78 -0
- package/templates/skills/memory/recall.md +160 -0
- package/templates/skills/memory/reflect.md +168 -0
- package/templates/skills/memory/remember.md +105 -0
- package/templates/tasks/lessons.md.tmpl +77 -0
- package/templates/tasks/todo.md.tmpl +53 -0
- package/src/commands/switch.js +0 -53
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: responsive-design
|
|
3
|
+
description: |
|
|
4
|
+
Mobile-first responsive design with breakpoints and adaptive layouts.
|
|
5
|
+
Use when creating responsive layouts, mobile designs, or adapting for different screens.
|
|
6
|
+
Triggers: responsive, mobile-first, breakpoints, adaptive, mobile, tablet, desktop
|
|
7
|
+
version: 1.0.0
|
|
8
|
+
category: design
|
|
9
|
+
tags:
|
|
10
|
+
- responsive
|
|
11
|
+
- mobile-first
|
|
12
|
+
- breakpoints
|
|
13
|
+
- adaptive
|
|
14
|
+
depends_on: [ui-design]
|
|
15
|
+
recommends: []
|
|
16
|
+
used_by: []
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Responsive Design Guide
|
|
20
|
+
|
|
21
|
+
Mobile-first approach to creating adaptive layouts.
|
|
22
|
+
|
|
23
|
+
## Mobile-First Philosophy
|
|
24
|
+
|
|
25
|
+
Start with mobile styles, then add complexity for larger screens.
|
|
26
|
+
|
|
27
|
+
**Why Mobile-First:**
|
|
28
|
+
- Forces prioritization of content
|
|
29
|
+
- Simpler base styles
|
|
30
|
+
- Progressive enhancement
|
|
31
|
+
- Better performance on mobile
|
|
32
|
+
|
|
33
|
+
## Breakpoint System
|
|
34
|
+
|
|
35
|
+
### Standard Breakpoints
|
|
36
|
+
|
|
37
|
+
```css
|
|
38
|
+
/* Mobile First (min-width) */
|
|
39
|
+
--breakpoint-sm: 640px; /* Small tablets */
|
|
40
|
+
--breakpoint-md: 768px; /* Tablets */
|
|
41
|
+
--breakpoint-lg: 1024px; /* Laptops */
|
|
42
|
+
--breakpoint-xl: 1280px; /* Desktops */
|
|
43
|
+
--breakpoint-2xl: 1536px; /* Large screens */
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Tailwind-style Usage
|
|
47
|
+
|
|
48
|
+
```css
|
|
49
|
+
/* Base: Mobile styles */
|
|
50
|
+
.container {
|
|
51
|
+
padding: 1rem;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* sm: 640px+ */
|
|
55
|
+
@media (min-width: 640px) {
|
|
56
|
+
.container {
|
|
57
|
+
padding: 1.5rem;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* md: 768px+ */
|
|
62
|
+
@media (min-width: 768px) {
|
|
63
|
+
.container {
|
|
64
|
+
padding: 2rem;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Layout Patterns
|
|
70
|
+
|
|
71
|
+
### Container
|
|
72
|
+
|
|
73
|
+
```css
|
|
74
|
+
.container {
|
|
75
|
+
width: 100%;
|
|
76
|
+
max-width: 1280px;
|
|
77
|
+
margin-left: auto;
|
|
78
|
+
margin-right: auto;
|
|
79
|
+
padding-left: 1rem;
|
|
80
|
+
padding-right: 1rem;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@media (min-width: 640px) {
|
|
84
|
+
.container {
|
|
85
|
+
padding-left: 1.5rem;
|
|
86
|
+
padding-right: 1.5rem;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Responsive Grid
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
.grid {
|
|
95
|
+
display: grid;
|
|
96
|
+
gap: 1rem;
|
|
97
|
+
grid-template-columns: 1fr;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@media (min-width: 640px) {
|
|
101
|
+
.grid {
|
|
102
|
+
grid-template-columns: repeat(2, 1fr);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@media (min-width: 1024px) {
|
|
107
|
+
.grid {
|
|
108
|
+
grid-template-columns: repeat(3, 1fr);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Stack on Mobile
|
|
114
|
+
|
|
115
|
+
```css
|
|
116
|
+
/* Mobile: Stack */
|
|
117
|
+
.flex-mobile-stack {
|
|
118
|
+
flex-direction: column;
|
|
119
|
+
gap: 1rem;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* Desktop: Row */
|
|
123
|
+
@media (min-width: 768px) {
|
|
124
|
+
.flex-mobile-stack {
|
|
125
|
+
flex-direction: row;
|
|
126
|
+
gap: 2rem;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Typography Scaling
|
|
132
|
+
|
|
133
|
+
### Fluid Typography
|
|
134
|
+
|
|
135
|
+
```css
|
|
136
|
+
/* Clamps between min and max based on viewport */
|
|
137
|
+
.heading {
|
|
138
|
+
font-size: clamp(1.5rem, 4vw, 3rem);
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Responsive Type Scale
|
|
143
|
+
|
|
144
|
+
| Size | Mobile | Desktop |
|
|
145
|
+
| ---- | ------ | ------- |
|
|
146
|
+
| h1 | 2rem | 3rem |
|
|
147
|
+
| h2 | 1.5rem | 2.25rem |
|
|
148
|
+
| h3 | 1.25rem | 1.5rem |
|
|
149
|
+
| h4 | 1.125rem | 1.25rem |
|
|
150
|
+
| body | 1rem | 1rem |
|
|
151
|
+
| small | 0.875rem | 0.875rem |
|
|
152
|
+
|
|
153
|
+
## Image Handling
|
|
154
|
+
|
|
155
|
+
### Responsive Images
|
|
156
|
+
|
|
157
|
+
```html
|
|
158
|
+
<img
|
|
159
|
+
src="image.jpg"
|
|
160
|
+
srcset="image-320w.jpg 320w, image-640w.jpg 640w, image-1280w.jpg 1280w"
|
|
161
|
+
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
|
|
162
|
+
alt="Description"
|
|
163
|
+
/>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Aspect Ratio
|
|
167
|
+
|
|
168
|
+
```css
|
|
169
|
+
.aspect-video {
|
|
170
|
+
aspect-ratio: 16 / 9;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.aspect-square {
|
|
174
|
+
aspect-ratio: 1 / 1;
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Touch Considerations
|
|
179
|
+
|
|
180
|
+
### Touch Targets
|
|
181
|
+
|
|
182
|
+
```css
|
|
183
|
+
/* Minimum 44x44px for touch */
|
|
184
|
+
.touch-target {
|
|
185
|
+
min-height: 44px;
|
|
186
|
+
min-width: 44px;
|
|
187
|
+
padding: 0.75rem 1rem;
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Touch vs Mouse Interactions
|
|
192
|
+
|
|
193
|
+
| Touch | Mouse |
|
|
194
|
+
| ----- | ----- |
|
|
195
|
+
| Tap | Click |
|
|
196
|
+
| Long press | Right click |
|
|
197
|
+
| Swipe | Scroll |
|
|
198
|
+
| Pinch | Scroll zoom |
|
|
199
|
+
|
|
200
|
+
## Testing Checklist
|
|
201
|
+
|
|
202
|
+
- [ ] Test at 320px, 375px, 768px, 1024px, 1440px
|
|
203
|
+
- [ ] Touch targets at least 44x44px
|
|
204
|
+
- [ ] Text readable without zoom on mobile
|
|
205
|
+
- [ ] No horizontal scroll on mobile
|
|
206
|
+
- [ ] Images scale appropriately
|
|
207
|
+
- [ ] Forms usable on touch devices
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-design
|
|
3
|
+
description: |
|
|
4
|
+
UI design principles for creating professional, accessible interfaces.
|
|
5
|
+
Use when designing user interfaces, creating design systems, or reviewing UI.
|
|
6
|
+
Triggers: design, ui, interface, visual, user interface
|
|
7
|
+
version: 1.0.0
|
|
8
|
+
category: design
|
|
9
|
+
tags:
|
|
10
|
+
- ui-design
|
|
11
|
+
- accessibility
|
|
12
|
+
- visual-design
|
|
13
|
+
- user-interface
|
|
14
|
+
depends_on: []
|
|
15
|
+
recommends: []
|
|
16
|
+
used_by: [design-system]
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# UI Design Principles
|
|
20
|
+
|
|
21
|
+
Core principles for creating professional, accessible user interfaces.
|
|
22
|
+
|
|
23
|
+
## Visual Hierarchy
|
|
24
|
+
|
|
25
|
+
- **Size**: Larger elements draw more attention
|
|
26
|
+
- **Color**: Bright/warm colors advance, cool/dark colors recede
|
|
27
|
+
- **Contrast**: High contrast creates focal points
|
|
28
|
+
- **Spacing**: White space guides the eye
|
|
29
|
+
- **Typography**: Weight and size differentiate importance
|
|
30
|
+
|
|
31
|
+
## Layout Principles
|
|
32
|
+
|
|
33
|
+
### Grid Systems
|
|
34
|
+
- Use consistent grid (12-column common)
|
|
35
|
+
- Maintain alignment across elements
|
|
36
|
+
- Create rhythm through repetition
|
|
37
|
+
|
|
38
|
+
### Spacing Scale
|
|
39
|
+
```
|
|
40
|
+
xs: 4px
|
|
41
|
+
sm: 8px
|
|
42
|
+
md: 16px
|
|
43
|
+
lg: 24px
|
|
44
|
+
xl: 32px
|
|
45
|
+
2xl: 48px
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Visual Balance
|
|
49
|
+
- Distribute visual weight evenly
|
|
50
|
+
- Use symmetry for stability, asymmetry for interest
|
|
51
|
+
- Avoid orphan elements
|
|
52
|
+
|
|
53
|
+
## Color Application
|
|
54
|
+
|
|
55
|
+
### Primary Actions
|
|
56
|
+
- One primary color for main CTAs
|
|
57
|
+
- High contrast with background
|
|
58
|
+
- Consistent across all screens
|
|
59
|
+
|
|
60
|
+
### Semantic Colors
|
|
61
|
+
- **Success**: Green (#10B981)
|
|
62
|
+
- **Warning**: Yellow (#F59E0B)
|
|
63
|
+
- **Error**: Red (#EF4444)
|
|
64
|
+
- **Info**: Blue (#3B82F6)
|
|
65
|
+
|
|
66
|
+
### Accessibility
|
|
67
|
+
- Minimum 4.5:1 contrast ratio for text
|
|
68
|
+
- 3:1 for large text (18px+ or 14px+ bold)
|
|
69
|
+
- Never rely on color alone for meaning
|
|
70
|
+
|
|
71
|
+
## Typography
|
|
72
|
+
|
|
73
|
+
### Font Pairing
|
|
74
|
+
- Maximum 2 font families
|
|
75
|
+
- Pair contrasting styles (serif + sans-serif)
|
|
76
|
+
- Ensure readability at all sizes
|
|
77
|
+
|
|
78
|
+
### Type Scale
|
|
79
|
+
```
|
|
80
|
+
xs: 12px
|
|
81
|
+
sm: 14px
|
|
82
|
+
base: 16px
|
|
83
|
+
lg: 18px
|
|
84
|
+
xl: 20px
|
|
85
|
+
2xl: 24px
|
|
86
|
+
3xl: 30px
|
|
87
|
+
4xl: 36px
|
|
88
|
+
5xl: 48px
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Line Height
|
|
92
|
+
- Body text: 1.5 - 1.75
|
|
93
|
+
- Headings: 1.2 - 1.4
|
|
94
|
+
- Captions: 1.4
|
|
95
|
+
|
|
96
|
+
## Interactive Elements
|
|
97
|
+
|
|
98
|
+
### Buttons
|
|
99
|
+
- Minimum 44x44px touch target
|
|
100
|
+
- Clear hover/focus states
|
|
101
|
+
- Disabled state visually distinct
|
|
102
|
+
- Loading state when async
|
|
103
|
+
|
|
104
|
+
### Form Inputs
|
|
105
|
+
- Visible labels (not placeholder-only)
|
|
106
|
+
- Clear error states
|
|
107
|
+
- Helper text for complex inputs
|
|
108
|
+
- Consistent input heights
|
|
109
|
+
|
|
110
|
+
### Links
|
|
111
|
+
- Underline or clear visual distinction
|
|
112
|
+
- Different visited state optional
|
|
113
|
+
- Hover state feedback
|
|
114
|
+
|
|
115
|
+
## Accessibility Checklist
|
|
116
|
+
|
|
117
|
+
- [ ] Color contrast meets WCAG 2.1 AA
|
|
118
|
+
- [ ] Focus states visible
|
|
119
|
+
- [ ] Touch targets minimum 44x44px
|
|
120
|
+
- [ ] Form inputs have labels
|
|
121
|
+
- [ ] Error messages clear and specific
|
|
122
|
+
- [ ] Interactive elements keyboard accessible
|
|
123
|
+
- [ ] Images have alt text
|
|
124
|
+
- [ ] Heading hierarchy logical
|
|
@@ -1,42 +1,45 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: testing-fe
|
|
3
3
|
description: |
|
|
4
|
-
Frontend testing
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
version: 1.0.0
|
|
4
|
+
Frontend testing from developer perspective: Unit Tests, Integration Tests,
|
|
5
|
+
Functional Tests, Component/UI Tests. Use when writing tests for your own
|
|
6
|
+
code. NOT for E2E/QA testing (that's QA domain). Test behavior, not implementation.
|
|
7
|
+
version: 1.1.0
|
|
9
8
|
category: frontend
|
|
10
9
|
tags:
|
|
11
10
|
- testing
|
|
11
|
+
- unit-test
|
|
12
|
+
- integration-test
|
|
13
|
+
- functional-test
|
|
14
|
+
- component-test
|
|
12
15
|
- vitest
|
|
13
16
|
- testing-library
|
|
14
|
-
- playwright
|
|
15
17
|
depends_on:
|
|
16
18
|
- code-review
|
|
17
19
|
recommends: []
|
|
18
|
-
used_by:
|
|
20
|
+
used_by:
|
|
21
|
+
- dev-fe
|
|
19
22
|
---
|
|
20
23
|
|
|
21
|
-
# Skill: Testing FE
|
|
24
|
+
# Skill: Testing FE (Developer Perspective)
|
|
22
25
|
|
|
23
26
|
## Core Principle
|
|
24
|
-
**Test behavior, not implementation.**
|
|
27
|
+
**Test behavior, not implementation.** As a developer, you test YOUR code to ensure it works correctly. E2E testing is QA's responsibility.
|
|
25
28
|
|
|
26
|
-
## Testing
|
|
29
|
+
## Testing Pyramid (Developer Focus)
|
|
27
30
|
|
|
28
31
|
```
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
/ Unit Tests \ Many, very fast
|
|
37
|
-
/───────────────────\
|
|
32
|
+
▲
|
|
33
|
+
/API\ Some, medium speed (Integration)
|
|
34
|
+
/─────\
|
|
35
|
+
/Component\ Many, fast (Component/UI)
|
|
36
|
+
/───────────\
|
|
37
|
+
/ Unit \ Many, very fast
|
|
38
|
+
/───────────────\
|
|
38
39
|
```
|
|
39
40
|
|
|
41
|
+
**Note:** E2E testing is NOT included - that's QA/Tester domain, not developer responsibility.
|
|
42
|
+
|
|
40
43
|
## Hard Rules
|
|
41
44
|
|
|
42
45
|
1. **NEVER test implementation** - Test user behavior
|
|
@@ -44,8 +47,39 @@ used_by: []
|
|
|
44
47
|
3. **ALWAYS use userEvent** - Not fireEvent
|
|
45
48
|
4. **ALWAYS wait for async** - findBy*, waitFor
|
|
46
49
|
5. **ALWAYS clean up** - No state leakage
|
|
50
|
+
6. **NO E2E tests** - That's QA domain, not dev responsibility
|
|
51
|
+
|
|
52
|
+
## Unit Testing
|
|
53
|
+
|
|
54
|
+
Test individual functions, hooks, and utilities in isolation.
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
// useCounter.test.ts
|
|
58
|
+
import { renderHook, act } from '@testing-library/react';
|
|
59
|
+
import { describe, it, expect } from 'vitest';
|
|
60
|
+
import { useCounter } from './useCounter';
|
|
61
|
+
|
|
62
|
+
describe('useCounter', () => {
|
|
63
|
+
it('initializes with default value', () => {
|
|
64
|
+
const { result } = renderHook(() => useCounter());
|
|
65
|
+
expect(result.current.count).toBe(0);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('increments count', () => {
|
|
69
|
+
const { result } = renderHook(() => useCounter());
|
|
70
|
+
|
|
71
|
+
act(() => {
|
|
72
|
+
result.current.increment();
|
|
73
|
+
});
|
|
47
74
|
|
|
48
|
-
|
|
75
|
+
expect(result.current.count).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Component/UI Testing (Vitest + Testing Library)
|
|
81
|
+
|
|
82
|
+
Test how components render and respond to user interaction.
|
|
49
83
|
|
|
50
84
|
```tsx
|
|
51
85
|
// Button.test.tsx
|
|
@@ -80,6 +114,93 @@ describe('Button', () => {
|
|
|
80
114
|
});
|
|
81
115
|
```
|
|
82
116
|
|
|
117
|
+
## Integration Testing
|
|
118
|
+
|
|
119
|
+
Test how multiple components work together.
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
// LoginForm.test.tsx
|
|
123
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
124
|
+
import userEvent from '@testing-library/user-event';
|
|
125
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
126
|
+
import { LoginForm } from './LoginForm';
|
|
127
|
+
|
|
128
|
+
describe('LoginForm Integration', () => {
|
|
129
|
+
it('submits form with valid credentials', async () => {
|
|
130
|
+
const onSubmit = vi.fn();
|
|
131
|
+
const user = userEvent.setup();
|
|
132
|
+
|
|
133
|
+
render(<LoginForm onSubmit={onSubmit} />);
|
|
134
|
+
|
|
135
|
+
await user.type(screen.getByLabelText(/email/i), 'test@example.com');
|
|
136
|
+
await user.type(screen.getByLabelText(/password/i), 'password123');
|
|
137
|
+
await user.click(screen.getByRole('button', { name: /sign in/i }));
|
|
138
|
+
|
|
139
|
+
await waitFor(() => {
|
|
140
|
+
expect(onSubmit).toHaveBeenCalledWith({
|
|
141
|
+
email: 'test@example.com',
|
|
142
|
+
password: 'password123',
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('shows validation errors', async () => {
|
|
148
|
+
const user = userEvent.setup();
|
|
149
|
+
|
|
150
|
+
render(<LoginForm onSubmit={vi.fn()} />);
|
|
151
|
+
|
|
152
|
+
await user.click(screen.getByRole('button', { name: /sign in/i }));
|
|
153
|
+
|
|
154
|
+
expect(await screen.findByText(/email is required/i)).toBeInTheDocument();
|
|
155
|
+
expect(screen.getByText(/password is required/i)).toBeInTheDocument();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Functional Testing
|
|
161
|
+
|
|
162
|
+
Test complete features from user perspective (without browser).
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
// ShoppingCart.test.tsx
|
|
166
|
+
import { render, screen } from '@testing-library/react';
|
|
167
|
+
import userEvent from '@testing-library/user-event';
|
|
168
|
+
import { describe, it, expect } from 'vitest';
|
|
169
|
+
import { ShoppingCart } from './ShoppingCart';
|
|
170
|
+
|
|
171
|
+
describe('ShoppingCart Functional Tests', () => {
|
|
172
|
+
it('adds item and updates total', async () => {
|
|
173
|
+
const user = userEvent.setup();
|
|
174
|
+
|
|
175
|
+
render(<ShoppingCart />);
|
|
176
|
+
|
|
177
|
+
// Add first item
|
|
178
|
+
await user.click(screen.getByRole('button', { name: /add product a/i }));
|
|
179
|
+
|
|
180
|
+
expect(screen.getByText(/total: \$10.00/i)).toBeInTheDocument();
|
|
181
|
+
expect(screen.getByText(/1 item/i)).toBeInTheDocument();
|
|
182
|
+
|
|
183
|
+
// Add second item
|
|
184
|
+
await user.click(screen.getByRole('button', { name: /add product b/i }));
|
|
185
|
+
|
|
186
|
+
expect(screen.getByText(/total: \$25.00/i)).toBeInTheDocument();
|
|
187
|
+
expect(screen.getByText(/2 items/i)).toBeInTheDocument();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('removes item and updates total', async () => {
|
|
191
|
+
const user = userEvent.setup();
|
|
192
|
+
|
|
193
|
+
render(<ShoppingCart />);
|
|
194
|
+
|
|
195
|
+
await user.click(screen.getByRole('button', { name: /add product a/i }));
|
|
196
|
+
await user.click(screen.getByRole('button', { name: /remove product a/i }));
|
|
197
|
+
|
|
198
|
+
expect(screen.getByText(/total: \$0.00/i)).toBeInTheDocument();
|
|
199
|
+
expect(screen.getByText(/0 items/i)).toBeInTheDocument();
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
```
|
|
203
|
+
|
|
83
204
|
## Async Testing
|
|
84
205
|
|
|
85
206
|
```tsx
|
|
@@ -127,6 +248,7 @@ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
|
127
248
|
| Not waiting for async | findBy*, waitFor |
|
|
128
249
|
| Testing implementation | Test user behavior |
|
|
129
250
|
| Brittle selectors | Use accessible queries |
|
|
251
|
+
| Writing E2E tests | That's QA domain |
|
|
130
252
|
|
|
131
253
|
## Query Priority
|
|
132
254
|
|
|
@@ -145,24 +267,6 @@ screen.getByTitle(/close/i);
|
|
|
145
267
|
screen.getByTestId('submit-button');
|
|
146
268
|
```
|
|
147
269
|
|
|
148
|
-
## E2E Testing (Playwright)
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
// example.spec.ts
|
|
152
|
-
import { test, expect } from '@playwright/test';
|
|
153
|
-
|
|
154
|
-
test('user can login', async ({ page }) => {
|
|
155
|
-
await page.goto('/login');
|
|
156
|
-
|
|
157
|
-
await page.fill('[name="email"]', 'test@example.com');
|
|
158
|
-
await page.fill('[name="password"]', 'password123');
|
|
159
|
-
await page.click('button[type="submit"]');
|
|
160
|
-
|
|
161
|
-
await expect(page).toHaveURL('/dashboard');
|
|
162
|
-
await expect(page.locator('h1')).toContainText('Welcome');
|
|
163
|
-
});
|
|
164
|
-
```
|
|
165
|
-
|
|
166
270
|
## Vitest Config
|
|
167
271
|
|
|
168
272
|
```typescript
|
|
@@ -191,3 +295,4 @@ export default defineConfig({
|
|
|
191
295
|
- [ ] Waits for async with findBy/waitFor
|
|
192
296
|
- [ ] Mocks external dependencies
|
|
193
297
|
- [ ] Coverage reports generated
|
|
298
|
+
- [ ] NO E2E tests (that's QA domain)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# UI/UX Pro Max Skill
|
|
2
|
+
|
|
3
|
+
Source: https://github.com/nextlevelbuilder/ui-ux-pro-max-skill
|
|
4
|
+
|
|
5
|
+
## Version Update
|
|
6
|
+
|
|
7
|
+
To update this skill to the latest version:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
cd /tmp
|
|
11
|
+
git clone --depth 1 https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git
|
|
12
|
+
cd ui-ux-pro-max-skill
|
|
13
|
+
|
|
14
|
+
# Update skill files
|
|
15
|
+
cp .claude/skills/ui-ux-pro-max/SKILL.md /path/to/project/.claude/skills/domain/frontend/ui-ux-pro-max/
|
|
16
|
+
cp src/ui-ux-pro-max/scripts/*.py /path/to/project/.claude/skills/domain/frontend/ui-ux-pro-max/scripts/
|
|
17
|
+
cp src/ui-ux-pro-max/data/*.csv /path/to/project/.claude/skills/domain/frontend/ui-ux-pro-max/data/
|
|
18
|
+
cp -r src/ui-ux-pro-max/data/stacks/* /path/to/project/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Requirements
|
|
22
|
+
|
|
23
|
+
- Python 3.x (for search script)
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
The skill activates automatically when working on UI/UX tasks. It provides:
|
|
28
|
+
|
|
29
|
+
- 67 UI styles (Glassmorphism, Claymorphism, Minimalism, etc.)
|
|
30
|
+
- 96 color palettes
|
|
31
|
+
- 57 font pairings
|
|
32
|
+
- 99 UX guidelines
|
|
33
|
+
- 25 chart types
|
|
34
|
+
- 100 industry-specific reasoning rules
|
|
35
|
+
- 13 tech stack guidelines (React, Next.js, Vue, Svelte, SwiftUI, etc.)
|
|
36
|
+
|
|
37
|
+
## Search Script
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Generate design system
|
|
41
|
+
python3 .claude/skills/domain/frontend/ui-ux-pro-max/scripts/search.py "fintech" --design-system
|
|
42
|
+
|
|
43
|
+
# Search by domain
|
|
44
|
+
python3 .claude/skills/domain/frontend/ui-ux-pro-max/scripts/search.py "glassmorphism" --domain style
|
|
45
|
+
```
|