design-brain-memory 0.8.2 → 0.9.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.
Files changed (126) hide show
  1. package/dist/agentBrowser.d.ts +1 -0
  2. package/dist/agentBrowser.js +1 -0
  3. package/dist/agentBrowser.js.map +1 -1
  4. package/dist/classify.d.ts +21 -0
  5. package/dist/classify.js +205 -0
  6. package/dist/classify.js.map +1 -0
  7. package/dist/cli.js +216 -219
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands.d.ts +1 -60
  10. package/dist/commands.js +10 -322
  11. package/dist/commands.js.map +1 -1
  12. package/dist/extractFromUrl.d.ts +0 -7
  13. package/dist/extractFromUrl.js +353 -82
  14. package/dist/extractFromUrl.js.map +1 -1
  15. package/dist/index.d.ts +12 -24
  16. package/dist/index.js +11 -16
  17. package/dist/index.js.map +1 -1
  18. package/dist/llm.d.ts +6 -0
  19. package/dist/llm.js +12 -1
  20. package/dist/llm.js.map +1 -1
  21. package/dist/persona.d.ts +2 -0
  22. package/dist/persona.js +234 -0
  23. package/dist/persona.js.map +1 -0
  24. package/dist/query.js +6 -1
  25. package/dist/query.js.map +1 -1
  26. package/dist/render.d.ts +10 -2
  27. package/dist/render.js +175 -80
  28. package/dist/render.js.map +1 -1
  29. package/dist/scan.d.ts +10 -0
  30. package/dist/scan.js +393 -0
  31. package/dist/scan.js.map +1 -0
  32. package/dist/scanRenderer.d.ts +2 -0
  33. package/dist/scanRenderer.js +155 -0
  34. package/dist/scanRenderer.js.map +1 -0
  35. package/dist/skillPrompt.d.ts +3 -1
  36. package/dist/skillPrompt.js +148 -22
  37. package/dist/skillPrompt.js.map +1 -1
  38. package/dist/store.d.ts +5 -1
  39. package/dist/store.js +19 -0
  40. package/dist/store.js.map +1 -1
  41. package/dist/taste.d.ts +9 -0
  42. package/dist/taste.js +598 -0
  43. package/dist/taste.js.map +1 -0
  44. package/dist/tasteDiff.d.ts +19 -0
  45. package/dist/tasteDiff.js +340 -0
  46. package/dist/tasteDiff.js.map +1 -0
  47. package/dist/tasteGenerate.d.ts +12 -0
  48. package/dist/tasteGenerate.js +140 -0
  49. package/dist/tasteGenerate.js.map +1 -0
  50. package/dist/tasteRefine.d.ts +13 -0
  51. package/dist/tasteRefine.js +351 -0
  52. package/dist/tasteRefine.js.map +1 -0
  53. package/dist/tasteRenderer.d.ts +4 -0
  54. package/dist/tasteRenderer.js +133 -0
  55. package/dist/tasteRenderer.js.map +1 -0
  56. package/dist/theatrical.d.ts +5 -0
  57. package/dist/theatrical.js +258 -0
  58. package/dist/theatrical.js.map +1 -0
  59. package/dist/types.d.ts +196 -27
  60. package/package.json +4 -3
  61. package/skills/SKILL.md +36 -0
  62. package/skills/design-brain/SKILL.md +77 -0
  63. package/README.md +0 -242
  64. package/dist/aggregate.d.ts +0 -9
  65. package/dist/aggregate.js +0 -53
  66. package/dist/aggregate.js.map +0 -1
  67. package/dist/batch.d.ts +0 -16
  68. package/dist/batch.js +0 -44
  69. package/dist/batch.js.map +0 -1
  70. package/dist/compare.d.ts +0 -33
  71. package/dist/compare.js +0 -83
  72. package/dist/compare.js.map +0 -1
  73. package/dist/componentGraph.d.ts +0 -22
  74. package/dist/componentGraph.js +0 -106
  75. package/dist/componentGraph.js.map +0 -1
  76. package/dist/contextLayer.d.ts +0 -12
  77. package/dist/contextLayer.js +0 -263
  78. package/dist/contextLayer.js.map +0 -1
  79. package/dist/cssInJs.d.ts +0 -9
  80. package/dist/cssInJs.js +0 -124
  81. package/dist/cssInJs.js.map +0 -1
  82. package/dist/graphView.d.ts +0 -21
  83. package/dist/graphView.js +0 -492
  84. package/dist/graphView.js.map +0 -1
  85. package/dist/knowledge.d.ts +0 -20
  86. package/dist/knowledge.js +0 -208
  87. package/dist/knowledge.js.map +0 -1
  88. package/dist/liveView.d.ts +0 -15
  89. package/dist/liveView.js +0 -476
  90. package/dist/liveView.js.map +0 -1
  91. package/dist/moodboard.d.ts +0 -3
  92. package/dist/moodboard.js +0 -139
  93. package/dist/moodboard.js.map +0 -1
  94. package/dist/reviewChecklist.d.ts +0 -17
  95. package/dist/reviewChecklist.js +0 -126
  96. package/dist/reviewChecklist.js.map +0 -1
  97. package/dist/scorecard.d.ts +0 -48
  98. package/dist/scorecard.js +0 -201
  99. package/dist/scorecard.js.map +0 -1
  100. package/dist/styleDictionary.d.ts +0 -16
  101. package/dist/styleDictionary.js +0 -89
  102. package/dist/styleDictionary.js.map +0 -1
  103. package/dist/svg.d.ts +0 -5
  104. package/dist/svg.js +0 -162
  105. package/dist/svg.js.map +0 -1
  106. package/dist/systemDiff.d.ts +0 -28
  107. package/dist/systemDiff.js +0 -107
  108. package/dist/systemDiff.js.map +0 -1
  109. package/dist/tailwind.d.ts +0 -2
  110. package/dist/tailwind.js +0 -122
  111. package/dist/tailwind.js.map +0 -1
  112. package/dist/tokenNaming.d.ts +0 -5
  113. package/dist/tokenNaming.js +0 -229
  114. package/dist/tokenNaming.js.map +0 -1
  115. package/dist/tokens.d.ts +0 -17
  116. package/dist/tokens.js +0 -44
  117. package/dist/tokens.js.map +0 -1
  118. package/dist/trends.d.ts +0 -12
  119. package/dist/trends.js +0 -178
  120. package/dist/trends.js.map +0 -1
  121. package/dist/wiki.d.ts +0 -10
  122. package/dist/wiki.js +0 -346
  123. package/dist/wiki.js.map +0 -1
  124. package/dist/writingStyle.d.ts +0 -38
  125. package/dist/writingStyle.js +0 -224
  126. package/dist/writingStyle.js.map +0 -1
