design-brain-memory 0.2.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 (47) hide show
  1. package/README.md +167 -0
  2. package/dist/agentBrowser.d.ts +9 -0
  3. package/dist/agentBrowser.js +96 -0
  4. package/dist/agentBrowser.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +212 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands.d.ts +27 -0
  9. package/dist/commands.js +178 -0
  10. package/dist/commands.js.map +1 -0
  11. package/dist/extractFromImage.d.ts +7 -0
  12. package/dist/extractFromImage.js +72 -0
  13. package/dist/extractFromImage.js.map +1 -0
  14. package/dist/extractFromUrl.d.ts +13 -0
  15. package/dist/extractFromUrl.js +605 -0
  16. package/dist/extractFromUrl.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.js +3 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/interactive.d.ts +3 -0
  21. package/dist/interactive.js +42 -0
  22. package/dist/interactive.js.map +1 -0
  23. package/dist/llm.d.ts +33 -0
  24. package/dist/llm.js +250 -0
  25. package/dist/llm.js.map +1 -0
  26. package/dist/query.d.ts +25 -0
  27. package/dist/query.js +150 -0
  28. package/dist/query.js.map +1 -0
  29. package/dist/render.d.ts +2 -0
  30. package/dist/render.js +365 -0
  31. package/dist/render.js.map +1 -0
  32. package/dist/skillPrompt.d.ts +3 -0
  33. package/dist/skillPrompt.js +66 -0
  34. package/dist/skillPrompt.js.map +1 -0
  35. package/dist/store.d.ts +14 -0
  36. package/dist/store.js +69 -0
  37. package/dist/store.js.map +1 -0
  38. package/dist/svg.d.ts +5 -0
  39. package/dist/svg.js +162 -0
  40. package/dist/svg.js.map +1 -0
  41. package/dist/types.d.ts +175 -0
  42. package/dist/types.js +2 -0
  43. package/dist/types.js.map +1 -0
  44. package/dist/util.d.ts +9 -0
  45. package/dist/util.js +51 -0
  46. package/dist/util.js.map +1 -0
  47. package/package.json +53 -0
