design-brain-memory 0.9.3 → 0.9.4

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.
Files changed (125) hide show
  1. package/README.md +273 -0
  2. package/dist/agentBrowser.d.ts +0 -1
  3. package/dist/agentBrowser.js +13 -31
  4. package/dist/agentBrowser.js.map +1 -1
  5. package/dist/aggregate.d.ts +9 -0
  6. package/dist/aggregate.js +53 -0
  7. package/dist/aggregate.js.map +1 -0
  8. package/dist/batch.d.ts +16 -0
  9. package/dist/batch.js +44 -0
  10. package/dist/batch.js.map +1 -0
  11. package/dist/cli.js +250 -216
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands.d.ts +60 -1
  14. package/dist/commands.js +323 -10
  15. package/dist/commands.js.map +1 -1
  16. package/dist/compare.d.ts +33 -0
  17. package/dist/compare.js +83 -0
  18. package/dist/compare.js.map +1 -0
  19. package/dist/componentGraph.d.ts +22 -0
  20. package/dist/componentGraph.js +106 -0
  21. package/dist/componentGraph.js.map +1 -0
  22. package/dist/contextLayer.d.ts +12 -0
  23. package/dist/contextLayer.js +263 -0
  24. package/dist/contextLayer.js.map +1 -0
  25. package/dist/cssInJs.d.ts +9 -0
  26. package/dist/cssInJs.js +124 -0
  27. package/dist/cssInJs.js.map +1 -0
  28. package/dist/extractFromUrl.d.ts +8 -0
  29. package/dist/extractFromUrl.js +508 -414
  30. package/dist/extractFromUrl.js.map +1 -1
  31. package/dist/graphView.d.ts +21 -0
  32. package/dist/graphView.js +492 -0
  33. package/dist/graphView.js.map +1 -0
  34. package/dist/index.d.ts +26 -11
  35. package/dist/index.js +17 -10
  36. package/dist/index.js.map +1 -1
  37. package/dist/knowledge.d.ts +20 -0
  38. package/dist/knowledge.js +208 -0
  39. package/dist/knowledge.js.map +1 -0
  40. package/dist/liveView.d.ts +15 -0
  41. package/dist/liveView.js +475 -0
  42. package/dist/liveView.js.map +1 -0
  43. package/dist/llm.js +1 -9
  44. package/dist/llm.js.map +1 -1
  45. package/dist/moodboard.d.ts +3 -0
  46. package/dist/moodboard.js +152 -0
  47. package/dist/moodboard.js.map +1 -0
  48. package/dist/persona.d.ts +2 -2
  49. package/dist/persona.js +82 -210
  50. package/dist/persona.js.map +1 -1
  51. package/dist/query.js +1 -6
  52. package/dist/query.js.map +1 -1
  53. package/dist/render.d.ts +2 -10
  54. package/dist/render.js +80 -175
  55. package/dist/render.js.map +1 -1
  56. package/dist/reviewChecklist.d.ts +17 -0
  57. package/dist/reviewChecklist.js +126 -0
  58. package/dist/reviewChecklist.js.map +1 -0
  59. package/dist/scan.d.ts +19 -7
  60. package/dist/scan.js +132 -374
  61. package/dist/scan.js.map +1 -1
  62. package/dist/scorecard.d.ts +53 -0
  63. package/dist/scorecard.js +325 -0
  64. package/dist/scorecard.js.map +1 -0
  65. package/dist/skillPrompt.d.ts +1 -3
  66. package/dist/skillPrompt.js +22 -148
  67. package/dist/skillPrompt.js.map +1 -1
  68. package/dist/store.d.ts +2 -2
  69. package/dist/store.js +7 -9
  70. package/dist/store.js.map +1 -1
  71. package/dist/styleDictionary.d.ts +16 -0
  72. package/dist/styleDictionary.js +89 -0
  73. package/dist/styleDictionary.js.map +1 -0
  74. package/dist/svg.d.ts +5 -0
  75. package/dist/svg.js +162 -0
  76. package/dist/svg.js.map +1 -0
  77. package/dist/systemDiff.d.ts +28 -0
  78. package/dist/systemDiff.js +107 -0
  79. package/dist/systemDiff.js.map +1 -0
  80. package/dist/tailwind.d.ts +2 -0
  81. package/dist/tailwind.js +122 -0
  82. package/dist/tailwind.js.map +1 -0
  83. package/dist/taste.d.ts +3 -2
  84. package/dist/taste.js +349 -536
  85. package/dist/taste.js.map +1 -1
  86. package/dist/tasteRenderer.d.ts +2 -3
  87. package/dist/tasteRenderer.js +123 -119
  88. package/dist/tasteRenderer.js.map +1 -1
  89. package/dist/tokenNaming.d.ts +5 -0
  90. package/dist/tokenNaming.js +229 -0
  91. package/dist/tokenNaming.js.map +1 -0
  92. package/dist/tokens.d.ts +17 -0
  93. package/dist/tokens.js +44 -0
  94. package/dist/tokens.js.map +1 -0
  95. package/dist/trends.d.ts +12 -0
  96. package/dist/trends.js +178 -0
  97. package/dist/trends.js.map +1 -0
  98. package/dist/types.d.ts +47 -101
  99. package/dist/wiki.d.ts +10 -0
  100. package/dist/wiki.js +346 -0
  101. package/dist/wiki.js.map +1 -0
  102. package/dist/writingStyle.d.ts +38 -0
  103. package/dist/writingStyle.js +224 -0
  104. package/dist/writingStyle.js.map +1 -0
  105. package/package.json +5 -4
  106. package/dist/classify.d.ts +0 -21
  107. package/dist/classify.js +0 -205
  108. package/dist/classify.js.map +0 -1
  109. package/dist/scanRenderer.d.ts +0 -2
  110. package/dist/scanRenderer.js +0 -155
  111. package/dist/scanRenderer.js.map +0 -1
  112. package/dist/tasteDiff.d.ts +0 -19
  113. package/dist/tasteDiff.js +0 -340
  114. package/dist/tasteDiff.js.map +0 -1
  115. package/dist/tasteGenerate.d.ts +0 -12
  116. package/dist/tasteGenerate.js +0 -140
  117. package/dist/tasteGenerate.js.map +0 -1
  118. package/dist/tasteRefine.d.ts +0 -13
  119. package/dist/tasteRefine.js +0 -351
  120. package/dist/tasteRefine.js.map +0 -1
  121. package/dist/theatrical.d.ts +0 -5
  122. package/dist/theatrical.js +0 -258
  123. package/dist/theatrical.js.map +0 -1
  124. package/skills/SKILL.md +0 -36
  125. package/skills/design-brain/SKILL.md +0 -77