@@ -0,0 +1,340 @@
1
+ import path from 'node:path';
2
+ import { scanDesignSystem } from './scan.js';
3
+ import { findProject, loadDatabase, loadTasteProfile, saveTasteProfile } from './store.js';
4
+ import { nowIso, slugify, unique } from './util.js';
5
+ function clampScore(value) {
6
+ return Math.max(0, Math.min(100, Math.round(value)));
7
+ }
8
+ function hexToRgb(hex) {
9
+ const clean = hex.replace('#', '').trim();
10
+ if (!/^[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(clean)) {
11
+ return null;
12
+ }
13
+ const full = clean.length === 3
14
+ ? `${clean[0]}${clean[0]}${clean[1]}${clean[1]}${clean[2]}${clean[2]}`
15
+ : clean;
16
+ return {
17
+ r: Number.parseInt(full.slice(0, 2), 16),
18
+ g: Number.parseInt(full.slice(2, 4), 16),
19
+ b: Number.parseInt(full.slice(4, 6), 16),
20
+ };
21
+ }
22
+ function rgbToHsl(rgb) {
23
+ const r = rgb.r / 255;
24
+ const g = rgb.g / 255;
25
+ const b = rgb.b / 255;
26
+ const max = Math.max(r, g, b);
27
+ const min = Math.min(r, g, b);
28
+ const l = (max + min) / 2;
29
+ if (max === min) {
30
+ return { h: 0, s: 0, l };
31
+ }
32
+ const d = max - min;
33
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
34
+ let h = 0;
35
+ if (max === r) {
36
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
37
+ }
38
+ else if (max === g) {
39
+ h = ((b - r) / d + 2) / 6;
40
+ }
41
+ else {
42
+ h = ((r - g) / d + 4) / 6;
43
+ }
44
+ return { h: h * 360, s, l };
45
+ }
46
+ function parsePxValues(input) {
47
+ return (input.match(/-?\d+(?:\.\d+)?/g) ?? [])
48
+ .map((value) => Number.parseFloat(value))
49
+ .filter((value) => Number.isFinite(value));
50
+ }
51
+ function parseDurationMs(value) {
52
+ const matches = value.match(/(\d+(?:\.\d+)?)\s*(ms|s)\b/gi) ?? [];
53
+ return matches
54
+ .map((match) => {
55
+ const parsed = match.match(/(\d+(?:\.\d+)?)\s*(ms|s)\b/i);
56
+ if (!parsed) {
57
+ return null;
58
+ }
59
+ const numeric = Number.parseFloat(parsed[1]);
60
+ if (!Number.isFinite(numeric)) {
61
+ return null;
62
+ }
63
+ return parsed[2].toLowerCase() === 's' ? numeric * 1000 : numeric;
64
+ })
65
+ .filter((value) => value !== null);
66
+ }
67
+ function isHexColor(input) {
68
+ return /^#(?:[0-9a-fA-F]{3}){1,2}$/.test(input.trim());
69
+ }
70
+ function colorDistance(hex1, hex2) {
71
+ const rgb1 = hexToRgb(hex1);
72
+ const rgb2 = hexToRgb(hex2);
73
+ if (!rgb1 || !rgb2) {
74
+ return 100;
75
+ }
76
+ const hsl1 = rgbToHsl(rgb1);
77
+ const hsl2 = rgbToHsl(rgb2);
78
+ const hueDelta = Math.min(Math.abs(hsl1.h - hsl2.h), 360 - Math.abs(hsl1.h - hsl2.h)) / 180;
79
+ const satDelta = Math.abs(hsl1.s - hsl2.s);
80
+ const lightDelta = Math.abs(hsl1.l - hsl2.l);
81
+ return Math.round((hueDelta * 0.6 + satDelta * 0.2 + lightDelta * 0.2) * 100);
82
+ }
83
+ function closestTasteColor(hex, palette) {
84
+ const closest = palette
85
+ .map((candidate) => ({ hex: candidate, distance: colorDistance(hex, candidate) }))
86
+ .sort((a, b) => a.distance - b.distance)[0];
87
+ return closest ?? { hex, distance: 100 };
88
+ }
89
+ function computeColorAlignment(tokens, taste) {
90
+ const palette = taste.color.palette
91
+ .map((entry) => entry.hex.toUpperCase())
92
+ .filter(isHexColor);
93
+ const codeColors = unique(tokens.colors.map((color) => color.toUpperCase()).filter(isHexColor));
94
+ if (codeColors.length === 0 || palette.length === 0) {
95
+ return {
96
+ alignment: 100,
97
+ summary: 'No color mismatch detected',
98
+ deltas: [],
99
+ };
100
+ }
101
+ let aligned = 0;
102
+ let close = 0;
103
+ const deltas = [];
104
+ for (const color of codeColors) {
105
+ const closest = closestTasteColor(color, palette);
106
+ if (closest.distance < 15) {
107
+ aligned += 1;
108
+ }
109
+ else if (closest.distance < 30) {
110
+ close += 1;
111
+ }
112
+ else {
113
+ deltas.push({
114
+ dimension: 'color',
115
+ issue: `Color ${color} is outside the taste palette`,
116
+ suggestion: `Closest palette match: ${closest.hex}`,
117
+ severity: 'mismatch',
118
+ });
119
+ }
120
+ }
121
+ const alignment = clampScore(((aligned + close * 0.5) / codeColors.length) * 100);
122
+ return {
123
+ alignment,
124
+ summary: `${aligned}/${codeColors.length} colors aligned with palette`,
125
+ deltas,
126
+ };
127
+ }
128
+ function normalizeFontFamily(value) {
129
+ return value.trim().replace(/['"]/g, '').toLowerCase();
130
+ }
131
+ function parseFontSize(value) {
132
+ const cleaned = value.trim().toLowerCase();
133
+ const match = cleaned.match(/^(\d+(?:\.\d+)?)(px|rem|em)$/);
134
+ if (!match) {
135
+ return null;
136
+ }
137
+ const numeric = Number.parseFloat(match[1]);
138
+ if (!Number.isFinite(numeric)) {
139
+ return null;
140
+ }
141
+ return match[2] === 'px' ? numeric : numeric * 16;
142
+ }
143
+ function computeTypographyAlignment(tokens, taste) {
144
+ const expectedFonts = unique([
145
+ taste.typography.primaryFont,
146
+ taste.typography.secondaryFont ?? '',
147
+ ].filter(Boolean).map(normalizeFontFamily));
148
+ const codeFonts = unique(tokens.fontFamilies.map(normalizeFontFamily).filter(Boolean));
149
+ const matchedFonts = codeFonts.filter((font) => expectedFonts.includes(font));
150
+ const extraFonts = codeFonts.filter((font) => !expectedFonts.includes(font));
151
+ const expectedSizes = taste.typography.sizes
152
+ .map(parseFontSize)
153
+ .filter((size) => size !== null);
154
+ const codeSizes = tokens.fontSizes
155
+ .map(parseFontSize)
156
+ .filter((size) => size !== null);
157
+ const alignedSizes = codeSizes.filter((size) => expectedSizes.some((expected) => Math.abs(size - expected) <= 1)).length;
158
+ const sizeBonus = codeSizes.length > 0 ? (alignedSizes / codeSizes.length) * 15 : 0;
159
+ let score = expectedFonts.length > 0
160
+ ? (matchedFonts.length / Math.max(codeFonts.length, 1)) * 100
161
+ : 100;
162
+ score -= extraFonts.length * 20;
163
+ score += sizeBonus;
164
+ const alignment = clampScore(score);
165
+ const deltas = [];
166
+ for (const font of extraFonts) {
167
+ deltas.push({
168
+ dimension: 'typography',
169
+ issue: `Font "${font}" is outside taste profile`,
170
+ suggestion: `Use ${[taste.typography.primaryFont, taste.typography.secondaryFont].filter(Boolean).join(', ')}`,
171
+ severity: 'warning',
172
+ });
173
+ }
174
+ return {
175
+ alignment,
176
+ summary: `${matchedFonts.length}/${Math.max(codeFonts.length, 1)} font families match taste`,
177
+ deltas,
178
+ };
179
+ }
180
+ function computeSpacingAlignment(tokens, taste) {
181
+ const codeSpacing = tokens.spacingValues.flatMap(parsePxValues).filter((value) => value > 0);
182
+ if (codeSpacing.length === 0 || taste.spacing.scale.length === 0) {
183
+ return {
184
+ alignment: 100,
185
+ summary: 'No spacing mismatch detected',
186
+ deltas: [],
187
+ };
188
+ }
189
+ const alignedCount = codeSpacing.filter((value) => taste.spacing.scale.some((scaleValue) => Math.abs(value - scaleValue) <= 2)).length;
190
+ const ratio = alignedCount / codeSpacing.length;
191
+ const alignment = clampScore(ratio * 100);
192
+ const deltas = ratio < 0.8
193
+ ? [{
194
+ dimension: 'spacing',
195
+ issue: `${Math.round((1 - ratio) * 100)}% of spacing values are off-scale`,
196
+ suggestion: `Align spacing to ${taste.spacing.scale.join(', ')}px`,
197
+ severity: 'warning',
198
+ }]
199
+ : [];
200
+ return {
201
+ alignment,
202
+ summary: `${Math.round(ratio * 100)}% of spacing values align to taste grid`,
203
+ deltas,
204
+ };
205
+ }
206
+ function classifyMotionIntensity(motionCount) {
207
+ if (motionCount === 0) {
208
+ return 'none';
209
+ }
210
+ if (motionCount <= 12) {
211
+ return 'subtle';
212
+ }
213
+ if (motionCount <= 40) {
214
+ return 'moderate';
215
+ }
216
+ return 'expressive';
217
+ }
218
+ function computeMotionAlignment(tokens, taste) {
219
+ const codeDurations = unique(tokens.transitions.flatMap(parseDurationMs).map((value) => Math.round(value)));
220
+ const tasteDurations = unique(taste.motion.durations.flatMap(parseDurationMs).map((value) => Math.round(value)));
221
+ let durationScore = 0;
222
+ if (tasteDurations.length === 0 || codeDurations.length === 0) {
223
+ durationScore = 50;
224
+ }
225
+ else {
226
+ const matches = codeDurations.filter((duration) => tasteDurations.some((expected) => Math.abs(duration - expected) <= 40)).length;
227
+ durationScore = (matches / codeDurations.length) * 50;
228
+ }
229
+ const transitionsBlob = tokens.transitions.join(' ').toLowerCase();
230
+ const easingScore = transitionsBlob.includes(taste.motion.easing.toLowerCase()) ? 30 : 0;
231
+ const expectedIntensity = taste.motion.intensity;
232
+ const actualIntensity = classifyMotionIntensity(tokens.transitions.length);
233
+ const intensityScore = expectedIntensity === actualIntensity
234
+ ? 20
235
+ : (expectedIntensity === 'none' && actualIntensity === 'subtle') || (expectedIntensity === 'subtle' && actualIntensity === 'moderate') || (expectedIntensity === 'moderate' && actualIntensity === 'subtle')
236
+ ? 10
237
+ : 0;
238
+ const alignment = clampScore(durationScore + easingScore + intensityScore);
239
+ const deltas = [];
240
+ if (easingScore === 0) {
241
+ deltas.push({
242
+ dimension: 'motion',
243
+ issue: `Expected easing "${taste.motion.easing}" not found`,
244
+ suggestion: `Adopt easing ${taste.motion.easing}`,
245
+ severity: 'warning',
246
+ });
247
+ }
248
+ return {
249
+ alignment,
250
+ summary: `Motion intensity is ${actualIntensity}; taste expects ${expectedIntensity}`,
251
+ deltas,
252
+ };
253
+ }
254
+ export function computeTasteDiff(codebaseTokens, taste) {
255
+ const color = computeColorAlignment(codebaseTokens, taste);
256
+ const typography = computeTypographyAlignment(codebaseTokens, taste);
257
+ const spacing = computeSpacingAlignment(codebaseTokens, taste);
258
+ const motion = computeMotionAlignment(codebaseTokens, taste);
259
+ const alignment = clampScore((color.alignment + typography.alignment + spacing.alignment + motion.alignment) / 4);
260
+ return {
261
+ alignment,
262
+ dimensions: {
263
+ color: { alignment: color.alignment, summary: color.summary },
264
+ typography: { alignment: typography.alignment, summary: typography.summary },
265
+ spacing: { alignment: spacing.alignment, summary: spacing.summary },
266
+ motion: { alignment: motion.alignment, summary: motion.summary },
267
+ },
268
+ deltas: [...color.deltas, ...typography.deltas, ...spacing.deltas, ...motion.deltas],
269
+ };
270
+ }
271
+ export async function scoreTaste(options) {
272
+ const profile = await loadTasteProfile(options.rootDir, options.projectId);
273
+ if (!profile) {
274
+ throw new Error(`Taste profile not found for project: ${options.projectId}`);
275
+ }
276
+ const resolvedPath = path.resolve(options.scanPath);
277
+ const scanResult = await scanDesignSystem(resolvedPath);
278
+ const diff = computeTasteDiff(scanResult.tokens, profile);
279
+ return { scanResult, diff };
280
+ }
281
+ function normalizeHost(input) {
282
+ try {
283
+ return new URL(input).hostname.toLowerCase();
284
+ }
285
+ catch {
286
+ return null;
287
+ }
288
+ }
289
+ function resolveSourceInspiration(projectInspirations, sourceUrlOrId) {
290
+ const byId = projectInspirations.find((inspiration) => inspiration.id === sourceUrlOrId);
291
+ if (byId) {
292
+ return byId;
293
+ }
294
+ const normalizedInputUrl = sourceUrlOrId.startsWith('http://') || sourceUrlOrId.startsWith('https://')
295
+ ? sourceUrlOrId
296
+ : `https://${sourceUrlOrId}`;
297
+ const byUrl = projectInspirations.find((inspiration) => inspiration.url === sourceUrlOrId || inspiration.url === normalizedInputUrl);
298
+ if (byUrl) {
299
+ return byUrl;
300
+ }
301
+ const inputHost = normalizeHost(normalizedInputUrl);
302
+ if (!inputHost) {
303
+ return null;
304
+ }
305
+ return projectInspirations.find((inspiration) => inspiration.url && normalizeHost(inspiration.url) === inputHost) ?? null;
306
+ }
307
+ export async function cherryPickComponent(options) {
308
+ const db = await loadDatabase(options.rootDir);
309
+ const project = findProject(db, slugify(options.projectId));
310
+ if (!project) {
311
+ throw new Error(`Project not found: ${options.projectId}`);
312
+ }
313
+ const source = resolveSourceInspiration(project.inspirations, options.sourceUrlOrId);
314
+ if (!source) {
315
+ throw new Error(`Could not resolve inspiration from "${options.sourceUrlOrId}"`);
316
+ }
317
+ const candidates = source.analysis.components.filter((component) => component.kind.toLowerCase() === options.componentKind.toLowerCase());
318
+ if (candidates.length === 0) {
319
+ throw new Error(`No components of kind "${options.componentKind}" found in ${source.id}`);
320
+ }
321
+ const selectedIndex = Math.max(0, Math.min(options.index ?? 0, candidates.length - 1));
322
+ const selected = candidates[selectedIndex];
323
+ const pick = {
324
+ componentKind: options.componentKind,
325
+ sourceInspirationId: source.id,
326
+ sourceUrl: source.url ?? source.id,
327
+ tokens: [selected],
328
+ styles: { ...selected.styles },
329
+ note: options.note?.trim() || undefined,
330
+ };
331
+ const profile = await loadTasteProfile(options.rootDir, project.id);
332
+ if (!profile) {
333
+ throw new Error(`Taste profile not found for project: ${project.id}`);
334
+ }
335
+ profile.components.cherryPicks.push(pick);
336
+ profile.updatedAt = nowIso();
337
+ await saveTasteProfile(options.rootDir, profile);
338
+ return pick;
339
+ }
340
+ //# sourceMappingURL=tasteDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasteDiff.js","sourceRoot":"","sources":["../src/tasteDiff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { LlmConfig, TasteProfile } from './types.js';
2
+ export declare function generateDesignTokens(taste: TasteProfile): string;
3
+ export declare function generateFromTaste(options: {
4
+ taste: TasteProfile;
5
+ target: 'component' | 'page' | 'tokens';
6
+ componentKind?: string;
7
+ llm?: LlmConfig;
8
+ framework?: string;
9
+ }): Promise<{
10
+ code: string;
11
+ explanation: string;
12
+ }>;
@@ -0,0 +1,140 @@
1
+ import { runDesignLlm } from './llm.js';
2
+ function resolvePaletteColor(taste, role, fallbackIndex, fallback) {
3
+ const byRole = taste.color.palette.find((entry) => entry.role.toLowerCase() === role);
4
+ if (byRole) {
5
+ return byRole.hex.toUpperCase();
6
+ }
7
+ return taste.color.palette[fallbackIndex]?.hex?.toUpperCase() ?? fallback;
8
+ }
9
+ function formatFontVariable(font) {
10
+ if (!font) {
11
+ return `'Inter', sans-serif`;
12
+ }
13
+ return `'${font.replace(/'/g, "\\'")}', sans-serif`;
14
+ }
15
+ function textSizeVarName(index) {
16
+ const names = ['sm', 'base', 'lg', 'xl', '2xl', '3xl', '4xl', '5xl'];
17
+ return `--text-${names[index] ?? `step-${index + 1}`}`;
18
+ }
19
+ function durationVarName(index) {
20
+ const names = ['fast', 'normal', 'slow', 'slower'];
21
+ return `--duration-${names[index] ?? `step-${index + 1}`}`;
22
+ }
23
+ function spacingVarName(value, index) {
24
+ const twIndex = Math.round(value / 4);
25
+ if (twIndex > 0) {
26
+ return `--space-${twIndex}`;
27
+ }
28
+ return `--space-step-${index + 1}`;
29
+ }
30
+ export function generateDesignTokens(taste) {
31
+ const primary = resolvePaletteColor(taste, 'primary', 0, '#111111');
32
+ const background = resolvePaletteColor(taste, 'background', 1, '#FFFFFF');
33
+ const accent = resolvePaletteColor(taste, 'accent', 2, primary);
34
+ const text = resolvePaletteColor(taste, 'text', 3, '#000000');
35
+ const surface = resolvePaletteColor(taste, 'surface', 4, '#FFFFFF');
36
+ const typographyLines = taste.typography.sizes
37
+ .slice(0, 8)
38
+ .map((size, index) => ` ${textSizeVarName(index)}: ${size};`);
39
+ const spacingLines = taste.spacing.scale
40
+ .slice(0, 12)
41
+ .map((value, index) => ` ${spacingVarName(value, index)}: ${Math.round(value)}px;`);
42
+ const durationLines = taste.motion.durations
43
+ .slice(0, 4)
44
+ .map((duration, index) => ` ${durationVarName(index)}: ${duration};`);
45
+ return [
46
+ ':root {',
47
+ ' /* Colors — from taste profile */',
48
+ ` --color-primary: ${primary};`,
49
+ ` --color-background: ${background};`,
50
+ ` --color-accent: ${accent};`,
51
+ ` --color-text: ${text};`,
52
+ ` --color-surface: ${surface};`,
53
+ '',
54
+ ' /* Typography */',
55
+ ` --font-primary: ${formatFontVariable(taste.typography.primaryFont)};`,
56
+ ` --font-secondary: ${formatFontVariable(taste.typography.secondaryFont)};`,
57
+ ...typographyLines,
58
+ '',
59
+ ' /* Spacing */',
60
+ ...spacingLines,
61
+ '',
62
+ ' /* Motion */',
63
+ ...(durationLines.length > 0 ? durationLines : [' --duration-normal: 200ms;']),
64
+ ` --easing-default: ${taste.motion.easing};`,
65
+ '',
66
+ ' /* Shape */',
67
+ ` --radius-default: ${taste.components.borderRadius};`,
68
+ '}',
69
+ ].join('\n');
70
+ }
71
+ function extractCodeBlock(raw) {
72
+ const match = raw.match(/```[a-zA-Z0-9_-]*\n([\s\S]*?)```/);
73
+ if (!match) {
74
+ return {
75
+ code: raw.trim(),
76
+ explanation: 'Generated directly from LLM output.',
77
+ };
78
+ }
79
+ const code = match[1].trim();
80
+ const explanation = raw
81
+ .replace(match[0], '')
82
+ .trim()
83
+ .replace(/^[-:\s]+/, '');
84
+ return {
85
+ code,
86
+ explanation: explanation || 'Generated from taste profile context.',
87
+ };
88
+ }
89
+ function buildGenerationPrompt(options) {
90
+ const framework = options.framework?.trim() || 'vanilla HTML/CSS';
91
+ const palette = options.taste.color.palette
92
+ .map((entry) => `${entry.role}:${entry.hex}`)
93
+ .join(', ');
94
+ const principles = (options.taste.principles ?? []).join(' | ') || 'Keep output minimal and coherent.';
95
+ const cherryPicks = options.taste.components.cherryPicks
96
+ .map((pick) => `${pick.componentKind} from ${pick.sourceUrl} (${Object.entries(pick.styles).slice(0, 4).map(([k, v]) => `${k}:${v}`).join(', ')})`)
97
+ .join('\n');
98
+ return [
99
+ `You are a frontend developer. Generate production-ready ${framework} code matching this taste profile.`,
100
+ '',
101
+ `Persona: ${options.taste.persona.name} — "${options.taste.persona.tagline}"`,
102
+ `Palette: ${palette}`,
103
+ `Typography: Primary=${options.taste.typography.primaryFont}, Secondary=${options.taste.typography.secondaryFont ?? 'none'}`,
104
+ `Spacing: ${options.taste.spacing.baseUnit}px base, scale=[${options.taste.spacing.scale.join(', ')}]`,
105
+ `Motion: ${options.taste.motion.intensity}, ${options.taste.motion.durations.join(', ')}, ${options.taste.motion.easing}`,
106
+ `Shape: radius=${options.taste.components.borderRadius}, shadow=${options.taste.components.shadowStyle}`,
107
+ `Principles: ${principles}`,
108
+ '',
109
+ 'Cherry-picked references:',
110
+ cherryPicks || '- none',
111
+ '',
112
+ `Generate: ${options.target}${options.componentKind ? ` (${options.componentKind})` : ''}`,
113
+ 'Requirements: Use exact token values. Semantic HTML. Accessible.',
114
+ 'Output: Single code block, then a 2-sentence explanation.',
115
+ ].join('\n');
116
+ }
117
+ export async function generateFromTaste(options) {
118
+ if (options.target === 'tokens') {
119
+ return {
120
+ code: generateDesignTokens(options.taste),
121
+ explanation: 'Generated deterministic CSS custom properties from the saved taste profile.',
122
+ };
123
+ }
124
+ if (!options.llm) {
125
+ throw new Error('LLM configuration is required for component/page generation');
126
+ }
127
+ const content = await runDesignLlm({
128
+ llm: options.llm,
129
+ system: 'You are a senior frontend engineer. Return only a code block followed by a short explanation.',
130
+ userContent: buildGenerationPrompt({
131
+ taste: options.taste,
132
+ target: options.target,
133
+ componentKind: options.componentKind,
134
+ framework: options.framework,
135
+ }),
136
+ temperature: 0.2,
137
+ });
138
+ return extractCodeBlock(content);
139
+ }
140
+ //# sourceMappingURL=tasteGenerate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasteGenerate.js","sourceRoot":"","sources":["../src/tasteGenerate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,SAAS,mBAAmB,CAAC,KAAmB,EAAE,IAAY,EAAE,aAAqB,EAAE,QAAgB;IACrG,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC;IACtF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,QAAQ,CAAC;AAC5E,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAmB;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC;AACtD,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACrE,OAAO,UAAU,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,WAAW,OAAO,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,gBAAgB,KAAK,GAAG,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK;SAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK;SACrC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS;SACzC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC;IAEzE,OAAO;QACL,SAAS;QACT,qCAAqC;QACrC,sBAAsB,OAAO,GAAG;QAChC,yBAAyB,UAAU,GAAG;QACtC,qBAAqB,MAAM,GAAG;QAC9B,mBAAmB,IAAI,GAAG;QAC1B,sBAAsB,OAAO,GAAG;QAChC,EAAE;QACF,oBAAoB;QACpB,qBAAqB,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG;QACxE,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG;QAC5E,GAAG,eAAe;QAClB,EAAE;QACF,iBAAiB;QACjB,GAAG,YAAY;QACf,EAAE;QACF,gBAAgB;QAChB,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC;QAC/E,uBAAuB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG;QAC7C,EAAE;QACF,eAAe;QACf,uBAAuB,KAAK,CAAC,UAAU,CAAC,YAAY,GAAG;QACvD,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE;YAChB,WAAW,EAAE,qCAAqC;SACnD,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,GAAG;SACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SACrB,IAAI,EAAE;SACN,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE3B,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,WAAW,IAAI,uCAAuC;KACpE,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAK9B;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,kBAAkB,CAAC;IAClE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO;SACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;SAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,mCAAmC,CAAC;IACvG,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW;SACrD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,SAAS,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SAClJ,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,2DAA2D,SAAS,oCAAoC;QACxG,EAAE;QACF,YAAY,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG;QAC7E,YAAY,OAAO,EAAE;QACrB,uBAAuB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,eAAe,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,EAAE;QAC5H,YAAY,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,mBAAmB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACtG,WAAW,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;QACzH,iBAAiB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,YAAY,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE;QACxG,eAAe,UAAU,EAAE;QAC3B,EAAE;QACF,2BAA2B;QAC3B,WAAW,IAAI,QAAQ;QACvB,EAAE;QACF,aAAa,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1F,kEAAkE;QAClE,2DAA2D;KAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAMvC;IACC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC;YACzC,WAAW,EAAE,6EAA6E;SAC3F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,+FAA+F;QACvG,WAAW,EAAE,qBAAqB,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QACF,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { InspirationRecord, TasteConflict, TasteDecision, TasteProfile } from './types.js';
2
+ export declare function detectConflicts(inspirations: InspirationRecord[]): TasteConflict[];
3
+ export declare function nextClarifyingQuestion(profile: TasteProfile): {
4
+ conflict: TasteConflict;
5
+ question: string;
6
+ options: string[];
7
+ } | null;
8
+ export declare function applyDecision(options: {
9
+ rootDir: string;
10
+ projectId: string;
11
+ conflictIndex: number;
12
+ answer: string;
13
+ }): Promise<TasteDecision>;