stella-coder 3.9.2 → 5.0.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/.mcp.json +11 -0
- package/.opencode/skills/banner-design/SKILL.md +196 -0
- package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/.opencode/skills/brand/SKILL.md +97 -0
- package/.opencode/skills/brand/references/approval-checklist.md +169 -0
- package/.opencode/skills/brand/references/asset-organization.md +157 -0
- package/.opencode/skills/brand/references/brand-guideline-template.md +140 -0
- package/.opencode/skills/brand/references/color-palette-management.md +186 -0
- package/.opencode/skills/brand/references/consistency-checklist.md +94 -0
- package/.opencode/skills/brand/references/logo-usage-rules.md +185 -0
- package/.opencode/skills/brand/references/messaging-framework.md +85 -0
- package/.opencode/skills/brand/references/typography-specifications.md +214 -0
- package/.opencode/skills/brand/references/update.md +118 -0
- package/.opencode/skills/brand/references/visual-identity.md +96 -0
- package/.opencode/skills/brand/references/voice-framework.md +88 -0
- package/.opencode/skills/brand/scripts/extract-colors.cjs +341 -0
- package/.opencode/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +248 -0
- package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +52 -0
- package/.opencode/skills/brand/scripts/validate-asset.cjs +387 -0
- package/.opencode/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/.opencode/skills/design/SKILL.md +313 -0
- package/.opencode/skills/design/data/cip/deliverables.csv +51 -0
- package/.opencode/skills/design/data/cip/industries.csv +21 -0
- package/.opencode/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/.opencode/skills/design/data/cip/styles.csv +21 -0
- package/.opencode/skills/design/data/icon/styles.csv +16 -0
- package/.opencode/skills/design/data/logo/colors.csv +56 -0
- package/.opencode/skills/design/data/logo/industries.csv +56 -0
- package/.opencode/skills/design/data/logo/styles.csv +56 -0
- package/.opencode/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/.opencode/skills/design/references/cip-deliverable-guide.md +95 -0
- package/.opencode/skills/design/references/cip-design.md +121 -0
- package/.opencode/skills/design/references/cip-prompt-engineering.md +84 -0
- package/.opencode/skills/design/references/cip-style-guide.md +68 -0
- package/.opencode/skills/design/references/design-routing.md +207 -0
- package/.opencode/skills/design/references/icon-design.md +122 -0
- package/.opencode/skills/design/references/logo-color-psychology.md +101 -0
- package/.opencode/skills/design/references/logo-design.md +92 -0
- package/.opencode/skills/design/references/logo-prompt-engineering.md +158 -0
- package/.opencode/skills/design/references/logo-style-guide.md +109 -0
- package/.opencode/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/.opencode/skills/design/references/slides-create.md +4 -0
- package/.opencode/skills/design/references/slides-html-template.md +295 -0
- package/.opencode/skills/design/references/slides-layout-patterns.md +137 -0
- package/.opencode/skills/design/references/slides-strategies.md +94 -0
- package/.opencode/skills/design/references/slides.md +42 -0
- package/.opencode/skills/design/references/social-photos-design.md +329 -0
- package/.opencode/skills/design/scripts/cip/core.py +215 -0
- package/.opencode/skills/design/scripts/cip/generate.py +484 -0
- package/.opencode/skills/design/scripts/cip/render-html.py +424 -0
- package/.opencode/skills/design/scripts/cip/search.py +127 -0
- package/.opencode/skills/design/scripts/icon/generate.py +487 -0
- package/.opencode/skills/design/scripts/logo/core.py +175 -0
- package/.opencode/skills/design/scripts/logo/generate.py +362 -0
- package/.opencode/skills/design/scripts/logo/search.py +114 -0
- package/.opencode/skills/design-system/SKILL.md +244 -0
- package/.opencode/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/.opencode/skills/design-system/data/slide-charts.csv +26 -0
- package/.opencode/skills/design-system/data/slide-color-logic.csv +14 -0
- package/.opencode/skills/design-system/data/slide-copy.csv +26 -0
- package/.opencode/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/.opencode/skills/design-system/data/slide-layouts.csv +26 -0
- package/.opencode/skills/design-system/data/slide-strategies.csv +16 -0
- package/.opencode/skills/design-system/data/slide-typography.csv +15 -0
- package/.opencode/skills/design-system/references/component-specs.md +236 -0
- package/.opencode/skills/design-system/references/component-tokens.md +214 -0
- package/.opencode/skills/design-system/references/primitive-tokens.md +203 -0
- package/.opencode/skills/design-system/references/semantic-tokens.md +215 -0
- package/.opencode/skills/design-system/references/states-and-variants.md +241 -0
- package/.opencode/skills/design-system/references/tailwind-integration.md +251 -0
- package/.opencode/skills/design-system/references/token-architecture.md +224 -0
- package/.opencode/skills/design-system/scripts/embed-tokens.cjs +99 -0
- package/.opencode/skills/design-system/scripts/fetch-background.py +317 -0
- package/.opencode/skills/design-system/scripts/generate-slide.py +770 -0
- package/.opencode/skills/design-system/scripts/generate-tokens.cjs +205 -0
- package/.opencode/skills/design-system/scripts/html-token-validator.py +327 -0
- package/.opencode/skills/design-system/scripts/search-slides.py +218 -0
- package/.opencode/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/.opencode/skills/design-system/scripts/slide_search_core.py +453 -0
- package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +48 -0
- package/.opencode/skills/design-system/scripts/validate-tokens.cjs +246 -0
- package/.opencode/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/.opencode/skills/slides/SKILL.md +40 -0
- package/.opencode/skills/slides/references/copywriting-formulas.md +84 -0
- package/.opencode/skills/slides/references/create.md +4 -0
- package/.opencode/skills/slides/references/html-template.md +295 -0
- package/.opencode/skills/slides/references/layout-patterns.md +137 -0
- package/.opencode/skills/slides/references/slide-strategies.md +94 -0
- package/.opencode/skills/ui-styling/LICENSE.txt +202 -0
- package/.opencode/skills/ui-styling/SKILL.md +324 -0
- package/.opencode/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/.opencode/skills/ui-styling/references/shadcn-components.md +424 -0
- package/.opencode/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/.opencode/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/.opencode/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/.opencode/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/.opencode/skills/ui-styling/scripts/requirements.txt +17 -0
- package/.opencode/skills/ui-styling/scripts/shadcn_add.py +308 -0
- package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
- package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +394 -0
- package/.opencode/skills/ui-ux-pro-max/SKILL.md +396 -0
- package/.opencode/skills/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/.opencode/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.opencode/skills/ui-ux-pro-max/data/colors.csv +193 -0
- package/.opencode/skills/ui-ux-pro-max/data/design.csv +1776 -0
- package/.opencode/skills/ui-ux-pro-max/data/draft.csv +1779 -0
- package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/.opencode/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/.opencode/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/.opencode/skills/ui-ux-pro-max/data/motion.csv +17 -0
- package/.opencode/skills/ui-ux-pro-max/data/products.csv +193 -0
- package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +71 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +60 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +60 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
- package/.opencode/skills/ui-ux-pro-max/data/styles.csv +85 -0
- package/.opencode/skills/ui-ux-pro-max/data/typography.csv +75 -0
- package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/core.py +274 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +1329 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/search.py +127 -0
- package/README.md +25 -30
- package/STELLA.md +1 -1
- package/dist/antimalware/database.mjs +871 -0
- package/dist/antimalware/index.mjs +8 -0
- package/dist/antimalware/scanner.mjs +591 -0
- package/dist/antimalware/ui.mjs +570 -0
- package/dist/banner.mjs +46 -0
- package/dist/index.mjs +3073 -0
- package/dist/markdown.mjs +100 -0
- package/dist/sea-config.json +4 -0
- package/dist/security.mjs +237 -0
- package/dist/theme.mjs +89 -0
- package/dist/tools.mjs +3145 -0
- package/install-stella.bat +44 -0
- package/package.json +5 -4
- package/stella-cli/coding-brain.mjs +753 -0
- package/stella-cli/index.mjs +931 -15
- package/stella-cli/mcp.mjs +296 -0
- package/stella-cli/presentations.mjs +1106 -0
- package/stella-cli/subagents.mjs +142 -0
- package/stella-cli/telegram-bot.mjs +824 -0
- package/stella-cli/tg-bg.bat +13 -0
- package/stella-cli/tg-server.bat +15 -0
- package/stella-cli/tg-server.mjs +116 -0
- package/stella-cli/theme.mjs +6 -4
- package/create_cats_pptx.py +0 -121
- package/hello.py +0 -2
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Validate token usage in codebase
|
|
4
|
+
* Finds hardcoded values that should use design tokens
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* node validate-tokens.cjs --dir src/
|
|
8
|
+
* node validate-tokens.cjs --dir src/ --fix
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Parse command line arguments
|
|
16
|
+
*/
|
|
17
|
+
function parseArgs() {
|
|
18
|
+
const args = process.argv.slice(2);
|
|
19
|
+
const options = {
|
|
20
|
+
dir: null,
|
|
21
|
+
fix: false,
|
|
22
|
+
ignore: ['node_modules', '.git', 'dist', 'build', '.next']
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
for (let i = 0; i < args.length; i++) {
|
|
26
|
+
if (args[i] === '--dir' || args[i] === '-d') {
|
|
27
|
+
options.dir = args[++i];
|
|
28
|
+
} else if (args[i] === '--fix') {
|
|
29
|
+
options.fix = true;
|
|
30
|
+
} else if (args[i] === '--ignore' || args[i] === '-i') {
|
|
31
|
+
options.ignore.push(args[++i]);
|
|
32
|
+
} else if (args[i] === '--help' || args[i] === '-h') {
|
|
33
|
+
console.log(`
|
|
34
|
+
Usage: node validate-tokens.cjs [options]
|
|
35
|
+
|
|
36
|
+
Options:
|
|
37
|
+
-d, --dir <path> Directory to scan (required)
|
|
38
|
+
--fix Show suggested fixes (no auto-fix)
|
|
39
|
+
-i, --ignore <dir> Additional directories to ignore
|
|
40
|
+
-h, --help Show this help
|
|
41
|
+
|
|
42
|
+
Checks for:
|
|
43
|
+
- Hardcoded hex colors (#RGB, #RRGGBB)
|
|
44
|
+
- Hardcoded pixel values (except 0, 1px)
|
|
45
|
+
- Hardcoded rem values in CSS
|
|
46
|
+
`);
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return options;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Patterns to detect hardcoded values
|
|
56
|
+
*/
|
|
57
|
+
const patterns = {
|
|
58
|
+
hexColor: {
|
|
59
|
+
regex: /#([0-9A-Fa-f]{3}){1,2}\b/g,
|
|
60
|
+
message: 'Hardcoded hex color',
|
|
61
|
+
suggestion: 'Use var(--color-*) token'
|
|
62
|
+
},
|
|
63
|
+
rgbColor: {
|
|
64
|
+
regex: /rgb\s*\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*\)/gi,
|
|
65
|
+
message: 'Hardcoded RGB color',
|
|
66
|
+
suggestion: 'Use var(--color-*) token'
|
|
67
|
+
},
|
|
68
|
+
pixelValue: {
|
|
69
|
+
regex: /:\s*(\d{2,})px/g, // 2+ digit px values
|
|
70
|
+
message: 'Hardcoded pixel value',
|
|
71
|
+
suggestion: 'Use var(--space-*) or var(--radius-*) token'
|
|
72
|
+
},
|
|
73
|
+
remValue: {
|
|
74
|
+
regex: /:\s*\d+\.?\d*rem(?![^{]*\$value)/g, // rem not in token definition
|
|
75
|
+
message: 'Hardcoded rem value',
|
|
76
|
+
suggestion: 'Use var(--space-*) or var(--font-size-*) token'
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* File extensions to scan
|
|
82
|
+
*/
|
|
83
|
+
const extensions = ['.css', '.scss', '.tsx', '.jsx', '.ts', '.js', '.vue', '.svelte'];
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Files/patterns to skip
|
|
87
|
+
*/
|
|
88
|
+
const skipPatterns = [
|
|
89
|
+
/\.min\.(css|js)$/,
|
|
90
|
+
/tailwind\.config/,
|
|
91
|
+
/globals\.css/, // Token definitions
|
|
92
|
+
/tokens\.(css|json)/
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get all files recursively
|
|
97
|
+
*/
|
|
98
|
+
function getFiles(dir, ignore, files = []) {
|
|
99
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
100
|
+
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
const fullPath = path.join(dir, entry.name);
|
|
103
|
+
|
|
104
|
+
if (entry.isDirectory()) {
|
|
105
|
+
if (!ignore.includes(entry.name)) {
|
|
106
|
+
getFiles(fullPath, ignore, files);
|
|
107
|
+
}
|
|
108
|
+
} else if (entry.isFile()) {
|
|
109
|
+
const ext = path.extname(entry.name);
|
|
110
|
+
if (extensions.includes(ext)) {
|
|
111
|
+
files.push(fullPath);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return files;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Check if file should be skipped
|
|
121
|
+
*/
|
|
122
|
+
function shouldSkip(filePath) {
|
|
123
|
+
return skipPatterns.some(pattern => pattern.test(filePath));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Scan file for violations
|
|
128
|
+
*/
|
|
129
|
+
function scanFile(filePath) {
|
|
130
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
131
|
+
const lines = content.split('\n');
|
|
132
|
+
const violations = [];
|
|
133
|
+
|
|
134
|
+
lines.forEach((line, index) => {
|
|
135
|
+
// Skip comments
|
|
136
|
+
if (line.trim().startsWith('//') || line.trim().startsWith('/*')) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
for (const [name, pattern] of Object.entries(patterns)) {
|
|
141
|
+
const matches = line.match(pattern.regex);
|
|
142
|
+
if (matches) {
|
|
143
|
+
matches.forEach(match => {
|
|
144
|
+
// Skip common exceptions
|
|
145
|
+
if (name === 'hexColor' && ['#000', '#fff', '#FFF', '#000000', '#FFFFFF'].includes(match.toUpperCase())) {
|
|
146
|
+
return; // Skip black/white, often intentional
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
violations.push({
|
|
150
|
+
file: filePath,
|
|
151
|
+
line: index + 1,
|
|
152
|
+
column: line.indexOf(match) + 1,
|
|
153
|
+
value: match,
|
|
154
|
+
type: name,
|
|
155
|
+
message: pattern.message,
|
|
156
|
+
suggestion: pattern.suggestion,
|
|
157
|
+
context: line.trim().substring(0, 80)
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return violations;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Format violation report
|
|
169
|
+
*/
|
|
170
|
+
function formatReport(violations) {
|
|
171
|
+
if (violations.length === 0) {
|
|
172
|
+
return '✅ No token violations found';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
let report = `⚠️ Found ${violations.length} potential token violations:\n\n`;
|
|
176
|
+
|
|
177
|
+
// Group by file
|
|
178
|
+
const byFile = {};
|
|
179
|
+
violations.forEach(v => {
|
|
180
|
+
if (!byFile[v.file]) byFile[v.file] = [];
|
|
181
|
+
byFile[v.file].push(v);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
for (const [file, fileViolations] of Object.entries(byFile)) {
|
|
185
|
+
report += `📁 ${file}\n`;
|
|
186
|
+
fileViolations.forEach(v => {
|
|
187
|
+
report += ` Line ${v.line}: ${v.message}\n`;
|
|
188
|
+
report += ` Found: ${v.value}\n`;
|
|
189
|
+
report += ` Suggestion: ${v.suggestion}\n`;
|
|
190
|
+
report += ` Context: ${v.context}\n\n`;
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Summary
|
|
195
|
+
const byType = {};
|
|
196
|
+
violations.forEach(v => {
|
|
197
|
+
byType[v.type] = (byType[v.type] || 0) + 1;
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
report += `\n📊 Summary:\n`;
|
|
201
|
+
for (const [type, count] of Object.entries(byType)) {
|
|
202
|
+
report += ` ${patterns[type].message}: ${count}\n`;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return report;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Main
|
|
210
|
+
*/
|
|
211
|
+
function main() {
|
|
212
|
+
const options = parseArgs();
|
|
213
|
+
|
|
214
|
+
if (!options.dir) {
|
|
215
|
+
console.error('Error: --dir is required');
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const dirPath = path.resolve(process.cwd(), options.dir);
|
|
220
|
+
|
|
221
|
+
if (!fs.existsSync(dirPath)) {
|
|
222
|
+
console.error(`Error: Directory not found: ${dirPath}`);
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
console.log(`Scanning ${dirPath} for token violations...\n`);
|
|
227
|
+
|
|
228
|
+
const files = getFiles(dirPath, options.ignore);
|
|
229
|
+
const allViolations = [];
|
|
230
|
+
|
|
231
|
+
for (const file of files) {
|
|
232
|
+
if (shouldSkip(file)) continue;
|
|
233
|
+
|
|
234
|
+
const violations = scanFile(file);
|
|
235
|
+
allViolations.push(...violations);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
console.log(formatReport(allViolations));
|
|
239
|
+
|
|
240
|
+
// Exit with error code if violations found
|
|
241
|
+
if (allViolations.length > 0) {
|
|
242
|
+
process.exit(1);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
main();
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://design-tokens.org/schema.json",
|
|
3
|
+
"primitive": {
|
|
4
|
+
"color": {
|
|
5
|
+
"gray": {
|
|
6
|
+
"50": { "$value": "#F9FAFB", "$type": "color" },
|
|
7
|
+
"100": { "$value": "#F3F4F6", "$type": "color" },
|
|
8
|
+
"200": { "$value": "#E5E7EB", "$type": "color" },
|
|
9
|
+
"300": { "$value": "#D1D5DB", "$type": "color" },
|
|
10
|
+
"400": { "$value": "#9CA3AF", "$type": "color" },
|
|
11
|
+
"500": { "$value": "#6B7280", "$type": "color" },
|
|
12
|
+
"600": { "$value": "#4B5563", "$type": "color" },
|
|
13
|
+
"700": { "$value": "#374151", "$type": "color" },
|
|
14
|
+
"800": { "$value": "#1F2937", "$type": "color" },
|
|
15
|
+
"900": { "$value": "#111827", "$type": "color" },
|
|
16
|
+
"950": { "$value": "#030712", "$type": "color" }
|
|
17
|
+
},
|
|
18
|
+
"blue": {
|
|
19
|
+
"50": { "$value": "#EFF6FF", "$type": "color" },
|
|
20
|
+
"500": { "$value": "#3B82F6", "$type": "color" },
|
|
21
|
+
"600": { "$value": "#2563EB", "$type": "color" },
|
|
22
|
+
"700": { "$value": "#1D4ED8", "$type": "color" },
|
|
23
|
+
"800": { "$value": "#1E40AF", "$type": "color" }
|
|
24
|
+
},
|
|
25
|
+
"red": {
|
|
26
|
+
"500": { "$value": "#EF4444", "$type": "color" },
|
|
27
|
+
"600": { "$value": "#DC2626", "$type": "color" },
|
|
28
|
+
"700": { "$value": "#B91C1C", "$type": "color" }
|
|
29
|
+
},
|
|
30
|
+
"green": {
|
|
31
|
+
"500": { "$value": "#22C55E", "$type": "color" },
|
|
32
|
+
"600": { "$value": "#16A34A", "$type": "color" }
|
|
33
|
+
},
|
|
34
|
+
"yellow": {
|
|
35
|
+
"500": { "$value": "#EAB308", "$type": "color" }
|
|
36
|
+
},
|
|
37
|
+
"white": { "$value": "#FFFFFF", "$type": "color" }
|
|
38
|
+
},
|
|
39
|
+
"spacing": {
|
|
40
|
+
"0": { "$value": "0", "$type": "dimension" },
|
|
41
|
+
"1": { "$value": "0.25rem", "$type": "dimension" },
|
|
42
|
+
"2": { "$value": "0.5rem", "$type": "dimension" },
|
|
43
|
+
"3": { "$value": "0.75rem", "$type": "dimension" },
|
|
44
|
+
"4": { "$value": "1rem", "$type": "dimension" },
|
|
45
|
+
"5": { "$value": "1.25rem", "$type": "dimension" },
|
|
46
|
+
"6": { "$value": "1.5rem", "$type": "dimension" },
|
|
47
|
+
"8": { "$value": "2rem", "$type": "dimension" },
|
|
48
|
+
"10": { "$value": "2.5rem", "$type": "dimension" },
|
|
49
|
+
"12": { "$value": "3rem", "$type": "dimension" },
|
|
50
|
+
"16": { "$value": "4rem", "$type": "dimension" }
|
|
51
|
+
},
|
|
52
|
+
"fontSize": {
|
|
53
|
+
"xs": { "$value": "0.75rem", "$type": "dimension" },
|
|
54
|
+
"sm": { "$value": "0.875rem", "$type": "dimension" },
|
|
55
|
+
"base": { "$value": "1rem", "$type": "dimension" },
|
|
56
|
+
"lg": { "$value": "1.125rem", "$type": "dimension" },
|
|
57
|
+
"xl": { "$value": "1.25rem", "$type": "dimension" },
|
|
58
|
+
"2xl": { "$value": "1.5rem", "$type": "dimension" },
|
|
59
|
+
"3xl": { "$value": "1.875rem", "$type": "dimension" },
|
|
60
|
+
"4xl": { "$value": "2.25rem", "$type": "dimension" }
|
|
61
|
+
},
|
|
62
|
+
"radius": {
|
|
63
|
+
"none": { "$value": "0", "$type": "dimension" },
|
|
64
|
+
"sm": { "$value": "0.125rem", "$type": "dimension" },
|
|
65
|
+
"default": { "$value": "0.25rem", "$type": "dimension" },
|
|
66
|
+
"md": { "$value": "0.375rem", "$type": "dimension" },
|
|
67
|
+
"lg": { "$value": "0.5rem", "$type": "dimension" },
|
|
68
|
+
"xl": { "$value": "0.75rem", "$type": "dimension" },
|
|
69
|
+
"full": { "$value": "9999px", "$type": "dimension" }
|
|
70
|
+
},
|
|
71
|
+
"shadow": {
|
|
72
|
+
"none": { "$value": "none", "$type": "shadow" },
|
|
73
|
+
"sm": { "$value": "0 1px 2px 0 rgb(0 0 0 / 0.05)", "$type": "shadow" },
|
|
74
|
+
"default": { "$value": "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", "$type": "shadow" },
|
|
75
|
+
"md": { "$value": "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)", "$type": "shadow" },
|
|
76
|
+
"lg": { "$value": "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)", "$type": "shadow" }
|
|
77
|
+
},
|
|
78
|
+
"duration": {
|
|
79
|
+
"fast": { "$value": "150ms", "$type": "duration" },
|
|
80
|
+
"normal": { "$value": "200ms", "$type": "duration" },
|
|
81
|
+
"slow": { "$value": "300ms", "$type": "duration" }
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"semantic": {
|
|
85
|
+
"color": {
|
|
86
|
+
"background": { "$value": "{primitive.color.gray.50}", "$type": "color" },
|
|
87
|
+
"foreground": { "$value": "{primitive.color.gray.900}", "$type": "color" },
|
|
88
|
+
"primary": { "$value": "{primitive.color.blue.600}", "$type": "color" },
|
|
89
|
+
"primary-hover": { "$value": "{primitive.color.blue.700}", "$type": "color" },
|
|
90
|
+
"primary-foreground": { "$value": "{primitive.color.white}", "$type": "color" },
|
|
91
|
+
"secondary": { "$value": "{primitive.color.gray.100}", "$type": "color" },
|
|
92
|
+
"secondary-foreground": { "$value": "{primitive.color.gray.900}", "$type": "color" },
|
|
93
|
+
"muted": { "$value": "{primitive.color.gray.100}", "$type": "color" },
|
|
94
|
+
"muted-foreground": { "$value": "{primitive.color.gray.500}", "$type": "color" },
|
|
95
|
+
"destructive": { "$value": "{primitive.color.red.600}", "$type": "color" },
|
|
96
|
+
"destructive-foreground": { "$value": "{primitive.color.white}", "$type": "color" },
|
|
97
|
+
"border": { "$value": "{primitive.color.gray.200}", "$type": "color" },
|
|
98
|
+
"ring": { "$value": "{primitive.color.blue.500}", "$type": "color" }
|
|
99
|
+
},
|
|
100
|
+
"spacing": {
|
|
101
|
+
"component": { "$value": "{primitive.spacing.4}", "$type": "dimension" },
|
|
102
|
+
"section": { "$value": "{primitive.spacing.12}", "$type": "dimension" }
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"component": {
|
|
106
|
+
"button": {
|
|
107
|
+
"bg": { "$value": "{semantic.color.primary}", "$type": "color" },
|
|
108
|
+
"fg": { "$value": "{semantic.color.primary-foreground}", "$type": "color" },
|
|
109
|
+
"hover-bg": { "$value": "{semantic.color.primary-hover}", "$type": "color" },
|
|
110
|
+
"padding-x": { "$value": "{primitive.spacing.4}", "$type": "dimension" },
|
|
111
|
+
"padding-y": { "$value": "{primitive.spacing.2}", "$type": "dimension" },
|
|
112
|
+
"radius": { "$value": "{primitive.radius.md}", "$type": "dimension" },
|
|
113
|
+
"font-size": { "$value": "{primitive.fontSize.sm}", "$type": "dimension" }
|
|
114
|
+
},
|
|
115
|
+
"input": {
|
|
116
|
+
"bg": { "$value": "{semantic.color.background}", "$type": "color" },
|
|
117
|
+
"border": { "$value": "{semantic.color.border}", "$type": "color" },
|
|
118
|
+
"focus-ring": { "$value": "{semantic.color.ring}", "$type": "color" },
|
|
119
|
+
"padding-x": { "$value": "{primitive.spacing.3}", "$type": "dimension" },
|
|
120
|
+
"padding-y": { "$value": "{primitive.spacing.2}", "$type": "dimension" },
|
|
121
|
+
"radius": { "$value": "{primitive.radius.md}", "$type": "dimension" }
|
|
122
|
+
},
|
|
123
|
+
"card": {
|
|
124
|
+
"bg": { "$value": "{primitive.color.white}", "$type": "color" },
|
|
125
|
+
"border": { "$value": "{semantic.color.border}", "$type": "color" },
|
|
126
|
+
"shadow": { "$value": "{primitive.shadow.default}", "$type": "shadow" },
|
|
127
|
+
"padding": { "$value": "{primitive.spacing.6}", "$type": "dimension" },
|
|
128
|
+
"radius": { "$value": "{primitive.radius.lg}", "$type": "dimension" }
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"dark": {
|
|
132
|
+
"semantic": {
|
|
133
|
+
"color": {
|
|
134
|
+
"background": { "$value": "{primitive.color.gray.950}", "$type": "color" },
|
|
135
|
+
"foreground": { "$value": "{primitive.color.gray.50}", "$type": "color" },
|
|
136
|
+
"secondary": { "$value": "{primitive.color.gray.800}", "$type": "color" },
|
|
137
|
+
"muted": { "$value": "{primitive.color.gray.800}", "$type": "color" },
|
|
138
|
+
"muted-foreground": { "$value": "{primitive.color.gray.400}", "$type": "color" },
|
|
139
|
+
"border": { "$value": "{primitive.color.gray.800}", "$type": "color" }
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slides
|
|
3
|
+
description: Create strategic HTML presentations with Chart.js, design tokens, responsive layouts, copywriting formulas, and contextual slide strategies.
|
|
4
|
+
argument-hint: "[topic] [slide-count]"
|
|
5
|
+
metadata:
|
|
6
|
+
author: claudekit
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Slides
|
|
11
|
+
|
|
12
|
+
Strategic HTML presentation design with data visualization.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
- Marketing presentations and pitch decks
|
|
17
|
+
- Data-driven slides with Chart.js
|
|
18
|
+
- Strategic slide design with layout patterns
|
|
19
|
+
- Copywriting-optimized presentation content
|
|
20
|
+
|
|
21
|
+
## Subcommands
|
|
22
|
+
|
|
23
|
+
| Subcommand | Description | Reference |
|
|
24
|
+
|------------|-------------|-----------|
|
|
25
|
+
| `create` | Create strategic presentation slides | `references/create.md` |
|
|
26
|
+
|
|
27
|
+
## References (Knowledge Base)
|
|
28
|
+
|
|
29
|
+
| Topic | File |
|
|
30
|
+
|-------|------|
|
|
31
|
+
| Layout Patterns | `references/layout-patterns.md` |
|
|
32
|
+
| HTML Template | `references/html-template.md` |
|
|
33
|
+
| Copywriting Formulas | `references/copywriting-formulas.md` |
|
|
34
|
+
| Slide Strategies | `references/slide-strategies.md` |
|
|
35
|
+
|
|
36
|
+
## Routing
|
|
37
|
+
|
|
38
|
+
1. Parse subcommand from `$ARGUMENTS` (first word)
|
|
39
|
+
2. Load corresponding `references/{subcommand}.md`
|
|
40
|
+
3. Execute with remaining arguments
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Copywriting Formulas
|
|
2
|
+
|
|
3
|
+
25 formulas for persuasive slide copy.
|
|
4
|
+
|
|
5
|
+
## Core Formulas
|
|
6
|
+
|
|
7
|
+
### PAS (Problem-Agitate-Solution)
|
|
8
|
+
**Use:** Problem slides, pain points
|
|
9
|
+
**Components:** Problem → Agitate → Solution
|
|
10
|
+
**Template:** "[Pain point]? Every [time frame], [consequence]. [Solution] fixes this."
|
|
11
|
+
|
|
12
|
+
### AIDA (Attention-Interest-Desire-Action)
|
|
13
|
+
**Use:** CTAs, closing slides
|
|
14
|
+
**Components:** Attention → Interest → Desire → Action
|
|
15
|
+
**Template:** "[Bold statement]. [Benefit detail]. [Social proof]. [CTA]."
|
|
16
|
+
|
|
17
|
+
### FAB (Features-Advantages-Benefits)
|
|
18
|
+
**Use:** Feature slides, product showcases
|
|
19
|
+
**Components:** Feature → Advantage → Benefit
|
|
20
|
+
**Template:** "[Feature] lets you [advantage], so you can [benefit]."
|
|
21
|
+
|
|
22
|
+
### Cost of Inaction
|
|
23
|
+
**Use:** Agitation slides, urgency
|
|
24
|
+
**Components:** Status Quo → Loss → Time Decay
|
|
25
|
+
**Template:** "Without [solution], you're losing [amount] every [timeframe]."
|
|
26
|
+
|
|
27
|
+
### Before-After-Bridge
|
|
28
|
+
**Use:** Transformation slides, case studies
|
|
29
|
+
**Components:** Before → After → Bridge
|
|
30
|
+
**Template:** "[Pain point before]. [Desired state after]. [Your solution] is the bridge."
|
|
31
|
+
|
|
32
|
+
## Formula-to-Slide Mapping
|
|
33
|
+
|
|
34
|
+
| Slide Type | Primary Formula | Emotion |
|
|
35
|
+
|------------|-----------------|---------|
|
|
36
|
+
| Title/Hook | AIDA, Hook | curiosity |
|
|
37
|
+
| Problem | PAS, Agitate | frustration |
|
|
38
|
+
| Cost/Risk | Cost of Inaction | fear |
|
|
39
|
+
| Solution | FAB, BAB | hope |
|
|
40
|
+
| Features | FAB | confidence |
|
|
41
|
+
| Traction | Proof Stack | trust |
|
|
42
|
+
| Social Proof | Testimonial | trust |
|
|
43
|
+
| Pricing | Value Stack | confidence |
|
|
44
|
+
| CTA | AIDA, Urgency | urgency |
|
|
45
|
+
|
|
46
|
+
## Headline Patterns
|
|
47
|
+
|
|
48
|
+
### Power Words
|
|
49
|
+
- "Stop [bad thing]"
|
|
50
|
+
- "Get [desired result] in [timeframe]"
|
|
51
|
+
- "The [adjective] way to [action]"
|
|
52
|
+
- "Why [audience] choose [product]"
|
|
53
|
+
- "[Number] ways to [achieve goal]"
|
|
54
|
+
|
|
55
|
+
### Contrast Patterns
|
|
56
|
+
- "[Old way] is dead. Meet [new way]."
|
|
57
|
+
- "Don't [bad action]. Instead, [good action]."
|
|
58
|
+
- "From [pain point] to [benefit]."
|
|
59
|
+
|
|
60
|
+
### Social Proof Patterns
|
|
61
|
+
- "[Number]+ [users/companies] trust [product]"
|
|
62
|
+
- "Join [notable company] and [notable company]"
|
|
63
|
+
- "As seen in [publication]"
|
|
64
|
+
|
|
65
|
+
## Search Commands
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Find formula for slide type
|
|
69
|
+
python .claude/skills/design-system/scripts/search-slides.py "problem agitation" -d copy
|
|
70
|
+
|
|
71
|
+
# Get emotion-appropriate formula
|
|
72
|
+
python .claude/skills/design-system/scripts/search-slides.py "urgency cta" -d copy
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Quick Reference
|
|
76
|
+
|
|
77
|
+
| Need | Use Formula |
|
|
78
|
+
|------|------------|
|
|
79
|
+
| Create urgency | Cost of Inaction, Scarcity |
|
|
80
|
+
| Build trust | Social Proof, Testimonial |
|
|
81
|
+
| Show value | FAB, Value Stack |
|
|
82
|
+
| Drive action | AIDA, CTA |
|
|
83
|
+
| Tell story | BAB, Story Arc |
|
|
84
|
+
| Present data | Proof Stack |
|