Skip to main content
Glama
file-utils.js3.19 kB
/** * File utility functions */ import fs from 'fs/promises'; import { existsSync } from 'fs'; import path from 'path'; import config from '../config.js'; /** * Ensure summaries directory exists */ export async function ensureSummariesDir() { if (!existsSync(config.output.dir)) { await fs.mkdir(config.output.dir, { recursive: true }); } } /** * Generate filename for summary * @param {string} startDate - Start date (YYYY-MM-DD) * @param {string} endDate - End date (YYYY-MM-DD) * @param {string} format - Format (html or markdown) * @returns {string} Filename */ export function generateFilename(startDate, endDate, format) { const ext = format === 'html' ? 'html' : 'md'; return `weekly-summary-${startDate}-to-${endDate}.${ext}`; } /** * Save summary to file * @param {string} content - File content * @param {string} filename - Filename * @returns {string} Full file path */ export async function saveSummary(content, filename) { await ensureSummariesDir(); const filePath = path.join(config.output.dir, filename); await fs.writeFile(filePath, content, 'utf-8'); return filePath; } /** * Read summary from file * @param {string} filename - Filename * @returns {string} File content */ export async function readSummary(filename) { const filePath = path.join(config.output.dir, filename); return await fs.readFile(filePath, 'utf-8'); } /** * List summary files * @param {object} options - { format, sort, limit } * @returns {Array} List of file info objects */ export async function listSummaryFiles(options = {}) { const { format = 'all', sort = 'newest', limit = 10 } = options; await ensureSummariesDir(); let files = await fs.readdir(config.output.dir); // Filter by format if (format !== 'all') { const ext = format === 'html' ? '.html' : '.md'; files = files.filter(f => f.endsWith(ext)); } else { files = files.filter(f => f.endsWith('.html') || f.endsWith('.md')); } // Filter weekly summary files only files = files.filter(f => f.startsWith('weekly-summary-')); // Get file stats const fileInfos = await Promise.all( files.map(async (filename) => { const filePath = path.join(config.output.dir, filename); const stats = await fs.stat(filePath); return { filename, path: filePath, created: stats.birthtime, modified: stats.mtime, size: stats.size, }; }) ); // Sort fileInfos.sort((a, b) => { if (sort === 'newest') { return b.created - a.created; } else { return a.created - b.created; } }); // Limit return fileInfos.slice(0, limit); } /** * Check if file exists * @param {string} filename - Filename * @returns {boolean} True if exists */ export function fileExists(filename) { const filePath = path.join(config.output.dir, filename); return existsSync(filePath); } /** * Get file size in bytes * @param {string} filename - Filename * @returns {number} Size in bytes */ export async function getFileSize(filename) { const filePath = path.join(config.output.dir, filename); const stats = await fs.stat(filePath); return stats.size; }

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/philipbloch/summary-mcp'

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