@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.
- package/dist/commands/clean.d.ts +7 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +54 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +30 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/gallery.d.ts +2 -0
- package/dist/commands/gallery.d.ts.map +1 -0
- package/dist/commands/gallery.js +23 -0
- package/dist/commands/gallery.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +105 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +25 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/stop.d.ts +6 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +18 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/taste.d.ts +7 -0
- package/dist/commands/taste.d.ts.map +1 -0
- package/dist/commands/taste.js +33 -0
- package/dist/commands/taste.js.map +1 -0
- package/dist/config-writer.d.ts +2 -0
- package/dist/config-writer.d.ts.map +1 -0
- package/dist/config-writer.js +33 -0
- package/dist/config-writer.js.map +1 -0
- package/dist/detect-platform.d.ts +16 -0
- package/dist/detect-platform.d.ts.map +1 -0
- package/dist/detect-platform.js +41 -0
- package/dist/detect-platform.js.map +1 -0
- package/dist/hooks-installer.d.ts +8 -0
- package/dist/hooks-installer.d.ts.map +1 -0
- package/dist/hooks-installer.js +62 -0
- package/dist/hooks-installer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/scaffold.d.ts +2 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +38 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/server/export/index.d.ts +10 -0
- package/dist/server/export/index.d.ts.map +1 -0
- package/dist/server/export/index.js +65 -0
- package/dist/server/export/index.js.map +1 -0
- package/dist/server/export/pdf-export.d.ts +8 -0
- package/dist/server/export/pdf-export.d.ts.map +1 -0
- package/dist/server/export/pdf-export.js +17 -0
- package/dist/server/export/pdf-export.js.map +1 -0
- package/dist/server/export/presets.d.ts +4 -0
- package/dist/server/export/presets.d.ts.map +1 -0
- package/dist/server/export/presets.js +22 -0
- package/dist/server/export/presets.js.map +1 -0
- package/dist/server/export/puppeteer-manager.d.ts +8 -0
- package/dist/server/export/puppeteer-manager.d.ts.map +1 -0
- package/dist/server/export/puppeteer-manager.js +24 -0
- package/dist/server/export/puppeteer-manager.js.map +1 -0
- package/dist/server/export/raster-export.d.ts +11 -0
- package/dist/server/export/raster-export.d.ts.map +1 -0
- package/dist/server/export/raster-export.js +28 -0
- package/dist/server/export/raster-export.js.map +1 -0
- package/dist/server/export/svg-export.d.ts +2 -0
- package/dist/server/export/svg-export.d.ts.map +1 -0
- package/dist/server/export/svg-export.js +17 -0
- package/dist/server/export/svg-export.js.map +1 -0
- package/dist/server/feedback.d.ts +4 -0
- package/dist/server/feedback.d.ts.map +1 -0
- package/dist/server/feedback.js +29 -0
- package/dist/server/feedback.js.map +1 -0
- package/dist/server/http-server.d.ts +19 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +199 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +44 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp-server.d.ts +433 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +248 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/preview.d.ts +2 -0
- package/dist/server/preview.d.ts.map +1 -0
- package/dist/server/preview.js +15 -0
- package/dist/server/preview.js.map +1 -0
- package/dist/server/screenshot.d.ts +7 -0
- package/dist/server/screenshot.d.ts.map +1 -0
- package/dist/server/screenshot.js +23 -0
- package/dist/server/screenshot.js.map +1 -0
- package/dist/server/serve.d.ts +3 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +39 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/types.d.ts +84 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/typography/analyze-url.d.ts +10 -0
- package/dist/server/typography/analyze-url.d.ts.map +1 -0
- package/dist/server/typography/analyze-url.js +28 -0
- package/dist/server/typography/analyze-url.js.map +1 -0
- package/dist/server/typography/classify.d.ts +9 -0
- package/dist/server/typography/classify.d.ts.map +1 -0
- package/dist/server/typography/classify.js +15 -0
- package/dist/server/typography/classify.js.map +1 -0
- package/dist/server/typography/embed.d.ts +5 -0
- package/dist/server/typography/embed.d.ts.map +1 -0
- package/dist/server/typography/embed.js +34 -0
- package/dist/server/typography/embed.js.map +1 -0
- package/dist/server/typography/mood-match.d.ts +3 -0
- package/dist/server/typography/mood-match.d.ts.map +1 -0
- package/dist/server/typography/mood-match.js +21 -0
- package/dist/server/typography/mood-match.js.map +1 -0
- package/dist/server/typography/registry.d.ts +23 -0
- package/dist/server/typography/registry.d.ts.map +1 -0
- package/dist/server/typography/registry.js +93 -0
- package/dist/server/typography/registry.js.map +1 -0
- package/dist/server/typography/scale.d.ts +3 -0
- package/dist/server/typography/scale.d.ts.map +1 -0
- package/dist/server/typography/scale.js +43 -0
- package/dist/server/typography/scale.js.map +1 -0
- package/dist/server/typography/suggest.d.ts +9 -0
- package/dist/server/typography/suggest.d.ts.map +1 -0
- package/dist/server/typography/suggest.js +21 -0
- package/dist/server/typography/suggest.js.map +1 -0
- package/dist/server/versioning/gallery.d.ts +3 -0
- package/dist/server/versioning/gallery.d.ts.map +1 -0
- package/dist/server/versioning/gallery.js +57 -0
- package/dist/server/versioning/gallery.js.map +1 -0
- package/dist/server/versioning/versions.d.ts +19 -0
- package/dist/server/versioning/versions.d.ts.map +1 -0
- package/dist/server/versioning/versions.js +91 -0
- package/dist/server/versioning/versions.js.map +1 -0
- package/dist/server/watcher.d.ts +6 -0
- package/dist/server/watcher.d.ts.map +1 -0
- package/dist/server/watcher.js +23 -0
- package/dist/server/watcher.js.map +1 -0
- package/dist/server/websocket.d.ts +13 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +36 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/skill/SKILL.md +280 -0
- package/dist/taste-memory/db.d.ts +5 -0
- package/dist/taste-memory/db.d.ts.map +1 -0
- package/dist/taste-memory/db.js +64 -0
- package/dist/taste-memory/db.js.map +1 -0
- package/dist/taste-memory/embeddings.d.ts +3 -0
- package/dist/taste-memory/embeddings.d.ts.map +1 -0
- package/dist/taste-memory/embeddings.js +24 -0
- package/dist/taste-memory/embeddings.js.map +1 -0
- package/dist/taste-memory/index.d.ts +3 -0
- package/dist/taste-memory/index.d.ts.map +1 -0
- package/dist/taste-memory/index.js +113 -0
- package/dist/taste-memory/index.js.map +1 -0
- package/dist/taste-memory/profile.d.ts +6 -0
- package/dist/taste-memory/profile.d.ts.map +1 -0
- package/dist/taste-memory/profile.js +33 -0
- package/dist/taste-memory/profile.js.map +1 -0
- package/dist/taste-memory/search.d.ts +16 -0
- package/dist/taste-memory/search.d.ts.map +1 -0
- package/dist/taste-memory/search.js +53 -0
- package/dist/taste-memory/search.js.map +1 -0
- package/dist/taste-memory/server.d.ts +43 -0
- package/dist/taste-memory/server.d.ts.map +1 -0
- package/dist/taste-memory/server.js +64 -0
- package/dist/taste-memory/server.js.map +1 -0
- package/dist/taste-memory/store.d.ts +21 -0
- package/dist/taste-memory/store.d.ts.map +1 -0
- package/dist/taste-memory/store.js +72 -0
- package/dist/taste-memory/store.js.map +1 -0
- package/dist/taste-memory/types.d.ts +95 -0
- package/dist/taste-memory/types.d.ts.map +1 -0
- package/dist/taste-memory/types.js +2 -0
- package/dist/taste-memory/types.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":"AAAA,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;IAEnC,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,IAMpB;YACC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CACvB,IAAI,CAAC,IAAiF,EACtF,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAuB,EAC5C,IAAI,CAAC,IAAI,EACT,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CACrD,CAAC;YACF,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,eAAe,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAMlB;YACC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC5C,IAAI,EAAE,IAAI,CAAC,IAA6F;gBACxG,KAAK,EAAE,IAAI,CAAC,KAAuC;gBACnD,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAc,CAAC;gBAClC,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,KAAK,EAAE,CAAC,CAAC,MAAM;aAChB,CAAC,CAAC,CAAC;YAEJ,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,IAGnB;YACC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAsC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/F,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAKlB;YACC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,IAIrB;YACC,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC,0CAA0C,IAAI,CAAC,OAAO,UAAU,EAAE,GAAG,CAAC,CAAC;QACrF,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAGlB;YACC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC,4CAA4C,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,uCAAuC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|