package/dist/scan.js CHANGED
@@ -1,393 +1,151 @@
1
- import { readdirSync, readFileSync, statSync, existsSync } from 'node:fs';
2
- import { join, extname } from 'node:path';
3
- import { assignPersona } from './persona.js';
4
- import { theatricalScan } from './theatrical.js';
5
- /* ─── File collection ─── */
6
- const SKIP_DIRS = new Set([
7
- 'node_modules', '.git', 'dist', 'build', '.next', '.nuxt',
8
- '.output', 'coverage', 'vendor', '.svelte-kit', '__pycache__',
9
- ]);
10
- const SCAN_EXTENSIONS = new Set([
11
- '.css', '.scss', '.sass', '.less', '.styl',
12
- '.tsx', '.jsx', '.vue', '.svelte',
13
- '.html', '.htm',
14
- ]);
15
- export function collectFiles(dir) {
16
- const results = [];
17
- function walk(current) {
18
- let entries;
19
- try {
20
- entries = readdirSync(current);
21
- }
22
- catch {
23
- return;
24
- }
25
- for (const entry of entries) {
26
- if (entry.startsWith('.') && entry !== '.')
27
- continue;
28
- const full = join(current, entry);
29
- let stat;
30
- try {
31
- stat = statSync(full);
32
- }
33
- catch {
34
- continue;
35
- }
36
- if (stat.isDirectory()) {
37
- if (!SKIP_DIRS.has(entry))
38
- walk(full);
39
- }
40
- else if (SCAN_EXTENSIONS.has(extname(entry).toLowerCase())) {
41
- results.push(full);
42
- }
43
- }
44
- }
45
- walk(dir);
46
- return results;
1
+ const URL_RE = /^https?:\/\//i;
2
+ const BARE_DOMAIN_RE = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z]{2,})+$/i;
3
+ export function looksLikeUrl(input) {
4
+ const trimmed = input.trim();
5
+ return URL_RE.test(trimmed) || BARE_DOMAIN_RE.test(trimmed);
47
6
  }