package/dist/render.js ADDED
@@ -0,0 +1,365 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { brainRoot, projectDir } from './store.js';
4
+ import { generatePaletteSvg, generateComponentsSvg, generateTypographySvg, generateLayoutSvg, } from './svg.js';
5
+ import { csvEscape, relPath, truncate, unique } from './util.js';
6
+ function mdTable(headers, rows) {
7
+ const head = `| ${headers.join(' | ')} |`;
8
+ const rule = `| ${headers.map(() => '---').join(' | ')} |`;
9
+ const body = rows.map((row) => `| ${row.join(' | ')} |`).join('\n');
10
+ return [head, rule, body].filter((line) => line.length > 0).join('\n');
11
+ }
12
+ function aggregateColors(records) {
13
+ const map = new Map();
14
+ for (const record of records) {
15
+ for (const color of record.analysis.colors) {
16
+ const existing = map.get(color.hex) ?? { hex: color.hex, count: 0, samples: [] };
17
+ existing.count += color.count;
18
+ for (const sample of color.samples) {
19
+ if (existing.samples.length < 6 && !existing.samples.includes(sample)) {
20
+ existing.samples.push(sample);
21
+ }
22
+ }
23
+ map.set(color.hex, existing);
24
+ }
25
+ }
26
+ return [...map.values()].sort((a, b) => b.count - a.count).slice(0, 40);
27
+ }
28
+ function aggregateTypography(records) {
29
+ const map = new Map();
30
+ for (const record of records) {
31
+ for (const token of record.analysis.typography) {
32
+ const key = `${token.fontFamily}|${token.fontSize}|${token.fontWeight}|${token.lineHeight}`;
33
+ const existing = map.get(key) ?? { ...token, count: 0 };
34
+ existing.count += token.count;
35
+ map.set(key, existing);
36
+ }
37
+ }
38
+ return [...map.values()].sort((a, b) => b.count - a.count).slice(0, 60);
39
+ }
40
+ function aggregateComponents(records) {
41
+ const map = new Map();
42
+ for (const record of records) {
43
+ for (const token of record.analysis.components) {
44
+ const key = `${token.kind}|${token.tag}|${token.selector}`;
45
+ const existing = map.get(key) ?? { ...token, count: 0 };
46
+ existing.count += 1;
47
+ map.set(key, existing);
48
+ }
49
+ }
50
+ return [...map.values()].sort((a, b) => b.count - a.count).slice(0, 120);
51
+ }
52
+ function aggregateMotion(records) {
53
+ const map = new Map();
54
+ for (const record of records) {
55
+ for (const token of record.analysis.motion) {
56
+ const key = `${token.selector}|${token.transition}|${token.animation}|${token.transform}`;
57
+ const existing = map.get(key) ?? { ...token, count: 0 };
58
+ existing.count += 1;
59
+ map.set(key, existing);
60
+ }
61
+ }
62
+ return [...map.values()].sort((a, b) => b.count - a.count).slice(0, 140);
63
+ }
64
+ function renderProjectReadme(project) {
65
+ const inspirationLinks = project.inspirations.length > 0
66
+ ? project.inspirations.map((record) => `- [${record.name}](./inspirations/${record.id}.md)`).join('\n')
67
+ : '- No inspirations captured yet.';
68
+ const outcomeLinks = project.outcomes.length > 0
69
+ ? project.outcomes.map((record) => `- [${record.title}](./outcomes/${record.id}.md)`).join('\n')
70
+ : '- No outcomes recorded yet.';
71
+ return `# ${project.name}\n\n`
72
+ + `Project ID: \`${project.id}\`\n\n`
73
+ + `Created: ${project.createdAt}\n\n`
74
+ + `Updated: ${project.updatedAt}\n\n`
75
+ + `${project.description ? `${project.description}\n\n` : ''}`
76
+ + `## Wiki\n\n`
77
+ + `- [Colors](./tokens/colors.md)\n`
78
+ + `- [Typography](./tokens/typography.md)\n`
79
+ + `- [Components](./tokens/components.md)\n`
80
+ + `- [Motion](./tokens/motion.md)\n`
81
+ + `- [Layout](./tokens/layout.md)\n\n`
82
+ + `## Visual Catalog\n\n`
83
+ + `![Color Palette](./visuals/palette.svg)\n`
84
+ + `![Component Inventory](./visuals/components.svg)\n`
85
+ + `![Typography Specimen](./visuals/typography.svg)\n`
86
+ + `![Layout Structure](./visuals/layout.svg)\n\n`
87
+ + `## Inspirations\n\n${inspirationLinks}\n\n`
88
+ + `## Outcomes\n\n${outcomeLinks}\n`;
89
+ }
90
+ function renderInspiration(record, projectId) {
91
+ const colorsRows = record.analysis.colors.slice(0, 30).map((color) => [
92
+ color.hex,
93
+ `${color.count}`,
94
+ color.samples.map((value) => `\`${value}\``).join('<br/>'),
95
+ ]);
96
+ const typeRows = record.analysis.typography.slice(0, 40).map((token) => [
97
+ token.fontFamily,
98
+ token.fontSize,
99
+ token.fontWeight,
100
+ token.lineHeight,
101
+ `${token.count}`,
102
+ ]);
103
+ const componentRows = record.analysis.components.slice(0, 60).map((component) => [
104
+ component.kind,
105
+ `\`${component.selector}\``,
106
+ component.tag,
107
+ truncate(component.text || '-'),
108
+ truncate(component.className || '-'),
109
+ ]);
110
+ const motionRows = record.analysis.motion.slice(0, 80).map((motion) => [
111
+ `\`${motion.selector}\``,
112
+ truncate(motion.transition || 'none'),
113
+ truncate(motion.animation || 'none'),
114
+ truncate(motion.transform || 'none'),
115
+ ]);
116
+ const layoutRows = record.analysis.layout.slice(0, 80).map((layout) => [
117
+ layout.tag,
118
+ `\`${layout.selector}\``,
119
+ layout.role || '-',
120
+ `${layout.children}`,
121
+ ]);
122
+ const variablesRows = Object.entries(record.analysis.cssVariables)
123
+ .slice(0, 120)
124
+ .map(([key, value]) => [key, truncate(value, 80)]);
125
+ const stateRows = (record.analysis.stateStyles ?? []).slice(0, 80).map((state) => [
126
+ `\`${state.selector}\``,
127
+ state.state,
128
+ Object.entries(state.declarations)
129
+ .map(([key, value]) => `${key}: ${truncate(value, 40)}`)
130
+ .join('<br/>'),
131
+ ]);
132
+ const responsiveRows = (record.analysis.responsiveSnapshots ?? []).slice(0, 20).map((item) => [
133
+ item.label,
134
+ `${item.viewport.width}x${item.viewport.height}`,
135
+ `${item.colorCount}`,
136
+ `${item.typographyCount}`,
137
+ `${item.componentCount}`,
138
+ truncate(item.title ?? '-', 60),
139
+ ]);
140
+ const journeyRows = (record.analysis.journey ?? []).slice(0, 20).map((step) => [
141
+ `${step.step}`,
142
+ step.action,
143
+ truncate(step.fromUrl ?? '-', 40),
144
+ truncate(step.toUrl ?? '-', 40),
145
+ truncate(step.summary ?? '-', 70),
146
+ ]);
147
+ const tags = record.tags.length > 0 ? record.tags.map((tag) => `\`${tag}\``).join(', ') : '-';
148
+ return `# ${record.name}\n\n`
149
+ + `ID: \`${record.id}\`\n\n`
150
+ + `Project: \`${projectId}\`\n\n`
151
+ + `Captured: ${record.capturedAt}\n\n`
152
+ + `Source type: \`${record.sourceType}\`\n\n`
153
+ + `${record.url ? `URL: ${record.url}\n\n` : ''}`
154
+ + `${record.originalImagePath ? `Original image: \`${record.originalImagePath}\`\n\n` : ''}`
155
+ + `${record.screenshotPath ? `Screenshot: \`${record.screenshotPath}\`\n\n` : ''}`
156
+ + `Fingerprint: \`${record.fingerprint}\`\n\n`
157
+ + `Version: \`${record.version}\`\n\n`
158
+ + `${record.supersedes ? `Supersedes: \`${record.supersedes}\`\n\n` : ''}`
159
+ + `Tags: ${tags}\n\n`
160
+ + `${record.notes ? `Notes: ${record.notes}\n\n` : ''}`
161
+ + `${record.inspirationSummary ? `Inspiration summary: ${record.inspirationSummary}\n\n` : ''}`
162
+ + `${record.diffFromPrevious ? `## Diff From Previous\n\n- Previous: \`${record.diffFromPrevious.previousId}\`\n- Added colors: ${record.diffFromPrevious.addedColors.join(', ') || '-'}\n- Removed colors: ${record.diffFromPrevious.removedColors.join(', ') || '-'}\n- Component delta: ${record.diffFromPrevious.componentCountDelta}\n- Motion delta: ${record.diffFromPrevious.motionCountDelta}\n\n` : ''}`
163
+ + `${record.llmEnrichment ? `## LLM Enrichment\n\n- Model: \`${record.llmEnrichment.model}\`\n- Base URL: \`${record.llmEnrichment.baseUrl}\`\n- Generated: ${record.llmEnrichment.generatedAt}\n- Color narrative: ${record.llmEnrichment.colorNarrative}\n\n### Design Principles\n${record.llmEnrichment.designPrinciples.map((item) => `- ${item}`).join('\n') || '- none'}\n\n### Component Patterns\n${record.llmEnrichment.componentPatterns.map((item) => `- ${item}`).join('\n') || '- none'}\n\n### Layout Guidance\n${(record.llmEnrichment.layoutGuidance ?? []).map((item) => `- ${item}`).join('\n') || '- none'}\n\n### Motion Guidance\n${(record.llmEnrichment.motionGuidance ?? []).map((item) => `- ${item}`).join('\n') || '- none'}\n\n` : ''}`
164
+ + `${responsiveRows.length > 0 ? `## Responsive Coverage\n\n${mdTable(['Viewport', 'Size', 'Colors', 'Typography', 'Components', 'Title'], responsiveRows)}\n\n` : ''}`
165
+ + `${stateRows.length > 0 ? `## Interaction States\n\n${mdTable(['Selector', 'State', 'Declarations'], stateRows)}\n\n` : ''}`
166
+ + `${journeyRows.length > 0 ? `## Journey Capture\n\n${mdTable(['Step', 'Action', 'From', 'To', 'Summary'], journeyRows)}\n\n` : ''}`
167
+ + `## Visual Catalog\n\n`
168
+ + `![Color Palette](./${record.id}/palette.svg)\n`
169
+ + `![Component Inventory](./${record.id}/components.svg)\n`
170
+ + `![Typography Specimen](./${record.id}/typography.svg)\n`
171
+ + `![Layout Structure](./${record.id}/layout.svg)\n\n`
172
+ + `## Colors\n\n${mdTable(['Hex', 'Weight', 'Samples'], colorsRows)}\n\n`
173
+ + `## Typography\n\n${mdTable(['Font', 'Size', 'Weight', 'Line Height', 'Weight'], typeRows)}\n\n`
174
+ + `## Components\n\n${mdTable(['Kind', 'Selector', 'Tag', 'Text', 'Class'], componentRows)}\n\n`
175
+ + `## Motion\n\n${mdTable(['Selector', 'Transition', 'Animation', 'Transform'], motionRows)}\n\n`
176
+ + `## Layout\n\n${mdTable(['Tag', 'Selector', 'Role', 'Children'], layoutRows)}\n\n`
177
+ + `## CSS Variables\n\n${mdTable(['Variable', 'Value'], variablesRows)}\n\n`
178
+ + `${record.analysis.accessibilitySnapshot ? `## Accessibility Snapshot\n\n\`\`\`text\n${record.analysis.accessibilitySnapshot}\n\`\`\`\n` : ''}`;
179
+ }
180
+ function renderOutcome(project, outcomeId) {
181
+ const outcome = project.outcomes.find((entry) => entry.id === outcomeId);
182
+ if (!outcome) {
183
+ throw new Error(`Outcome not found: ${outcomeId}`);
184
+ }
185
+ const inspirations = outcome.inspiredBy
186
+ .map((id) => project.inspirations.find((entry) => entry.id === id))
187
+ .filter((entry) => Boolean(entry));
188
+ const related = inspirations.length > 0
189
+ ? inspirations.map((entry) => `- [${entry.name}](../inspirations/${entry.id}.md)`).join('\n')
190
+ : '- None linked.';
191
+ return `# ${outcome.title}\n\n`
192
+ + `ID: \`${outcome.id}\`\n\n`
193
+ + `Created: ${outcome.createdAt}\n\n`
194
+ + `Description: ${outcome.description}\n\n`
195
+ + `${outcome.artifactUrl ? `Artifact URL: ${outcome.artifactUrl}\n\n` : ''}`
196
+ + `${outcome.tags.length > 0 ? `Tags: ${outcome.tags.map((tag) => `\`${tag}\``).join(', ')}\n\n` : ''}`
197
+ + `## Inspired By\n\n${related}\n`;
198
+ }
199
+ function renderTokens(project) {
200
+ const colors = aggregateColors(project.inspirations);
201
+ const typography = aggregateTypography(project.inspirations);
202
+ const components = aggregateComponents(project.inspirations);
203
+ const motion = aggregateMotion(project.inspirations);
204
+ const colorRows = colors.map((token) => [token.hex, `${token.count}`, token.samples.map((sample) => `\`${sample}\``).join('<br/>')]);
205
+ const typographyRows = typography.map((token) => [token.fontFamily, token.fontSize, token.fontWeight, token.lineHeight, `${token.count}`]);
206
+ const componentRows = components.map((token) => [token.kind, token.tag, `\`${token.selector}\``, `${token.count}`]);
207
+ const motionRows = motion.map((token) => [truncate(token.transition || 'none'), truncate(token.animation || 'none'), `\`${token.selector}\``, `${token.count}`]);
208
+ const layoutRows = project.inspirations
209
+ .flatMap((inspiration) => inspiration.analysis.layout.map((layout) => [
210
+ layout.tag,
211
+ `\`${layout.selector}\``,
212
+ layout.role || '-',
213
+ `${layout.children}`,
214
+ inspiration.id,
215
+ ]))
216
+ .slice(0, 250);
217
+ return {
218
+ colors: `# ${project.name} Color Brain\n\n` + mdTable(['Hex', 'Weight', 'Samples'], colorRows) + '\n',
219
+ typography: `# ${project.name} Typography Brain\n\n` + mdTable(['Font', 'Size', 'Weight', 'Line Height', 'Weight'], typographyRows) + '\n',
220
+ components: `# ${project.name} Component Brain\n\n` + mdTable(['Kind', 'Tag', 'Selector', 'Occurrences'], componentRows) + '\n',
221
+ motion: `# ${project.name} Motion Brain\n\n` + mdTable(['Transition', 'Animation', 'Selector', 'Occurrences'], motionRows) + '\n',
222
+ layout: `# ${project.name} Layout Brain\n\n` + mdTable(['Tag', 'Selector', 'Role', 'Children', 'Source'], layoutRows) + '\n',
223
+ };
224
+ }
225
+ function renderRootReadme(db) {
226
+ const projects = db.projects.length > 0
227
+ ? db.projects
228
+ .map((project) => {
229
+ const inspirationCount = project.inspirations.length;
230
+ const outcomeCount = project.outcomes.length;
231
+ return `- [${project.name}](./projects/${project.id}/README.md) - ${inspirationCount} inspirations, ${outcomeCount} outcomes`;
232
+ })
233
+ .join('\n')
234
+ : '- No projects yet.';
235
+ return `# Design Brain\n\n`
236
+ + `Relational design memory generated by \`design-brain-memory\`.\n\n`
237
+ + `## Projects\n\n${projects}\n\n`
238
+ + `## Retrieval\n\n`
239
+ + `- Search all inspirations: \`rg "inspiration|component|color" .design-brain/projects\`\n`
240
+ + `- Query relation graph: \`rg "has_inspiration|inspired_by" .design-brain/graph/relations.csv\`\n`
241
+ + `- Find a color usage: \`rg "#0055FF" .design-brain\`\n`
242
+ + `- CLI keyword search: \`design-brain-memory search --query "button hierarchy"\`\n`
243
+ + `- CLI semantic ask: \`design-brain-memory ask --query "What changed between versions?"\`\n`;
244
+ }
245
+ function renderGraphFiles(db) {
246
+ const entityRows = ['id,type,project,title,path'];
247
+ const relationRows = ['from,relation,to,project,notes'];
248
+ const seenEntities = new Set();
249
+ const seenRelations = new Set();
250
+ function pushEntity(values) {
251
+ const row = values.map(csvEscape).join(',');
252
+ if (!seenEntities.has(row)) {
253
+ seenEntities.add(row);
254
+ entityRows.push(row);
255
+ }
256
+ }
257
+ function pushRelation(values) {
258
+ const row = values.map(csvEscape).join(',');
259
+ if (!seenRelations.has(row)) {
260
+ seenRelations.add(row);
261
+ relationRows.push(row);
262
+ }
263
+ }
264
+ for (const project of db.projects) {
265
+ const projectPath = `projects/${project.id}/README.md`;
266
+ pushEntity([project.id, 'project', project.id, project.name, projectPath]);
267
+ for (const inspiration of project.inspirations) {
268
+ const inspirationPath = `projects/${project.id}/inspirations/${inspiration.id}.md`;
269
+ pushEntity([inspiration.id, 'inspiration', project.id, inspiration.name, inspirationPath]);
270
+ pushRelation([project.id, 'has_inspiration', inspiration.id, project.id, inspiration.url ?? inspiration.originalImagePath ?? '']);
271
+ pushEntity([`fingerprint:${inspiration.fingerprint}`, 'fingerprint', project.id, inspiration.fingerprint, inspirationPath]);
272
+ pushRelation([inspiration.id, 'has_fingerprint', `fingerprint:${inspiration.fingerprint}`, project.id, '']);
273
+ if (inspiration.supersedes) {
274
+ pushRelation([inspiration.id, 'supersedes', inspiration.supersedes, project.id, 'version lineage']);
275
+ }
276
+ const componentKinds = unique(inspiration.analysis.components.map((component) => component.kind));
277
+ for (const kind of componentKinds) {
278
+ const componentId = `component:${kind}`;
279
+ pushEntity([componentId, 'component_kind', project.id, kind, inspirationPath]);
280
+ pushRelation([inspiration.id, 'uses_component_kind', componentId, project.id, '']);
281
+ }
282
+ const topColors = inspiration.analysis.colors.slice(0, 12).map((color) => color.hex.toUpperCase());
283
+ for (const color of topColors) {
284
+ const colorId = `color:${color}`;
285
+ pushEntity([colorId, 'color', project.id, color, inspirationPath]);
286
+ pushRelation([inspiration.id, 'uses_color', colorId, project.id, '']);
287
+ }
288
+ }
289
+ for (const outcome of project.outcomes) {
290
+ const outcomePath = `projects/${project.id}/outcomes/${outcome.id}.md`;
291
+ pushEntity([outcome.id, 'outcome', project.id, outcome.title, outcomePath]);
292
+ pushRelation([project.id, 'has_outcome', outcome.id, project.id, '']);
293
+ for (const sourceId of outcome.inspiredBy) {
294
+ pushRelation([outcome.id, 'inspired_by', sourceId, project.id, '']);
295
+ }
296
+ }
297
+ }
298
+ return {
299
+ entities: entityRows.join('\n') + '\n',
300
+ relations: relationRows.join('\n') + '\n',
301
+ };
302
+ }
303
+ async function renderVisuals(baseDir, project, skipVisuals) {
304
+ if (skipVisuals)
305
+ return;
306
+ const visualDir = path.join(baseDir, 'visuals');
307
+ await fs.ensureDir(visualDir);
308
+ const colors = aggregateColors(project.inspirations);
309
+ const components = aggregateComponents(project.inspirations);
310
+ const typography = aggregateTypography(project.inspirations);
311
+ const layout = project.inspirations.at(-1)?.analysis.layout ?? [];
312
+ await fs.writeFile(path.join(visualDir, 'palette.svg'), generatePaletteSvg(colors, project.name));
313
+ await fs.writeFile(path.join(visualDir, 'components.svg'), generateComponentsSvg(components, project.name));
314
+ await fs.writeFile(path.join(visualDir, 'typography.svg'), generateTypographySvg(typography, project.name));
315
+ await fs.writeFile(path.join(visualDir, 'layout.svg'), generateLayoutSvg(layout, project.name));
316
+ for (const inspiration of project.inspirations) {
317
+ const inspoVisualDir = path.join(baseDir, 'inspirations', inspiration.id);
318
+ await fs.ensureDir(inspoVisualDir);
319
+ await fs.writeFile(path.join(inspoVisualDir, 'palette.svg'), generatePaletteSvg(inspiration.analysis.colors, inspiration.name));
320
+ await fs.writeFile(path.join(inspoVisualDir, 'components.svg'), generateComponentsSvg(inspiration.analysis.components, inspiration.name));
321
+ await fs.writeFile(path.join(inspoVisualDir, 'typography.svg'), generateTypographySvg(inspiration.analysis.typography, inspiration.name));
322
+ await fs.writeFile(path.join(inspoVisualDir, 'layout.svg'), generateLayoutSvg(inspiration.analysis.layout, inspiration.name));
323
+ }
324
+ }
325
+ export async function renderAll(rootDir, db, skipVisuals = false) {
326
+ const root = brainRoot(rootDir);
327
+ await fs.ensureDir(root);
328
+ await fs.writeFile(path.join(root, 'README.md'), renderRootReadme(db));
329
+ for (const project of db.projects) {
330
+ const baseDir = projectDir(rootDir, project.id);
331
+ const inspirationDir = path.join(baseDir, 'inspirations');
332
+ const outcomeDir = path.join(baseDir, 'outcomes');
333
+ const tokenDir = path.join(baseDir, 'tokens');
334
+ await fs.ensureDir(inspirationDir);
335
+ await fs.ensureDir(outcomeDir);
336
+ await fs.ensureDir(tokenDir);
337
+ await fs.writeFile(path.join(baseDir, 'README.md'), renderProjectReadme(project));
338
+ for (const inspiration of project.inspirations) {
339
+ await fs.writeFile(path.join(inspirationDir, `${inspiration.id}.md`), renderInspiration(inspiration, project.id));
340
+ }
341
+ for (const outcome of project.outcomes) {
342
+ await fs.writeFile(path.join(outcomeDir, `${outcome.id}.md`), renderOutcome(project, outcome.id));
343
+ }
344
+ const tokenFiles = renderTokens(project);
345
+ await fs.writeFile(path.join(tokenDir, 'colors.md'), tokenFiles.colors);
346
+ await fs.writeFile(path.join(tokenDir, 'typography.md'), tokenFiles.typography);
347
+ await fs.writeFile(path.join(tokenDir, 'components.md'), tokenFiles.components);
348
+ await fs.writeFile(path.join(tokenDir, 'motion.md'), tokenFiles.motion);
349
+ await fs.writeFile(path.join(tokenDir, 'layout.md'), tokenFiles.layout);
350
+ await renderVisuals(baseDir, project, skipVisuals);
351
+ const projectIndex = path.join(baseDir, 'index.md');
352
+ const from = path.dirname(projectIndex);
353
+ const links = [
354
+ `[Project Wiki](${relPath(from, path.join(baseDir, 'README.md'))})`,
355
+ `[Inspirations](${relPath(from, inspirationDir)})`,
356
+ `[Outcomes](${relPath(from, outcomeDir)})`,
357
+ `[Token Brain](${relPath(from, tokenDir)})`,
358
+ ];
359
+ await fs.writeFile(projectIndex, `# ${project.name} Index\n\n- ${links.join('\n- ')}\n`);
360
+ }
361
+ const graph = renderGraphFiles(db);
362
+ await fs.writeFile(path.join(root, 'graph', 'entities.csv'), graph.entities);
363
+ await fs.writeFile(path.join(root, 'graph', 'relations.csv'), graph.relations);
364
+ }
365
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function getDefaultSkillRepo(): string;
2
+ export declare function installSkill(repo?: string): boolean;
3
+ export declare function maybePromptSkillInstall(skipPrompts: boolean): Promise<void>;
@@ -0,0 +1,66 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { confirmPrompt } from './interactive.js';
6
+ const CONFIG_DIRECTORY = join(homedir(), '.design-brain-memory');
7
+ const CONFIG_FILE = join(CONFIG_DIRECTORY, 'config.json');
8
+ const DEFAULT_SKILL_REPO = 'design-brain/design-brain';
9
+ function readConfig() {
10
+ try {
11
+ if (!existsSync(CONFIG_FILE)) {
12
+ return {};
13
+ }
14
+ return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));
15
+ }
16
+ catch {
17
+ return {};
18
+ }
19
+ }
20
+ function writeConfig(config) {
21
+ try {
22
+ if (!existsSync(CONFIG_DIRECTORY)) {
23
+ mkdirSync(CONFIG_DIRECTORY, { recursive: true });
24
+ }
25
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
26
+ }
27
+ catch {
28
+ // no-op: prompt persistence should never block command execution
29
+ }
30
+ }
31
+ export function getDefaultSkillRepo() {
32
+ return process.env.DESIGN_BRAIN_SKILL_REPO?.trim() || DEFAULT_SKILL_REPO;
33
+ }
34
+ export function installSkill(repo = getDefaultSkillRepo()) {
35
+ try {
36
+ execSync(`npx -y skills add ${repo}`, { stdio: 'inherit' });
37
+ return true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ export async function maybePromptSkillInstall(skipPrompts) {
44
+ const config = readConfig();
45
+ if (config.skillPromptDismissed) {
46
+ return;
47
+ }
48
+ if (skipPrompts) {
49
+ return;
50
+ }
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);
54
+ if (!shouldInstall) {
55
+ return;
56
+ }
57
+ const installed = installSkill();
58
+ if (installed) {
59
+ console.log('Design Brain skill installed.');
60
+ writeConfig({ ...config, skillPromptDismissed: true });
61
+ return;
62
+ }
63
+ console.log('Skill install failed. You can install manually:');
64
+ console.log(` npx -y skills add ${getDefaultSkillRepo()}`);
65
+ }
66
+ //# sourceMappingURL=skillPrompt.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,14 @@
1
+ import type { DesignBrainDatabase, ProjectRecord } from './types.js';
2
+ export declare function brainRoot(rootDir: string): string;
3
+ export declare function databasePath(rootDir: string): string;
4
+ export declare function projectDir(rootDir: string, projectId: string): string;
5
+ export declare function projectAssetDir(rootDir: string, projectId: string): string;
6
+ export declare function ensureBrainExists(rootDir: string): Promise<void>;
7
+ export declare function loadDatabase(rootDir: string): Promise<DesignBrainDatabase>;
8
+ export declare function saveDatabase(rootDir: string, db: DesignBrainDatabase): Promise<void>;
9
+ export declare function findProject(db: DesignBrainDatabase, projectId: string): ProjectRecord | undefined;
10
+ export declare function ensureProject(db: DesignBrainDatabase, options: {
11
+ projectId: string;
12
+ projectName?: string;
13
+ description?: string;
14
+ }): ProjectRecord;
package/dist/store.js ADDED
@@ -0,0 +1,69 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { nowIso, slugify } from './util.js';
4
+ export function brainRoot(rootDir) {
5
+ return path.join(rootDir, '.design-brain');
6
+ }
7
+ export function databasePath(rootDir) {
8
+ return path.join(brainRoot(rootDir), 'database.json');
9
+ }
10
+ export function projectDir(rootDir, projectId) {
11
+ return path.join(brainRoot(rootDir), 'projects', projectId);
12
+ }
13
+ export function projectAssetDir(rootDir, projectId) {
14
+ return path.join(brainRoot(rootDir), 'assets', projectId);
15
+ }
16
+ export async function ensureBrainExists(rootDir) {
17
+ const base = brainRoot(rootDir);
18
+ await fs.ensureDir(path.join(base, 'projects'));
19
+ await fs.ensureDir(path.join(base, 'assets'));
20
+ await fs.ensureDir(path.join(base, 'graph'));
21
+ const dbFile = databasePath(rootDir);
22
+ if (!(await fs.pathExists(dbFile))) {
23
+ const db = {
24
+ version: 1,
25
+ createdAt: nowIso(),
26
+ updatedAt: nowIso(),
27
+ projects: [],
28
+ };
29
+ await fs.writeJson(dbFile, db, { spaces: 2 });
30
+ }
31
+ }
32
+ export async function loadDatabase(rootDir) {
33
+ await ensureBrainExists(rootDir);
34
+ const db = await fs.readJson(databasePath(rootDir));
35
+ return db;
36
+ }
37
+ export async function saveDatabase(rootDir, db) {
38
+ db.updatedAt = nowIso();
39
+ await fs.writeJson(databasePath(rootDir), db, { spaces: 2 });
40
+ }
41
+ export function findProject(db, projectId) {
42
+ return db.projects.find((project) => project.id === projectId);
43
+ }
44
+ export function ensureProject(db, options) {
45
+ const normalizedId = slugify(options.projectId);
46
+ const now = nowIso();
47
+ let project = findProject(db, normalizedId);
48
+ if (!project) {
49
+ project = {
50
+ id: normalizedId,
51
+ name: options.projectName?.trim() || options.projectId,
52
+ description: options.description,
53
+ createdAt: now,
54
+ updatedAt: now,
55
+ inspirations: [],
56
+ outcomes: [],
57
+ };
58
+ db.projects.push(project);
59
+ }
60
+ if (options.projectName?.trim()) {
61
+ project.name = options.projectName.trim();
62
+ }
63
+ if (options.description !== undefined) {
64
+ project.description = options.description;
65
+ }
66
+ project.updatedAt = now;
67
+ return project;
68
+ }
69
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/svg.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { ColorToken, ComponentToken, LayoutToken, TypographyToken } from './types.js';
2
+ export declare function generatePaletteSvg(colors: ColorToken[], title: string): string;
3
+ export declare function generateComponentsSvg(components: ComponentToken[], title: string): string;
4
+ export declare function generateTypographySvg(tokens: TypographyToken[], title: string): string;
5
+ export declare function generateLayoutSvg(layout: LayoutToken[], title: string): string;