@daviesayo/mise-en-scene 0.1.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 (186) hide show
  1. package/dist/commands/clean.d.ts +7 -0
  2. package/dist/commands/clean.d.ts.map +1 -0
  3. package/dist/commands/clean.js +54 -0
  4. package/dist/commands/clean.js.map +1 -0
  5. package/dist/commands/export.d.ts +11 -0
  6. package/dist/commands/export.d.ts.map +1 -0
  7. package/dist/commands/export.js +30 -0
  8. package/dist/commands/export.js.map +1 -0
  9. package/dist/commands/gallery.d.ts +2 -0
  10. package/dist/commands/gallery.d.ts.map +1 -0
  11. package/dist/commands/gallery.js +23 -0
  12. package/dist/commands/gallery.js.map +1 -0
  13. package/dist/commands/init.d.ts +8 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +105 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/serve.d.ts +7 -0
  18. package/dist/commands/serve.d.ts.map +1 -0
  19. package/dist/commands/serve.js +25 -0
  20. package/dist/commands/serve.js.map +1 -0
  21. package/dist/commands/stop.d.ts +6 -0
  22. package/dist/commands/stop.d.ts.map +1 -0
  23. package/dist/commands/stop.js +18 -0
  24. package/dist/commands/stop.js.map +1 -0
  25. package/dist/commands/taste.d.ts +7 -0
  26. package/dist/commands/taste.d.ts.map +1 -0
  27. package/dist/commands/taste.js +33 -0
  28. package/dist/commands/taste.js.map +1 -0
  29. package/dist/config-writer.d.ts +2 -0
  30. package/dist/config-writer.d.ts.map +1 -0
  31. package/dist/config-writer.js +33 -0
  32. package/dist/config-writer.js.map +1 -0
  33. package/dist/detect-platform.d.ts +16 -0
  34. package/dist/detect-platform.d.ts.map +1 -0
  35. package/dist/detect-platform.js +41 -0
  36. package/dist/detect-platform.js.map +1 -0
  37. package/dist/hooks-installer.d.ts +8 -0
  38. package/dist/hooks-installer.d.ts.map +1 -0
  39. package/dist/hooks-installer.js +62 -0
  40. package/dist/hooks-installer.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +83 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/scaffold.d.ts +2 -0
  46. package/dist/scaffold.d.ts.map +1 -0
  47. package/dist/scaffold.js +38 -0
  48. package/dist/scaffold.js.map +1 -0
  49. package/dist/server/export/index.d.ts +10 -0
  50. package/dist/server/export/index.d.ts.map +1 -0
  51. package/dist/server/export/index.js +65 -0
  52. package/dist/server/export/index.js.map +1 -0
  53. package/dist/server/export/pdf-export.d.ts +8 -0
  54. package/dist/server/export/pdf-export.d.ts.map +1 -0
  55. package/dist/server/export/pdf-export.js +17 -0
  56. package/dist/server/export/pdf-export.js.map +1 -0
  57. package/dist/server/export/presets.d.ts +4 -0
  58. package/dist/server/export/presets.d.ts.map +1 -0
  59. package/dist/server/export/presets.js +22 -0
  60. package/dist/server/export/presets.js.map +1 -0
  61. package/dist/server/export/puppeteer-manager.d.ts +8 -0
  62. package/dist/server/export/puppeteer-manager.d.ts.map +1 -0
  63. package/dist/server/export/puppeteer-manager.js +24 -0
  64. package/dist/server/export/puppeteer-manager.js.map +1 -0
  65. package/dist/server/export/raster-export.d.ts +11 -0
  66. package/dist/server/export/raster-export.d.ts.map +1 -0
  67. package/dist/server/export/raster-export.js +28 -0
  68. package/dist/server/export/raster-export.js.map +1 -0
  69. package/dist/server/export/svg-export.d.ts +2 -0
  70. package/dist/server/export/svg-export.d.ts.map +1 -0
  71. package/dist/server/export/svg-export.js +17 -0
  72. package/dist/server/export/svg-export.js.map +1 -0
  73. package/dist/server/feedback.d.ts +4 -0
  74. package/dist/server/feedback.d.ts.map +1 -0
  75. package/dist/server/feedback.js +29 -0
  76. package/dist/server/feedback.js.map +1 -0
  77. package/dist/server/http-server.d.ts +19 -0
  78. package/dist/server/http-server.d.ts.map +1 -0
  79. package/dist/server/http-server.js +199 -0
  80. package/dist/server/http-server.js.map +1 -0
  81. package/dist/server/index.d.ts +3 -0
  82. package/dist/server/index.d.ts.map +1 -0
  83. package/dist/server/index.js +44 -0
  84. package/dist/server/index.js.map +1 -0
  85. package/dist/server/mcp-server.d.ts +433 -0
  86. package/dist/server/mcp-server.d.ts.map +1 -0
  87. package/dist/server/mcp-server.js +248 -0
  88. package/dist/server/mcp-server.js.map +1 -0
  89. package/dist/server/preview.d.ts +2 -0
  90. package/dist/server/preview.d.ts.map +1 -0
  91. package/dist/server/preview.js +15 -0
  92. package/dist/server/preview.js.map +1 -0
  93. package/dist/server/screenshot.d.ts +7 -0
  94. package/dist/server/screenshot.d.ts.map +1 -0
  95. package/dist/server/screenshot.js +23 -0
  96. package/dist/server/screenshot.js.map +1 -0
  97. package/dist/server/serve.d.ts +3 -0
  98. package/dist/server/serve.d.ts.map +1 -0
  99. package/dist/server/serve.js +39 -0
  100. package/dist/server/serve.js.map +1 -0
  101. package/dist/server/types.d.ts +84 -0
  102. package/dist/server/types.d.ts.map +1 -0
  103. package/dist/server/types.js +2 -0
  104. package/dist/server/types.js.map +1 -0
  105. package/dist/server/typography/analyze-url.d.ts +10 -0
  106. package/dist/server/typography/analyze-url.d.ts.map +1 -0
  107. package/dist/server/typography/analyze-url.js +28 -0
  108. package/dist/server/typography/analyze-url.js.map +1 -0
  109. package/dist/server/typography/classify.d.ts +9 -0
  110. package/dist/server/typography/classify.d.ts.map +1 -0
  111. package/dist/server/typography/classify.js +15 -0
  112. package/dist/server/typography/classify.js.map +1 -0
  113. package/dist/server/typography/embed.d.ts +5 -0
  114. package/dist/server/typography/embed.d.ts.map +1 -0
  115. package/dist/server/typography/embed.js +34 -0
  116. package/dist/server/typography/embed.js.map +1 -0
  117. package/dist/server/typography/mood-match.d.ts +3 -0
  118. package/dist/server/typography/mood-match.d.ts.map +1 -0
  119. package/dist/server/typography/mood-match.js +21 -0
  120. package/dist/server/typography/mood-match.js.map +1 -0
  121. package/dist/server/typography/registry.d.ts +23 -0
  122. package/dist/server/typography/registry.d.ts.map +1 -0
  123. package/dist/server/typography/registry.js +93 -0
  124. package/dist/server/typography/registry.js.map +1 -0
  125. package/dist/server/typography/scale.d.ts +3 -0
  126. package/dist/server/typography/scale.d.ts.map +1 -0
  127. package/dist/server/typography/scale.js +43 -0
  128. package/dist/server/typography/scale.js.map +1 -0
  129. package/dist/server/typography/suggest.d.ts +9 -0
  130. package/dist/server/typography/suggest.d.ts.map +1 -0
  131. package/dist/server/typography/suggest.js +21 -0
  132. package/dist/server/typography/suggest.js.map +1 -0
  133. package/dist/server/versioning/gallery.d.ts +3 -0
  134. package/dist/server/versioning/gallery.d.ts.map +1 -0
  135. package/dist/server/versioning/gallery.js +57 -0
  136. package/dist/server/versioning/gallery.js.map +1 -0
  137. package/dist/server/versioning/versions.d.ts +19 -0
  138. package/dist/server/versioning/versions.d.ts.map +1 -0
  139. package/dist/server/versioning/versions.js +91 -0
  140. package/dist/server/versioning/versions.js.map +1 -0
  141. package/dist/server/watcher.d.ts +6 -0
  142. package/dist/server/watcher.d.ts.map +1 -0
  143. package/dist/server/watcher.js +23 -0
  144. package/dist/server/watcher.js.map +1 -0
  145. package/dist/server/websocket.d.ts +13 -0
  146. package/dist/server/websocket.d.ts.map +1 -0
  147. package/dist/server/websocket.js +36 -0
  148. package/dist/server/websocket.js.map +1 -0
  149. package/dist/skill/SKILL.md +280 -0
  150. package/dist/taste-memory/db.d.ts +5 -0
  151. package/dist/taste-memory/db.d.ts.map +1 -0
  152. package/dist/taste-memory/db.js +64 -0
  153. package/dist/taste-memory/db.js.map +1 -0
  154. package/dist/taste-memory/embeddings.d.ts +3 -0
  155. package/dist/taste-memory/embeddings.d.ts.map +1 -0
  156. package/dist/taste-memory/embeddings.js +24 -0
  157. package/dist/taste-memory/embeddings.js.map +1 -0
  158. package/dist/taste-memory/index.d.ts +3 -0
  159. package/dist/taste-memory/index.d.ts.map +1 -0
  160. package/dist/taste-memory/index.js +113 -0
  161. package/dist/taste-memory/index.js.map +1 -0
  162. package/dist/taste-memory/profile.d.ts +6 -0
  163. package/dist/taste-memory/profile.d.ts.map +1 -0
  164. package/dist/taste-memory/profile.js +33 -0
  165. package/dist/taste-memory/profile.js.map +1 -0
  166. package/dist/taste-memory/search.d.ts +16 -0
  167. package/dist/taste-memory/search.d.ts.map +1 -0
  168. package/dist/taste-memory/search.js +53 -0
  169. package/dist/taste-memory/search.js.map +1 -0
  170. package/dist/taste-memory/server.d.ts +43 -0
  171. package/dist/taste-memory/server.d.ts.map +1 -0
  172. package/dist/taste-memory/server.js +64 -0
  173. package/dist/taste-memory/server.js.map +1 -0
  174. package/dist/taste-memory/store.d.ts +21 -0
  175. package/dist/taste-memory/store.d.ts.map +1 -0
  176. package/dist/taste-memory/store.js +72 -0
  177. package/dist/taste-memory/store.js.map +1 -0
  178. package/dist/taste-memory/types.d.ts +95 -0
  179. package/dist/taste-memory/types.d.ts.map +1 -0
  180. package/dist/taste-memory/types.js +2 -0
  181. package/dist/taste-memory/types.js.map +1 -0
  182. package/dist/types.d.ts +13 -0
  183. package/dist/types.d.ts.map +1 -0
  184. package/dist/types.js +2 -0
  185. package/dist/types.js.map +1 -0
  186. package/package.json +36 -0
