stella-coder 3.9.1 → 4.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 +5 -0
- 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 +12 -3
- package/presentation-advanced-features-demo/README.md +27 -0
- package/presentation-advanced-features-demo/index.html +371 -0
- package/presentation-advanced-features-demo/print.html +81 -0
- package/presentation-advanced-features-demo/slide-01.html +98 -0
- package/presentation-advanced-features-demo/slide-02.html +101 -0
- package/presentation-advanced-features-demo/slide-03.html +100 -0
- package/presentation-advanced-features-demo/slide-04.html +100 -0
- package/presentation-advanced-features-demo/slide-05.html +100 -0
- package/presentation-advanced-features-demo/slide-06.html +64 -0
- package/presentation-advanced-features-demo/slide-07.html +101 -0
- package/presentation-advanced-features-demo/slide-08.html +91 -0
- package/presentation-stella-coder---ai-coding-agent/README.md +27 -0
- package/presentation-stella-coder---ai-coding-agent/index.html +168 -0
- package/presentation-stella-coder---ai-coding-agent/slide-01.html +98 -0
- package/presentation-stella-coder---ai-coding-agent/slide-02.html +101 -0
- package/presentation-stella-coder---ai-coding-agent/slide-03.html +100 -0
- package/presentation-stella-coder---ai-coding-agent/slide-04.html +100 -0
- package/presentation-stella-coder---ai-coding-agent/slide-05.html +100 -0
- package/presentation-stella-coder---ai-coding-agent/slide-06.html +100 -0
- package/presentation-stella-coder---ai-coding-agent/slide-07.html +100 -0
- package/presentation-stella-coder---ai-coding-agent/slide-08.html +64 -0
- package/presentation-stella-coder---ai-coding-agent/slide-09.html +101 -0
- package/presentation-stella-coder---ai-coding-agent/slide-10.html +91 -0
- package/presentation-stella-coder-demo/README.md +27 -0
- package/presentation-stella-coder-demo/index.html +371 -0
- package/presentation-stella-coder-demo/slide-01.html +98 -0
- package/presentation-stella-coder-demo/slide-02.html +101 -0
- package/presentation-stella-coder-demo/slide-03.html +100 -0
- package/presentation-stella-coder-demo/slide-04.html +100 -0
- package/presentation-stella-coder-demo/slide-05.html +100 -0
- package/presentation-stella-coder-demo/slide-06.html +64 -0
- package/presentation-stella-coder-demo/slide-07.html +101 -0
- package/presentation-stella-coder-demo/slide-08.html +91 -0
- package/presentation-stella-coder-features/README.md +27 -0
- package/presentation-stella-coder-features/index.html +364 -0
- package/presentation-stella-coder-features/print.html +77 -0
- package/presentation-stella-coder-features/slide-01.html +98 -0
- package/presentation-stella-coder-features/slide-02.html +101 -0
- package/presentation-stella-coder-features/slide-03.html +100 -0
- package/presentation-stella-coder-features/slide-04.html +100 -0
- package/presentation-stella-coder-features/slide-05.html +64 -0
- package/presentation-stella-coder-features/slide-06.html +101 -0
- package/presentation-stella-coder-features/slide-07.html +91 -0
- package/presentation-test-presentation/README.md +27 -0
- package/presentation-test-presentation/index.html +350 -0
- package/presentation-test-presentation/print.html +69 -0
- package/presentation-test-presentation/slide-01.html +98 -0
- package/presentation-test-presentation/slide-02.html +101 -0
- package/presentation-test-presentation/slide-03.html +64 -0
- package/presentation-test-presentation/slide-04.html +101 -0
- package/presentation-test-presentation/slide-05.html +91 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/README.md +27 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/index.html +159 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-01.html +98 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-02.html +101 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-03.html +100 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-04.html +100 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-05.html +64 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-06.html +101 -0
- package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-07.html +91 -0
- 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/stella-coder-3.9.2.tgz +0 -0
|
@@ -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 |
|