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.
- package/README.md +273 -0
- package/dist/agentBrowser.d.ts +0 -1
- package/dist/agentBrowser.js +13 -31
- package/dist/agentBrowser.js.map +1 -1
- package/dist/aggregate.d.ts +9 -0
- package/dist/aggregate.js +53 -0
- package/dist/aggregate.js.map +1 -0
- package/dist/batch.d.ts +16 -0
- package/dist/batch.js +44 -0
- package/dist/batch.js.map +1 -0
- package/dist/cli.js +250 -216
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +60 -1
- package/dist/commands.js +323 -10
- package/dist/commands.js.map +1 -1
- package/dist/compare.d.ts +33 -0
- package/dist/compare.js +83 -0
- package/dist/compare.js.map +1 -0
- package/dist/componentGraph.d.ts +22 -0
- package/dist/componentGraph.js +106 -0
- package/dist/componentGraph.js.map +1 -0
- package/dist/contextLayer.d.ts +12 -0
- package/dist/contextLayer.js +263 -0
- package/dist/contextLayer.js.map +1 -0
- package/dist/cssInJs.d.ts +9 -0
- package/dist/cssInJs.js +124 -0
- package/dist/cssInJs.js.map +1 -0
- package/dist/extractFromUrl.d.ts +8 -0
- package/dist/extractFromUrl.js +508 -414
- package/dist/extractFromUrl.js.map +1 -1
- package/dist/graphView.d.ts +21 -0
- package/dist/graphView.js +492 -0
- package/dist/graphView.js.map +1 -0
- package/dist/index.d.ts +26 -11
- package/dist/index.js +17 -10
- package/dist/index.js.map +1 -1
- package/dist/knowledge.d.ts +20 -0
- package/dist/knowledge.js +208 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/liveView.d.ts +15 -0
- package/dist/liveView.js +475 -0
- package/dist/liveView.js.map +1 -0
- package/dist/llm.js +1 -9
- package/dist/llm.js.map +1 -1
- package/dist/moodboard.d.ts +3 -0
- package/dist/moodboard.js +152 -0
- package/dist/moodboard.js.map +1 -0
- package/dist/persona.d.ts +2 -2
- package/dist/persona.js +82 -210
- package/dist/persona.js.map +1 -1
- package/dist/query.js +1 -6
- package/dist/query.js.map +1 -1
- package/dist/render.d.ts +2 -10
- package/dist/render.js +80 -175
- package/dist/render.js.map +1 -1
- package/dist/reviewChecklist.d.ts +17 -0
- package/dist/reviewChecklist.js +126 -0
- package/dist/reviewChecklist.js.map +1 -0
- package/dist/scan.d.ts +19 -7
- package/dist/scan.js +132 -374
- package/dist/scan.js.map +1 -1
- package/dist/scorecard.d.ts +53 -0
- package/dist/scorecard.js +325 -0
- package/dist/scorecard.js.map +1 -0
- package/dist/skillPrompt.d.ts +1 -3
- package/dist/skillPrompt.js +22 -148
- package/dist/skillPrompt.js.map +1 -1
- package/dist/store.d.ts +2 -2
- package/dist/store.js +7 -9
- package/dist/store.js.map +1 -1
- package/dist/styleDictionary.d.ts +16 -0
- package/dist/styleDictionary.js +89 -0
- package/dist/styleDictionary.js.map +1 -0
- package/dist/svg.d.ts +5 -0
- package/dist/svg.js +162 -0
- package/dist/svg.js.map +1 -0
- package/dist/systemDiff.d.ts +28 -0
- package/dist/systemDiff.js +107 -0
- package/dist/systemDiff.js.map +1 -0
- package/dist/tailwind.d.ts +2 -0
- package/dist/tailwind.js +122 -0
- package/dist/tailwind.js.map +1 -0
- package/dist/taste.d.ts +3 -2
- package/dist/taste.js +349 -536
- package/dist/taste.js.map +1 -1
- package/dist/tasteRenderer.d.ts +2 -3
- package/dist/tasteRenderer.js +123 -119
- package/dist/tasteRenderer.js.map +1 -1
- package/dist/tokenNaming.d.ts +5 -0
- package/dist/tokenNaming.js +229 -0
- package/dist/tokenNaming.js.map +1 -0
- package/dist/tokens.d.ts +17 -0
- package/dist/tokens.js +44 -0
- package/dist/tokens.js.map +1 -0
- package/dist/trends.d.ts +12 -0
- package/dist/trends.js +178 -0
- package/dist/trends.js.map +1 -0
- package/dist/types.d.ts +47 -101
- package/dist/wiki.d.ts +10 -0
- package/dist/wiki.js +346 -0
- package/dist/wiki.js.map +1 -0
- package/dist/writingStyle.d.ts +38 -0
- package/dist/writingStyle.js +224 -0
- package/dist/writingStyle.js.map +1 -0
- package/package.json +5 -4
- package/dist/classify.d.ts +0 -21
- package/dist/classify.js +0 -205
- package/dist/classify.js.map +0 -1
- package/dist/scanRenderer.d.ts +0 -2
- package/dist/scanRenderer.js +0 -155
- package/dist/scanRenderer.js.map +0 -1
- package/dist/tasteDiff.d.ts +0 -19
- package/dist/tasteDiff.js +0 -340
- package/dist/tasteDiff.js.map +0 -1
- package/dist/tasteGenerate.d.ts +0 -12
- package/dist/tasteGenerate.js +0 -140
- package/dist/tasteGenerate.js.map +0 -1
- package/dist/tasteRefine.d.ts +0 -13
- package/dist/tasteRefine.js +0 -351
- package/dist/tasteRefine.js.map +0 -1
- package/dist/theatrical.d.ts +0 -5
- package/dist/theatrical.js +0 -258
- package/dist/theatrical.js.map +0 -1
- package/skills/SKILL.md +0 -36
- package/skills/design-brain/SKILL.md +0 -77
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { aggregateColors, aggregateTypography, aggregateMotion } from './aggregate.js';
|
|
4
|
+
import { projectDir } from './store.js';
|
|
5
|
+
const HEX_RE = /#[0-9a-fA-F]{3,8}\b/g;
|
|
6
|
+
const RGB_RE = /rgba?\([^)]+\)/g;
|
|
7
|
+
const FONT_FAMILY_RE = /font-family:\s*([^;]+)/g;
|
|
8
|
+
const FONT_SIZE_RE = /font-size:\s*([^;]+)/g;
|
|
9
|
+
const TRANSITION_RE = /transition[^:]*:\s*([^;]+)/g;
|
|
10
|
+
const SCAN_EXTENSIONS = new Set(['.css', '.scss', '.less', '.html', '.tsx', '.jsx', '.vue', '.svelte']);
|
|
11
|
+
export function scanCssContent(css) {
|
|
12
|
+
const colors = [];
|
|
13
|
+
const fontFamilies = [];
|
|
14
|
+
const fontSizes = [];
|
|
15
|
+
const transitions = [];
|
|
16
|
+
for (const match of css.matchAll(HEX_RE)) {
|
|
17
|
+
colors.push(match[0]);
|
|
18
|
+
}
|
|
19
|
+
for (const match of css.matchAll(RGB_RE)) {
|
|
20
|
+
colors.push(match[0]);
|
|
21
|
+
}
|
|
22
|
+
for (const match of css.matchAll(FONT_FAMILY_RE)) {
|
|
23
|
+
fontFamilies.push(match[1].trim());
|
|
24
|
+
}
|
|
25
|
+
for (const match of css.matchAll(FONT_SIZE_RE)) {
|
|
26
|
+
fontSizes.push(match[1].trim());
|
|
27
|
+
}
|
|
28
|
+
for (const match of css.matchAll(TRANSITION_RE)) {
|
|
29
|
+
transitions.push(match[1].trim());
|
|
30
|
+
}
|
|
31
|
+
return { colors, fontFamilies, fontSizes, transitions };
|
|
32
|
+
}
|
|
33
|
+
function cloneRegex(pattern) {
|
|
34
|
+
const flags = pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`;
|
|
35
|
+
return new RegExp(pattern.source, flags);
|
|
36
|
+
}
|
|
37
|
+
function collectOccurrences(content, file) {
|
|
38
|
+
const lines = content.split(/\r?\n/);
|
|
39
|
+
const colorOccurrences = [];
|
|
40
|
+
const fontFamilyOccurrences = [];
|
|
41
|
+
const fontSizeOccurrences = [];
|
|
42
|
+
const transitionOccurrences = [];
|
|
43
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
44
|
+
const line = lines[index];
|
|
45
|
+
const lineNo = index + 1;
|
|
46
|
+
for (const match of line.matchAll(cloneRegex(HEX_RE))) {
|
|
47
|
+
colorOccurrences.push({ value: match[0], file, line: lineNo });
|
|
48
|
+
}
|
|
49
|
+
for (const match of line.matchAll(cloneRegex(RGB_RE))) {
|
|
50
|
+
colorOccurrences.push({ value: match[0], file, line: lineNo });
|
|
51
|
+
}
|
|
52
|
+
for (const match of line.matchAll(cloneRegex(FONT_FAMILY_RE))) {
|
|
53
|
+
fontFamilyOccurrences.push({ value: match[1].trim(), file, line: lineNo });
|
|
54
|
+
}
|
|
55
|
+
for (const match of line.matchAll(cloneRegex(FONT_SIZE_RE))) {
|
|
56
|
+
fontSizeOccurrences.push({ value: match[1].trim(), file, line: lineNo });
|
|
57
|
+
}
|
|
58
|
+
for (const match of line.matchAll(cloneRegex(TRANSITION_RE))) {
|
|
59
|
+
transitionOccurrences.push({ value: match[1].trim(), file, line: lineNo });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
colorOccurrences,
|
|
64
|
+
fontFamilyOccurrences,
|
|
65
|
+
fontSizeOccurrences,
|
|
66
|
+
transitionOccurrences,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function collectFiles(dirPath) {
|
|
70
|
+
const files = [];
|
|
71
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
74
|
+
if (entry.isDirectory()) {
|
|
75
|
+
if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'dist')
|
|
76
|
+
continue;
|
|
77
|
+
files.push(...await collectFiles(fullPath));
|
|
78
|
+
}
|
|
79
|
+
else if (SCAN_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {
|
|
80
|
+
files.push(fullPath);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return files;
|
|
84
|
+
}
|
|
85
|
+
export async function scanCodebase(scanPath) {
|
|
86
|
+
const files = await collectFiles(scanPath);
|
|
87
|
+
const merged = {
|
|
88
|
+
colors: [],
|
|
89
|
+
fontFamilies: [],
|
|
90
|
+
fontSizes: [],
|
|
91
|
+
transitions: [],
|
|
92
|
+
colorOccurrences: [],
|
|
93
|
+
fontFamilyOccurrences: [],
|
|
94
|
+
fontSizeOccurrences: [],
|
|
95
|
+
transitionOccurrences: [],
|
|
96
|
+
sourceText: '',
|
|
97
|
+
};
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
100
|
+
const tokens = scanCssContent(content);
|
|
101
|
+
const occurrences = collectOccurrences(content, file);
|
|
102
|
+
merged.colors.push(...tokens.colors);
|
|
103
|
+
merged.fontFamilies.push(...tokens.fontFamilies);
|
|
104
|
+
merged.fontSizes.push(...tokens.fontSizes);
|
|
105
|
+
merged.transitions.push(...tokens.transitions);
|
|
106
|
+
merged.colorOccurrences?.push(...occurrences.colorOccurrences);
|
|
107
|
+
merged.fontFamilyOccurrences?.push(...occurrences.fontFamilyOccurrences);
|
|
108
|
+
merged.fontSizeOccurrences?.push(...occurrences.fontSizeOccurrences);
|
|
109
|
+
merged.transitionOccurrences?.push(...occurrences.transitionOccurrences);
|
|
110
|
+
merged.sourceText = `${merged.sourceText ?? ''}\n${content.toLowerCase()}`;
|
|
111
|
+
}
|
|
112
|
+
return { tokens: merged, filesScanned: files.length };
|
|
113
|
+
}
|
|
114
|
+
function parseRgbToHex(value) {
|
|
115
|
+
const match = value.trim().match(/^rgba?\(([^)]+)\)$/i);
|
|
116
|
+
if (!match) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const parts = match[1].split(',').map((part) => part.trim());
|
|
120
|
+
const r = Number.parseFloat(parts[0] ?? '');
|
|
121
|
+
const g = Number.parseFloat(parts[1] ?? '');
|
|
122
|
+
const b = Number.parseFloat(parts[2] ?? '');
|
|
123
|
+
if ([r, g, b].some((channel) => Number.isNaN(channel))) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const toHex = (channel) => Math.max(0, Math.min(255, Math.round(channel))).toString(16).padStart(2, '0').toUpperCase();
|
|
127
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
128
|
+
}
|
|
129
|
+
function normalizeColor(value) {
|
|
130
|
+
const trimmed = value.trim();
|
|
131
|
+
const rgbHex = parseRgbToHex(trimmed);
|
|
132
|
+
if (rgbHex) {
|
|
133
|
+
return rgbHex;
|
|
134
|
+
}
|
|
135
|
+
const hex = trimmed.toUpperCase();
|
|
136
|
+
if (/^#[0-9A-F]{3}$/.test(hex)) {
|
|
137
|
+
const [, r, g, b] = /^#([0-9A-F])([0-9A-F])([0-9A-F])$/.exec(hex) ?? [];
|
|
138
|
+
return `#${r}${r}${g}${g}${b}${b}`;
|
|
139
|
+
}
|
|
140
|
+
return hex;
|
|
141
|
+
}
|
|
142
|
+
function parseDurationMs(value) {
|
|
143
|
+
const match = value.match(/(\d+(?:\.\d+)?)(ms|s)\b/i);
|
|
144
|
+
if (!match) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const numeric = Number.parseFloat(match[1]);
|
|
148
|
+
if (!Number.isFinite(numeric)) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return match[2].toLowerCase() === 's' ? Math.round(numeric * 1000) : Math.round(numeric);
|
|
152
|
+
}
|
|
153
|
+
function matchesKindInSource(kind, sourceText) {
|
|
154
|
+
const normalized = kind.toLowerCase();
|
|
155
|
+
const aliases = {
|
|
156
|
+
button: ['button', 'btn'],
|
|
157
|
+
link: ['<a', 'href=', 'link'],
|
|
158
|
+
navigation: ['<nav', 'navigation', 'navbar', 'menu'],
|
|
159
|
+
card: ['card'],
|
|
160
|
+
'form-control': ['form-control', '<input', '<select', '<textarea'],
|
|
161
|
+
header: ['<header', 'header'],
|
|
162
|
+
footer: ['<footer', 'footer'],
|
|
163
|
+
hero: ['hero'],
|
|
164
|
+
};
|
|
165
|
+
const candidates = aliases[normalized] ?? [normalized];
|
|
166
|
+
return candidates.some((candidate) => sourceText.includes(candidate));
|
|
167
|
+
}
|
|
168
|
+
function fallbackDetails(values) {
|
|
169
|
+
return values.map((value) => ({ value, file: '', line: 0 }));
|
|
170
|
+
}
|
|
171
|
+
export function scoreAgainstProject(codebase, project) {
|
|
172
|
+
// Color scoring
|
|
173
|
+
const paletteColors = new Set(aggregateColors(project.inspirations).map((c) => normalizeColor(c.hex)));
|
|
174
|
+
const colorEntries = codebase.colorOccurrences?.length
|
|
175
|
+
? codebase.colorOccurrences
|
|
176
|
+
: fallbackDetails(codebase.colors);
|
|
177
|
+
let onPalette = 0;
|
|
178
|
+
let offPalette = 0;
|
|
179
|
+
const colorDetails = [];
|
|
180
|
+
for (const color of colorEntries) {
|
|
181
|
+
const normalized = normalizeColor(color.value);
|
|
182
|
+
if (paletteColors.has(normalized)) {
|
|
183
|
+
onPalette += 1;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
offPalette += 1;
|
|
187
|
+
colorDetails.push(color);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Typography scoring
|
|
191
|
+
const systemFonts = new Set(aggregateTypography(project.inspirations).map((t) => t.fontFamily.split(',')[0].trim().replace(/['"]/g, '').toLowerCase()));
|
|
192
|
+
const systemSizes = new Set(aggregateTypography(project.inspirations).map((t) => t.fontSize));
|
|
193
|
+
const familyEntries = codebase.fontFamilyOccurrences?.length
|
|
194
|
+
? codebase.fontFamilyOccurrences
|
|
195
|
+
: fallbackDetails(codebase.fontFamilies);
|
|
196
|
+
const sizeEntries = codebase.fontSizeOccurrences?.length
|
|
197
|
+
? codebase.fontSizeOccurrences
|
|
198
|
+
: fallbackDetails(codebase.fontSizes);
|
|
199
|
+
let onSystem = 0;
|
|
200
|
+
let offSystem = 0;
|
|
201
|
+
const typoDetails = [];
|
|
202
|
+
for (const family of familyEntries) {
|
|
203
|
+
const first = family.value.split(',')[0].trim().replace(/['"]/g, '').toLowerCase();
|
|
204
|
+
if (systemFonts.has(first)) {
|
|
205
|
+
onSystem += 1;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
offSystem += 1;
|
|
209
|
+
typoDetails.push(family);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
for (const size of sizeEntries) {
|
|
213
|
+
if (systemSizes.has(size.value.trim())) {
|
|
214
|
+
onSystem += 1;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
offSystem += 1;
|
|
218
|
+
typoDetails.push(size);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Component scoring
|
|
222
|
+
const capturedKinds = [...new Set(project.inspirations.flatMap((i) => i.analysis.components.map((c) => c.kind)))];
|
|
223
|
+
const sourceText = (codebase.sourceText ?? '').toLowerCase();
|
|
224
|
+
const coveredKinds = capturedKinds.filter((kind) => matchesKindInSource(kind, sourceText));
|
|
225
|
+
const missingKinds = capturedKinds.filter((kind) => !coveredKinds.includes(kind));
|
|
226
|
+
// Motion scoring
|
|
227
|
+
const capturedDurations = new Set();
|
|
228
|
+
for (const m of aggregateMotion(project.inspirations)) {
|
|
229
|
+
for (const t of m.transitions ?? []) {
|
|
230
|
+
const ms = parseDurationMs(t.duration);
|
|
231
|
+
if (ms !== null) {
|
|
232
|
+
capturedDurations.add(ms);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const transitionEntries = codebase.transitionOccurrences?.length
|
|
237
|
+
? codebase.transitionOccurrences
|
|
238
|
+
: fallbackDetails(codebase.transitions);
|
|
239
|
+
let consistent = 0;
|
|
240
|
+
let inconsistent = 0;
|
|
241
|
+
const motionDetails = [];
|
|
242
|
+
for (const transition of transitionEntries) {
|
|
243
|
+
const durationMs = parseDurationMs(transition.value);
|
|
244
|
+
if (durationMs === null) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (capturedDurations.has(durationMs)) {
|
|
248
|
+
consistent += 1;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
inconsistent += 1;
|
|
252
|
+
motionDetails.push(transition);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
colorScore: { onPalette, offPalette, details: colorDetails.slice(0, 20) },
|
|
257
|
+
typographyScore: { onSystem, offSystem, details: typoDetails.slice(0, 20) },
|
|
258
|
+
componentScore: { covered: coveredKinds.length, missing: missingKinds.length, coveredKinds, missingKinds },
|
|
259
|
+
motionScore: { consistent, inconsistent, details: motionDetails.slice(0, 20) },
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function pct(on, off) {
|
|
263
|
+
const total = on + off;
|
|
264
|
+
if (total === 0)
|
|
265
|
+
return 'N/A';
|
|
266
|
+
return `${Math.round((on / total) * 100)}%`;
|
|
267
|
+
}
|
|
268
|
+
export function renderScorecard(report, projectId) {
|
|
269
|
+
const colorPct = pct(report.colorScore.onPalette, report.colorScore.offPalette);
|
|
270
|
+
const typoPct = pct(report.typographyScore.onSystem, report.typographyScore.offSystem);
|
|
271
|
+
const motionPct = pct(report.motionScore.consistent, report.motionScore.inconsistent);
|
|
272
|
+
const lines = [
|
|
273
|
+
`# Design System Scorecard — ${projectId}\n`,
|
|
274
|
+
`Files scanned: ${report.filesScanned}\n`,
|
|
275
|
+
'## Scores\n',
|
|
276
|
+
'| Category | Score | On-System | Off-System |',
|
|
277
|
+
'| --- | --- | --- | --- |',
|
|
278
|
+
`| Colors | ${colorPct} | ${report.colorScore.onPalette} | ${report.colorScore.offPalette} |`,
|
|
279
|
+
`| Typography | ${typoPct} | ${report.typographyScore.onSystem} | ${report.typographyScore.offSystem} |`,
|
|
280
|
+
`| Components | ${report.componentScore.covered} kinds | ${report.componentScore.covered} | ${report.componentScore.missing} |`,
|
|
281
|
+
`| Motion | ${motionPct} | ${report.motionScore.consistent} | ${report.motionScore.inconsistent} |`,
|
|
282
|
+
'',
|
|
283
|
+
];
|
|
284
|
+
if (report.colorScore.details.length > 0) {
|
|
285
|
+
lines.push('## Off-Palette Colors\n');
|
|
286
|
+
for (const d of report.colorScore.details) {
|
|
287
|
+
const location = d.file ? ` (${d.file}${d.line > 0 ? `:${d.line}` : ''})` : '';
|
|
288
|
+
lines.push(`- \`${d.value}\`${location}`);
|
|
289
|
+
}
|
|
290
|
+
lines.push('');
|
|
291
|
+
}
|
|
292
|
+
if (report.typographyScore.details.length > 0) {
|
|
293
|
+
lines.push('## Off-System Typography\n');
|
|
294
|
+
for (const d of report.typographyScore.details) {
|
|
295
|
+
const location = d.file ? ` (${d.file}${d.line > 0 ? `:${d.line}` : ''})` : '';
|
|
296
|
+
lines.push(`- \`${d.value}\`${location}`);
|
|
297
|
+
}
|
|
298
|
+
lines.push('');
|
|
299
|
+
}
|
|
300
|
+
if (report.motionScore.details.length > 0) {
|
|
301
|
+
lines.push('## Inconsistent Motion\n');
|
|
302
|
+
for (const d of report.motionScore.details) {
|
|
303
|
+
const location = d.file ? ` (${d.file}${d.line > 0 ? `:${d.line}` : ''})` : '';
|
|
304
|
+
lines.push(`- \`${d.value}\`${location}`);
|
|
305
|
+
}
|
|
306
|
+
lines.push('');
|
|
307
|
+
}
|
|
308
|
+
return lines.join('\n');
|
|
309
|
+
}
|
|
310
|
+
export async function runScorecard(params) {
|
|
311
|
+
const { loadDatabase } = await import('./store.js');
|
|
312
|
+
const db = await loadDatabase(params.rootDir);
|
|
313
|
+
const project = db.projects.find((p) => p.id === params.project);
|
|
314
|
+
if (!project)
|
|
315
|
+
throw new Error(`Project not found: ${params.project}`);
|
|
316
|
+
const { tokens, filesScanned } = await scanCodebase(params.scanPath);
|
|
317
|
+
const scores = scoreAgainstProject(tokens, project);
|
|
318
|
+
const report = { filesScanned, ...scores };
|
|
319
|
+
const md = renderScorecard(report, project.id);
|
|
320
|
+
const outPath = path.join(projectDir(params.rootDir, project.id), 'scorecard.md');
|
|
321
|
+
await fs.ensureDir(path.dirname(outPath));
|
|
322
|
+
await fs.writeFile(outPath, md);
|
|
323
|
+
return outPath;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=scorecard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorecard.js","sourceRoot":"","sources":["../src/scorecard.ts"],"names":[],"mappings":"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"}
|
package/dist/skillPrompt.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { AgentInfo, InstallResult } from './types.js';
|
|
2
1
|
export declare function getDefaultSkillRepo(): string;
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function installSkillToAgents(agents: AgentInfo[]): InstallResult[];
|
|
2
|
+
export declare function installSkill(repo?: string): boolean;
|
|
5
3
|
export declare function maybePromptSkillInstall(skipPrompts: boolean): Promise<void>;
|
package/dist/skillPrompt.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
1
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
3
|
import { homedir } from 'node:os';
|
|
3
|
-
import { join
|
|
4
|
+
import { join } from 'node:path';
|
|
4
5
|
import { confirmPrompt } from './interactive.js';
|
|
5
6
|
const CONFIG_DIRECTORY = join(homedir(), '.design-brain-memory');
|
|
6
7
|
const CONFIG_FILE = join(CONFIG_DIRECTORY, 'config.json');
|
|
7
8
|
const DEFAULT_SKILL_REPO = 'design-brain/design-brain';
|
|
8
9
|
function readConfig() {
|
|
9
10
|
try {
|
|
10
|
-
if (!existsSync(CONFIG_FILE))
|
|
11
|
+
if (!existsSync(CONFIG_FILE)) {
|
|
11
12
|
return {};
|
|
13
|
+
}
|
|
12
14
|
return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));
|
|
13
15
|
}
|
|
14
16
|
catch {
|
|
@@ -23,170 +25,42 @@ function writeConfig(config) {
|
|
|
23
25
|
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
24
26
|
}
|
|
25
27
|
catch {
|
|
26
|
-
// no-op:
|
|
28
|
+
// no-op: prompt persistence should never block command execution
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
|
-
/* ─── Backward-compatible export ─── */
|
|
30
31
|
export function getDefaultSkillRepo() {
|
|
31
32
|
return process.env.DESIGN_BRAIN_SKILL_REPO?.trim() || DEFAULT_SKILL_REPO;
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
-
function getSkillContent() {
|
|
35
|
-
// Try to load from bundled skills/SKILL.md first
|
|
36
|
-
const bundledPath = join(dirname(new URL(import.meta.url).pathname), '..', 'skills', 'SKILL.md');
|
|
34
|
+
export function installSkill(repo = getDefaultSkillRepo()) {
|
|
37
35
|
try {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
36
|
+
execSync(`npx -y skills add ${repo}`, { stdio: 'inherit' });
|
|
37
|
+
return true;
|
|
41
38
|
}
|
|
42
39
|
catch {
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
// Inline fallback
|
|
46
|
-
return `---
|
|
47
|
-
name: design-brain
|
|
48
|
-
description: Design system awareness for AI coding agents. Provides design token guidance, component patterns, and design principles extracted from your codebase.
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
# Design Brain Skill
|
|
52
|
-
|
|
53
|
-
You have access to design system knowledge extracted by design-brain-memory.
|
|
54
|
-
|
|
55
|
-
## When to Use This Skill
|
|
56
|
-
|
|
57
|
-
- When writing UI components, reference the color palette and typography system
|
|
58
|
-
- When adding spacing/layout, follow the established spacing scale
|
|
59
|
-
- When creating new components, follow existing component patterns
|
|
60
|
-
- When adding transitions/animations, match existing motion patterns
|
|
61
|
-
|
|
62
|
-
## Design Principles
|
|
63
|
-
|
|
64
|
-
1. **Consistency** — Use existing design tokens rather than ad-hoc values
|
|
65
|
-
2. **Systematic spacing** — Prefer multiples of 4px (4, 8, 12, 16, 24, 32, 48, 64)
|
|
66
|
-
3. **Color discipline** — Use palette colors from CSS variables or design tokens
|
|
67
|
-
4. **Typography scale** — Stick to the established font size scale
|
|
68
|
-
5. **Motion restraint** — Use consistent transition timing across the UI
|
|
69
|
-
|
|
70
|
-
## Quick Reference
|
|
71
|
-
|
|
72
|
-
- Run \`npx design-brain-memory scan\` to see your design health score
|
|
73
|
-
- Run \`npx design-brain-memory scan .\` to scan the current directory
|
|
74
|
-
- Design tokens are extracted from CSS, SCSS, and component files
|
|
75
|
-
|
|
76
|
-
## Tips for Code Generation
|
|
77
|
-
|
|
78
|
-
- Prefer CSS custom properties (--var-name) over hardcoded values
|
|
79
|
-
- Use the project's existing color palette — don't introduce new colors without reason
|
|
80
|
-
- Match existing component patterns before creating new abstractions
|
|
81
|
-
- Keep transition durations consistent (prefer 150ms, 200ms, or 300ms)
|
|
82
|
-
`;
|
|
83
|
-
}
|
|
84
|
-
/* ─── Agent detection ─── */
|
|
85
|
-
const AGENT_DEFS = [
|
|
86
|
-
{
|
|
87
|
-
name: 'Claude Code',
|
|
88
|
-
configCheck: join(homedir(), '.claude'),
|
|
89
|
-
skillSubpath: join('.claude', 'skills', 'design-brain', 'SKILL.md'),
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
name: 'Cursor',
|
|
93
|
-
configCheck: join(homedir(), '.cursor'),
|
|
94
|
-
skillSubpath: join('.cursor', 'skills', 'design-brain', 'SKILL.md'),
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
name: 'Windsurf',
|
|
98
|
-
configCheck: join(homedir(), '.codeium', 'windsurf'),
|
|
99
|
-
skillSubpath: join('.codeium', 'windsurf', 'skills', 'design-brain', 'SKILL.md'),
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
name: 'Amp',
|
|
103
|
-
configCheck: join(homedir(), '.amp'),
|
|
104
|
-
skillSubpath: join('.amp', 'skills', 'design-brain', 'SKILL.md'),
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: 'Codex',
|
|
108
|
-
configCheck: join(homedir(), '.codex'),
|
|
109
|
-
skillSubpath: join('.codex', 'skills', 'design-brain', 'SKILL.md'),
|
|
110
|
-
},
|
|
111
|
-
];
|
|
112
|
-
export function detectAgents() {
|
|
113
|
-
const agents = [];
|
|
114
|
-
for (const def of AGENT_DEFS) {
|
|
115
|
-
if (existsSync(def.configCheck)) {
|
|
116
|
-
agents.push({
|
|
117
|
-
name: def.name,
|
|
118
|
-
configDir: def.configCheck,
|
|
119
|
-
skillDir: join(homedir(), def.skillSubpath),
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return agents;
|
|
124
|
-
}
|
|
125
|
-
export function installSkillToAgents(agents) {
|
|
126
|
-
const content = getSkillContent();
|
|
127
|
-
const results = [];
|
|
128
|
-
for (const agent of agents) {
|
|
129
|
-
try {
|
|
130
|
-
const dir = dirname(agent.skillDir);
|
|
131
|
-
if (!existsSync(dir)) {
|
|
132
|
-
mkdirSync(dir, { recursive: true });
|
|
133
|
-
}
|
|
134
|
-
writeFileSync(agent.skillDir, content, 'utf-8');
|
|
135
|
-
results.push({ agent, success: true });
|
|
136
|
-
}
|
|
137
|
-
catch (err) {
|
|
138
|
-
results.push({
|
|
139
|
-
agent,
|
|
140
|
-
success: false,
|
|
141
|
-
error: err instanceof Error ? err.message : String(err),
|
|
142
|
-
});
|
|
143
|
-
}
|
|
40
|
+
return false;
|
|
144
41
|
}
|
|
145
|
-
return results;
|
|
146
42
|
}
|
|
147
|
-
/* ─── ANSI helpers ─── */
|
|
148
|
-
const USE_COLOR = process.stdout.isTTY !== false;
|
|
149
|
-
const RESET = USE_COLOR ? '\x1b[0m' : '';
|
|
150
|
-
const BOLD = USE_COLOR ? '\x1b[1m' : '';
|
|
151
|
-
const GREEN = USE_COLOR ? '\x1b[32m' : '';
|
|
152
|
-
const DIM = USE_COLOR ? '\x1b[2m' : '';
|
|
153
|
-
const RED = USE_COLOR ? '\x1b[31m' : '';
|
|
154
|
-
/* ─── Main prompt flow ─── */
|
|
155
43
|
export async function maybePromptSkillInstall(skipPrompts) {
|
|
156
44
|
const config = readConfig();
|
|
157
|
-
if (config.skillPromptDismissed)
|
|
158
|
-
return;
|
|
159
|
-
if (skipPrompts)
|
|
160
|
-
return;
|
|
161
|
-
const agents = detectAgents();
|
|
162
|
-
if (agents.length === 0) {
|
|
163
|
-
console.log(`\n${DIM}No AI agents detected. Skill installation skipped.${RESET}`);
|
|
45
|
+
if (config.skillPromptDismissed) {
|
|
164
46
|
return;
|
|
165
47
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
console.log(` ${DIM}\u2022${RESET} ${agent.name}`);
|
|
48
|
+
if (skipPrompts) {
|
|
49
|
+
return;
|
|
169
50
|
}
|
|
170
|
-
console.log('');
|
|
171
|
-
|
|
51
|
+
console.log('\nTip: install the Design Brain skill for coding agents (Cursor/Claude/Copilot).');
|
|
52
|
+
console.log(`Run via skills registry: npx -y skills add ${getDefaultSkillRepo()}\n`);
|
|
53
|
+
const shouldInstall = await confirmPrompt('Install Design Brain skill now?', true);
|
|
172
54
|
if (!shouldInstall) {
|
|
173
|
-
writeConfig({ ...config, skillPromptDismissed: true });
|
|
174
55
|
return;
|
|
175
56
|
}
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
console.log(` ${RED}\u2718${RESET} ${r.agent.name} — ${r.error}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
const allOk = results.every(r => r.success);
|
|
187
|
-
if (allOk) {
|
|
188
|
-
console.log(`\n ${GREEN}Design Brain skill installed to all agents.${RESET}\n`);
|
|
57
|
+
const installed = installSkill();
|
|
58
|
+
if (installed) {
|
|
59
|
+
console.log('Design Brain skill installed.');
|
|
60
|
+
writeConfig({ ...config, skillPromptDismissed: true });
|
|
61
|
+
return;
|
|
189
62
|
}
|
|
190
|
-
|
|
63
|
+
console.log('Skill install failed. You can install manually:');
|
|
64
|
+
console.log(` npx -y skills add ${getDefaultSkillRepo()}`);
|
|
191
65
|
}
|
|
192
66
|
//# sourceMappingURL=skillPrompt.js.map
|
package/dist/skillPrompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillPrompt.js","sourceRoot":"","sources":["../src/skillPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"skillPrompt.js","sourceRoot":"","sources":["../src/skillPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;AACjE,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAEvD,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAe,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,kBAAkB,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAI,GAAG,mBAAmB,EAAE;IACvD,IAAI,CAAC;QACH,QAAQ,CAAC,qBAAqB,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,WAAoB;IAChE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,8CAA8C,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAErF,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,uBAAuB,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/store.d.ts
CHANGED
|
@@ -3,8 +3,6 @@ export declare function brainRoot(rootDir: string): string;
|
|
|
3
3
|
export declare function databasePath(rootDir: string): string;
|
|
4
4
|
export declare function projectDir(rootDir: string, projectId: string): string;
|
|
5
5
|
export declare function projectAssetDir(rootDir: string, projectId: string): string;
|
|
6
|
-
export declare function tasteDir(rootDir: string): string;
|
|
7
|
-
export declare function tasteProfilePath(rootDir: string, projectId: string): string;
|
|
8
6
|
export declare function ensureBrainExists(rootDir: string): Promise<void>;
|
|
9
7
|
export declare function loadDatabase(rootDir: string): Promise<DesignBrainDatabase>;
|
|
10
8
|
export declare function saveDatabase(rootDir: string, db: DesignBrainDatabase): Promise<void>;
|
|
@@ -14,5 +12,7 @@ export declare function ensureProject(db: DesignBrainDatabase, options: {
|
|
|
14
12
|
projectName?: string;
|
|
15
13
|
description?: string;
|
|
16
14
|
}): ProjectRecord;
|
|
15
|
+
export declare function tasteDir(rootDir: string): string;
|
|
16
|
+
export declare function tasteProfilePath(rootDir: string, projectId: string): string;
|
|
17
17
|
export declare function loadTasteProfile(rootDir: string, projectId: string): Promise<TasteProfile | null>;
|
|
18
18
|
export declare function saveTasteProfile(rootDir: string, profile: TasteProfile): Promise<void>;
|
package/dist/store.js
CHANGED
|
@@ -13,18 +13,11 @@ export function projectDir(rootDir, projectId) {
|
|
|
13
13
|
export function projectAssetDir(rootDir, projectId) {
|
|
14
14
|
return path.join(brainRoot(rootDir), 'assets', projectId);
|
|
15
15
|
}
|
|
16
|
-
export function tasteDir(rootDir) {
|
|
17
|
-
return path.join(brainRoot(rootDir), 'taste');
|
|
18
|
-
}
|
|
19
|
-
export function tasteProfilePath(rootDir, projectId) {
|
|
20
|
-
return path.join(tasteDir(rootDir), `${slugify(projectId)}.json`);
|
|
21
|
-
}
|
|
22
16
|
export async function ensureBrainExists(rootDir) {
|
|
23
17
|
const base = brainRoot(rootDir);
|
|
24
18
|
await fs.ensureDir(path.join(base, 'projects'));
|
|
25
19
|
await fs.ensureDir(path.join(base, 'assets'));
|
|
26
20
|
await fs.ensureDir(path.join(base, 'graph'));
|
|
27
|
-
await fs.ensureDir(path.join(base, 'taste'));
|
|
28
21
|
const dbFile = databasePath(rootDir);
|
|
29
22
|
if (!(await fs.pathExists(dbFile))) {
|
|
30
23
|
const db = {
|
|
@@ -73,11 +66,16 @@ export function ensureProject(db, options) {
|
|
|
73
66
|
project.updatedAt = now;
|
|
74
67
|
return project;
|
|
75
68
|
}
|
|
69
|
+
export function tasteDir(rootDir) {
|
|
70
|
+
return path.join(brainRoot(rootDir), 'taste');
|
|
71
|
+
}
|
|
72
|
+
export function tasteProfilePath(rootDir, projectId) {
|
|
73
|
+
return path.join(tasteDir(rootDir), `${projectId}.json`);
|
|
74
|
+
}
|
|
76
75
|
export async function loadTasteProfile(rootDir, projectId) {
|
|
77
76
|
const filePath = tasteProfilePath(rootDir, projectId);
|
|
78
|
-
if (!await fs.pathExists(filePath))
|
|
77
|
+
if (!await fs.pathExists(filePath))
|
|
79
78
|
return null;
|
|
80
|
-
}
|
|
81
79
|
return fs.readJson(filePath);
|
|
82
80
|
}
|
|
83
81
|
export async function saveTasteProfile(rootDir, profile) {
|