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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,kBAAkB,GAAG;IACzB,IAAI;IACJ,YAAY;IACZ,cAAc;IACd,UAAU;IACV,UAAU;IACV,UAAU;IACV,KAAK;CACN,CAAC;AAEF,MAAM,UAAU,sBAAsB;IACpC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO,OAAO,IAAI,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,UAAU,GAAG,IAAI;IACpE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAExC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
package/dist/llm.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { ComponentToken, DesignAnalysis, LayoutToken, LlmConfig, LlmEnrichment, MotionToken, TypographyToken } from './types.js';
2
+ export declare function resolveLlmConfig(input: {
3
+ baseUrl?: string;
4
+ apiKey?: string;
5
+ model?: string;
6
+ timeoutMs?: number;
7
+ }): LlmConfig | undefined;
8
+ export declare function enrichWithLlm(params: {
9
+ llm: LlmConfig;
10
+ sourceName: string;
11
+ sourceUrl?: string;
12
+ notes?: string;
13
+ fallbackSummary?: string;
14
+ analysis: DesignAnalysis;
15
+ }): Promise<LlmEnrichment>;
16
+ export declare function enrichImageWithLlmVision(params: {
17
+ llm: LlmConfig;
18
+ imagePath: string;
19
+ sourceName: string;
20
+ notes?: string;
21
+ }): Promise<{
22
+ summary?: string;
23
+ tags: string[];
24
+ components: ComponentToken[];
25
+ typography: TypographyToken[];
26
+ layout: LayoutToken[];
27
+ motion: MotionToken[];
28
+ }>;
29
+ export declare function answerDesignQuestion(params: {
30
+ llm: LlmConfig;
31
+ query: string;
32
+ context: string;
33
+ }): Promise<string>;
package/dist/llm.js ADDED
@@ -0,0 +1,250 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { nowIso, unique } from './util.js';
4
+ export function resolveLlmConfig(input) {
5
+ const baseUrl = input.baseUrl?.trim() || process.env.DESIGN_BRAIN_LLM_BASE_URL || '';
6
+ const apiKey = input.apiKey?.trim() || process.env.DESIGN_BRAIN_LLM_API_KEY || '';
7
+ const model = input.model?.trim() || process.env.DESIGN_BRAIN_LLM_MODEL || 'gpt-4o-mini';
8
+ if (!baseUrl && !apiKey && !input.model) {
9
+ return undefined;
10
+ }
11
+ if (!apiKey) {
12
+ throw new Error('LLM enabled but API key is missing. Set --llm-api-key or DESIGN_BRAIN_LLM_API_KEY.');
13
+ }
14
+ return {
15
+ baseUrl: baseUrl || 'https://api.openai.com/v1',
16
+ apiKey,
17
+ model,
18
+ timeoutMs: input.timeoutMs,
19
+ };
20
+ }
21
+ function normalizeBaseUrl(baseUrl) {
22
+ const trimmed = baseUrl.trim().replace(/\/+$/, '');
23
+ if (!trimmed) {
24
+ throw new Error('LLM base URL is empty');
25
+ }
26
+ return trimmed;
27
+ }
28
+ function normalizeMessageContent(content) {
29
+ if (typeof content === 'string') {
30
+ return content;
31
+ }
32
+ if (!Array.isArray(content)) {
33
+ return '';
34
+ }
35
+ return content
36
+ .map((item) => item.text ?? '')
37
+ .join('')
38
+ .trim();
39
+ }
40
+ function extractFirstJsonObject(raw) {
41
+ const direct = raw.trim();
42
+ if (direct.startsWith('{') && direct.endsWith('}')) {
43
+ return direct;
44
+ }
45
+ const start = raw.indexOf('{');
46
+ const end = raw.lastIndexOf('}');
47
+ if (start >= 0 && end > start) {
48
+ return raw.slice(start, end + 1);
49
+ }
50
+ throw new Error('LLM did not return JSON output');
51
+ }
52
+ function toStringArray(value) {
53
+ if (!Array.isArray(value)) {
54
+ return [];
55
+ }
56
+ return unique(value
57
+ .map((item) => (typeof item === 'string' ? item.trim() : ''))
58
+ .filter((item) => item.length > 0));
59
+ }
60
+ function clip(items, max = 8) {
61
+ return items.slice(0, max);
62
+ }
63
+ async function runCompletion(params) {
64
+ const baseUrl = normalizeBaseUrl(params.llm.baseUrl);
65
+ const apiKey = params.llm.apiKey.trim();
66
+ if (!apiKey) {
67
+ throw new Error('LLM API key is empty');
68
+ }
69
+ const controller = new AbortController();
70
+ const timeoutMs = params.llm.timeoutMs ?? 30_000;
71
+ const timer = setTimeout(() => {
72
+ controller.abort();
73
+ }, timeoutMs);
74
+ try {
75
+ const response = await fetch(`${baseUrl}/chat/completions`, {
76
+ method: 'POST',
77
+ headers: {
78
+ Authorization: `Bearer ${apiKey}`,
79
+ 'Content-Type': 'application/json',
80
+ },
81
+ body: JSON.stringify({
82
+ model: params.llm.model,
83
+ temperature: params.temperature ?? 0.2,
84
+ messages: [
85
+ {
86
+ role: 'system',
87
+ content: params.system,
88
+ },
89
+ {
90
+ role: 'user',
91
+ content: params.userContent,
92
+ },
93
+ ],
94
+ }),
95
+ signal: controller.signal,
96
+ });
97
+ if (!response.ok) {
98
+ const errorText = await response.text();
99
+ throw new Error(`LLM request failed (${response.status}): ${errorText}`);
100
+ }
101
+ const body = (await response.json());
102
+ const content = normalizeMessageContent(body.choices?.[0]?.message?.content);
103
+ if (!content) {
104
+ throw new Error('LLM returned empty content');
105
+ }
106
+ return content;
107
+ }
108
+ finally {
109
+ clearTimeout(timer);
110
+ }
111
+ }
112
+ function buildPrompt(input) {
113
+ const colorList = input.analysis.colors.slice(0, 16).map((color) => `${color.hex}(${color.count})`).join(', ');
114
+ const typographyList = input.analysis.typography
115
+ .slice(0, 10)
116
+ .map((token) => `${token.fontFamily} ${token.fontSize}/${token.lineHeight} w${token.fontWeight}`)
117
+ .join('; ');
118
+ const componentList = input.analysis.components.slice(0, 20).map((component) => `${component.kind}:${component.selector}`).join(', ');
119
+ const motionList = input.analysis.motion.slice(0, 12).map((motion) => `${motion.selector}:${motion.transition || motion.animation || motion.transform}`).join(', ');
120
+ return [
121
+ 'Create semantic design memory enrichment from extracted tokens.',
122
+ 'Return JSON only with keys:',
123
+ 'summary (string), designPrinciples (string[]), componentPatterns (string[]), colorNarrative (string), suggestedTags (string[]), layoutGuidance (string[]), motionGuidance (string[]).',
124
+ '',
125
+ `Source: ${input.sourceName}`,
126
+ `URL: ${input.sourceUrl ?? 'N/A'}`,
127
+ `User notes: ${input.notes ?? 'N/A'}`,
128
+ `Current summary: ${input.fallbackSummary ?? 'N/A'}`,
129
+ `Top colors: ${colorList || 'none'}`,
130
+ `Typography: ${typographyList || 'none'}`,
131
+ `Components: ${componentList || 'none'}`,
132
+ `Motion: ${motionList || 'none'}`,
133
+ '',
134
+ 'Constraints:',
135
+ '- summary <= 40 words',
136
+ '- 3 to 6 designPrinciples',
137
+ '- 3 to 6 componentPatterns',
138
+ '- 2 to 5 layoutGuidance',
139
+ '- 2 to 5 motionGuidance',
140
+ '- suggestedTags should be short kebab-case candidates',
141
+ ].join('\n');
142
+ }
143
+ export async function enrichWithLlm(params) {
144
+ const content = await runCompletion({
145
+ llm: params.llm,
146
+ system: 'You are a senior design systems analyst. Return strict JSON only with the required keys and no markdown.',
147
+ userContent: buildPrompt({
148
+ sourceName: params.sourceName,
149
+ sourceUrl: params.sourceUrl,
150
+ notes: params.notes,
151
+ fallbackSummary: params.fallbackSummary,
152
+ analysis: params.analysis,
153
+ }),
154
+ });
155
+ const jsonText = extractFirstJsonObject(content);
156
+ const parsed = JSON.parse(jsonText);
157
+ const summary = typeof parsed.summary === 'string' ? parsed.summary.trim() : '';
158
+ const colorNarrative = typeof parsed.colorNarrative === 'string' ? parsed.colorNarrative.trim() : '';
159
+ if (!summary) {
160
+ throw new Error('LLM response missing `summary`');
161
+ }
162
+ if (!colorNarrative) {
163
+ throw new Error('LLM response missing `colorNarrative`');
164
+ }
165
+ return {
166
+ summary,
167
+ colorNarrative,
168
+ designPrinciples: clip(toStringArray(parsed.designPrinciples), 6),
169
+ componentPatterns: clip(toStringArray(parsed.componentPatterns), 6),
170
+ layoutGuidance: clip(toStringArray(parsed.layoutGuidance), 5),
171
+ motionGuidance: clip(toStringArray(parsed.motionGuidance), 5),
172
+ suggestedTags: clip(toStringArray(parsed.suggestedTags), 8),
173
+ model: params.llm.model,
174
+ baseUrl: normalizeBaseUrl(params.llm.baseUrl),
175
+ generatedAt: nowIso(),
176
+ };
177
+ }
178
+ export async function enrichImageWithLlmVision(params) {
179
+ const absolutePath = path.resolve(params.imagePath);
180
+ const buffer = await fs.readFile(absolutePath);
181
+ const base64 = buffer.toString('base64');
182
+ const content = await runCompletion({
183
+ llm: params.llm,
184
+ system: 'You are a UI design reverse-engineering expert. Return strict JSON only; no markdown.',
185
+ userContent: [
186
+ {
187
+ type: 'text',
188
+ text: [
189
+ 'Analyze this screenshot and return JSON with keys:',
190
+ 'summary (string), components (string[]), typography (string[]), layout (string[]), motion (string[]), tags (string[]).',
191
+ 'Use short, concrete entries.',
192
+ `Source name: ${params.sourceName}`,
193
+ `Notes: ${params.notes ?? 'N/A'}`,
194
+ ].join('\n'),
195
+ },
196
+ {
197
+ type: 'image_url',
198
+ image_url: {
199
+ url: `data:image/png;base64,${base64}`,
200
+ },
201
+ },
202
+ ],
203
+ });
204
+ const jsonText = extractFirstJsonObject(content);
205
+ const parsed = JSON.parse(jsonText);
206
+ const components = (parsed.components ?? []).slice(0, 12).map((item, index) => ({
207
+ kind: 'vision-inferred',
208
+ tag: 'unknown',
209
+ selector: `vision-component-${index + 1}`,
210
+ text: item,
211
+ className: '',
212
+ styles: {},
213
+ }));
214
+ const typography = (parsed.typography ?? []).slice(0, 10).map((item) => ({
215
+ fontFamily: 'vision-inferred',
216
+ fontSize: item,
217
+ fontWeight: 'unknown',
218
+ lineHeight: 'unknown',
219
+ count: 1,
220
+ }));
221
+ const layout = (parsed.layout ?? []).slice(0, 10).map((item, index) => ({
222
+ tag: 'vision-layout',
223
+ selector: `vision-layout-${index + 1}`,
224
+ role: item,
225
+ children: 0,
226
+ }));
227
+ const motion = (parsed.motion ?? []).slice(0, 8).map((item, index) => ({
228
+ selector: `vision-motion-${index + 1}`,
229
+ transition: item,
230
+ animation: item,
231
+ transform: 'vision-inferred',
232
+ }));
233
+ return {
234
+ summary: parsed.summary,
235
+ tags: clip(toStringArray(parsed.tags), 10),
236
+ components,
237
+ typography,
238
+ layout,
239
+ motion,
240
+ };
241
+ }
242
+ export async function answerDesignQuestion(params) {
243
+ return runCompletion({
244
+ llm: params.llm,
245
+ system: 'You answer design memory questions from provided context. Be concise and factual.',
246
+ userContent: [`Question: ${params.query}`, '', 'Context:', params.context].join('\n'),
247
+ temperature: 0.1,
248
+ });
249
+ }
250
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { LlmConfig } from './types.js';
2
+ export interface SearchResult {
3
+ type: 'project' | 'inspiration' | 'outcome';
4
+ projectId: string;
5
+ id: string;
6
+ title: string;
7
+ score: number;
8
+ snippet: string;
9
+ }
10
+ export declare function searchDesignBrain(params: {
11
+ rootDir: string;
12
+ query: string;
13
+ project?: string;
14
+ limit?: number;
15
+ }): Promise<SearchResult[]>;
16
+ export declare function askDesignBrain(params: {
17
+ rootDir: string;
18
+ query: string;
19
+ project?: string;
20
+ limit?: number;
21
+ llm?: LlmConfig;
22
+ }): Promise<{
23
+ answer: string;
24
+ matches: SearchResult[];
25
+ }>;
package/dist/query.js ADDED
@@ -0,0 +1,150 @@
1
+ import { answerDesignQuestion } from './llm.js';
2
+ import { loadDatabase } from './store.js';
3
+ import { truncate, unique } from './util.js';
4
+ function tokenize(input) {
5
+ const base = input
6
+ .toLowerCase()
7
+ .split(/\s+/)
8
+ .map((token) => token.trim())
9
+ .filter((token) => token.length > 1);
10
+ const expanded = [];
11
+ for (const token of base) {
12
+ expanded.push(token);
13
+ if (token.endsWith('s') && token.length > 3) {
14
+ expanded.push(token.slice(0, -1));
15
+ }
16
+ }
17
+ return unique(expanded);
18
+ }
19
+ function countHits(haystack, tokens) {
20
+ const lower = haystack.toLowerCase();
21
+ let score = 0;
22
+ for (const token of tokens) {
23
+ if (lower.includes(token)) {
24
+ score += 1;
25
+ }
26
+ }
27
+ return score;
28
+ }
29
+ function buildSnippet(haystack, tokens) {
30
+ const lower = haystack.toLowerCase();
31
+ for (const token of tokens) {
32
+ const idx = lower.indexOf(token);
33
+ if (idx >= 0) {
34
+ const start = Math.max(0, idx - 60);
35
+ const end = Math.min(haystack.length, idx + 120);
36
+ return truncate(haystack.slice(start, end).replace(/\s+/g, ' ').trim(), 180);
37
+ }
38
+ }
39
+ return truncate(haystack.replace(/\s+/g, ' ').trim(), 180);
40
+ }
41
+ export async function searchDesignBrain(params) {
42
+ const db = await loadDatabase(params.rootDir);
43
+ const tokens = tokenize(params.query);
44
+ const results = [];
45
+ if (tokens.length === 0) {
46
+ return [];
47
+ }
48
+ for (const project of db.projects) {
49
+ if (params.project && params.project !== project.id) {
50
+ continue;
51
+ }
52
+ const projectText = `${project.name}\n${project.description ?? ''}`;
53
+ const projectScore = countHits(projectText, tokens);
54
+ if (projectScore > 0) {
55
+ results.push({
56
+ type: 'project',
57
+ projectId: project.id,
58
+ id: project.id,
59
+ title: project.name,
60
+ score: projectScore,
61
+ snippet: buildSnippet(projectText, tokens),
62
+ });
63
+ }
64
+ for (const inspiration of project.inspirations) {
65
+ const inspirationText = [
66
+ inspiration.name,
67
+ inspiration.url,
68
+ inspiration.notes,
69
+ inspiration.inspirationSummary,
70
+ inspiration.llmEnrichment?.summary,
71
+ ...(inspiration.llmEnrichment?.designPrinciples ?? []),
72
+ ...(inspiration.llmEnrichment?.componentPatterns ?? []),
73
+ inspiration.analysis.colors.map((color) => color.hex).join(' '),
74
+ inspiration.analysis.components.map((component) => component.kind).join(' '),
75
+ inspiration.analysis.motion.map((motion) => `${motion.transition} ${motion.animation}`).join(' '),
76
+ inspiration.analysis.stateStyles && inspiration.analysis.stateStyles.length > 0 ? 'interaction states hover focus active' : '',
77
+ (inspiration.analysis.stateStyles ?? []).map((state) => `${state.selector} ${state.state}`).join(' '),
78
+ (inspiration.analysis.responsiveSnapshots ?? []).map((snap) => `${snap.label} ${snap.viewport.width}x${snap.viewport.height}`).join(' '),
79
+ (inspiration.analysis.journey ?? []).map((step) => `${step.action} ${step.summary ?? ''}`).join(' '),
80
+ ].filter(Boolean).join('\n');
81
+ const score = countHits(inspirationText, tokens);
82
+ if (score > 0) {
83
+ results.push({
84
+ type: 'inspiration',
85
+ projectId: project.id,
86
+ id: inspiration.id,
87
+ title: inspiration.name,
88
+ score,
89
+ snippet: buildSnippet(inspirationText, tokens),
90
+ });
91
+ }
92
+ }
93
+ for (const outcome of project.outcomes) {
94
+ const outcomeText = [
95
+ outcome.title,
96
+ outcome.description,
97
+ outcome.tags.join(' '),
98
+ outcome.artifactUrl,
99
+ ].filter(Boolean).join('\n');
100
+ const score = countHits(outcomeText, tokens);
101
+ if (score > 0) {
102
+ results.push({
103
+ type: 'outcome',
104
+ projectId: project.id,
105
+ id: outcome.id,
106
+ title: outcome.title,
107
+ score,
108
+ snippet: buildSnippet(outcomeText, tokens),
109
+ });
110
+ }
111
+ }
112
+ }
113
+ return results
114
+ .sort((a, b) => b.score - a.score)
115
+ .slice(0, params.limit ?? 10);
116
+ }
117
+ function buildContext(results) {
118
+ if (results.length === 0) {
119
+ return 'No matches found.';
120
+ }
121
+ return results
122
+ .map((result, index) => `${index + 1}. [${result.type}] ${result.projectId}/${result.id}: ${result.title}\n${result.snippet}`)
123
+ .join('\n\n');
124
+ }
125
+ export async function askDesignBrain(params) {
126
+ const matches = await searchDesignBrain({
127
+ rootDir: params.rootDir,
128
+ query: params.query,
129
+ project: params.project,
130
+ limit: params.limit ?? 8,
131
+ });
132
+ if (!params.llm) {
133
+ if (matches.length === 0) {
134
+ return { answer: 'No matching design memory records found.', matches };
135
+ }
136
+ const answer = [
137
+ 'Top matches (LLM not configured):',
138
+ ...matches.map((match) => `- [${match.type}] ${match.projectId}/${match.id}: ${match.title} (${match.score})`),
139
+ ].join('\n');
140
+ return { answer, matches };
141
+ }
142
+ const context = buildContext(matches);
143
+ const answer = await answerDesignQuestion({
144
+ llm: params.llm,
145
+ query: params.query,
146
+ context,
147
+ });
148
+ return { answer, matches };
149
+ }
150
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAY7C,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,IAAI,GAAG,KAAK;SACf,WAAW,EAAE;SACb,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,MAAgB;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,MAAgB;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACjD,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAKvC;IACC,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QACpE,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,OAAO,CAAC,IAAI;gBACnB,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAC/C,MAAM,eAAe,GAAG;gBACtB,WAAW,CAAC,IAAI;gBAChB,WAAW,CAAC,GAAG;gBACf,WAAW,CAAC,KAAK;gBACjB,WAAW,CAAC,kBAAkB;gBAC9B,WAAW,CAAC,aAAa,EAAE,OAAO;gBAClC,GAAG,CAAC,WAAW,CAAC,aAAa,EAAE,gBAAgB,IAAI,EAAE,CAAC;gBACtD,GAAG,CAAC,WAAW,CAAC,aAAa,EAAE,iBAAiB,IAAI,EAAE,CAAC;gBACvD,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC/D,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC5E,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjG,WAAW,CAAC,QAAQ,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,EAAE;gBAC9H,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACrG,CAAC,WAAW,CAAC,QAAQ,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACxI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;aACrG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE7B,MAAM,KAAK,GAAG,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,EAAE,EAAE,WAAW,CAAC,EAAE;oBAClB,KAAK,EAAE,WAAW,CAAC,IAAI;oBACvB,KAAK;oBACL,OAAO,EAAE,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC;iBAC/C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG;gBAClB,OAAO,CAAC,KAAK;gBACb,OAAO,CAAC,WAAW;gBACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACtB,OAAO,CAAC,WAAW;aACpB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,SAAS;oBACf,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,KAAK;oBACL,OAAO,EAAE,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO;SACX,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,OAAuB;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;SAC7H,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAMpC;IACC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,0CAA0C,EAAE,OAAO,EAAE,CAAC;QACzE,CAAC;QAED,MAAM,MAAM,GAAG;YACb,mCAAmC;YACnC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC;SAC/G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;KACR,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { DesignBrainDatabase } from './types.js';
2
+ export declare function renderAll(rootDir: string, db: DesignBrainDatabase, skipVisuals?: boolean): Promise<void>;