Reorganize: Move all skills to skills/ folder
- Created skills/ directory - Moved 272 skills to skills/ subfolder - Kept agents/ at root level - Kept installation scripts and docs at root level Repository structure: - skills/ - All 272 skills from skills.sh - agents/ - Agent definitions - *.sh, *.ps1 - Installation scripts - README.md, etc. - Documentation Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
115
skills/plugins/examples/knowledge-base/commands/export.ts
Normal file
115
skills/plugins/examples/knowledge-base/commands/export.ts
Normal file
@@ -0,0 +1,115 @@
|
||||
/**
|
||||
* Knowledge Export Command
|
||||
* Export knowledge base to various formats
|
||||
*/
|
||||
|
||||
import { writeFileSync, readFileSync, existsSync } from 'fs'
|
||||
import { join } from 'path'
|
||||
import { homedir } from 'os'
|
||||
|
||||
export interface ExportOptions {
|
||||
format: 'json' | 'markdown' | 'csv'
|
||||
outputPath?: string
|
||||
category?: string
|
||||
}
|
||||
|
||||
const KNOWLEDGE_FILE = join(homedir(), '.claude', 'knowledge', 'knowledge.json')
|
||||
|
||||
interface KnowledgeEntry {
|
||||
id: string
|
||||
title?: string
|
||||
content: string
|
||||
tags: string[]
|
||||
category: string
|
||||
source?: string
|
||||
timestamp: string
|
||||
}
|
||||
|
||||
export async function handle(args: ExportOptions, context: any): Promise<string> {
|
||||
const { format, outputPath, category } = args
|
||||
|
||||
try {
|
||||
if (!existsSync(KNOWLEDGE_FILE)) {
|
||||
return 'Knowledge base is empty. Add some knowledge first!'
|
||||
}
|
||||
|
||||
const data = readFileSync(KNOWLEDGE_FILE, 'utf-8')
|
||||
let knowledge: KnowledgeEntry[] = JSON.parse(data)
|
||||
|
||||
if (category) {
|
||||
knowledge = knowledge.filter(entry => entry.category === category)
|
||||
}
|
||||
|
||||
let content: string
|
||||
let defaultPath: string
|
||||
|
||||
switch (format) {
|
||||
case 'json':
|
||||
content = JSON.stringify(knowledge, null, 2)
|
||||
defaultPath = join(homedir(), 'knowledge-export.json')
|
||||
break
|
||||
|
||||
case 'markdown':
|
||||
content = exportAsMarkdown(knowledge)
|
||||
defaultPath = join(homedir(), 'knowledge-export.md')
|
||||
break
|
||||
|
||||
case 'csv':
|
||||
content = exportAsCSV(knowledge)
|
||||
defaultPath = join(homedir(), 'knowledge-export.csv')
|
||||
break
|
||||
|
||||
default:
|
||||
throw new Error(`Unknown format: ${format}`)
|
||||
}
|
||||
|
||||
const output = outputPath || defaultPath
|
||||
writeFileSync(output, content, 'utf-8')
|
||||
|
||||
return `✓ Exported ${knowledge.length} entries to ${output}`
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to export knowledge: ${error.message}`)
|
||||
}
|
||||
}
|
||||
|
||||
function exportAsMarkdown(entries: KnowledgeEntry[]): string {
|
||||
const lines: string[] = ['# Knowledge Base Export', '', `Generated: ${new Date().toISOString()}`, '']
|
||||
|
||||
for (const entry of entries) {
|
||||
lines.push(`## ${entry.title || 'Untitled'}`)
|
||||
lines.push(`**ID:** ${entry.id}`)
|
||||
lines.push(`**Category:** ${entry.category}`)
|
||||
lines.push(`**Tags:** ${entry.tags.join(', ') || 'none'}`)
|
||||
lines.push(`**Date:** ${new Date(entry.timestamp).toLocaleString()}`)
|
||||
if (entry.source) {
|
||||
lines.push(`**Source:** ${entry.source}`)
|
||||
}
|
||||
lines.push('')
|
||||
lines.push(entry.content)
|
||||
lines.push('')
|
||||
lines.push('---')
|
||||
lines.push('')
|
||||
}
|
||||
|
||||
return lines.join('\n')
|
||||
}
|
||||
|
||||
function exportAsCSV(entries: KnowledgeEntry[]): string {
|
||||
const headers = ['ID', 'Title', 'Category', 'Tags', 'Content', 'Source', 'Date']
|
||||
const rows = entries.map(entry => [
|
||||
entry.id,
|
||||
entry.title || '',
|
||||
entry.category,
|
||||
entry.tags.join('; '),
|
||||
`"${entry.content.replace(/"/g, '""')}"`,
|
||||
entry.source || '',
|
||||
entry.timestamp
|
||||
])
|
||||
|
||||
return [
|
||||
headers.join(','),
|
||||
...rows.map(row => row.join(','))
|
||||
].join('\n')
|
||||
}
|
||||
|
||||
export default { handle }
|
||||
Reference in New Issue
Block a user