claude-code-orchestrator-kit 1.4.1 ā 1.4.16
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/agents/business/workers/lead-research-assistant.md +199 -0
- package/.claude/agents/database/workers/api-builder.md +8 -0
- package/.claude/agents/database/workers/database-architect.md +11 -3
- package/.claude/agents/database/workers/supabase-auditor.md +7 -7
- package/.claude/agents/database/workers/supabase-fixer.md +825 -0
- package/.claude/agents/database/workers/supabase-realtime-optimizer.md +1086 -0
- package/.claude/agents/database/workers/supabase-storage-optimizer.md +1187 -0
- package/.claude/agents/development/workers/code-reviewer.md +17 -2
- package/.claude/agents/development/workers/code-structure-refactorer.md +771 -0
- package/.claude/agents/development/workers/judge-specialist.md +3275 -0
- package/.claude/agents/development/workers/langgraph-specialist.md +1343 -0
- package/.claude/agents/development/workers/stage-pipeline-specialist.md +1173 -0
- package/.claude/agents/frontend/workers/fullstack-nextjs-specialist.md +10 -0
- package/.claude/agents/frontend/workers/nextjs-ui-designer.md +30 -0
- package/.claude/agents/health/workers/bug-fixer.md +31 -3
- package/.claude/agents/health/workers/bug-hunter.md +0 -1
- package/.claude/agents/health/workers/dead-code-hunter.md +167 -75
- package/.claude/agents/health/workers/dead-code-remover.md +217 -66
- package/.claude/agents/health/workers/dependency-auditor.md +83 -24
- package/.claude/agents/health/workers/dependency-updater.md +0 -1
- package/.claude/agents/health/workers/security-scanner.md +0 -1
- package/.claude/agents/infrastructure/workers/bullmq-worker-specialist.md +748 -0
- package/.claude/agents/infrastructure/workers/deployment-engineer.md +446 -0
- package/.claude/agents/infrastructure/workers/infrastructure-specialist.md +2 -2
- package/.claude/agents/infrastructure/workers/rag-specialist.md +799 -0
- package/.claude/agents/infrastructure/workers/server-hardening-specialist.md +1128 -0
- package/.claude/agents/integrations/workers/lms-integration-specialist.md +866 -0
- package/.claude/agents/meta/workers/meta-agent-v3.md +22 -0
- package/.claude/agents/testing/workers/integration-tester.md +1 -1
- package/.claude/agents/testing/workers/test-writer.md +16 -0
- package/.claude/commands/health-bugs.md +14 -281
- package/.claude/commands/health-cleanup.md +14 -281
- package/.claude/commands/health-deps.md +14 -281
- package/.claude/commands/health-metrics.md +51 -709
- package/.claude/commands/health-reuse.md +14 -311
- package/.claude/commands/health-security.md +14 -281
- package/.claude/commands/push.md +17 -3
- package/.claude/commands/speckit.implement.md +0 -11
- package/.claude/commands/supabase-performance-optimizer.md +73 -0
- package/.claude/commands/ultra-think.md +158 -0
- package/.claude/commands/worktree.md +150 -0
- package/.claude/scripts/gates/check-bundle-size.sh +0 -0
- package/.claude/scripts/gates/check-coverage.sh +0 -0
- package/.claude/scripts/gates/check-security.sh +0 -0
- package/.claude/scripts/release.sh +469 -94
- package/.claude/skills/algorithmic-art/LICENSE.txt +202 -0
- package/.claude/skills/algorithmic-art/SKILL.md +405 -0
- package/.claude/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/.claude/skills/algorithmic-art/templates/viewer.html +599 -0
- package/.claude/skills/artifacts-builder/LICENSE.txt +202 -0
- package/.claude/skills/artifacts-builder/SKILL.md +74 -0
- package/.claude/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/.claude/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/.claude/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/.claude/skills/bug-health-inline/SKILL.md +221 -0
- package/.claude/skills/bug-health-inline/references/worker-prompts.md +182 -0
- package/.claude/skills/canvas-design/LICENSE.txt +202 -0
- package/.claude/skills/canvas-design/SKILL.md +130 -0
- package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/.claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/.claude/skills/changelog-generator/SKILL.md +104 -0
- package/.claude/skills/cleanup-health-inline/SKILL.md +224 -0
- package/.claude/skills/code-reviewer/SKILL.md +209 -0
- package/.claude/skills/code-reviewer/references/code_review_checklist.md +103 -0
- package/.claude/skills/code-reviewer/references/coding_standards.md +103 -0
- package/.claude/skills/code-reviewer/references/common_antipatterns.md +103 -0
- package/.claude/skills/code-reviewer/scripts/code_quality_checker.py +114 -0
- package/.claude/skills/code-reviewer/scripts/pr_analyzer.py +114 -0
- package/.claude/skills/code-reviewer/scripts/review_report_generator.py +114 -0
- package/.claude/skills/content-research-writer/SKILL.md +538 -0
- package/.claude/skills/deps-health-inline/SKILL.md +227 -0
- package/.claude/skills/frontend-aesthetics/SKILL.md +51 -396
- package/.claude/skills/git-commit-helper/SKILL.md +203 -0
- package/.claude/skills/lead-research-assistant/SKILL.md +199 -0
- package/.claude/skills/reuse-health-inline/SKILL.md +248 -0
- package/.claude/skills/rollback-changes/SKILL.md +50 -524
- package/.claude/skills/run-quality-gate/SKILL.md +36 -346
- package/.claude/skills/security-health-inline/SKILL.md +224 -0
- package/.claude/skills/senior-architect/SKILL.md +209 -0
- package/.claude/skills/senior-architect/references/architecture_patterns.md +755 -0
- package/.claude/skills/senior-architect/references/system_design_workflows.md +749 -0
- package/.claude/skills/senior-architect/references/tech_decision_guide.md +612 -0
- package/.claude/skills/senior-architect/scripts/architecture_diagram_generator.py +114 -0
- package/.claude/skills/senior-architect/scripts/dependency_analyzer.py +114 -0
- package/.claude/skills/senior-architect/scripts/project_architect.py +114 -0
- package/.claude/skills/senior-devops/SKILL.md +209 -0
- package/.claude/skills/senior-devops/references/cicd_pipeline_guide.md +103 -0
- package/.claude/skills/senior-devops/references/deployment_strategies.md +103 -0
- package/.claude/skills/senior-devops/references/infrastructure_as_code.md +103 -0
- package/.claude/skills/senior-devops/scripts/deployment_manager.py +114 -0
- package/.claude/skills/senior-devops/scripts/pipeline_generator.py +114 -0
- package/.claude/skills/senior-devops/scripts/terraform_scaffolder.py +114 -0
- package/.claude/skills/senior-prompt-engineer/SKILL.md +226 -0
- package/.claude/skills/senior-prompt-engineer/references/agentic_system_design.md +80 -0
- package/.claude/skills/senior-prompt-engineer/references/llm_evaluation_frameworks.md +80 -0
- package/.claude/skills/senior-prompt-engineer/references/prompt_engineering_patterns.md +80 -0
- package/.claude/skills/senior-prompt-engineer/scripts/agent_orchestrator.py +100 -0
- package/.claude/skills/senior-prompt-engineer/scripts/prompt_optimizer.py +100 -0
- package/.claude/skills/senior-prompt-engineer/scripts/rag_evaluator.py +100 -0
- package/.claude/skills/setup-knip/SKILL.md +372 -0
- package/.claude/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/.claude/skills/systematic-debugging/SKILL.md +296 -0
- package/.claude/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/.claude/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/.claude/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/.claude/skills/systematic-debugging/find-polluter.sh +63 -0
- package/.claude/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/.claude/skills/systematic-debugging/test-academic.md +14 -0
- package/.claude/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/.claude/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/.claude/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/.claude/skills/theme-factory/LICENSE.txt +202 -0
- package/.claude/skills/theme-factory/SKILL.md +59 -0
- package/.claude/skills/theme-factory/theme-showcase.pdf +0 -0
- package/.claude/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/.claude/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/.claude/skills/theme-factory/themes/desert-rose.md +19 -0
- package/.claude/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/.claude/skills/theme-factory/themes/golden-hour.md +19 -0
- package/.claude/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/.claude/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/.claude/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/.claude/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/.claude/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/.claude/skills/ui-design-system/SKILL.md +32 -0
- package/.claude/skills/ui-design-system/scripts/design_token_generator.py +529 -0
- package/.claude/skills/ux-researcher-designer/SKILL.md +30 -0
- package/.claude/skills/ux-researcher-designer/scripts/persona_generator.py +508 -0
- package/.claude/skills/webapp-testing/LICENSE.txt +202 -0
- package/.claude/skills/webapp-testing/SKILL.md +96 -0
- package/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
- package/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
- package/.gitignore +4 -0
- package/README.md +492 -1093
- package/README.ru.md +719 -0
- package/docs/Agents Ecosystem/AGENT-ORCHESTRATION.md +2 -2
- package/docs/COMMANDS-GUIDE.md +0 -15
- package/docs/reports/skills/new-skills-analysis-2025-12.md +331 -0
- package/package.json +11 -3
- package/.claude/agents/health/orchestrators/bug-orchestrator.md +0 -1084
- package/.claude/agents/health/orchestrators/dead-code-orchestrator.md +0 -1064
- package/.claude/agents/health/orchestrators/dependency-orchestrator.md +0 -1064
- package/.claude/agents/health/orchestrators/reuse-orchestrator.md +0 -1112
- package/.claude/agents/health/orchestrators/security-orchestrator.md +0 -1064
- package/.claude/commands/worktree-cleanup.md +0 -382
- package/.claude/commands/worktree-create.md +0 -287
- package/.claude/commands/worktree-list.md +0 -239
- package/.claude/commands/worktree-remove.md +0 -339
- package/.claude/project-index.md +0 -75
- package/.claude/skills/load-project-context/SKILL.md +0 -89
- package/.claude/skills/resume-session/SKILL.md +0 -164
- package/.claude/skills/save-session-context/SKILL.md +0 -123
- package/.claude/templates/project-index.template.md +0 -67
- package/.claude/templates/session/context.template.md +0 -40
- package/.claude/templates/session/log.template.md +0 -72
- package/.github/BRANCH_PROTECTION.md +0 -137
- package/.github/workflows/build.yml +0 -70
- package/.github/workflows/deploy-staging.yml +0 -90
- package/.github/workflows/test.yml +0 -104
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Design Token Generator
|
|
4
|
+
Creates consistent design system tokens for colors, typography, spacing, and more
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
from typing import Dict, List, Tuple
|
|
9
|
+
import colorsys
|
|
10
|
+
|
|
11
|
+
class DesignTokenGenerator:
|
|
12
|
+
"""Generate comprehensive design system tokens"""
|
|
13
|
+
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.base_unit = 8 # 8pt grid system
|
|
16
|
+
self.type_scale_ratio = 1.25 # Major third
|
|
17
|
+
self.base_font_size = 16
|
|
18
|
+
|
|
19
|
+
def generate_complete_system(self, brand_color: str = "#0066CC",
|
|
20
|
+
style: str = "modern") -> Dict:
|
|
21
|
+
"""Generate complete design token system"""
|
|
22
|
+
|
|
23
|
+
tokens = {
|
|
24
|
+
'meta': {
|
|
25
|
+
'version': '1.0.0',
|
|
26
|
+
'style': style,
|
|
27
|
+
'generated': 'auto-generated'
|
|
28
|
+
},
|
|
29
|
+
'colors': self.generate_color_palette(brand_color),
|
|
30
|
+
'typography': self.generate_typography_system(style),
|
|
31
|
+
'spacing': self.generate_spacing_system(),
|
|
32
|
+
'sizing': self.generate_sizing_tokens(),
|
|
33
|
+
'borders': self.generate_border_tokens(style),
|
|
34
|
+
'shadows': self.generate_shadow_tokens(style),
|
|
35
|
+
'animation': self.generate_animation_tokens(),
|
|
36
|
+
'breakpoints': self.generate_breakpoints(),
|
|
37
|
+
'z-index': self.generate_z_index_scale()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return tokens
|
|
41
|
+
|
|
42
|
+
def generate_color_palette(self, brand_color: str) -> Dict:
|
|
43
|
+
"""Generate comprehensive color palette from brand color"""
|
|
44
|
+
|
|
45
|
+
# Convert hex to RGB
|
|
46
|
+
brand_rgb = self._hex_to_rgb(brand_color)
|
|
47
|
+
brand_hsv = colorsys.rgb_to_hsv(*[c/255 for c in brand_rgb])
|
|
48
|
+
|
|
49
|
+
palette = {
|
|
50
|
+
'primary': self._generate_color_scale(brand_color, 'primary'),
|
|
51
|
+
'secondary': self._generate_color_scale(
|
|
52
|
+
self._adjust_hue(brand_color, 180), 'secondary'
|
|
53
|
+
),
|
|
54
|
+
'neutral': self._generate_neutral_scale(),
|
|
55
|
+
'semantic': {
|
|
56
|
+
'success': {
|
|
57
|
+
'base': '#10B981',
|
|
58
|
+
'light': '#34D399',
|
|
59
|
+
'dark': '#059669',
|
|
60
|
+
'contrast': '#FFFFFF'
|
|
61
|
+
},
|
|
62
|
+
'warning': {
|
|
63
|
+
'base': '#F59E0B',
|
|
64
|
+
'light': '#FBB
|
|
65
|
+
|
|
66
|
+
D24',
|
|
67
|
+
'dark': '#D97706',
|
|
68
|
+
'contrast': '#FFFFFF'
|
|
69
|
+
},
|
|
70
|
+
'error': {
|
|
71
|
+
'base': '#EF4444',
|
|
72
|
+
'light': '#F87171',
|
|
73
|
+
'dark': '#DC2626',
|
|
74
|
+
'contrast': '#FFFFFF'
|
|
75
|
+
},
|
|
76
|
+
'info': {
|
|
77
|
+
'base': '#3B82F6',
|
|
78
|
+
'light': '#60A5FA',
|
|
79
|
+
'dark': '#2563EB',
|
|
80
|
+
'contrast': '#FFFFFF'
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
'surface': {
|
|
84
|
+
'background': '#FFFFFF',
|
|
85
|
+
'foreground': '#111827',
|
|
86
|
+
'card': '#FFFFFF',
|
|
87
|
+
'overlay': 'rgba(0, 0, 0, 0.5)',
|
|
88
|
+
'divider': '#E5E7EB'
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return palette
|
|
93
|
+
|
|
94
|
+
def _generate_color_scale(self, base_color: str, name: str) -> Dict:
|
|
95
|
+
"""Generate color scale from base color"""
|
|
96
|
+
|
|
97
|
+
scale = {}
|
|
98
|
+
rgb = self._hex_to_rgb(base_color)
|
|
99
|
+
h, s, v = colorsys.rgb_to_hsv(*[c/255 for c in rgb])
|
|
100
|
+
|
|
101
|
+
# Generate scale from 50 to 900
|
|
102
|
+
steps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900]
|
|
103
|
+
|
|
104
|
+
for step in steps:
|
|
105
|
+
# Adjust lightness based on step
|
|
106
|
+
factor = (1000 - step) / 1000
|
|
107
|
+
new_v = 0.95 if step < 500 else v * (1 - (step - 500) / 500)
|
|
108
|
+
new_s = s * (0.3 + 0.7 * (step / 900))
|
|
109
|
+
|
|
110
|
+
new_rgb = colorsys.hsv_to_rgb(h, new_s, new_v)
|
|
111
|
+
scale[str(step)] = self._rgb_to_hex([int(c * 255) for c in new_rgb])
|
|
112
|
+
|
|
113
|
+
scale['DEFAULT'] = base_color
|
|
114
|
+
return scale
|
|
115
|
+
|
|
116
|
+
def _generate_neutral_scale(self) -> Dict:
|
|
117
|
+
"""Generate neutral color scale"""
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
'50': '#F9FAFB',
|
|
121
|
+
'100': '#F3F4F6',
|
|
122
|
+
'200': '#E5E7EB',
|
|
123
|
+
'300': '#D1D5DB',
|
|
124
|
+
'400': '#9CA3AF',
|
|
125
|
+
'500': '#6B7280',
|
|
126
|
+
'600': '#4B5563',
|
|
127
|
+
'700': '#374151',
|
|
128
|
+
'800': '#1F2937',
|
|
129
|
+
'900': '#111827',
|
|
130
|
+
'DEFAULT': '#6B7280'
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
def generate_typography_system(self, style: str) -> Dict:
|
|
134
|
+
"""Generate typography system"""
|
|
135
|
+
|
|
136
|
+
# Font families based on style
|
|
137
|
+
font_families = {
|
|
138
|
+
'modern': {
|
|
139
|
+
'sans': 'Inter, system-ui, -apple-system, sans-serif',
|
|
140
|
+
'serif': 'Merriweather, Georgia, serif',
|
|
141
|
+
'mono': 'Fira Code, Monaco, monospace'
|
|
142
|
+
},
|
|
143
|
+
'classic': {
|
|
144
|
+
'sans': 'Helvetica, Arial, sans-serif',
|
|
145
|
+
'serif': 'Times New Roman, Times, serif',
|
|
146
|
+
'mono': 'Courier New, monospace'
|
|
147
|
+
},
|
|
148
|
+
'playful': {
|
|
149
|
+
'sans': 'Poppins, Roboto, sans-serif',
|
|
150
|
+
'serif': 'Playfair Display, Georgia, serif',
|
|
151
|
+
'mono': 'Source Code Pro, monospace'
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
typography = {
|
|
156
|
+
'fontFamily': font_families.get(style, font_families['modern']),
|
|
157
|
+
'fontSize': self._generate_type_scale(),
|
|
158
|
+
'fontWeight': {
|
|
159
|
+
'thin': 100,
|
|
160
|
+
'light': 300,
|
|
161
|
+
'normal': 400,
|
|
162
|
+
'medium': 500,
|
|
163
|
+
'semibold': 600,
|
|
164
|
+
'bold': 700,
|
|
165
|
+
'extrabold': 800,
|
|
166
|
+
'black': 900
|
|
167
|
+
},
|
|
168
|
+
'lineHeight': {
|
|
169
|
+
'none': 1,
|
|
170
|
+
'tight': 1.25,
|
|
171
|
+
'snug': 1.375,
|
|
172
|
+
'normal': 1.5,
|
|
173
|
+
'relaxed': 1.625,
|
|
174
|
+
'loose': 2
|
|
175
|
+
},
|
|
176
|
+
'letterSpacing': {
|
|
177
|
+
'tighter': '-0.05em',
|
|
178
|
+
'tight': '-0.025em',
|
|
179
|
+
'normal': '0',
|
|
180
|
+
'wide': '0.025em',
|
|
181
|
+
'wider': '0.05em',
|
|
182
|
+
'widest': '0.1em'
|
|
183
|
+
},
|
|
184
|
+
'textStyles': self._generate_text_styles()
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return typography
|
|
188
|
+
|
|
189
|
+
def _generate_type_scale(self) -> Dict:
|
|
190
|
+
"""Generate modular type scale"""
|
|
191
|
+
|
|
192
|
+
scale = {}
|
|
193
|
+
sizes = ['xs', 'sm', 'base', 'lg', 'xl', '2xl', '3xl', '4xl', '5xl']
|
|
194
|
+
|
|
195
|
+
for i, size in enumerate(sizes):
|
|
196
|
+
if size == 'base':
|
|
197
|
+
scale[size] = f'{self.base_font_size}px'
|
|
198
|
+
elif i < sizes.index('base'):
|
|
199
|
+
factor = self.type_scale_ratio ** (sizes.index('base') - i)
|
|
200
|
+
scale[size] = f'{round(self.base_font_size / factor)}px'
|
|
201
|
+
else:
|
|
202
|
+
factor = self.type_scale_ratio ** (i - sizes.index('base'))
|
|
203
|
+
scale[size] = f'{round(self.base_font_size * factor)}px'
|
|
204
|
+
|
|
205
|
+
return scale
|
|
206
|
+
|
|
207
|
+
def _generate_text_styles(self) -> Dict:
|
|
208
|
+
"""Generate pre-composed text styles"""
|
|
209
|
+
|
|
210
|
+
return {
|
|
211
|
+
'h1': {
|
|
212
|
+
'fontSize': '48px',
|
|
213
|
+
'fontWeight': 700,
|
|
214
|
+
'lineHeight': 1.2,
|
|
215
|
+
'letterSpacing': '-0.02em'
|
|
216
|
+
},
|
|
217
|
+
'h2': {
|
|
218
|
+
'fontSize': '36px',
|
|
219
|
+
'fontWeight': 700,
|
|
220
|
+
'lineHeight': 1.3,
|
|
221
|
+
'letterSpacing': '-0.01em'
|
|
222
|
+
},
|
|
223
|
+
'h3': {
|
|
224
|
+
'fontSize': '28px',
|
|
225
|
+
'fontWeight': 600,
|
|
226
|
+
'lineHeight': 1.4,
|
|
227
|
+
'letterSpacing': '0'
|
|
228
|
+
},
|
|
229
|
+
'h4': {
|
|
230
|
+
'fontSize': '24px',
|
|
231
|
+
'fontWeight': 600,
|
|
232
|
+
'lineHeight': 1.4,
|
|
233
|
+
'letterSpacing': '0'
|
|
234
|
+
},
|
|
235
|
+
'h5': {
|
|
236
|
+
'fontSize': '20px',
|
|
237
|
+
'fontWeight': 600,
|
|
238
|
+
'lineHeight': 1.5,
|
|
239
|
+
'letterSpacing': '0'
|
|
240
|
+
},
|
|
241
|
+
'h6': {
|
|
242
|
+
'fontSize': '16px',
|
|
243
|
+
'fontWeight': 600,
|
|
244
|
+
'lineHeight': 1.5,
|
|
245
|
+
'letterSpacing': '0.01em'
|
|
246
|
+
},
|
|
247
|
+
'body': {
|
|
248
|
+
'fontSize': '16px',
|
|
249
|
+
'fontWeight': 400,
|
|
250
|
+
'lineHeight': 1.5,
|
|
251
|
+
'letterSpacing': '0'
|
|
252
|
+
},
|
|
253
|
+
'small': {
|
|
254
|
+
'fontSize': '14px',
|
|
255
|
+
'fontWeight': 400,
|
|
256
|
+
'lineHeight': 1.5,
|
|
257
|
+
'letterSpacing': '0'
|
|
258
|
+
},
|
|
259
|
+
'caption': {
|
|
260
|
+
'fontSize': '12px',
|
|
261
|
+
'fontWeight': 400,
|
|
262
|
+
'lineHeight': 1.5,
|
|
263
|
+
'letterSpacing': '0.01em'
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
def generate_spacing_system(self) -> Dict:
|
|
268
|
+
"""Generate spacing system based on 8pt grid"""
|
|
269
|
+
|
|
270
|
+
spacing = {}
|
|
271
|
+
multipliers = [0, 0.5, 1, 1.5, 2, 2.5, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 20, 24, 32, 40, 48, 56, 64]
|
|
272
|
+
|
|
273
|
+
for i, mult in enumerate(multipliers):
|
|
274
|
+
spacing[str(i)] = f'{int(self.base_unit * mult)}px'
|
|
275
|
+
|
|
276
|
+
# Add semantic spacing
|
|
277
|
+
spacing.update({
|
|
278
|
+
'xs': spacing['1'], # 4px
|
|
279
|
+
'sm': spacing['2'], # 8px
|
|
280
|
+
'md': spacing['4'], # 16px
|
|
281
|
+
'lg': spacing['6'], # 24px
|
|
282
|
+
'xl': spacing['8'], # 32px
|
|
283
|
+
'2xl': spacing['12'], # 48px
|
|
284
|
+
'3xl': spacing['16'] # 64px
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
return spacing
|
|
288
|
+
|
|
289
|
+
def generate_sizing_tokens(self) -> Dict:
|
|
290
|
+
"""Generate sizing tokens for components"""
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
'container': {
|
|
294
|
+
'sm': '640px',
|
|
295
|
+
'md': '768px',
|
|
296
|
+
'lg': '1024px',
|
|
297
|
+
'xl': '1280px',
|
|
298
|
+
'2xl': '1536px'
|
|
299
|
+
},
|
|
300
|
+
'components': {
|
|
301
|
+
'button': {
|
|
302
|
+
'sm': {'height': '32px', 'paddingX': '12px'},
|
|
303
|
+
'md': {'height': '40px', 'paddingX': '16px'},
|
|
304
|
+
'lg': {'height': '48px', 'paddingX': '20px'}
|
|
305
|
+
},
|
|
306
|
+
'input': {
|
|
307
|
+
'sm': {'height': '32px', 'paddingX': '12px'},
|
|
308
|
+
'md': {'height': '40px', 'paddingX': '16px'},
|
|
309
|
+
'lg': {'height': '48px', 'paddingX': '20px'}
|
|
310
|
+
},
|
|
311
|
+
'icon': {
|
|
312
|
+
'sm': '16px',
|
|
313
|
+
'md': '20px',
|
|
314
|
+
'lg': '24px',
|
|
315
|
+
'xl': '32px'
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
def generate_border_tokens(self, style: str) -> Dict:
|
|
321
|
+
"""Generate border tokens"""
|
|
322
|
+
|
|
323
|
+
radius_values = {
|
|
324
|
+
'modern': {
|
|
325
|
+
'none': '0',
|
|
326
|
+
'sm': '4px',
|
|
327
|
+
'DEFAULT': '8px',
|
|
328
|
+
'md': '12px',
|
|
329
|
+
'lg': '16px',
|
|
330
|
+
'xl': '24px',
|
|
331
|
+
'full': '9999px'
|
|
332
|
+
},
|
|
333
|
+
'classic': {
|
|
334
|
+
'none': '0',
|
|
335
|
+
'sm': '2px',
|
|
336
|
+
'DEFAULT': '4px',
|
|
337
|
+
'md': '6px',
|
|
338
|
+
'lg': '8px',
|
|
339
|
+
'xl': '12px',
|
|
340
|
+
'full': '9999px'
|
|
341
|
+
},
|
|
342
|
+
'playful': {
|
|
343
|
+
'none': '0',
|
|
344
|
+
'sm': '8px',
|
|
345
|
+
'DEFAULT': '16px',
|
|
346
|
+
'md': '20px',
|
|
347
|
+
'lg': '24px',
|
|
348
|
+
'xl': '32px',
|
|
349
|
+
'full': '9999px'
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return {
|
|
354
|
+
'radius': radius_values.get(style, radius_values['modern']),
|
|
355
|
+
'width': {
|
|
356
|
+
'none': '0',
|
|
357
|
+
'thin': '1px',
|
|
358
|
+
'DEFAULT': '1px',
|
|
359
|
+
'medium': '2px',
|
|
360
|
+
'thick': '4px'
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
def generate_shadow_tokens(self, style: str) -> Dict:
|
|
365
|
+
"""Generate shadow tokens"""
|
|
366
|
+
|
|
367
|
+
shadow_styles = {
|
|
368
|
+
'modern': {
|
|
369
|
+
'none': 'none',
|
|
370
|
+
'sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
|
|
371
|
+
'DEFAULT': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
|
|
372
|
+
'md': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
|
|
373
|
+
'lg': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
|
|
374
|
+
'xl': '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
|
|
375
|
+
'2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
|
|
376
|
+
'inner': 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)'
|
|
377
|
+
},
|
|
378
|
+
'classic': {
|
|
379
|
+
'none': 'none',
|
|
380
|
+
'sm': '0 1px 2px rgba(0, 0, 0, 0.1)',
|
|
381
|
+
'DEFAULT': '0 2px 4px rgba(0, 0, 0, 0.1)',
|
|
382
|
+
'md': '0 4px 8px rgba(0, 0, 0, 0.1)',
|
|
383
|
+
'lg': '0 8px 16px rgba(0, 0, 0, 0.1)',
|
|
384
|
+
'xl': '0 16px 32px rgba(0, 0, 0, 0.1)'
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return shadow_styles.get(style, shadow_styles['modern'])
|
|
389
|
+
|
|
390
|
+
def generate_animation_tokens(self) -> Dict:
|
|
391
|
+
"""Generate animation tokens"""
|
|
392
|
+
|
|
393
|
+
return {
|
|
394
|
+
'duration': {
|
|
395
|
+
'instant': '0ms',
|
|
396
|
+
'fast': '150ms',
|
|
397
|
+
'DEFAULT': '250ms',
|
|
398
|
+
'slow': '350ms',
|
|
399
|
+
'slower': '500ms'
|
|
400
|
+
},
|
|
401
|
+
'easing': {
|
|
402
|
+
'linear': 'linear',
|
|
403
|
+
'ease': 'ease',
|
|
404
|
+
'easeIn': 'ease-in',
|
|
405
|
+
'easeOut': 'ease-out',
|
|
406
|
+
'easeInOut': 'ease-in-out',
|
|
407
|
+
'spring': 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'
|
|
408
|
+
},
|
|
409
|
+
'keyframes': {
|
|
410
|
+
'fadeIn': {
|
|
411
|
+
'from': {'opacity': 0},
|
|
412
|
+
'to': {'opacity': 1}
|
|
413
|
+
},
|
|
414
|
+
'slideUp': {
|
|
415
|
+
'from': {'transform': 'translateY(10px)', 'opacity': 0},
|
|
416
|
+
'to': {'transform': 'translateY(0)', 'opacity': 1}
|
|
417
|
+
},
|
|
418
|
+
'scale': {
|
|
419
|
+
'from': {'transform': 'scale(0.95)'},
|
|
420
|
+
'to': {'transform': 'scale(1)'}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
def generate_breakpoints(self) -> Dict:
|
|
426
|
+
"""Generate responsive breakpoints"""
|
|
427
|
+
|
|
428
|
+
return {
|
|
429
|
+
'xs': '480px',
|
|
430
|
+
'sm': '640px',
|
|
431
|
+
'md': '768px',
|
|
432
|
+
'lg': '1024px',
|
|
433
|
+
'xl': '1280px',
|
|
434
|
+
'2xl': '1536px'
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
def generate_z_index_scale(self) -> Dict:
|
|
438
|
+
"""Generate z-index scale"""
|
|
439
|
+
|
|
440
|
+
return {
|
|
441
|
+
'hide': -1,
|
|
442
|
+
'base': 0,
|
|
443
|
+
'dropdown': 1000,
|
|
444
|
+
'sticky': 1020,
|
|
445
|
+
'overlay': 1030,
|
|
446
|
+
'modal': 1040,
|
|
447
|
+
'popover': 1050,
|
|
448
|
+
'tooltip': 1060,
|
|
449
|
+
'notification': 1070
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
def export_tokens(self, tokens: Dict, format: str = 'json') -> str:
|
|
453
|
+
"""Export tokens in various formats"""
|
|
454
|
+
|
|
455
|
+
if format == 'json':
|
|
456
|
+
return json.dumps(tokens, indent=2)
|
|
457
|
+
elif format == 'css':
|
|
458
|
+
return self._export_as_css(tokens)
|
|
459
|
+
elif format == 'scss':
|
|
460
|
+
return self._export_as_scss(tokens)
|
|
461
|
+
else:
|
|
462
|
+
return json.dumps(tokens, indent=2)
|
|
463
|
+
|
|
464
|
+
def _export_as_css(self, tokens: Dict) -> str:
|
|
465
|
+
"""Export as CSS variables"""
|
|
466
|
+
|
|
467
|
+
css = [':root {']
|
|
468
|
+
|
|
469
|
+
def flatten_dict(obj, prefix=''):
|
|
470
|
+
for key, value in obj.items():
|
|
471
|
+
if isinstance(value, dict):
|
|
472
|
+
flatten_dict(value, f'{prefix}-{key}' if prefix else key)
|
|
473
|
+
else:
|
|
474
|
+
css.append(f' --{prefix}-{key}: {value};')
|
|
475
|
+
|
|
476
|
+
flatten_dict(tokens)
|
|
477
|
+
css.append('}')
|
|
478
|
+
|
|
479
|
+
return '\n'.join(css)
|
|
480
|
+
|
|
481
|
+
def _hex_to_rgb(self, hex_color: str) -> Tuple[int, int, int]:
|
|
482
|
+
"""Convert hex to RGB"""
|
|
483
|
+
hex_color = hex_color.lstrip('#')
|
|
484
|
+
return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
|
|
485
|
+
|
|
486
|
+
def _rgb_to_hex(self, rgb: List[int]) -> str:
|
|
487
|
+
"""Convert RGB to hex"""
|
|
488
|
+
return '#{:02x}{:02x}{:02x}'.format(*rgb)
|
|
489
|
+
|
|
490
|
+
def _adjust_hue(self, hex_color: str, degrees: int) -> str:
|
|
491
|
+
"""Adjust hue of color"""
|
|
492
|
+
rgb = self._hex_to_rgb(hex_color)
|
|
493
|
+
h, s, v = colorsys.rgb_to_hsv(*[c/255 for c in rgb])
|
|
494
|
+
h = (h + degrees/360) % 1
|
|
495
|
+
new_rgb = colorsys.hsv_to_rgb(h, s, v)
|
|
496
|
+
return self._rgb_to_hex([int(c * 255) for c in new_rgb])
|
|
497
|
+
|
|
498
|
+
def main():
|
|
499
|
+
import sys
|
|
500
|
+
|
|
501
|
+
generator = DesignTokenGenerator()
|
|
502
|
+
|
|
503
|
+
# Get parameters
|
|
504
|
+
brand_color = sys.argv[1] if len(sys.argv) > 1 else "#0066CC"
|
|
505
|
+
style = sys.argv[2] if len(sys.argv) > 2 else "modern"
|
|
506
|
+
output_format = sys.argv[3] if len(sys.argv) > 3 else "json"
|
|
507
|
+
|
|
508
|
+
# Generate tokens
|
|
509
|
+
tokens = generator.generate_complete_system(brand_color, style)
|
|
510
|
+
|
|
511
|
+
# Output
|
|
512
|
+
if output_format == 'summary':
|
|
513
|
+
print("=" * 60)
|
|
514
|
+
print("DESIGN SYSTEM TOKENS")
|
|
515
|
+
print("=" * 60)
|
|
516
|
+
print(f"\nšØ Style: {style}")
|
|
517
|
+
print(f"šØ Brand Color: {brand_color}")
|
|
518
|
+
print("\nš Generated Tokens:")
|
|
519
|
+
print(f" ⢠Colors: {len(tokens['colors'])} palettes")
|
|
520
|
+
print(f" ⢠Typography: {len(tokens['typography'])} categories")
|
|
521
|
+
print(f" ⢠Spacing: {len(tokens['spacing'])} values")
|
|
522
|
+
print(f" ⢠Shadows: {len(tokens['shadows'])} styles")
|
|
523
|
+
print(f" ⢠Breakpoints: {len(tokens['breakpoints'])} sizes")
|
|
524
|
+
print("\nš¾ Export formats available: json, css, scss")
|
|
525
|
+
else:
|
|
526
|
+
print(generator.export_tokens(tokens, output_format))
|
|
527
|
+
|
|
528
|
+
if __name__ == "__main__":
|
|
529
|
+
main()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ux-researcher-designer
|
|
3
|
+
description: UX research and design toolkit for Senior UX Designer/Researcher including data-driven persona generation, journey mapping, usability testing frameworks, and research synthesis. Use for user research, persona creation, journey mapping, and design validation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UX Researcher & Designer
|
|
7
|
+
|
|
8
|
+
Comprehensive toolkit for user-centered research and experience design.
|
|
9
|
+
|
|
10
|
+
## Core Capabilities
|
|
11
|
+
- Data-driven persona generation
|
|
12
|
+
- Customer journey mapping
|
|
13
|
+
- Usability testing frameworks
|
|
14
|
+
- Research synthesis and insights
|
|
15
|
+
- Design validation methods
|
|
16
|
+
|
|
17
|
+
## Key Scripts
|
|
18
|
+
|
|
19
|
+
### persona_generator.py
|
|
20
|
+
Creates research-backed personas from user data and interviews.
|
|
21
|
+
|
|
22
|
+
**Usage**: `python scripts/persona_generator.py [json]`
|
|
23
|
+
|
|
24
|
+
**Features**:
|
|
25
|
+
- Analyzes user behavior patterns
|
|
26
|
+
- Identifies persona archetypes
|
|
27
|
+
- Extracts psychographics
|
|
28
|
+
- Generates scenarios
|
|
29
|
+
- Provides design implications
|
|
30
|
+
- Confidence scoring based on sample size
|