@@ -0,0 +1,64 @@
1
+ // src/db.ts
2
+ import Database from 'better-sqlite3';
3
+ let db = null;
4
+ export function createDatabase(dbPath) {
5
+ db = new Database(dbPath);
6
+ db.pragma('journal_mode = WAL');
7
+ db.pragma('foreign_keys = ON');
8
+ db.exec(`
9
+ CREATE TABLE IF NOT EXISTS taste_entries (
10
+ id TEXT PRIMARY KEY,
11
+ type TEXT NOT NULL CHECK(type IN ('palette','typography','layout','texture','mood','anti-pattern')),
12
+ scope TEXT NOT NULL CHECK(scope IN ('user','project')),
13
+ project TEXT,
14
+ data TEXT NOT NULL,
15
+ reasoning TEXT,
16
+ embedding BLOB,
17
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
18
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
19
+ );
20
+
21
+ CREATE TABLE IF NOT EXISTS taste_decisions (
22
+ id TEXT PRIMARY KEY,
23
+ project TEXT,
24
+ chosen TEXT NOT NULL,
25
+ rejected TEXT NOT NULL,
26
+ reason TEXT NOT NULL,
27
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
28
+ );
29
+
30
+ CREATE TABLE IF NOT EXISTS taste_references (
31
+ id TEXT PRIMARY KEY,
32
+ project TEXT NOT NULL,
33
+ image_path TEXT,
34
+ analysis TEXT NOT NULL,
35
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
36
+ );
37
+
38
+ CREATE TABLE IF NOT EXISTS design_systems (
39
+ project TEXT PRIMARY KEY,
40
+ tokens TEXT NOT NULL,
41
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
42
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_entries_type ON taste_entries(type);
46
+ CREATE INDEX IF NOT EXISTS idx_entries_scope ON taste_entries(scope);
47
+ CREATE INDEX IF NOT EXISTS idx_entries_project ON taste_entries(project);
48
+ CREATE INDEX IF NOT EXISTS idx_decisions_project ON taste_decisions(project);
49
+ CREATE INDEX IF NOT EXISTS idx_references_project ON taste_references(project);
50
+ `);
51
+ return db;
52
+ }
53
+ export function getDatabase() {
54
+ if (!db)
55
+ throw new Error('Database not initialized. Call createDatabase() first.');
56
+ return db;
57
+ }
58
+ export function closeDatabase() {
59
+ if (db) {
60
+ db.close();
61
+ db = null;
62
+ }
63
+ }
64
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CP,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACnF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function tokenize(text: string): string[];
2
+ export declare function textSimilarity(query: string, document: string): number;
3
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWtE"}
@@ -0,0 +1,24 @@
1
+ // src/embeddings.ts
2
+ // v1: Simple TF-IDF-style text matching using tokenization.
3
+ // Future: Replace with proper vector embeddings (e.g., transformers.js)
4
+ export function tokenize(text) {
5
+ return text
6
+ .toLowerCase()
7
+ .replace(/[^a-z0-9\s#]/g, ' ')
8
+ .split(/\s+/)
9
+ .filter((t) => t.length > 1);
10
+ }
11
+ export function textSimilarity(query, document) {
12
+ const queryTokens = new Set(tokenize(query));
13
+ const docTokens = tokenize(document);
14
+ if (queryTokens.size === 0 || docTokens.length === 0)
15
+ return 0;
16
+ const docTokenSet = new Set(docTokens);
17
+ let matches = 0;
18
+ for (const token of queryTokens) {
19
+ if (docTokenSet.has(token))
20
+ matches++;
21
+ }
22
+ return matches / queryTokens.size;
23
+ }
24
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,4DAA4D;AAC5D,wEAAwE;AAExE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,QAAgB;IAC5D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;AACpC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { createToolHandlers } from './server.js';
6
+ import path from 'path';
7
+ import os from 'os';
8
+ import fs from 'fs';
9
+ const DB_PATH = process.env.MISE_TASTE_DB
10
+ ?? path.join(os.homedir(), '.mise-en-scene', 'taste-memory.db');
11
+ // Ensure directory exists
12
+ fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
13
+ const handlers = createToolHandlers(DB_PATH);
14
+ const server = new Server({ name: 'mise-en-scene-taste-memory', version: '0.1.0' }, { capabilities: { tools: {} } });
15
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
16
+ tools: [
17
+ {
18
+ name: 'taste_remember',
19
+ description: 'Store a taste observation (palette, typography, layout, texture, mood, or anti-pattern)',
20
+ inputSchema: {
21
+ type: 'object',
22
+ properties: {
23
+ type: { type: 'string', enum: ['palette', 'typography', 'layout', 'texture', 'mood', 'anti-pattern'] },
24
+ scope: { type: 'string', enum: ['user', 'project'], default: 'user' },
25
+ data: { type: 'object', description: 'The taste data to store' },
26
+ reasoning: { type: 'string', description: 'Why this taste observation matters' },
27
+ project: { type: 'string', description: 'Project name (required if scope is project)' },
28
+ },
29
+ required: ['type', 'data'],
30
+ },
31
+ },
32
+ {
33
+ name: 'taste_recall',
34
+ description: 'Semantic search across taste memory',
35
+ inputSchema: {
36
+ type: 'object',
37
+ properties: {
38
+ query: { type: 'string', description: 'Search query' },
39
+ type: { type: 'string', enum: ['palette', 'typography', 'layout', 'texture', 'mood', 'anti-pattern'] },
40
+ scope: { type: 'string', enum: ['user', 'project'] },
41
+ project: { type: 'string' },
42
+ limit: { type: 'number', default: 10 },
43
+ },
44
+ required: ['query'],
45
+ },
46
+ },
47
+ {
48
+ name: 'taste_profile',
49
+ description: 'Get the full taste profile (user-level, project-level, or merged)',
50
+ inputSchema: {
51
+ type: 'object',
52
+ properties: {
53
+ scope: { type: 'string', enum: ['user', 'project', 'merged'] },
54
+ project: { type: 'string', description: 'Project name (required for project/merged scope)' },
55
+ },
56
+ required: ['scope'],
57
+ },
58
+ },
59
+ {
60
+ name: 'taste_decide',
61
+ description: 'Record a design decision with reasoning (what was chosen, what was rejected, and why)',
62
+ inputSchema: {
63
+ type: 'object',
64
+ properties: {
65
+ chosen: { type: 'object', description: 'The chosen option' },
66
+ rejected: { type: 'object', description: 'The rejected option' },
67
+ reason: { type: 'string', description: 'Why this choice was made' },
68
+ project: { type: 'string' },
69
+ },
70
+ required: ['chosen', 'rejected', 'reason'],
71
+ },
72
+ },
73
+ {
74
+ name: 'taste_reference',
75
+ description: 'Store analyzed reference image data',
76
+ inputSchema: {
77
+ type: 'object',
78
+ properties: {
79
+ project: { type: 'string' },
80
+ analysis: { type: 'object', description: 'Structured analysis of the reference image' },
81
+ image_path: { type: 'string' },
82
+ },
83
+ required: ['project', 'analysis'],
84
+ },
85
+ },
86
+ {
87
+ name: 'taste_system',
88
+ description: 'Store or retrieve project design system tokens. Pass tokens to store, omit to retrieve.',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ project: { type: 'string' },
93
+ tokens: { type: 'object', description: 'Design system tokens to store. Omit to retrieve existing.' },
94
+ },
95
+ required: ['project'],
96
+ },
97
+ },
98
+ ],
99
+ }));
100
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
101
+ const { name, arguments: args } = request.params;
102
+ const handler = handlers[name];
103
+ if (!handler) {
104
+ return { content: [{ type: 'text', text: `Unknown tool: ${name}` }] };
105
+ }
106
+ return handler(args);
107
+ });
108
+ async function main() {
109
+ const transport = new StdioServerTransport();
110
+ await server.connect(transport);
111
+ }
112
+ main().catch(console.error);
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TasteStore } from './store.js';
2
+ import type { TasteProfile } from './types.js';
3
+ type ProfileScope = 'user' | 'project' | 'merged';
4
+ export declare function buildProfile(store: TasteStore, scope: ProfileScope, project?: string): TasteProfile;
5
+ export {};
6
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,KAAK,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,YAAY,CAmCd"}
@@ -0,0 +1,33 @@
1
+ export function buildProfile(store, scope, project) {
2
+ const profile = {
3
+ palettes: [],
4
+ typography: [],
5
+ layouts: [],
6
+ textures: [],
7
+ moods: [],
8
+ anti_patterns: [],
9
+ decisions: [],
10
+ references: [],
11
+ };
12
+ if (scope === 'user' || scope === 'merged') {
13
+ profile.palettes.push(...store.getEntriesByType('palette', 'user'));
14
+ profile.typography.push(...store.getEntriesByType('typography', 'user'));
15
+ profile.layouts.push(...store.getEntriesByType('layout', 'user'));
16
+ profile.textures.push(...store.getEntriesByType('texture', 'user'));
17
+ profile.moods.push(...store.getEntriesByType('mood', 'user'));
18
+ profile.anti_patterns.push(...store.getEntriesByType('anti-pattern', 'user'));
19
+ }
20
+ if ((scope === 'project' || scope === 'merged') && project) {
21
+ profile.palettes.push(...store.getEntriesByType('palette', 'project', project));
22
+ profile.typography.push(...store.getEntriesByType('typography', 'project', project));
23
+ profile.layouts.push(...store.getEntriesByType('layout', 'project', project));
24
+ profile.textures.push(...store.getEntriesByType('texture', 'project', project));
25
+ profile.moods.push(...store.getEntriesByType('mood', 'project', project));
26
+ profile.anti_patterns.push(...store.getEntriesByType('anti-pattern', 'project', project));
27
+ // Decisions and references are always project-scoped
28
+ profile.decisions = store.getDecisionsByProject(project);
29
+ profile.references = store.getReferencesByProject(project);
30
+ }
31
+ return profile;
32
+ }
33
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,YAAY,CAC1B,KAAiB,EACjB,KAAmB,EACnB,OAAgB;IAEhB,MAAM,OAAO,GAAiB;QAC5B,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAA8B,CAAC,CAAC;QAClG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAgC,CAAC,CAAC;QACzG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAA6B,CAAC,CAAC;QAC/F,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAA8B,CAAC,CAAC;QAClG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAA2B,CAAC,CAAC;QACzF,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAmC,CAAC,CAAC;IACnH,CAAC;IAED,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;QAC3D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAA8B,CAAC,CAAC;QAC9G,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAgC,CAAC,CAAC;QACrH,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAA6B,CAAC,CAAC;QAC3G,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAA8B,CAAC,CAAC;QAC9G,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAA2B,CAAC,CAAC;QACrG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,gBAAgB,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAmC,CAAC,CAAC;QAE7H,qDAAqD;QACrD,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAA8B,CAAC;QACtF,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAA+B,CAAC;IAC3F,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { TasteType } from './types.js';
3
+ interface SearchOptions {
4
+ type?: TasteType;
5
+ scope?: 'user' | 'project';
6
+ project?: string;
7
+ limit?: number;
8
+ }
9
+ export declare class TasteSearch {
10
+ private db;
11
+ constructor(db: Database.Database);
12
+ textSearch(query: string, opts?: SearchOptions): Record<string, unknown>[];
13
+ searchDecisions(query: string, project?: string, limit?: number): Record<string, unknown>[];
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEzC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IA+B1E,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;CAqBxF"}
@@ -0,0 +1,53 @@
1
+ import { textSimilarity } from './embeddings.js';
2
+ export class TasteSearch {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ textSearch(query, opts) {
8
+ const limit = opts?.limit ?? 10;
9
+ let sql = 'SELECT * FROM taste_entries WHERE 1=1';
10
+ const params = [];
11
+ if (opts?.type) {
12
+ sql += ' AND type = ?';
13
+ params.push(opts.type);
14
+ }
15
+ if (opts?.scope) {
16
+ sql += ' AND scope = ?';
17
+ params.push(opts.scope);
18
+ }
19
+ if (opts?.project) {
20
+ sql += ' AND project = ?';
21
+ params.push(opts.project);
22
+ }
23
+ const rows = this.db.prepare(sql).all(...params);
24
+ return rows
25
+ .map((row) => {
26
+ const searchable = [row.data, row.reasoning ?? ''].join(' ');
27
+ const score = textSimilarity(query, searchable);
28
+ return { ...row, _score: score };
29
+ })
30
+ .filter((r) => r._score > 0)
31
+ .sort((a, b) => b._score - a._score)
32
+ .slice(0, limit);
33
+ }
34
+ searchDecisions(query, project, limit = 10) {
35
+ let sql = 'SELECT * FROM taste_decisions WHERE 1=1';
36
+ const params = [];
37
+ if (project) {
38
+ sql += ' AND project = ?';
39
+ params.push(project);
40
+ }
41
+ const rows = this.db.prepare(sql).all(...params);
42
+ return rows
43
+ .map((row) => {
44
+ const searchable = [row.chosen, row.rejected, row.reason].join(' ');
45
+ const score = textSimilarity(query, searchable);
46
+ return { ...row, _score: score };
47
+ })
48
+ .filter((r) => r._score > 0)
49
+ .sort((a, b) => b._score - a._score)
50
+ .slice(0, limit);
51
+ }
52
+ }
53
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ interface ToolResult {
2
+ content: Array<{
3
+ type: 'text';
4
+ text: string;
5
+ }>;
6
+ }
7
+ export declare function createToolHandlers(dbPath: string): {
8
+ taste_remember(args: {
9
+ type: string;
10
+ scope?: string;
11
+ data: Record<string, unknown>;
12
+ reasoning?: string;
13
+ project?: string;
14
+ }): Promise<ToolResult>;
15
+ taste_recall(args: {
16
+ query: string;
17
+ type?: string;
18
+ scope?: string;
19
+ project?: string;
20
+ limit?: number;
21
+ }): Promise<ToolResult>;
22
+ taste_profile(args: {
23
+ scope: string;
24
+ project?: string;
25
+ }): Promise<ToolResult>;
26
+ taste_decide(args: {
27
+ chosen: Record<string, unknown>;
28
+ rejected: Record<string, unknown>;
29
+ reason: string;
30
+ project?: string;
31
+ }): Promise<ToolResult>;
32
+ taste_reference(args: {
33
+ project: string;
34
+ analysis: Record<string, unknown>;
35
+ image_path?: string;
36
+ }): Promise<ToolResult>;
37
+ taste_system(args: {
38
+ project: string;
39
+ tokens?: Record<string, unknown>;
40
+ }): Promise<ToolResult>;
41
+ };
42
+ export {};
43
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM;yBAMlB;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,UAAU,CAAC;uBAUE;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,UAAU,CAAC;wBAyBG;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,UAAU,CAAC;uBAKE;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,UAAU,CAAC;0BAKK;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,UAAU,CAAC;uBAKE;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,UAAU,CAAC;EAY1B"}
@@ -0,0 +1,64 @@
1
+ // src/server.ts
2
+ import { createDatabase } from './db.js';
3
+ import { TasteStore } from './store.js';
4
+ import { TasteSearch } from './search.js';
5
+ import { buildProfile } from './profile.js';
6
+ function text(msg) {
7
+ return { content: [{ type: 'text', text: msg }] };
8
+ }
9
+ export function createToolHandlers(dbPath) {
10
+ const db = createDatabase(dbPath);
11
+ const store = new TasteStore(db);
12
+ const search = new TasteSearch(db);
13
+ return {
14
+ async taste_remember(args) {
15
+ const id = store.remember(args.type, (args.scope ?? 'user'), args.data, { project: args.project, reasoning: args.reasoning });
16
+ return text(`Stored ${args.type} entry (id: ${id})`);
17
+ },
18
+ async taste_recall(args) {
19
+ const results = search.textSearch(args.query, {
20
+ type: args.type,
21
+ scope: args.scope,
22
+ project: args.project,
23
+ limit: args.limit,
24
+ });
25
+ if (results.length === 0) {
26
+ return text('No matching taste entries found.');
27
+ }
28
+ const formatted = results.map((r) => ({
29
+ id: r.id,
30
+ type: r.type,
31
+ scope: r.scope,
32
+ project: r.project,
33
+ data: JSON.parse(r.data),
34
+ reasoning: r.reasoning,
35
+ score: r._score,
36
+ }));
37
+ return text(JSON.stringify(formatted, null, 2));
38
+ },
39
+ async taste_profile(args) {
40
+ const profile = buildProfile(store, args.scope, args.project);
41
+ return text(JSON.stringify(profile, null, 2));
42
+ },
43
+ async taste_decide(args) {
44
+ const id = store.decide(args.chosen, args.rejected, args.reason, args.project);
45
+ return text(`Recorded design decision (id: ${id})`);
46
+ },
47
+ async taste_reference(args) {
48
+ const id = store.storeReference(args.project, args.analysis, args.image_path);
49
+ return text(`Stored reference analysis for project "${args.project}" (id: ${id})`);
50
+ },
51
+ async taste_system(args) {
52
+ if (args.tokens) {
53
+ store.storeDesignSystem(args.project, args.tokens);
54
+ return text(`Stored design system tokens for project "${args.project}"`);
55
+ }
56
+ const system = store.getDesignSystem(args.project);
57
+ if (!system) {
58
+ return text(`No design system found for project "${args.project}"`);
59
+ }
60
+ return text(JSON.stringify(JSON.parse(system.tokens), null, 2));
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { TasteType, TasteScope } from './types.js';
3
+ export declare class TasteStore {
4
+ private db;
5
+ constructor(db: Database.Database);
6
+ remember(type: TasteType, scope: TasteScope, data: Record<string, unknown>, opts?: {
7
+ project?: string;
8
+ reasoning?: string;
9
+ }): string;
10
+ getById(id: string): Record<string, unknown> | undefined;
11
+ getEntriesByType(type: TasteType, scope: TasteScope, project?: string): unknown[];
12
+ decide(chosen: Record<string, unknown>, rejected: Record<string, unknown>, reason: string, project?: string): string;
13
+ getDecision(id: string): Record<string, unknown> | undefined;
14
+ getDecisionsByProject(project: string): unknown[];
15
+ storeReference(project: string, analysis: Record<string, unknown>, imagePath?: string): string;
16
+ getReference(id: string): Record<string, unknown> | undefined;
17
+ getReferencesByProject(project: string): unknown[];
18
+ storeDesignSystem(project: string, tokens: Record<string, unknown>): void;
19
+ getDesignSystem(project: string): Record<string, unknown> | undefined;
20
+ }
21
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,UAAU;IACT,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEzC,QAAQ,CACN,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9C,MAAM;IAWT,OAAO,CAAC,EAAE,EAAE,MAAM,GAC8D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAGnH,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM;IAWrE,MAAM,CACJ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,MAAM;IAWT,WAAW,CAAC,EAAE,EAAE,MAAM,GAC4D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAGrH,qBAAqB,CAAC,OAAO,EAAE,MAAM;IAMrC,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM;IAWT,YAAY,CAAC,EAAE,EAAE,MAAM,GAC4D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAGtH,sBAAsB,CAAC,OAAO,EAAE,MAAM;IAMtC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAUzE,eAAe,CAAC,OAAO,EAAE,MAAM,GAC4D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;CAE/H"}
@@ -0,0 +1,72 @@
1
+ // src/store.ts
2
+ import { randomUUID } from 'crypto';
3
+ export class TasteStore {
4
+ db;
5
+ constructor(db) {
6
+ this.db = db;
7
+ }
8
+ remember(type, scope, data, opts) {
9
+ const id = randomUUID();
10
+ this.db
11
+ .prepare(`INSERT INTO taste_entries (id, type, scope, project, data, reasoning)
12
+ VALUES (?, ?, ?, ?, ?, ?)`)
13
+ .run(id, type, scope, opts?.project ?? null, JSON.stringify(data), opts?.reasoning ?? null);
14
+ return id;
15
+ }
16
+ getById(id) {
17
+ return this.db.prepare('SELECT * FROM taste_entries WHERE id = ?').get(id);
18
+ }
19
+ getEntriesByType(type, scope, project) {
20
+ if (scope === 'project' && project) {
21
+ return this.db
22
+ .prepare('SELECT * FROM taste_entries WHERE type = ? AND scope = ? AND project = ?')
23
+ .all(type, scope, project);
24
+ }
25
+ return this.db
26
+ .prepare('SELECT * FROM taste_entries WHERE type = ? AND scope = ?')
27
+ .all(type, scope);
28
+ }
29
+ decide(chosen, rejected, reason, project) {
30
+ const id = randomUUID();
31
+ this.db
32
+ .prepare(`INSERT INTO taste_decisions (id, project, chosen, rejected, reason)
33
+ VALUES (?, ?, ?, ?, ?)`)
34
+ .run(id, project ?? null, JSON.stringify(chosen), JSON.stringify(rejected), reason);
35
+ return id;
36
+ }
37
+ getDecision(id) {
38
+ return this.db.prepare('SELECT * FROM taste_decisions WHERE id = ?').get(id);
39
+ }
40
+ getDecisionsByProject(project) {
41
+ return this.db
42
+ .prepare('SELECT * FROM taste_decisions WHERE project = ? ORDER BY created_at DESC')
43
+ .all(project);
44
+ }
45
+ storeReference(project, analysis, imagePath) {
46
+ const id = randomUUID();
47
+ this.db
48
+ .prepare(`INSERT INTO taste_references (id, project, image_path, analysis)
49
+ VALUES (?, ?, ?, ?)`)
50
+ .run(id, project, imagePath ?? null, JSON.stringify(analysis));
51
+ return id;
52
+ }
53
+ getReference(id) {
54
+ return this.db.prepare('SELECT * FROM taste_references WHERE id = ?').get(id);
55
+ }
56
+ getReferencesByProject(project) {
57
+ return this.db
58
+ .prepare('SELECT * FROM taste_references WHERE project = ? ORDER BY created_at DESC')
59
+ .all(project);
60
+ }
61
+ storeDesignSystem(project, tokens) {
62
+ this.db
63
+ .prepare(`INSERT INTO design_systems (project, tokens)
64
+ VALUES (?, ?)
65
+ ON CONFLICT(project) DO UPDATE SET tokens = ?, updated_at = datetime('now')`)
66
+ .run(project, JSON.stringify(tokens), JSON.stringify(tokens));
67
+ }
68
+ getDesignSystem(project) {
69
+ return this.db.prepare('SELECT * FROM design_systems WHERE project = ?').get(project);
70
+ }
71
+ }
72
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}