48
- /* ─── CSS content scanning ─── */
49
- const HEX_COLOR_RE = /#(?:[0-9a-fA-F]{3}){1,2}\b/g;
50
- const RGB_COLOR_RE = /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})/g;
51
- const FONT_FAMILY_RE = /font-family\s*:\s*([^;}]+)/g;
52
- const FONT_SIZE_RE = /font-size\s*:\s*([^;}"']+)/g;
53
- const TRANSITION_RE = /transition\s*:\s*([^;}"']+)/g;
54
- const ANIMATION_RE = /animation\s*:\s*([^;}"']+)/g;
55
- const SPACING_RE = /(?:margin|padding|gap|row-gap|column-gap)\s*:\s*([^;}"']+)/g;
56
- const CSS_VAR_RE = /--[\w-]+\s*:/g;
57
- function rgbToHex(r, g, b) {
58
- const toHex = (n) => Math.max(0, Math.min(255, n)).toString(16).padStart(2, '0');
59
- return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
7
+ export function normalizeToUrl(input) {
8
+ const trimmed = input.trim();
9
+ if (URL_RE.test(trimmed))
10
+ return trimmed;
11
+ return `https://${trimmed}`;
60
12
  }
61
- function normalizeHex(hex) {
62
- const clean = hex.replace('#', '').toLowerCase();
63
- if (clean.length === 3) {
64
- return `#${clean[0]}${clean[0]}${clean[1]}${clean[1]}${clean[2]}${clean[2]}`;
65
- }
66
- return `#${clean}`;
13
+ function hueFromHex(hex) {
14
+ const raw = hex.replace('#', '');
15
+ const r = parseInt(raw.slice(0, 2), 16) / 255;
16
+ const g = parseInt(raw.slice(2, 4), 16) / 255;
17
+ const b = parseInt(raw.slice(4, 6), 16) / 255;
18
+ const max = Math.max(r, g, b);
19
+ const min = Math.min(r, g, b);
20
+ const delta = max - min;
21
+ if (delta === 0)
22
+ return 0;
23
+ let h;
24
+ if (max === r)
25
+ h = ((g - b) / delta) % 6;
26
+ else if (max === g)
27
+ h = (b - r) / delta + 2;
28
+ else
29
+ h = (r - g) / delta + 4;
30
+ h = Math.round(h * 60);
31
+ if (h < 0)
32
+ h += 360;
33
+ return h;
67
34
  }
68
- export function scanCssContent(css) {
69
- const colors = new Set();
70
- const fontFamilies = new Set();
71
- const fontSizes = new Set();
72
- const transitions = [];
73
- const spacingValues = [];
74
- // Hex colors
75
- for (const m of css.matchAll(HEX_COLOR_RE)) {
76
- colors.add(normalizeHex(m[0]));
77
- }
78
- // RGB/RGBA colors
79
- for (const m of css.matchAll(RGB_COLOR_RE)) {
80
- colors.add(rgbToHex(parseInt(m[1]), parseInt(m[2]), parseInt(m[3])));
81
- }
82
- // Font families
83
- for (const m of css.matchAll(FONT_FAMILY_RE)) {
84
- const families = m[1].split(',').map(f => f.trim().replace(/['"]/g, '').toLowerCase());
85
- for (const f of families) {
86
- if (f && !f.startsWith('var(') && f !== 'inherit' && f !== 'initial') {
87
- fontFamilies.add(f);
88
- }
89
- }
90
- }
91
- // Font sizes
92
- for (const m of css.matchAll(FONT_SIZE_RE)) {
93
- fontSizes.add(m[1].trim().toLowerCase());
94
- }
95
- // Transitions
96
- for (const m of css.matchAll(TRANSITION_RE)) {
97
- transitions.push(m[1].trim());
98
- }
99
- for (const m of css.matchAll(ANIMATION_RE)) {
100
- transitions.push(m[1].trim());
101
- }
102
- // Spacing
103
- for (const m of css.matchAll(SPACING_RE)) {
104
- spacingValues.push(m[1].trim());
105
- }
106
- // CSS variables
107
- const cssVariableCount = [...css.matchAll(CSS_VAR_RE)].length;
108
- return {
109
- colors: [...colors],
110
- fontFamilies: [...fontFamilies],
111
- fontSizes: [...fontSizes],
112
- transitions,
113
- spacingValues,
114
- cssVariableCount,
115
- };
35
+ function saturationFromHex(hex) {
36
+ const raw = hex.replace('#', '');
37
+ const r = parseInt(raw.slice(0, 2), 16) / 255;
38
+ const g = parseInt(raw.slice(2, 4), 16) / 255;
39
+ const b = parseInt(raw.slice(4, 6), 16) / 255;
40
+ const max = Math.max(r, g, b);
41
+ const min = Math.min(r, g, b);
42
+ const l = (max + min) / 2;
43
+ if (max === min)
44
+ return 0;
45
+ const delta = max - min;
46
+ return l > 0.5 ? delta / (2 - max - min) : delta / (max + min);
116
47
  }
117
- /* ─── Tailwind class scanning (for .tsx/.jsx/.vue/.svelte) ─── */
118
- const TW_COLOR_CLASSES = /(?:bg|text|border|ring|fill|stroke|accent|outline|decoration|shadow)-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(\d{2,3})\b/g;
119
- const TW_SPACING_CLASSES = /(?:p|px|py|pt|pb|pl|pr|m|mx|my|mt|mb|ml|mr|gap|space-x|space-y)-(\d+(?:\.5)?)\b/g;
120
- const TW_FONT_CLASSES = /font-(?:sans|serif|mono|thin|extralight|light|normal|medium|semibold|bold|extrabold|black)\b/g;
121
- const TW_TEXT_SIZE_CLASSES = /text-(?:xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)\b/g;
122
- const TW_TRANSITION_CLASSES = /transition(?:-(?:all|colors|opacity|shadow|transform|none))?\b/g;
123
- function scanTailwindClasses(content) {
124
- const colors = new Set();
125
- const fontFamilies = new Set();
126
- const fontSizes = new Set();
127
- const transitions = [];
128
- const spacingValues = [];
129
- // Tailwind color classes → track as palette indicators
130
- for (const m of content.matchAll(TW_COLOR_CLASSES)) {
131
- colors.add(`tw:${m[0]}`);
132
- }
133
- // Spacing
134
- for (const m of content.matchAll(TW_SPACING_CLASSES)) {
135
- const val = parseFloat(m[1]);
136
- spacingValues.push(`${val * 4}px`);
137
- }
138
- // Font families
139
- for (const m of content.matchAll(TW_FONT_CLASSES)) {
140
- fontFamilies.add(m[0].replace('font-', ''));
141
- }
142
- // Text sizes
143
- for (const m of content.matchAll(TW_TEXT_SIZE_CLASSES)) {
144
- fontSizes.add(m[0]);
145
- }
146
- // Transitions
147
- for (const m of content.matchAll(TW_TRANSITION_CLASSES)) {
148
- transitions.push(m[0]);
149
- }
150
- return {
151
- colors: [...colors],
152
- fontFamilies: [...fontFamilies],
153
- fontSizes: [...fontSizes],
154
- transitions,
155
- spacingValues,
156
- };
48
+ function lightnessFromHex(hex) {
49
+ const raw = hex.replace('#', '');
50
+ const r = parseInt(raw.slice(0, 2), 16) / 255;
51
+ const g = parseInt(raw.slice(2, 4), 16) / 255;
52
+ const b = parseInt(raw.slice(4, 6), 16) / 255;
53
+ return (Math.max(r, g, b) + Math.min(r, g, b)) / 2;
157
54
  }
158
- /* ─── Framework detection ─── */
159
- export async function detectFramework(scanPath) {
160
- // Check package.json
161
- const pkgPath = join(scanPath, 'package.json');
162
- if (existsSync(pkgPath)) {
163
- try {
164
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
165
- const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
166
- if (allDeps['tailwindcss'])
167
- return 'tailwind';
168
- if (allDeps['@chakra-ui/react'])
169
- return 'chakra';
170
- if (allDeps['@mui/material'])
171
- return 'mui';
172
- }
173
- catch {
174
- // ignore parse errors
55
+ export { hueFromHex, saturationFromHex, lightnessFromHex };
56
+ function extractSpacingValues(components) {
57
+ const values = [];
58
+ const spacingProps = [
59
+ 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',
60
+ 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',
61
+ 'gap', 'row-gap', 'column-gap',
62
+ ];
63
+ for (const comp of components) {
64
+ for (const prop of spacingProps) {
65
+ const val = comp.styles[prop];
66
+ if (!val)
67
+ continue;
68
+ const nums = val.match(/(\d+(?:\.\d+)?)/g);
69
+ if (nums) {
70
+ for (const n of nums) {
71
+ const parsed = parseFloat(n);
72
+ if (parsed > 0 && parsed < 200)
73
+ values.push(parsed);
74
+ }
75
+ }
175
76
  }
176
77
  }
177
- // Check for tailwind config files
178
- const twConfigs = ['tailwind.config.js', 'tailwind.config.ts', 'tailwind.config.mjs', 'tailwind.config.cjs'];
179
- for (const config of twConfigs) {
180
- if (existsSync(join(scanPath, config)))
181
- return 'tailwind';
182
- }
183
- return null;
78
+ return values;
184
79
  }
185
- /* ─── Token merging ─── */
186
- function mergeTokens(a, b) {
187
- return {
188
- colors: [...new Set([...a.colors, ...(b.colors ?? [])])],
189
- fontFamilies: [...new Set([...a.fontFamilies, ...(b.fontFamilies ?? [])])],
190
- fontSizes: [...new Set([...a.fontSizes, ...(b.fontSizes ?? [])])],
191
- transitions: [...a.transitions, ...(b.transitions ?? [])],
192
- spacingValues: [...a.spacingValues, ...(b.spacingValues ?? [])],
193
- cssVariableCount: a.cssVariableCount + (b.cssVariableCount ?? 0),
194
- };
195
- }
196
- /* ─── Score computation ─── */
197
- export function computeScore(tokens) {
198
- // Color Discipline (0–25): fewer unique colors = higher score
199
- const colorCount = tokens.colors.length;
200
- let colorDiscipline;
201
- if (colorCount === 0)
202
- colorDiscipline = 5; // no colors found → low score
203
- else if (colorCount <= 5)
204
- colorDiscipline = 25; // extremely disciplined
205
- else if (colorCount <= 10)
206
- colorDiscipline = 22;
207
- else if (colorCount <= 15)
208
- colorDiscipline = 18;
209
- else if (colorCount <= 25)
210
- colorDiscipline = 14;
211
- else if (colorCount <= 40)
212
- colorDiscipline = 10;
213
- else
214
- colorDiscipline = 6;
215
- // Bonus for CSS variables or framework
216
- if (tokens.cssVariableCount >= 5)
217
- colorDiscipline = Math.min(25, colorDiscipline + 2);
218
- if (tokens.framework)
219
- colorDiscipline = Math.min(25, colorDiscipline + 1);
220
- // Typography System (0–25): fewer families + consistent scale = better
221
- const fontCount = tokens.fontFamilies.length;
222
- let typographySystem;
223
- if (fontCount === 0)
224
- typographySystem = 5;
225
- else if (fontCount <= 2)
226
- typographySystem = 25;
227
- else if (fontCount <= 3)
228
- typographySystem = 20;
229
- else if (fontCount <= 5)
230
- typographySystem = 15;
231
- else
232
- typographySystem = 8;
233
- // Bonus for consistent size scale
234
- if (tokens.fontSizes.length >= 3 && tokens.fontSizes.length <= 8) {
235
- typographySystem = Math.min(25, typographySystem + 2);
236
- }
237
- // Spacing & Layout (0–25): grid alignment = better
238
- let gridAligned = 0;
239
- let totalSpacing = 0;
240
- for (const val of tokens.spacingValues) {
241
- const nums = val.match(/(\d+(?:\.\d+)?)/g);
242
- if (!nums)
243
- continue;
244
- for (const n of nums) {
245
- const px = parseFloat(n);
246
- if (px > 0) {
247
- totalSpacing++;
248
- if (px % 4 === 0)
249
- gridAligned++;
250
- }
80
+ export function designAnalysisToScanTokens(analysis) {
81
+ const hues = new Set();
82
+ for (const color of analysis.colors.slice(0, 20)) {
83
+ if (color.hex.length === 7) {
84
+ hues.add(Math.round(hueFromHex(color.hex) / 30) * 30);
251
85
  }
252
86
  }
253
- const gridRatio = totalSpacing > 0 ? gridAligned / totalSpacing : 0;
254
- let spacingLayout = Math.round(gridRatio * 20);
255
- if (totalSpacing === 0)
256
- spacingLayout = 5;
257
- // Bonus for CSS variables in spacing
258
- if (tokens.cssVariableCount >= 3)
259
- spacingLayout = Math.min(25, spacingLayout + 3);
260
- if (tokens.framework)
261
- spacingLayout = Math.min(25, spacingLayout + 2);
262
- // Motion & Polish (0–25): having transitions = good, consistency = bonus
263
- const motionCount = tokens.transitions.length;
264
- let motionPolish;
265
- if (motionCount === 0)
266
- motionPolish = 5;
267
- else if (motionCount <= 3)
268
- motionPolish = 15;
269
- else if (motionCount <= 10)
270
- motionPolish = 22;
271
- else if (motionCount <= 20)
272
- motionPolish = 25;
273
- else
274
- motionPolish = 20; // too many different durations = slight penalty
275
- // Check timing consistency
276
- const durations = new Set();
277
- for (const t of tokens.transitions) {
278
- const durationMatch = t.match(/(\d+(?:\.\d+)?m?s)/g);
279
- if (durationMatch) {
280
- for (const d of durationMatch)
281
- durations.add(d);
282
- }
87
+ const families = new Set();
88
+ const sizes = new Set();
89
+ for (const t of analysis.typography) {
90
+ families.add(t.fontFamily.toLowerCase());
91
+ sizes.add(t.fontSize);
283
92
  }
284
- if (durations.size > 0 && durations.size <= 3) {
285
- motionPolish = Math.min(25, motionPolish + 2); // consistent timing
93
+ const kinds = new Set();
94
+ for (const c of analysis.components) {
95
+ kinds.add(c.kind);
286
96
  }
287
- const total = colorDiscipline + typographySystem + spacingLayout + motionPolish;
288
- return { colorDiscipline, typographySystem, spacingLayout, motionPolish, total };
289
- }
290
- /* ─── URL detection ─── */
291
- export function looksLikeUrl(input) {
292
- if (input.startsWith('http://') || input.startsWith('https://'))
293
- return true;
294
- // Bare domain: has dot, no path separator at start, valid TLD pattern
295
- if (/^[a-zA-Z0-9-]+\.[a-zA-Z]{2,}/.test(input) && !input.startsWith('.') && !input.startsWith('/'))
296
- return true;
297
- return false;
298
- }
299
- export function normalizeToUrl(input) {
300
- if (input.startsWith('http://') || input.startsWith('https://'))
301
- return input;
302
- return `https://${input}`;
303
- }
304
- /* ─── DesignAnalysis → ScanTokens bridge ─── */
305
- function isAnimationToken(token) {
306
- return 'library' in token && 'motionIntent' in token;
307
- }
308
- export function designAnalysisToScanTokens(analysis) {
309
- const transitionValues = [];
310
- for (const m of analysis.motion) {
311
- if (isAnimationToken(m)) {
312
- if (m.timing) {
313
- transitionValues.push(`${m.motionIntent} ${m.timing.duration}ms ${m.timing.easing}`);
314
- }
315
- }
316
- else {
317
- if (m.transition && m.transition !== 'all 0s ease 0s') {
318
- transitionValues.push(m.transition);
319
- }
320
- }
97
+ const hasTransitions = analysis.motion.some((m) => m.transition && m.transition !== 'none');
98
+ const hasAnimations = analysis.motion.some((m) => m.animation && m.animation !== 'none');
99
+ const spacingValues = extractSpacingValues(analysis.components);
100
+ let gridAligned = 0;
101
+ for (const v of spacingValues) {
102
+ if (v % 4 === 0)
103
+ gridAligned++;
321
104
  }
322
105
  return {
323
- colors: analysis.colors.map(c => c.hex),
324
- fontFamilies: [...new Set(analysis.typography.map(t => t.fontFamily.toLowerCase()))],
325
- fontSizes: [...new Set(analysis.typography.map(t => t.fontSize))],
326
- transitions: transitionValues,
327
- spacingValues: analysis.components
328
- .flatMap(c => [c.styles.padding, c.styles.margin].filter(Boolean)),
329
- cssVariableCount: Object.keys(analysis.cssVariables).length,
330
- framework: null,
106
+ colorCount: analysis.colors.length,
107
+ uniqueHues: hues.size,
108
+ typographyFamilies: [...families],
109
+ typographySizes: [...sizes],
110
+ componentKinds: [...kinds],
111
+ motionCount: analysis.motion.length,
112
+ hasTransitions,
113
+ hasAnimations,
114
+ spacingValues,
115
+ gridAligned,
116
+ gridTotal: spacingValues.length,
331
117
  };
332
118
  }
333
- /* ─── Main scan function ─── */
334
- export async function scanDesignSystem(scanPath) {
335
- const framework = await detectFramework(scanPath);
336
- const files = collectFiles(scanPath);
337
- let merged = {
338
- colors: [],
339
- fontFamilies: [],
340
- fontSizes: [],
341
- transitions: [],
342
- spacingValues: [],
343
- cssVariableCount: 0,
344
- };
345
- for (const file of files) {
346
- let content;
347
- try {
348
- content = readFileSync(file, 'utf-8');
349
- }
350
- catch {
351
- continue;
352
- }
353
- const ext = extname(file).toLowerCase();
354
- // CSS-like files get full CSS scanning
355
- if (['.css', '.scss', '.sass', '.less', '.styl'].includes(ext)) {
356
- merged = mergeTokens(merged, scanCssContent(content));
357
- }
358
- // Template/component files get both CSS and Tailwind scanning
359
- else if (['.tsx', '.jsx', '.vue', '.svelte', '.html', '.htm'].includes(ext)) {
360
- merged = mergeTokens(merged, scanCssContent(content));
361
- if (framework === 'tailwind') {
362
- merged = mergeTokens(merged, scanTailwindClasses(content));
363
- }
364
- }
365
- }
366
- const tokens = { ...merged, framework };
367
- const score = computeScore(tokens);
368
- const persona = assignPersona(tokens);
369
- return {
370
- path: scanPath,
371
- filesScanned: files.length,
372
- tokens,
373
- score,
374
- persona,
375
- framework,
376
- };
119
+ function clamp(value, min, max) {
120
+ return Math.max(min, Math.min(max, value));
377
121
  }
378
- /* ─── URL scan function ─── */
379
- export async function scanFromUrl(url) {
380
- const { analysis } = await theatricalScan(url);
381
- const tokens = designAnalysisToScanTokens(analysis);
382
- const score = computeScore(tokens);
383
- const persona = assignPersona(tokens);
384
- return {
385
- path: url,
386
- filesScanned: 0,
387
- tokens,
388
- score,
389
- persona,
390
- framework: null,
391
- };
122
+ export function computeScore(tokens) {
123
+ const colorRaw = tokens.colorCount === 0
124
+ ? 0
125
+ : tokens.uniqueHues >= 3 && tokens.uniqueHues <= 8
126
+ ? 80 + Math.min(20, tokens.colorCount)
127
+ : tokens.uniqueHues < 3
128
+ ? 40 + tokens.uniqueHues * 10
129
+ : Math.max(30, 100 - (tokens.uniqueHues - 8) * 8);
130
+ const familyScore = tokens.typographyFamilies.length >= 1 && tokens.typographyFamilies.length <= 3
131
+ ? 70 : tokens.typographyFamilies.length === 0 ? 0 : 40;
132
+ const sizeScore = tokens.typographySizes.length >= 3 ? 30 : tokens.typographySizes.length * 10;
133
+ const typographyRaw = familyScore + sizeScore;
134
+ const spacingRaw = tokens.gridTotal === 0
135
+ ? 50
136
+ : Math.round((tokens.gridAligned / tokens.gridTotal) * 100);
137
+ const motionRaw = tokens.motionCount === 0
138
+ ? 30
139
+ : tokens.hasTransitions && tokens.hasAnimations
140
+ ? Math.min(100, 70 + tokens.motionCount)
141
+ : tokens.hasTransitions
142
+ ? Math.min(90, 60 + tokens.motionCount * 2)
143
+ : 50;
144
+ const color = clamp(Math.round(colorRaw), 0, 100);
145
+ const typography = clamp(Math.round(typographyRaw), 0, 100);
146
+ const spacing = clamp(Math.round(spacingRaw), 0, 100);
147
+ const motion = clamp(Math.round(motionRaw), 0, 100);
148
+ const overall = clamp(Math.round((color + typography + spacing + motion) / 4), 0, 100);
149
+ return { overall, color, typography, spacing, motion };
392
150
  }
393
151
  //# sourceMappingURL=scan.js.map
package/dist/scan.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { ProjectRecord } from './types.js';
2
+ export interface ScorecardDetail {
3
+ value: string;
4
+ file: string;
5
+ line: number;
6
+ }
7
+ export interface CodebaseTokens {
8
+ colors: string[];
9
+ fontFamilies: string[];
10
+ fontSizes: string[];
11
+ transitions: string[];
12
+ colorOccurrences?: ScorecardDetail[];
13
+ fontFamilyOccurrences?: ScorecardDetail[];
14
+ fontSizeOccurrences?: ScorecardDetail[];
15
+ transitionOccurrences?: ScorecardDetail[];
16
+ sourceText?: string;
17
+ }
18
+ export interface ScorecardReport {
19
+ filesScanned: number;
20
+ colorScore: {
21
+ onPalette: number;
22
+ offPalette: number;
23
+ details: ScorecardDetail[];
24
+ };
25
+ typographyScore: {
26
+ onSystem: number;
27
+ offSystem: number;
28
+ details: ScorecardDetail[];
29
+ };
30
+ componentScore: {
31
+ covered: number;
32
+ missing: number;
33
+ coveredKinds: string[];
34
+ missingKinds: string[];
35
+ };
36
+ motionScore: {
37
+ consistent: number;
38
+ inconsistent: number;
39
+ details: ScorecardDetail[];
40
+ };
41
+ }
42
+ export declare function scanCssContent(css: string): CodebaseTokens;
43
+ export declare function scanCodebase(scanPath: string): Promise<{
44
+ tokens: CodebaseTokens;
45
+ filesScanned: number;
46
+ }>;
47
+ export declare function scoreAgainstProject(codebase: CodebaseTokens, project: ProjectRecord): Omit<ScorecardReport, 'filesScanned'>;
48
+ export declare function renderScorecard(report: ScorecardReport, projectId: string): string;
49
+ export declare function runScorecard(params: {
50
+ rootDir: string;
51
+ project: string;
52
+ scanPath: string;
53
+ }): Promise<string>;