Skip to main content
Glama
PatternStore.tsโ€ข2.01 kB
import { promises as fs } from 'fs'; import path from 'path'; interface PatternData { name: string; content: string; tags: string[]; timestamp: string; audioFeatures?: any; } export class PatternStore { constructor(private basePath: string) { this.ensureDirectory(); } private async ensureDirectory() { try { await fs.mkdir(this.basePath, { recursive: true }); } catch (error) { console.error('Failed to create patterns directory:', error); } } async save(name: string, content: string, tags: string[] = []): Promise<void> { const filename = this.sanitizeFilename(name) + '.json'; const filepath = path.join(this.basePath, filename); const data: PatternData = { name, content, tags, timestamp: new Date().toISOString(), }; await fs.writeFile(filepath, JSON.stringify(data, null, 2)); } async load(name: string): Promise<PatternData | null> { const filename = this.sanitizeFilename(name) + '.json'; const filepath = path.join(this.basePath, filename); try { const data = await fs.readFile(filepath, 'utf-8'); return JSON.parse(data); } catch { return null; } } async list(tag?: string): Promise<PatternData[]> { try { const files = await fs.readdir(this.basePath); const patterns: PatternData[] = []; for (const file of files) { if (file.endsWith('.json')) { const data = await fs.readFile( path.join(this.basePath, file), 'utf-8' ); const pattern = JSON.parse(data); if (!tag || pattern.tags.includes(tag)) { patterns.push(pattern); } } } return patterns.sort((a, b) => b.timestamp.localeCompare(a.timestamp) ); } catch { return []; } } private sanitizeFilename(name: string): string { return name.replace(/[^a-z0-9_-]/gi, '_').toLowerCase(); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/williamzujkowski/strudel-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server