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
@@ -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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"}
@@ -1,5 +1,3 @@
1
- import type { AgentInfo, InstallResult } from './types.js';
2
1
  export declare function getDefaultSkillRepo(): string;
3
- export declare function detectAgents(): AgentInfo[];
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>;
@@ -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, dirname } from 'node:path';
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: config persistence should never block command execution
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
- /* ─── SKILL.md content ─── */
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
- if (existsSync(bundledPath)) {
39
- return readFileSync(bundledPath, 'utf-8');
40
- }
36
+ execSync(`npx -y skills add ${repo}`, { stdio: 'inherit' });
37
+ return true;
41
38
  }
42
39
  catch {
43
- // fall through to inline content
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
- console.log(`\n ${BOLD}Detected AI agents:${RESET}`);
167
- for (const agent of agents) {
168
- console.log(` ${DIM}\u2022${RESET} ${agent.name}`);
48
+ if (skipPrompts) {
49
+ return;
169
50
  }
170
- console.log('');
171
- const shouldInstall = await confirmPrompt(`Install design-brain skill to ${agents.length} agent${agents.length > 1 ? 's' : ''}?`, true);
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 results = installSkillToAgents(agents);
177
- console.log('');
178
- for (const r of results) {
179
- if (r.success) {
180
- console.log(` ${GREEN}\u2714${RESET} ${r.agent.name}`);
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
- writeConfig({ ...config, skillPromptDismissed: true });
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
@@ -1 +1 @@
1
- {"version":3,"file":"skillPrompt.js","sourceRoot":"","sources":["../src/skillPrompt.ts"],"names":[],"mappings":"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"}
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) {