Skip to main content
Glama
test-all-smart.tsβ€’7.65 kB
#!/usr/bin/env npx tsx /** * Complete Smart Features Test Script */ import { createConfig } from '../src/lib/config.js'; import { createAppContext } from '../src/lib/context.js'; import { createSmartHandlers } from '../src/lib/handlers/smart.js'; import { resetBrain } from '../src/lib/brain/index.js'; import * as fs from 'fs'; import * as path from 'path'; // Manual .env loading function loadEnvFile() { const envPath = path.join(process.cwd(), '.env'); if (fs.existsSync(envPath)) { const content = fs.readFileSync(envPath, 'utf-8'); for (const line of content.split('\n')) { const trimmed = line.trim(); if (trimmed && !trimmed.startsWith('#')) { const [key, ...valueParts] = trimmed.split('='); const value = valueParts.join('='); if (key && value && !process.env[key]) { process.env[key] = value; } } } } } loadEnvFile(); process.env.ENABLE_SMART_FEATURES = 'true'; async function main() { console.log('πŸ§ͺ Complete Smart Features Test\n'); const config = createConfig(process.env); const ctx = createAppContext(config); const handlers = createSmartHandlers(ctx); console.log(`πŸ“‘ Wiki: ${config.OUTLINE_URL}\n`); try { // 1. Smart Status (초기) console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('πŸ“Š 1. smart_status (초기 μƒνƒœ)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); const status1 = await handlers.smart_status(); console.log(JSON.stringify(status1, null, 2)); console.log(); // 2. Sync Knowledge (이미 동기화됨) console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('πŸ“š 2. sync_knowledge (λ¬Έμ„œ 동기화)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); // 이미 λ™κΈ°ν™”λœ 경우 μŠ€ν‚΅ if (status1.indexedChunks > 100) { console.log(`이미 ${status1.indexedChunks}개 청크가 μΈλ±μ‹±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν‚΅ν•©λ‹ˆλ‹€.`); } else { const syncResult = await handlers.sync_knowledge({}); console.log(JSON.stringify(syncResult, null, 2)); } console.log(); // 3. Ask Wiki - λ‹€μ–‘ν•œ 질문 ν…ŒμŠ€νŠΈ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('❓ 3. ask_wiki (RAG 질문 λ‹΅λ³€)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); const questions = [ 'VectorDB에 λŒ€ν•΄ μ„€λͺ…ν•΄μ€˜', 'νšŒμ˜λ‘μ€ μ–΄λ””μ„œ λ³Ό 수 μžˆμ–΄?', 'μ‹ κ·œ μž…μ‚¬μž κ°€μ΄λ“œκ°€ μžˆμ–΄?', ]; for (const q of questions) { console.log(`\nπŸ’¬ Q: ${q}`); const answer = await handlers.ask_wiki({ question: q }); console.log(`πŸ“ A: ${answer.answer?.substring(0, 500)}...`); console.log(`πŸ“Ž Sources: ${answer.sources?.map((s: {title: string}) => s.title).join(', ')}`); } console.log(); // 4. Summarize Document - 첫 번째 λ¬Έμ„œ μš”μ•½ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('πŸ“ 4. summarize_document (λ¬Έμ„œ μš”μ•½)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); // λ¨Όμ € λ¬Έμ„œ λͺ©λ‘ κ°€μ Έμ˜€κΈ° const { data: docs } = await ctx.apiCall(() => ctx.apiClient.post<Array<{id: string; title: string}>>('/documents.list', { limit: 5 }) ); if (docs && docs.length > 0) { const doc = docs[0]; console.log(`λ¬Έμ„œ: ${doc.title} (${doc.id})`); const summary = await handlers.summarize_document({ documentId: doc.id }); console.log('μš”μ•½:', summary.summary || summary.error); } console.log(); // 5. Suggest Tags console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('🏷️ 5. suggest_tags (νƒœκ·Έ μΆ”μ²œ)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); if (docs && docs.length > 0) { const doc = docs[0]; console.log(`λ¬Έμ„œ: ${doc.title}`); const tags = await handlers.suggest_tags({ documentId: doc.id }); console.log('μΆ”μ²œ νƒœκ·Έ:', tags.suggestedTags || tags.error); } console.log(); // 6. Find Related console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('πŸ”— 6. find_related (μ—°κ΄€ λ¬Έμ„œ μ°ΎκΈ°)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); if (docs && docs.length > 0) { const doc = docs[0]; console.log(`κΈ°μ€€ λ¬Έμ„œ: ${doc.title}`); const related = await handlers.find_related({ documentId: doc.id, limit: 3 }); if (related.related) { console.log('μ—°κ΄€ λ¬Έμ„œ:'); for (const r of related.related) { console.log(` - ${r.title}`); } } else { console.log(related.error); } } console.log(); // 7. Generate Diagram console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('πŸ“Š 7. generate_diagram (λ‹€μ΄μ–΄κ·Έλž¨ 생성)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); const diagramDesc = 'μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν•˜λ©΄ 토큰을 λ°œκΈ‰λ°›κ³ , ν† ν°μœΌλ‘œ APIλ₯Ό ν˜ΈμΆœν•˜λŠ” 흐름'; console.log(`μ„€λͺ…: ${diagramDesc}`); const diagram = await handlers.generate_diagram({ description: diagramDesc }); console.log('μƒμ„±λœ Mermaid:'); console.log(diagram.diagram); console.log(); // 8. Final Status console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('πŸ“Š 8. smart_status (μ΅œμ’… μƒνƒœ)'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); const status2 = await handlers.smart_status(); console.log(JSON.stringify(status2, null, 2)); console.log('\nβœ… λͺ¨λ“  Smart κΈ°λŠ₯ ν…ŒμŠ€νŠΈ μ™„λ£Œ!'); } catch (error) { console.error('❌ ν…ŒμŠ€νŠΈ μ‹€νŒ¨:', error); process.exit(1); } finally { resetBrain(); } } main();

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/huiseo/outline-smart-mcp'

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