qualia-framework-v2 2.4.0 → 2.6.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.md +4 -3
- package/README.md +9 -9
- package/agents/builder.md +23 -5
- package/agents/planner.md +21 -1
- package/agents/qa-browser.md +186 -0
- package/agents/verifier.md +63 -0
- package/bin/install.js +49 -22
- package/bin/qualia-ui.js +278 -0
- package/hooks/auto-update.sh +56 -0
- package/hooks/branch-guard.sh +11 -2
- package/hooks/session-start.sh +27 -9
- package/package.json +1 -1
- package/rules/design-reference.md +179 -0
- package/rules/frontend.md +108 -15
- package/skills/qualia/SKILL.md +15 -11
- package/skills/qualia-build/SKILL.md +17 -16
- package/skills/qualia-debug/SKILL.md +14 -0
- package/skills/qualia-design/SKILL.md +4 -0
- package/skills/qualia-handoff/SKILL.md +5 -9
- package/skills/qualia-learn/SKILL.md +4 -0
- package/skills/qualia-new/SKILL.md +50 -13
- package/skills/qualia-pause/SKILL.md +4 -0
- package/skills/qualia-plan/SKILL.md +21 -20
- package/skills/qualia-polish/SKILL.md +127 -29
- package/skills/qualia-quick/SKILL.md +9 -0
- package/skills/qualia-report/SKILL.md +27 -2
- package/skills/qualia-resume/SKILL.md +11 -6
- package/skills/qualia-review/SKILL.md +4 -0
- package/skills/qualia-ship/SKILL.md +10 -13
- package/skills/qualia-skill-new/SKILL.md +148 -0
- package/skills/qualia-task/SKILL.md +11 -15
- package/skills/qualia-verify/SKILL.md +49 -20
- package/templates/DESIGN.md +137 -0
- package/tests/hooks.test.sh +18 -6
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Design System — {Project Name}
|
|
2
|
+
|
|
3
|
+
> Generated during project setup. This is the source of truth for all frontend work.
|
|
4
|
+
> Builder agents read this before writing any component. Update it as design evolves.
|
|
5
|
+
|
|
6
|
+
## Brand
|
|
7
|
+
|
|
8
|
+
- **Tone:** {dark-bold | clean-minimal | colorful-playful | corporate-professional}
|
|
9
|
+
- **Personality:** {1-2 sentences describing the feel — e.g., "Confident and technical, like a Bloomberg terminal meets a luxury brand"}
|
|
10
|
+
- **Industry:** {e.g., fintech, healthcare, SaaS, e-commerce}
|
|
11
|
+
|
|
12
|
+
## Color System
|
|
13
|
+
|
|
14
|
+
```css
|
|
15
|
+
:root {
|
|
16
|
+
/* Primary — brand identity */
|
|
17
|
+
--color-primary: {value};
|
|
18
|
+
--color-primary-hover: {value};
|
|
19
|
+
--color-primary-subtle: {value}; /* backgrounds, badges */
|
|
20
|
+
|
|
21
|
+
/* Accent — CTAs, highlights */
|
|
22
|
+
--color-accent: {value};
|
|
23
|
+
--color-accent-hover: {value};
|
|
24
|
+
|
|
25
|
+
/* Neutral — text, borders, backgrounds */
|
|
26
|
+
--color-bg: {value};
|
|
27
|
+
--color-bg-subtle: {value}; /* cards, raised surfaces */
|
|
28
|
+
--color-bg-muted: {value}; /* disabled, secondary surfaces */
|
|
29
|
+
--color-text: {value};
|
|
30
|
+
--color-text-muted: {value}; /* secondary text */
|
|
31
|
+
--color-text-subtle: {value}; /* placeholders, hints */
|
|
32
|
+
--color-border: {value};
|
|
33
|
+
--color-border-subtle: {value};
|
|
34
|
+
|
|
35
|
+
/* Semantic */
|
|
36
|
+
--color-success: {value};
|
|
37
|
+
--color-warning: {value};
|
|
38
|
+
--color-error: {value};
|
|
39
|
+
--color-info: {value};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Dark mode overrides */
|
|
43
|
+
[data-theme="dark"] {
|
|
44
|
+
--color-bg: {value};
|
|
45
|
+
--color-bg-subtle: {value};
|
|
46
|
+
--color-text: {value};
|
|
47
|
+
/* ... override all tokens ... */
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Typography
|
|
52
|
+
|
|
53
|
+
```css
|
|
54
|
+
:root {
|
|
55
|
+
/* Font families */
|
|
56
|
+
--font-display: '{Display Font}', {fallback}; /* Hero text, page titles */
|
|
57
|
+
--font-heading: '{Heading Font}', {fallback}; /* Section headings */
|
|
58
|
+
--font-body: '{Body Font}', {fallback}; /* Paragraphs, UI text */
|
|
59
|
+
--font-mono: '{Mono Font}', monospace; /* Code, data */
|
|
60
|
+
|
|
61
|
+
/* Scale */
|
|
62
|
+
--text-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.8rem);
|
|
63
|
+
--text-sm: clamp(0.875rem, 0.8rem + 0.4vw, 0.9rem);
|
|
64
|
+
--text-base: clamp(1rem, 0.5rem + 1.5vw, 1.125rem);
|
|
65
|
+
--text-lg: clamp(1.125rem, 0.75rem + 1.2vw, 1.25rem);
|
|
66
|
+
--text-xl: clamp(1.25rem, 0.75rem + 1.5vw, 1.5rem);
|
|
67
|
+
--text-2xl: clamp(1.5rem, 0.75rem + 2.25vw, 2rem);
|
|
68
|
+
--text-3xl: clamp(1.875rem, 1rem + 2.5vw, 2.5rem);
|
|
69
|
+
--text-4xl: clamp(2.25rem, 1rem + 3vw, 3rem);
|
|
70
|
+
--text-5xl: clamp(3rem, 1rem + 4vw, 4rem);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Google Fonts import:** `{URL}`
|
|
75
|
+
|
|
76
|
+
## Spacing Scale
|
|
77
|
+
|
|
78
|
+
Based on 8px grid: `4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96 / 128`
|
|
79
|
+
|
|
80
|
+
- **Within components:** 8–16px
|
|
81
|
+
- **Between related elements:** 16–24px
|
|
82
|
+
- **Between sections:** 48–96px
|
|
83
|
+
- **Page padding:** `clamp(1rem, 5vw, 4rem)` horizontal
|
|
84
|
+
|
|
85
|
+
## Motion
|
|
86
|
+
|
|
87
|
+
- **Approach:** {minimal | subtle | expressive}
|
|
88
|
+
- **Page load:** staggered fade-up, 60ms delay between elements
|
|
89
|
+
- **Hover/focus:** 150ms ease-out
|
|
90
|
+
- **Expand/collapse:** 250ms ease-in-out
|
|
91
|
+
- **Page transitions:** 400ms ease-out
|
|
92
|
+
- **Reduced motion:** all non-essential animations disabled
|
|
93
|
+
|
|
94
|
+
## Component Patterns
|
|
95
|
+
|
|
96
|
+
### Buttons
|
|
97
|
+
- **Primary:** solid {accent} background, white text, rounded-{radius}
|
|
98
|
+
- **Secondary:** bordered, transparent background
|
|
99
|
+
- **Ghost:** text-only, hover background
|
|
100
|
+
- **Destructive:** red variant for dangerous actions
|
|
101
|
+
- **Sizes:** sm (32px), md (40px), lg (48px)
|
|
102
|
+
|
|
103
|
+
### Inputs
|
|
104
|
+
- Border: 1px solid var(--color-border)
|
|
105
|
+
- Focus: 2px ring var(--color-primary)
|
|
106
|
+
- Error: red border + error text below with `aria-describedby`
|
|
107
|
+
- Height: 40px (md), 48px (lg)
|
|
108
|
+
|
|
109
|
+
### Cards/Surfaces
|
|
110
|
+
- Background: var(--color-bg-subtle)
|
|
111
|
+
- Border: 1px solid var(--color-border-subtle) or shadow
|
|
112
|
+
- Border-radius: {value}
|
|
113
|
+
- No identical card grids — vary layout and emphasis
|
|
114
|
+
|
|
115
|
+
## Responsive Approach
|
|
116
|
+
|
|
117
|
+
- **Strategy:** mobile-first
|
|
118
|
+
- **Primary breakpoints:** 768px (tablet), 1024px (desktop)
|
|
119
|
+
- **Navigation:** hamburger on mobile, expanded on desktop
|
|
120
|
+
- **Layout:** single column mobile → multi-column desktop
|
|
121
|
+
- **Touch targets:** 44px minimum on mobile
|
|
122
|
+
|
|
123
|
+
## Visual Effects
|
|
124
|
+
|
|
125
|
+
- {e.g., "Noise texture overlay at 3% opacity on hero sections"}
|
|
126
|
+
- {e.g., "Glass-morphism on floating elements: backdrop-blur-xl bg-white/80"}
|
|
127
|
+
- {e.g., "Gradient mesh on hero: radial-gradient from primary to transparent"}
|
|
128
|
+
- {e.g., "Decorative geometric shapes as background accents"}
|
|
129
|
+
|
|
130
|
+
## Anti-Patterns (Don't Do This)
|
|
131
|
+
|
|
132
|
+
- No Inter, Roboto, Arial, system-ui fonts
|
|
133
|
+
- No blue-purple gradients
|
|
134
|
+
- No identical card grids
|
|
135
|
+
- No generic stock-photo heroes
|
|
136
|
+
- No hardcoded max-width containers (use fluid layouts)
|
|
137
|
+
- No gray-on-gray low-contrast text
|
package/tests/hooks.test.sh
CHANGED
|
@@ -95,19 +95,31 @@ fi
|
|
|
95
95
|
echo ""
|
|
96
96
|
echo "pre-push:"
|
|
97
97
|
|
|
98
|
-
if grep -q 'command -v
|
|
99
|
-
echo " ✓ checks for
|
|
98
|
+
if grep -q 'command -v node' "$HOOKS_DIR/pre-push.sh"; then
|
|
99
|
+
echo " ✓ checks for node availability"
|
|
100
100
|
PASS=$((PASS + 1))
|
|
101
101
|
else
|
|
102
|
-
echo " ✗ missing
|
|
102
|
+
echo " ✗ missing node check"
|
|
103
103
|
FAIL=$((FAIL + 1))
|
|
104
104
|
fi
|
|
105
105
|
|
|
106
|
-
if grep -q '
|
|
107
|
-
echo " ✓ captures
|
|
106
|
+
if grep -q 'tracking sync failed' "$HOOKS_DIR/pre-push.sh"; then
|
|
107
|
+
echo " ✓ captures tracking sync errors"
|
|
108
108
|
PASS=$((PASS + 1))
|
|
109
109
|
else
|
|
110
|
-
echo " ✗ missing
|
|
110
|
+
echo " ✗ missing tracking sync error capture"
|
|
111
|
+
FAIL=$((FAIL + 1))
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
# --- branch-guard reads from .qualia-config.json ---
|
|
115
|
+
echo ""
|
|
116
|
+
echo "branch-guard config source:"
|
|
117
|
+
|
|
118
|
+
if grep -q 'qualia-config.json' "$HOOKS_DIR/branch-guard.sh"; then
|
|
119
|
+
echo " ✓ reads role from .qualia-config.json"
|
|
120
|
+
PASS=$((PASS + 1))
|
|
121
|
+
else
|
|
122
|
+
echo " ✗ not reading from .qualia-config.json"
|
|
111
123
|
FAIL=$((FAIL + 1))
|
|
112
124
|
fi
|
|
113
125
|
|