#!/usr/bin/env node /** * Test Context File Summarization * * This script tests the file summarization functionality */ const path = require('path'); const fs = require('fs'); // Load the helper functions from main.js const mainPath = path.join(__dirname, '..', '.obsidian', 'plugins', 'claudian', 'main.js'); // Extract YAML frontmatter function extractYAMLFrontmatter(content) { // Normalize line endings to \n const normalized = content.replace(/\r\n/g, "\n"); const frontmatterMatch = normalized.match(/^---\n([\s\S]*?)\n---/); if (!frontmatterMatch) return {}; const yaml = frontmatterMatch[1]; const result = {}; // Simple YAML parsing (key: value) const lines = yaml.split("\n"); for (const line of lines) { const match = line.match(/^(\w+):\s*(.+)$/); if (match) { const [, key, value] = match; // Handle arrays if (value.startsWith("[") && value.endsWith("]")) { result[key] = value .slice(1, -1) .split(",") .map(v => v.trim().replace(/^["']|["']$/g, "")); } else { result[key] = value.replace(/^["']|["']$/g, ""); } } } return result; } // Extract markdown headings function extractMarkdownHeadings(content) { const headings = []; // Normalize line endings const lines = content.replace(/\r\n/g, "\n").split("\n"); for (const line of lines) { const match = line.match(/^#{1,6}\s+(.+)$/); if (match) { headings.push(match[1].trim()); } } return headings; } // Generate file summary async function generateFileSummary(filePath) { const content = fs.readFileSync(filePath, "utf-8"); const fileName = path.basename(filePath); // Extract YAML frontmatter const frontmatter = extractYAMLFrontmatter(content); // Extract markdown headings const headings = extractMarkdownHeadings(content); // Extract first paragraph (skip frontmatter) // Normalize line endings first const normalized = content.replace(/\r\n/g, "\n"); const textContent = normalized.replace(/^---\n[\s\S]*?\n---\n/, ""); const firstPara = textContent.trim().split("\n\n")[0] || ""; const preview = firstPara.slice(0, 300); // Format summary const parts = []; parts.push(`📄 **${fileName}** _(Summary - ${(content.length / 1024).toFixed(1)}KB)_`); parts.push(""); if (frontmatter.type || frontmatter.tags || frontmatter.created) { parts.push("**Metadata:**"); if (frontmatter.type) parts.push(`- Type: ${frontmatter.type}`); if (frontmatter.tags && frontmatter.tags.length > 0) { parts.push(`- Tags: ${frontmatter.tags.join(", ")}`); } if (frontmatter.created) parts.push(`- Created: ${frontmatter.created}`); parts.push(""); } if (headings.length > 0) { parts.push(`**Structure:** ${headings.slice(0, 5).join(" > ")}`); if (headings.length > 5) parts.push(`_(+${headings.length - 5} more sections)_`); parts.push(""); } if (preview) { parts.push("**Preview:**"); parts.push(preview + (firstPara.length > 300 ? "..." : "")); parts.push(""); } parts.push(`_📖 Use Read tool to view full content: \`${filePath}\`_`); return parts.join("\n"); } // Main test async function main() { console.log("=== Testing Context File Summarization ===\n"); const testFile = path.join(__dirname, '..', 'test-large-file.md'); console.log(`Test file: ${testFile}`); const stats = fs.statSync(testFile); console.log(`File size: ${stats.size} bytes (${(stats.size / 1024).toFixed(1)}KB)\n`); // Debug: Check frontmatter extraction const content = fs.readFileSync(testFile, "utf-8"); const frontmatter = extractYAMLFrontmatter(content); const headings = extractMarkdownHeadings(content); console.log("DEBUG - Extracted frontmatter:", JSON.stringify(frontmatter, null, 2)); console.log("DEBUG - Extracted headings (first 10):", headings.slice(0, 10)); console.log(""); console.log("Generating summary...\n"); const summary = await generateFileSummary(testFile); console.log("=== SUMMARY OUTPUT ===\n"); console.log(summary); console.log("\n=== END SUMMARY ==="); // Calculate token savings const originalTokens = Math.ceil(stats.size / 4); const summaryTokens = Math.ceil(summary.length / 4); const savings = ((1 - summaryTokens / originalTokens) * 100).toFixed(1); console.log(`\n=== Token Analysis ===`); console.log(`Original size: ~${originalTokens} tokens`); console.log(`Summary size: ~${summaryTokens} tokens`); console.log(`Token savings: ${savings}%`); } main().catch(console.error);