@weavelogic/knowledge-graph-agent 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -2
- package/dist/_virtual/index10.js +2 -2
- package/dist/_virtual/index11.js +2 -2
- package/dist/_virtual/index8.js +2 -2
- package/dist/_virtual/index9.js +2 -2
- package/dist/claude/hook-capture.d.ts +209 -0
- package/dist/claude/hook-capture.d.ts.map +1 -0
- package/dist/claude/hook-capture.js +792 -0
- package/dist/claude/hook-capture.js.map +1 -0
- package/dist/claude/index.d.ts +15 -0
- package/dist/claude/index.d.ts.map +1 -0
- package/dist/claude/types.d.ts +1054 -0
- package/dist/claude/types.d.ts.map +1 -0
- package/dist/claude/types.js +61 -0
- package/dist/claude/types.js.map +1 -0
- package/dist/cli/commands/analyze.js +3 -3
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/convert.js +1 -1
- package/dist/cli/commands/convert.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts +11 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +282 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +9 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/docs-analyzer.d.ts +2 -2
- package/dist/generators/docs-analyzer.d.ts.map +1 -1
- package/dist/generators/docs-analyzer.js +1 -1
- package/dist/generators/docs-analyzer.js.map +1 -1
- package/dist/generators/docs-convert.d.ts +1 -1
- package/dist/generators/docs-convert.d.ts.map +1 -1
- package/dist/generators/docs-convert.js +1 -1
- package/dist/generators/docs-convert.js.map +1 -1
- package/dist/node_modules/@typescript-eslint/project-service/dist/index.js +1 -1
- package/dist/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/dist/commonjs/index.js +1 -1
- package/dist/node_modules/fdir/dist/index.js +1 -1
- package/dist/node_modules/tinyglobby/dist/index.js +1 -1
- package/dist/node_modules/ts-api-utils/lib/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-analyzer.js","sources":["../../src/generators/docs-analyzer.ts"],"sourcesContent":["/**\n * Docs Analyzer\n *\n * Advanced documentation analyzer that uses claude-flow to create\n * comprehensive knowledge graph documentation with proper structure,\n * wikilinks, frontmatter, and tags following Obsidian conventions.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport { execSync, spawn } from 'child_process';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Analyzer options\n */\nexport interface AnalyzerOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs-nn) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Use claude-flow for deep analysis */\n useClaudeFlow?: boolean;\n /** Create MOC (Map of Content) files */\n createMOC?: boolean;\n /** Link back to original docs */\n linkOriginal?: boolean;\n /** Maximum depth for analysis */\n maxDepth?: number;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\n/**\n * Analyzed document\n */\nexport interface AnalyzedDoc {\n /** Original file path */\n originalPath: string;\n /** New file path in docs-nn */\n newPath: string;\n /** Document title */\n title: string;\n /** Detected node type */\n type: NodeType;\n /** Extracted tags */\n tags: string[];\n /** Related documents (wikilinks) */\n related: string[];\n /** Key concepts extracted */\n concepts: string[];\n /** Areas needing research */\n researchNeeded: string[];\n /** TODOs found or generated */\n todos: string[];\n /** Summary/description */\n summary: string;\n /** Category path in structure */\n category: string;\n}\n\n/**\n * Analyzer result\n */\nexport interface AnalyzerResult {\n success: boolean;\n filesAnalyzed: number;\n filesCreated: number;\n mocFilesCreated: number;\n errors: string[];\n analyzed: AnalyzedDoc[];\n structure: Map<string, string[]>;\n}\n\n/**\n * Weave-NN category structure with descriptions\n */\nconst CATEGORY_STRUCTURE: Record<string, { type: NodeType; description: string; subcategories: string[] }> = {\n concepts: {\n type: 'concept',\n description: 'Abstract concepts, theories, and architectural principles',\n subcategories: ['architecture', 'patterns', 'principles', 'models'],\n },\n components: {\n type: 'technical',\n description: 'Reusable technical components and implementations',\n subcategories: ['ui', 'utilities', 'core', 'shared'],\n },\n services: {\n type: 'service',\n description: 'Backend services, APIs, and workers',\n subcategories: ['api', 'workers', 'handlers', 'middleware'],\n },\n features: {\n type: 'feature',\n description: 'Product features and capabilities',\n subcategories: ['core', 'advanced', 'experimental'],\n },\n integrations: {\n type: 'integration',\n description: 'External integrations and adapters',\n subcategories: ['databases', 'auth', 'storage', 'monitoring', 'third-party'],\n },\n standards: {\n type: 'standard',\n description: 'Coding standards, conventions, and best practices',\n subcategories: ['coding', 'documentation', 'testing', 'security'],\n },\n guides: {\n type: 'guide',\n description: 'How-to guides and tutorials',\n subcategories: ['getting-started', 'tutorials', 'troubleshooting', 'deployment'],\n },\n references: {\n type: 'technical',\n description: 'API references and technical documentation',\n subcategories: ['api', 'cli', 'config', 'schemas'],\n },\n};\n\n/**\n * Analyze and migrate documentation to weave-nn structure\n */\nexport async function analyzeDocs(options: AnalyzerOptions): Promise<AnalyzerResult> {\n const {\n sourceDir,\n targetDir = 'docs-nn',\n projectRoot,\n useClaudeFlow = false,\n createMOC = true,\n linkOriginal = true,\n maxDepth = 3,\n dryRun = false,\n verbose = false,\n } = options;\n\n const result: AnalyzerResult = {\n success: true,\n filesAnalyzed: 0,\n filesCreated: 0,\n mocFilesCreated: 0,\n errors: [],\n analyzed: [],\n structure: new Map(),\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createFullStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**', 'docs-nn/**'],\n });\n\n // First pass: Analyze all documents\n const analyzedDocs: AnalyzedDoc[] = [];\n\n for (const file of files) {\n result.filesAnalyzed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n const analyzed = await analyzeDocument(sourceFile, file, sourcePath, {\n useClaudeFlow,\n linkOriginal,\n verbose,\n });\n analyzedDocs.push(analyzed);\n\n // Track structure\n const category = analyzed.category.split('/')[0];\n if (!result.structure.has(category)) {\n result.structure.set(category, []);\n }\n result.structure.get(category)!.push(analyzed.title);\n\n } catch (error) {\n result.errors.push(`Failed to analyze ${file}: ${error}`);\n }\n }\n\n // Build cross-references between documents\n buildCrossReferences(analyzedDocs);\n\n // Second pass: Create new documents\n for (const doc of analyzedDocs) {\n try {\n const targetFile = join(targetPath, doc.newPath);\n\n if (!dryRun) {\n mkdirSync(dirname(targetFile), { recursive: true });\n const content = generateKnowledgeDoc(doc, sourceDir, linkOriginal, analyzedDocs);\n writeFileSync(targetFile, content, 'utf-8');\n }\n\n result.filesCreated++;\n result.analyzed.push(doc);\n\n } catch (error) {\n result.errors.push(`Failed to create ${doc.newPath}: ${error}`);\n }\n }\n\n // Create MOC files for each category\n if (createMOC && !dryRun) {\n for (const [category, docs] of result.structure) {\n const mocPath = join(targetPath, category, '_MOC.md');\n const mocContent = generateMOC(category, docs, analyzedDocs);\n writeFileSync(mocPath, mocContent, 'utf-8');\n result.mocFilesCreated++;\n }\n\n // Create master MOC\n const masterMocPath = join(targetPath, 'MOC.md');\n const masterMocContent = generateMasterMOC(result.structure, analyzedDocs);\n writeFileSync(masterMocPath, masterMocContent, 'utf-8');\n result.mocFilesCreated++;\n\n // Create PRIMITIVES.md\n const primitivesPath = join(targetPath, 'PRIMITIVES.md');\n const primitivesContent = generatePrimitives(analyzedDocs);\n writeFileSync(primitivesPath, primitivesContent, 'utf-8');\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Analyze a single document\n */\nasync function analyzeDocument(\n filePath: string,\n relativePath: string,\n sourcePath: string,\n options: { useClaudeFlow?: boolean; linkOriginal?: boolean; verbose?: boolean }\n): Promise<AnalyzedDoc> {\n const content = readFileSync(filePath, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n const filename = basename(filePath, '.md');\n const title = existingFrontmatter.title as string || formatTitle(filename);\n\n // Detect node type and category\n const { type, category } = detectTypeAndCategory(relativePath, body, existingFrontmatter);\n\n // Extract tags\n const tags = extractAllTags(body, existingFrontmatter, relativePath);\n\n // Extract wikilinks and markdown links\n const related = extractLinks(body);\n\n // Extract key concepts\n const concepts = extractConcepts(body);\n\n // Find areas needing research\n const researchNeeded = findResearchAreas(body, filename);\n\n // Extract existing TODOs and generate new ones\n const todos = extractAndGenerateTodos(body, content, filename);\n\n // Generate summary\n const summary = generateSummary(body, existingFrontmatter);\n\n // Determine new path\n const newPath = join(category, formatFilename(filename) + '.md');\n\n return {\n originalPath: relativePath,\n newPath,\n title,\n type,\n tags,\n related,\n concepts,\n researchNeeded,\n todos,\n summary,\n category,\n };\n}\n\n/**\n * Create full target directory structure\n */\nfunction createFullStructure(targetPath: string): void {\n // Create all category directories and subcategories\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n mkdirSync(join(targetPath, category), { recursive: true });\n for (const sub of config.subcategories) {\n mkdirSync(join(targetPath, category, sub), { recursive: true });\n }\n }\n\n // Create meta directories\n mkdirSync(join(targetPath, '_templates'), { recursive: true });\n mkdirSync(join(targetPath, '_attachments'), { recursive: true });\n mkdirSync(join(targetPath, '_archive'), { recursive: true });\n}\n\n/**\n * Detect node type and category from content\n */\nfunction detectTypeAndCategory(\n filePath: string,\n content: string,\n frontmatter: Record<string, unknown>\n): { type: NodeType; category: string } {\n // Check frontmatter first\n if (frontmatter.type && frontmatter.category) {\n return {\n type: frontmatter.type as NodeType,\n category: frontmatter.category as string,\n };\n }\n\n const lowerContent = content.toLowerCase();\n const lowerPath = filePath.toLowerCase();\n\n // Score each category\n const scores: Record<string, number> = {};\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n scores[category] = 0;\n\n // Path matching\n if (lowerPath.includes(category)) scores[category] += 10;\n for (const sub of config.subcategories) {\n if (lowerPath.includes(sub)) scores[category] += 5;\n }\n\n // Content analysis based on type\n const keywords = getKeywordsForType(config.type);\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = content.match(regex);\n if (matches) scores[category] += matches.length;\n }\n }\n\n // Find best match\n let bestCategory = 'concepts';\n let bestScore = 0;\n\n for (const [category, score] of Object.entries(scores)) {\n if (score > bestScore) {\n bestScore = score;\n bestCategory = category;\n }\n }\n\n return {\n type: CATEGORY_STRUCTURE[bestCategory].type,\n category: bestCategory,\n };\n}\n\n/**\n * Get keywords for a node type\n */\nfunction getKeywordsForType(type: NodeType): string[] {\n const keywords: Record<NodeType, string[]> = {\n concept: ['concept', 'theory', 'principle', 'overview', 'introduction', 'architecture', 'design', 'pattern'],\n technical: ['component', 'implementation', 'class', 'function', 'module', 'utility', 'helper'],\n feature: ['feature', 'capability', 'functionality', 'user', 'requirement', 'use case'],\n primitive: ['library', 'framework', 'dependency', 'tool', 'sdk'],\n service: ['api', 'endpoint', 'service', 'server', 'backend', 'worker', 'handler'],\n guide: ['how to', 'tutorial', 'guide', 'step', 'walkthrough', 'getting started'],\n standard: ['standard', 'convention', 'best practice', 'rule', 'guideline', 'style'],\n integration: ['integration', 'connect', 'plugin', 'adapter', 'sync', 'import', 'export'],\n };\n\n return keywords[type] || [];\n}\n\n/**\n * Extract all tags from content and path\n */\nfunction extractAllTags(\n content: string,\n frontmatter: Record<string, unknown>,\n filePath: string\n): string[] {\n const tags = new Set<string>();\n\n // Add existing frontmatter tags\n if (Array.isArray(frontmatter.tags)) {\n frontmatter.tags.forEach(t => tags.add(String(t)));\n }\n\n // Extract #tags from content\n const hashTags = content.match(/#[\\w-]+/g);\n if (hashTags) {\n hashTags.forEach(t => tags.add(t.slice(1)));\n }\n\n // Generate tags from path\n const pathParts = filePath.split('/').filter(p => p && !p.endsWith('.md'));\n pathParts.forEach(p => {\n if (p.length > 2 && p.length < 20) {\n tags.add(p.replace(/[-_]/g, '-').toLowerCase());\n }\n });\n\n // Add status tags\n if (content.match(/\\b(wip|draft|todo)\\b/i)) tags.add('needs-work');\n if (content.match(/\\b(deprecated|legacy)\\b/i)) tags.add('deprecated');\n if (content.match(/\\b(experimental|beta)\\b/i)) tags.add('experimental');\n\n return [...tags].slice(0, 15);\n}\n\n/**\n * Extract wikilinks and markdown links\n */\nfunction extractLinks(content: string): string[] {\n const links = new Set<string>();\n\n // Wikilinks\n const wikilinks = content.match(/\\[\\[([^\\]|]+)(?:\\|[^\\]]+)?\\]\\]/g);\n if (wikilinks) {\n wikilinks.forEach(link => {\n const match = link.match(/\\[\\[([^\\]|]+)/);\n if (match) links.add(match[1].trim());\n });\n }\n\n // Markdown links (internal only)\n const mdLinks = content.match(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g);\n if (mdLinks) {\n mdLinks.forEach(link => {\n const match = link.match(/\\]\\(([^)]+)\\)/);\n if (match && !match[1].startsWith('http')) {\n links.add(match[1].replace(/\\.md$/, '').trim());\n }\n });\n }\n\n return [...links];\n}\n\n/**\n * Extract key concepts from content\n */\nfunction extractConcepts(content: string): string[] {\n const concepts: string[] = [];\n\n // Look for headers as concepts\n const headers = content.match(/^##\\s+(.+)$/gm);\n if (headers) {\n headers.slice(0, 5).forEach(h => {\n concepts.push(h.replace(/^##\\s+/, '').trim());\n });\n }\n\n // Look for bold terms as concepts\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n boldTerms.slice(0, 5).forEach(term => {\n const clean = term.replace(/\\*\\*/g, '').trim();\n if (clean.length > 2 && clean.length < 50) {\n concepts.push(clean);\n }\n });\n }\n\n return [...new Set(concepts)].slice(0, 10);\n}\n\n/**\n * Find areas needing research\n */\nfunction findResearchAreas(content: string, filename: string): string[] {\n const areas: string[] = [];\n\n // Look for question marks indicating uncertainty\n const questions = content.match(/[^.!?]*\\?/g);\n if (questions) {\n questions.slice(0, 3).forEach(q => {\n if (q.length > 10 && q.length < 200) {\n areas.push(q.trim());\n }\n });\n }\n\n // Look for placeholders\n if (content.match(/\\bTBD\\b|\\bTODO\\b|\\bFIXME\\b/i)) {\n areas.push('Contains placeholders that need completion');\n }\n\n // Look for empty sections\n const emptyHeaders = content.match(/^##[^#\\n]+\\n\\n##/gm);\n if (emptyHeaders) {\n areas.push('Has empty sections that need content');\n }\n\n // Check for missing content indicators\n if (content.length < 500) {\n areas.push('Document is short - may need expansion');\n }\n\n return areas;\n}\n\n/**\n * Extract and generate TODOs\n */\nfunction extractAndGenerateTodos(body: string, fullContent: string, filename: string): string[] {\n const todos: string[] = [];\n\n // Extract existing TODOs\n const existingTodos = fullContent.match(/[-*]\\s*\\[[ x]\\]\\s*(.+)/g);\n if (existingTodos) {\n existingTodos.forEach(todo => {\n todos.push(todo.replace(/^[-*]\\s*\\[[ x]\\]\\s*/, '').trim());\n });\n }\n\n // Extract TODO comments\n const todoComments = fullContent.match(/(?:TODO|FIXME|XXX):\\s*(.+)/gi);\n if (todoComments) {\n todoComments.forEach(todo => {\n todos.push(todo.replace(/^(?:TODO|FIXME|XXX):\\s*/i, '').trim());\n });\n }\n\n // Generate suggested TODOs based on analysis\n if (!fullContent.match(/^---[\\s\\S]*?---/)) {\n todos.push('Add proper frontmatter');\n }\n\n if (!fullContent.match(/\\[\\[/)) {\n todos.push('Add wikilinks to related documents');\n }\n\n if (!fullContent.match(/^##\\s/m)) {\n todos.push('Add section structure with headers');\n }\n\n return [...new Set(todos)].slice(0, 10);\n}\n\n/**\n * Generate summary from content\n */\nfunction generateSummary(body: string, frontmatter: Record<string, unknown>): string {\n // Use existing description\n if (frontmatter.description) {\n return String(frontmatter.description);\n }\n\n // Extract first meaningful paragraph\n const lines = body.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```') && trimmed.length > 30) {\n return trimmed.length > 200 ? trimmed.slice(0, 197) + '...' : trimmed;\n }\n }\n\n return 'Documentation requiring summary.';\n}\n\n/**\n * Build cross-references between documents\n */\nfunction buildCrossReferences(docs: AnalyzedDoc[]): void {\n const titleMap = new Map<string, AnalyzedDoc>();\n\n // Build title lookup\n docs.forEach(doc => {\n titleMap.set(doc.title.toLowerCase(), doc);\n titleMap.set(formatFilename(doc.title), doc);\n });\n\n // Update related links\n docs.forEach(doc => {\n const newRelated: string[] = [];\n\n doc.related.forEach(link => {\n const linkedDoc = titleMap.get(link.toLowerCase()) || titleMap.get(formatFilename(link));\n if (linkedDoc) {\n newRelated.push(linkedDoc.title);\n } else {\n newRelated.push(link);\n }\n });\n\n // Find related docs by shared tags\n const sharedTagDocs = docs.filter(other =>\n other !== doc &&\n other.tags.some(t => doc.tags.includes(t))\n );\n\n sharedTagDocs.slice(0, 3).forEach(other => {\n if (!newRelated.includes(other.title)) {\n newRelated.push(other.title);\n }\n });\n\n doc.related = [...new Set(newRelated)].slice(0, 10);\n });\n}\n\n/**\n * Generate knowledge document content\n */\nfunction generateKnowledgeDoc(\n doc: AnalyzedDoc,\n sourceDir: string,\n linkOriginal: boolean,\n allDocs: AnalyzedDoc[]\n): string {\n const lines: string[] = [];\n\n // Frontmatter\n lines.push('---');\n lines.push(`title: \"${doc.title}\"`);\n lines.push(`type: ${doc.type}`);\n lines.push(`status: active`);\n if (doc.tags.length > 0) {\n lines.push('tags:');\n doc.tags.forEach(tag => lines.push(` - ${tag}`));\n }\n lines.push(`category: ${doc.category}`);\n lines.push(`description: \"${doc.summary.replace(/\"/g, '\\\\\"')}\"`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push(`updated: ${new Date().toISOString().split('T')[0]}`);\n if (linkOriginal) {\n lines.push(`original: \"${sourceDir}/${doc.originalPath}\"`);\n }\n if (doc.related.length > 0) {\n lines.push('related:');\n doc.related.slice(0, 5).forEach(r => lines.push(` - \"[[${r}]]\"`));\n }\n lines.push('---');\n lines.push('');\n\n // Title\n lines.push(`# ${doc.title}`);\n lines.push('');\n\n // Summary\n lines.push('## Overview');\n lines.push('');\n lines.push(doc.summary);\n lines.push('');\n\n // Original reference\n if (linkOriginal) {\n lines.push(`> [!info] Original Documentation`);\n lines.push(`> See [[${sourceDir}/${doc.originalPath}|original document]] for full details.`);\n lines.push('');\n }\n\n // Key concepts\n if (doc.concepts.length > 0) {\n lines.push('## Key Concepts');\n lines.push('');\n doc.concepts.forEach(concept => {\n lines.push(`- **${concept}**`);\n });\n lines.push('');\n }\n\n // Related documents\n if (doc.related.length > 0) {\n lines.push('## Related');\n lines.push('');\n doc.related.forEach(rel => {\n lines.push(`- [[${rel}]]`);\n });\n lines.push('');\n }\n\n // Research needed\n if (doc.researchNeeded.length > 0) {\n lines.push('## Research Needed');\n lines.push('');\n lines.push('> [!warning] Areas Requiring Further Research');\n doc.researchNeeded.forEach(area => {\n lines.push(`> - ${area}`);\n });\n lines.push('');\n }\n\n // TODOs\n if (doc.todos.length > 0) {\n lines.push('## TODOs');\n lines.push('');\n doc.todos.forEach(todo => {\n lines.push(`- [ ] ${todo}`);\n });\n lines.push('');\n }\n\n // Tags section\n lines.push('## Tags');\n lines.push('');\n lines.push(doc.tags.map(t => `#${t}`).join(' '));\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate MOC (Map of Content) for a category\n */\nfunction generateMOC(category: string, docTitles: string[], allDocs: AnalyzedDoc[]): string {\n const config = CATEGORY_STRUCTURE[category];\n const categoryDocs = allDocs.filter(d => d.category.startsWith(category));\n\n const lines: string[] = [];\n\n lines.push('---');\n lines.push(`title: \"${formatTitle(category)} - Map of Content\"`);\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(` - ${category}`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push(`# ${formatTitle(category)}`);\n lines.push('');\n lines.push(config?.description || `Documentation related to ${category}.`);\n lines.push('');\n\n // Group by subcategory\n const bySubcategory = new Map<string, AnalyzedDoc[]>();\n categoryDocs.forEach(doc => {\n const parts = doc.category.split('/');\n const sub = parts[1] || 'general';\n if (!bySubcategory.has(sub)) {\n bySubcategory.set(sub, []);\n }\n bySubcategory.get(sub)!.push(doc);\n });\n\n for (const [sub, docs] of bySubcategory) {\n lines.push(`## ${formatTitle(sub)}`);\n lines.push('');\n docs.forEach(doc => {\n lines.push(`- [[${doc.title}]] - ${doc.summary.slice(0, 60)}...`);\n });\n lines.push('');\n }\n\n lines.push('---');\n lines.push(`*${categoryDocs.length} documents in this category*`);\n\n return lines.join('\\n');\n}\n\n/**\n * Generate master MOC\n */\nfunction generateMasterMOC(structure: Map<string, string[]>, allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Knowledge Graph - Master Index\"');\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(' - index');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Knowledge Graph');\n lines.push('');\n lines.push('Welcome to the knowledge graph. This is the master index of all documentation.');\n lines.push('');\n lines.push('## Categories');\n lines.push('');\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n const count = structure.get(category)?.length || 0;\n lines.push(`### [[${category}/_MOC|${formatTitle(category)}]]`);\n lines.push('');\n lines.push(`${config.description}`);\n lines.push(`*${count} documents*`);\n lines.push('');\n }\n\n lines.push('## Quick Links');\n lines.push('');\n lines.push('- [[PRIMITIVES]] - Core building blocks and technologies');\n lines.push('- [[guides/_MOC|Getting Started]]');\n lines.push('- [[standards/_MOC|Coding Standards]]');\n lines.push('');\n\n lines.push('## Statistics');\n lines.push('');\n lines.push(`- **Total Documents**: ${allDocs.length}`);\n lines.push(`- **Categories**: ${structure.size}`);\n lines.push(`- **Generated**: ${new Date().toISOString()}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate PRIMITIVES.md\n */\nfunction generatePrimitives(allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Primitives\"');\n lines.push('type: primitive');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - primitives');\n lines.push(' - foundation');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Primitives');\n lines.push('');\n lines.push('Core building blocks and foundational technologies used in this project.');\n lines.push('');\n\n // Group docs by type\n const byType = new Map<NodeType, AnalyzedDoc[]>();\n allDocs.forEach(doc => {\n if (!byType.has(doc.type)) {\n byType.set(doc.type, []);\n }\n byType.get(doc.type)!.push(doc);\n });\n\n for (const [type, docs] of byType) {\n lines.push(`## ${formatTitle(type)}`);\n lines.push('');\n docs.slice(0, 10).forEach(doc => {\n lines.push(`- [[${doc.title}]]`);\n });\n if (docs.length > 10) {\n lines.push(`- *...and ${docs.length - 10} more*`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format filename from title\n */\nfunction formatFilename(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 50);\n}\n\n/**\n * Format title from filename\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docs-analyzer.js","sources":["../../src/generators/docs-analyzer.ts"],"sourcesContent":["/**\n * Docs Analyzer\n *\n * Advanced documentation analyzer that uses claude-flow to create\n * comprehensive knowledge graph documentation with proper structure,\n * wikilinks, frontmatter, and tags following Obsidian conventions.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport { execSync, spawn } from 'child_process';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Analyzer options\n */\nexport interface AnalyzerOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Use claude-flow for deep analysis */\n useClaudeFlow?: boolean;\n /** Create MOC (Map of Content) files */\n createMOC?: boolean;\n /** Link back to original docs */\n linkOriginal?: boolean;\n /** Maximum depth for analysis */\n maxDepth?: number;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\n/**\n * Analyzed document\n */\nexport interface AnalyzedDoc {\n /** Original file path */\n originalPath: string;\n /** New file path in target directory */\n newPath: string;\n /** Document title */\n title: string;\n /** Detected node type */\n type: NodeType;\n /** Extracted tags */\n tags: string[];\n /** Related documents (wikilinks) */\n related: string[];\n /** Key concepts extracted */\n concepts: string[];\n /** Areas needing research */\n researchNeeded: string[];\n /** TODOs found or generated */\n todos: string[];\n /** Summary/description */\n summary: string;\n /** Category path in structure */\n category: string;\n}\n\n/**\n * Analyzer result\n */\nexport interface AnalyzerResult {\n success: boolean;\n filesAnalyzed: number;\n filesCreated: number;\n mocFilesCreated: number;\n errors: string[];\n analyzed: AnalyzedDoc[];\n structure: Map<string, string[]>;\n}\n\n/**\n * Weave-NN category structure with descriptions\n */\nconst CATEGORY_STRUCTURE: Record<string, { type: NodeType; description: string; subcategories: string[] }> = {\n concepts: {\n type: 'concept',\n description: 'Abstract concepts, theories, and architectural principles',\n subcategories: ['architecture', 'patterns', 'principles', 'models'],\n },\n components: {\n type: 'technical',\n description: 'Reusable technical components and implementations',\n subcategories: ['ui', 'utilities', 'core', 'shared'],\n },\n services: {\n type: 'service',\n description: 'Backend services, APIs, and workers',\n subcategories: ['api', 'workers', 'handlers', 'middleware'],\n },\n features: {\n type: 'feature',\n description: 'Product features and capabilities',\n subcategories: ['core', 'advanced', 'experimental'],\n },\n integrations: {\n type: 'integration',\n description: 'External integrations and adapters',\n subcategories: ['databases', 'auth', 'storage', 'monitoring', 'third-party'],\n },\n standards: {\n type: 'standard',\n description: 'Coding standards, conventions, and best practices',\n subcategories: ['coding', 'documentation', 'testing', 'security'],\n },\n guides: {\n type: 'guide',\n description: 'How-to guides and tutorials',\n subcategories: ['getting-started', 'tutorials', 'troubleshooting', 'deployment'],\n },\n references: {\n type: 'technical',\n description: 'API references and technical documentation',\n subcategories: ['api', 'cli', 'config', 'schemas'],\n },\n};\n\n/**\n * Analyze and migrate documentation to weave-nn structure\n */\nexport async function analyzeDocs(options: AnalyzerOptions): Promise<AnalyzerResult> {\n const {\n sourceDir,\n targetDir = 'docs',\n projectRoot,\n useClaudeFlow = false,\n createMOC = true,\n linkOriginal = true,\n maxDepth = 3,\n dryRun = false,\n verbose = false,\n } = options;\n\n const result: AnalyzerResult = {\n success: true,\n filesAnalyzed: 0,\n filesCreated: 0,\n mocFilesCreated: 0,\n errors: [],\n analyzed: [],\n structure: new Map(),\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createFullStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**', 'docs-nn/**'],\n });\n\n // First pass: Analyze all documents\n const analyzedDocs: AnalyzedDoc[] = [];\n\n for (const file of files) {\n result.filesAnalyzed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n const analyzed = await analyzeDocument(sourceFile, file, sourcePath, {\n useClaudeFlow,\n linkOriginal,\n verbose,\n });\n analyzedDocs.push(analyzed);\n\n // Track structure\n const category = analyzed.category.split('/')[0];\n if (!result.structure.has(category)) {\n result.structure.set(category, []);\n }\n result.structure.get(category)!.push(analyzed.title);\n\n } catch (error) {\n result.errors.push(`Failed to analyze ${file}: ${error}`);\n }\n }\n\n // Build cross-references between documents\n buildCrossReferences(analyzedDocs);\n\n // Second pass: Create new documents\n for (const doc of analyzedDocs) {\n try {\n const targetFile = join(targetPath, doc.newPath);\n\n if (!dryRun) {\n mkdirSync(dirname(targetFile), { recursive: true });\n const content = generateKnowledgeDoc(doc, sourceDir, linkOriginal, analyzedDocs);\n writeFileSync(targetFile, content, 'utf-8');\n }\n\n result.filesCreated++;\n result.analyzed.push(doc);\n\n } catch (error) {\n result.errors.push(`Failed to create ${doc.newPath}: ${error}`);\n }\n }\n\n // Create MOC files for each category\n if (createMOC && !dryRun) {\n for (const [category, docs] of result.structure) {\n const mocPath = join(targetPath, category, '_MOC.md');\n const mocContent = generateMOC(category, docs, analyzedDocs);\n writeFileSync(mocPath, mocContent, 'utf-8');\n result.mocFilesCreated++;\n }\n\n // Create master MOC\n const masterMocPath = join(targetPath, 'MOC.md');\n const masterMocContent = generateMasterMOC(result.structure, analyzedDocs);\n writeFileSync(masterMocPath, masterMocContent, 'utf-8');\n result.mocFilesCreated++;\n\n // Create PRIMITIVES.md\n const primitivesPath = join(targetPath, 'PRIMITIVES.md');\n const primitivesContent = generatePrimitives(analyzedDocs);\n writeFileSync(primitivesPath, primitivesContent, 'utf-8');\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Analyze a single document\n */\nasync function analyzeDocument(\n filePath: string,\n relativePath: string,\n sourcePath: string,\n options: { useClaudeFlow?: boolean; linkOriginal?: boolean; verbose?: boolean }\n): Promise<AnalyzedDoc> {\n const content = readFileSync(filePath, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n const filename = basename(filePath, '.md');\n const title = existingFrontmatter.title as string || formatTitle(filename);\n\n // Detect node type and category\n const { type, category } = detectTypeAndCategory(relativePath, body, existingFrontmatter);\n\n // Extract tags\n const tags = extractAllTags(body, existingFrontmatter, relativePath);\n\n // Extract wikilinks and markdown links\n const related = extractLinks(body);\n\n // Extract key concepts\n const concepts = extractConcepts(body);\n\n // Find areas needing research\n const researchNeeded = findResearchAreas(body, filename);\n\n // Extract existing TODOs and generate new ones\n const todos = extractAndGenerateTodos(body, content, filename);\n\n // Generate summary\n const summary = generateSummary(body, existingFrontmatter);\n\n // Determine new path\n const newPath = join(category, formatFilename(filename) + '.md');\n\n return {\n originalPath: relativePath,\n newPath,\n title,\n type,\n tags,\n related,\n concepts,\n researchNeeded,\n todos,\n summary,\n category,\n };\n}\n\n/**\n * Create full target directory structure\n */\nfunction createFullStructure(targetPath: string): void {\n // Create all category directories and subcategories\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n mkdirSync(join(targetPath, category), { recursive: true });\n for (const sub of config.subcategories) {\n mkdirSync(join(targetPath, category, sub), { recursive: true });\n }\n }\n\n // Create meta directories\n mkdirSync(join(targetPath, '_templates'), { recursive: true });\n mkdirSync(join(targetPath, '_attachments'), { recursive: true });\n mkdirSync(join(targetPath, '_archive'), { recursive: true });\n}\n\n/**\n * Detect node type and category from content\n */\nfunction detectTypeAndCategory(\n filePath: string,\n content: string,\n frontmatter: Record<string, unknown>\n): { type: NodeType; category: string } {\n // Check frontmatter first\n if (frontmatter.type && frontmatter.category) {\n return {\n type: frontmatter.type as NodeType,\n category: frontmatter.category as string,\n };\n }\n\n const lowerContent = content.toLowerCase();\n const lowerPath = filePath.toLowerCase();\n\n // Score each category\n const scores: Record<string, number> = {};\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n scores[category] = 0;\n\n // Path matching\n if (lowerPath.includes(category)) scores[category] += 10;\n for (const sub of config.subcategories) {\n if (lowerPath.includes(sub)) scores[category] += 5;\n }\n\n // Content analysis based on type\n const keywords = getKeywordsForType(config.type);\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = content.match(regex);\n if (matches) scores[category] += matches.length;\n }\n }\n\n // Find best match\n let bestCategory = 'concepts';\n let bestScore = 0;\n\n for (const [category, score] of Object.entries(scores)) {\n if (score > bestScore) {\n bestScore = score;\n bestCategory = category;\n }\n }\n\n return {\n type: CATEGORY_STRUCTURE[bestCategory].type,\n category: bestCategory,\n };\n}\n\n/**\n * Get keywords for a node type\n */\nfunction getKeywordsForType(type: NodeType): string[] {\n const keywords: Record<NodeType, string[]> = {\n concept: ['concept', 'theory', 'principle', 'overview', 'introduction', 'architecture', 'design', 'pattern'],\n technical: ['component', 'implementation', 'class', 'function', 'module', 'utility', 'helper'],\n feature: ['feature', 'capability', 'functionality', 'user', 'requirement', 'use case'],\n primitive: ['library', 'framework', 'dependency', 'tool', 'sdk'],\n service: ['api', 'endpoint', 'service', 'server', 'backend', 'worker', 'handler'],\n guide: ['how to', 'tutorial', 'guide', 'step', 'walkthrough', 'getting started'],\n standard: ['standard', 'convention', 'best practice', 'rule', 'guideline', 'style'],\n integration: ['integration', 'connect', 'plugin', 'adapter', 'sync', 'import', 'export'],\n };\n\n return keywords[type] || [];\n}\n\n/**\n * Extract all tags from content and path\n */\nfunction extractAllTags(\n content: string,\n frontmatter: Record<string, unknown>,\n filePath: string\n): string[] {\n const tags = new Set<string>();\n\n // Add existing frontmatter tags\n if (Array.isArray(frontmatter.tags)) {\n frontmatter.tags.forEach(t => tags.add(String(t)));\n }\n\n // Extract #tags from content\n const hashTags = content.match(/#[\\w-]+/g);\n if (hashTags) {\n hashTags.forEach(t => tags.add(t.slice(1)));\n }\n\n // Generate tags from path\n const pathParts = filePath.split('/').filter(p => p && !p.endsWith('.md'));\n pathParts.forEach(p => {\n if (p.length > 2 && p.length < 20) {\n tags.add(p.replace(/[-_]/g, '-').toLowerCase());\n }\n });\n\n // Add status tags\n if (content.match(/\\b(wip|draft|todo)\\b/i)) tags.add('needs-work');\n if (content.match(/\\b(deprecated|legacy)\\b/i)) tags.add('deprecated');\n if (content.match(/\\b(experimental|beta)\\b/i)) tags.add('experimental');\n\n return [...tags].slice(0, 15);\n}\n\n/**\n * Extract wikilinks and markdown links\n */\nfunction extractLinks(content: string): string[] {\n const links = new Set<string>();\n\n // Wikilinks\n const wikilinks = content.match(/\\[\\[([^\\]|]+)(?:\\|[^\\]]+)?\\]\\]/g);\n if (wikilinks) {\n wikilinks.forEach(link => {\n const match = link.match(/\\[\\[([^\\]|]+)/);\n if (match) links.add(match[1].trim());\n });\n }\n\n // Markdown links (internal only)\n const mdLinks = content.match(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g);\n if (mdLinks) {\n mdLinks.forEach(link => {\n const match = link.match(/\\]\\(([^)]+)\\)/);\n if (match && !match[1].startsWith('http')) {\n links.add(match[1].replace(/\\.md$/, '').trim());\n }\n });\n }\n\n return [...links];\n}\n\n/**\n * Extract key concepts from content\n */\nfunction extractConcepts(content: string): string[] {\n const concepts: string[] = [];\n\n // Look for headers as concepts\n const headers = content.match(/^##\\s+(.+)$/gm);\n if (headers) {\n headers.slice(0, 5).forEach(h => {\n concepts.push(h.replace(/^##\\s+/, '').trim());\n });\n }\n\n // Look for bold terms as concepts\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n boldTerms.slice(0, 5).forEach(term => {\n const clean = term.replace(/\\*\\*/g, '').trim();\n if (clean.length > 2 && clean.length < 50) {\n concepts.push(clean);\n }\n });\n }\n\n return [...new Set(concepts)].slice(0, 10);\n}\n\n/**\n * Find areas needing research\n */\nfunction findResearchAreas(content: string, filename: string): string[] {\n const areas: string[] = [];\n\n // Look for question marks indicating uncertainty\n const questions = content.match(/[^.!?]*\\?/g);\n if (questions) {\n questions.slice(0, 3).forEach(q => {\n if (q.length > 10 && q.length < 200) {\n areas.push(q.trim());\n }\n });\n }\n\n // Look for placeholders\n if (content.match(/\\bTBD\\b|\\bTODO\\b|\\bFIXME\\b/i)) {\n areas.push('Contains placeholders that need completion');\n }\n\n // Look for empty sections\n const emptyHeaders = content.match(/^##[^#\\n]+\\n\\n##/gm);\n if (emptyHeaders) {\n areas.push('Has empty sections that need content');\n }\n\n // Check for missing content indicators\n if (content.length < 500) {\n areas.push('Document is short - may need expansion');\n }\n\n return areas;\n}\n\n/**\n * Extract and generate TODOs\n */\nfunction extractAndGenerateTodos(body: string, fullContent: string, filename: string): string[] {\n const todos: string[] = [];\n\n // Extract existing TODOs\n const existingTodos = fullContent.match(/[-*]\\s*\\[[ x]\\]\\s*(.+)/g);\n if (existingTodos) {\n existingTodos.forEach(todo => {\n todos.push(todo.replace(/^[-*]\\s*\\[[ x]\\]\\s*/, '').trim());\n });\n }\n\n // Extract TODO comments\n const todoComments = fullContent.match(/(?:TODO|FIXME|XXX):\\s*(.+)/gi);\n if (todoComments) {\n todoComments.forEach(todo => {\n todos.push(todo.replace(/^(?:TODO|FIXME|XXX):\\s*/i, '').trim());\n });\n }\n\n // Generate suggested TODOs based on analysis\n if (!fullContent.match(/^---[\\s\\S]*?---/)) {\n todos.push('Add proper frontmatter');\n }\n\n if (!fullContent.match(/\\[\\[/)) {\n todos.push('Add wikilinks to related documents');\n }\n\n if (!fullContent.match(/^##\\s/m)) {\n todos.push('Add section structure with headers');\n }\n\n return [...new Set(todos)].slice(0, 10);\n}\n\n/**\n * Generate summary from content\n */\nfunction generateSummary(body: string, frontmatter: Record<string, unknown>): string {\n // Use existing description\n if (frontmatter.description) {\n return String(frontmatter.description);\n }\n\n // Extract first meaningful paragraph\n const lines = body.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```') && trimmed.length > 30) {\n return trimmed.length > 200 ? trimmed.slice(0, 197) + '...' : trimmed;\n }\n }\n\n return 'Documentation requiring summary.';\n}\n\n/**\n * Build cross-references between documents\n */\nfunction buildCrossReferences(docs: AnalyzedDoc[]): void {\n const titleMap = new Map<string, AnalyzedDoc>();\n\n // Build title lookup\n docs.forEach(doc => {\n titleMap.set(doc.title.toLowerCase(), doc);\n titleMap.set(formatFilename(doc.title), doc);\n });\n\n // Update related links\n docs.forEach(doc => {\n const newRelated: string[] = [];\n\n doc.related.forEach(link => {\n const linkedDoc = titleMap.get(link.toLowerCase()) || titleMap.get(formatFilename(link));\n if (linkedDoc) {\n newRelated.push(linkedDoc.title);\n } else {\n newRelated.push(link);\n }\n });\n\n // Find related docs by shared tags\n const sharedTagDocs = docs.filter(other =>\n other !== doc &&\n other.tags.some(t => doc.tags.includes(t))\n );\n\n sharedTagDocs.slice(0, 3).forEach(other => {\n if (!newRelated.includes(other.title)) {\n newRelated.push(other.title);\n }\n });\n\n doc.related = [...new Set(newRelated)].slice(0, 10);\n });\n}\n\n/**\n * Generate knowledge document content\n */\nfunction generateKnowledgeDoc(\n doc: AnalyzedDoc,\n sourceDir: string,\n linkOriginal: boolean,\n allDocs: AnalyzedDoc[]\n): string {\n const lines: string[] = [];\n\n // Frontmatter\n lines.push('---');\n lines.push(`title: \"${doc.title}\"`);\n lines.push(`type: ${doc.type}`);\n lines.push(`status: active`);\n if (doc.tags.length > 0) {\n lines.push('tags:');\n doc.tags.forEach(tag => lines.push(` - ${tag}`));\n }\n lines.push(`category: ${doc.category}`);\n lines.push(`description: \"${doc.summary.replace(/\"/g, '\\\\\"')}\"`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push(`updated: ${new Date().toISOString().split('T')[0]}`);\n if (linkOriginal) {\n lines.push(`original: \"${sourceDir}/${doc.originalPath}\"`);\n }\n if (doc.related.length > 0) {\n lines.push('related:');\n doc.related.slice(0, 5).forEach(r => lines.push(` - \"[[${r}]]\"`));\n }\n lines.push('---');\n lines.push('');\n\n // Title\n lines.push(`# ${doc.title}`);\n lines.push('');\n\n // Summary\n lines.push('## Overview');\n lines.push('');\n lines.push(doc.summary);\n lines.push('');\n\n // Original reference\n if (linkOriginal) {\n lines.push(`> [!info] Original Documentation`);\n lines.push(`> See [[${sourceDir}/${doc.originalPath}|original document]] for full details.`);\n lines.push('');\n }\n\n // Key concepts\n if (doc.concepts.length > 0) {\n lines.push('## Key Concepts');\n lines.push('');\n doc.concepts.forEach(concept => {\n lines.push(`- **${concept}**`);\n });\n lines.push('');\n }\n\n // Related documents\n if (doc.related.length > 0) {\n lines.push('## Related');\n lines.push('');\n doc.related.forEach(rel => {\n lines.push(`- [[${rel}]]`);\n });\n lines.push('');\n }\n\n // Research needed\n if (doc.researchNeeded.length > 0) {\n lines.push('## Research Needed');\n lines.push('');\n lines.push('> [!warning] Areas Requiring Further Research');\n doc.researchNeeded.forEach(area => {\n lines.push(`> - ${area}`);\n });\n lines.push('');\n }\n\n // TODOs\n if (doc.todos.length > 0) {\n lines.push('## TODOs');\n lines.push('');\n doc.todos.forEach(todo => {\n lines.push(`- [ ] ${todo}`);\n });\n lines.push('');\n }\n\n // Tags section\n lines.push('## Tags');\n lines.push('');\n lines.push(doc.tags.map(t => `#${t}`).join(' '));\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate MOC (Map of Content) for a category\n */\nfunction generateMOC(category: string, docTitles: string[], allDocs: AnalyzedDoc[]): string {\n const config = CATEGORY_STRUCTURE[category];\n const categoryDocs = allDocs.filter(d => d.category.startsWith(category));\n\n const lines: string[] = [];\n\n lines.push('---');\n lines.push(`title: \"${formatTitle(category)} - Map of Content\"`);\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(` - ${category}`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push(`# ${formatTitle(category)}`);\n lines.push('');\n lines.push(config?.description || `Documentation related to ${category}.`);\n lines.push('');\n\n // Group by subcategory\n const bySubcategory = new Map<string, AnalyzedDoc[]>();\n categoryDocs.forEach(doc => {\n const parts = doc.category.split('/');\n const sub = parts[1] || 'general';\n if (!bySubcategory.has(sub)) {\n bySubcategory.set(sub, []);\n }\n bySubcategory.get(sub)!.push(doc);\n });\n\n for (const [sub, docs] of bySubcategory) {\n lines.push(`## ${formatTitle(sub)}`);\n lines.push('');\n docs.forEach(doc => {\n lines.push(`- [[${doc.title}]] - ${doc.summary.slice(0, 60)}...`);\n });\n lines.push('');\n }\n\n lines.push('---');\n lines.push(`*${categoryDocs.length} documents in this category*`);\n\n return lines.join('\\n');\n}\n\n/**\n * Generate master MOC\n */\nfunction generateMasterMOC(structure: Map<string, string[]>, allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Knowledge Graph - Master Index\"');\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(' - index');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Knowledge Graph');\n lines.push('');\n lines.push('Welcome to the knowledge graph. This is the master index of all documentation.');\n lines.push('');\n lines.push('## Categories');\n lines.push('');\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n const count = structure.get(category)?.length || 0;\n lines.push(`### [[${category}/_MOC|${formatTitle(category)}]]`);\n lines.push('');\n lines.push(`${config.description}`);\n lines.push(`*${count} documents*`);\n lines.push('');\n }\n\n lines.push('## Quick Links');\n lines.push('');\n lines.push('- [[PRIMITIVES]] - Core building blocks and technologies');\n lines.push('- [[guides/_MOC|Getting Started]]');\n lines.push('- [[standards/_MOC|Coding Standards]]');\n lines.push('');\n\n lines.push('## Statistics');\n lines.push('');\n lines.push(`- **Total Documents**: ${allDocs.length}`);\n lines.push(`- **Categories**: ${structure.size}`);\n lines.push(`- **Generated**: ${new Date().toISOString()}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate PRIMITIVES.md\n */\nfunction generatePrimitives(allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Primitives\"');\n lines.push('type: primitive');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - primitives');\n lines.push(' - foundation');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Primitives');\n lines.push('');\n lines.push('Core building blocks and foundational technologies used in this project.');\n lines.push('');\n\n // Group docs by type\n const byType = new Map<NodeType, AnalyzedDoc[]>();\n allDocs.forEach(doc => {\n if (!byType.has(doc.type)) {\n byType.set(doc.type, []);\n }\n byType.get(doc.type)!.push(doc);\n });\n\n for (const [type, docs] of byType) {\n lines.push(`## ${formatTitle(type)}`);\n lines.push('');\n docs.slice(0, 10).forEach(doc => {\n lines.push(`- [[${doc.title}]]`);\n });\n if (docs.length > 10) {\n lines.push(`- *...and ${docs.length - 10} more*`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format filename from title\n */\nfunction formatFilename(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 50);\n}\n\n/**\n * Format title from filename\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import type { NodeType, NodeStatus } from '../core/types.js';
|
|
|
11
11
|
export interface ConvertOptions {
|
|
12
12
|
/** Source directory with existing docs */
|
|
13
13
|
sourceDir: string;
|
|
14
|
-
/** Target directory (default: docs
|
|
14
|
+
/** Target directory (default: docs) */
|
|
15
15
|
targetDir?: string;
|
|
16
16
|
/** Project root for path resolution */
|
|
17
17
|
projectRoot: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-convert.d.ts","sourceRoot":"","sources":["../../src/generators/docs-convert.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"docs-convert.d.ts","sourceRoot":"","sources":["../../src/generators/docs-convert.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,sBAAsB;IACtB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,QAAQ,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA6FjF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiF5F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACnD,CAAC,CA6DD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-convert.js","sources":["../../src/generators/docs-convert.ts"],"sourcesContent":["/**\n * Docs Converter\n *\n * Converts existing documentation to weave-nn structure with proper\n * frontmatter and directory organization.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, copyFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Conversion options\n */\nexport interface ConvertOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs-nn) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Preserve original files (copy instead of move) */\n preserveOriginal?: boolean;\n /** Overwrite existing files in target */\n force?: boolean;\n /** Auto-categorize based on content analysis */\n autoCategory?: boolean;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n}\n\n/**\n * Frontmatter options\n */\nexport interface FrontmatterOptions {\n /** Target file or directory */\n target: string;\n /** Project root */\n projectRoot: string;\n /** Override type detection */\n type?: NodeType;\n /** Override status */\n status?: NodeStatus;\n /** Additional tags to add */\n tags?: string[];\n /** Force overwrite existing frontmatter */\n force?: boolean;\n /** Dry run */\n dryRun?: boolean;\n}\n\n/**\n * Conversion result\n */\nexport interface ConvertResult {\n success: boolean;\n filesProcessed: number;\n filesConverted: number;\n filesSkipped: number;\n errors: string[];\n converted: Array<{\n source: string;\n target: string;\n type: NodeType;\n }>;\n}\n\n/**\n * Frontmatter result\n */\nexport interface FrontmatterResult {\n success: boolean;\n filesProcessed: number;\n filesUpdated: number;\n filesSkipped: number;\n errors: string[];\n}\n\n/**\n * Weave-NN directory structure mapping\n */\nconst CATEGORY_DIRS: Record<NodeType, string> = {\n concept: 'concepts',\n technical: 'components',\n feature: 'features',\n primitive: 'integrations',\n service: 'services',\n guide: 'guides',\n standard: 'standards',\n integration: 'integrations',\n};\n\n/**\n * Keywords for content-based categorization\n */\nconst CATEGORY_KEYWORDS: Record<NodeType, string[]> = {\n concept: [\n 'overview', 'introduction', 'theory', 'principle', 'concept',\n 'philosophy', 'approach', 'methodology', 'paradigm', 'model',\n ],\n technical: [\n 'component', 'implementation', 'class', 'function', 'module',\n 'algorithm', 'data structure', 'interface', 'abstract', 'utility',\n ],\n feature: [\n 'feature', 'capability', 'functionality', 'use case', 'user story',\n 'requirement', 'specification', 'product', 'roadmap',\n ],\n primitive: [\n 'library', 'framework', 'dependency', 'package', 'tool',\n 'sdk', 'runtime', 'platform', 'language',\n ],\n service: [\n 'api', 'endpoint', 'service', 'server', 'backend', 'microservice',\n 'rest', 'graphql', 'webhook', 'worker', 'queue',\n ],\n guide: [\n 'how to', 'tutorial', 'guide', 'walkthrough', 'step by step',\n 'getting started', 'setup', 'installation', 'configuration',\n ],\n standard: [\n 'standard', 'convention', 'best practice', 'rule', 'policy',\n 'guideline', 'coding style', 'lint', 'format',\n ],\n integration: [\n 'integration', 'connect', 'plugin', 'adapter', 'bridge',\n 'sync', 'import', 'export', 'webhook',\n ],\n};\n\n/**\n * Path-based categorization patterns\n */\nconst PATH_PATTERNS: Array<{ pattern: RegExp; type: NodeType }> = [\n { pattern: /\\/(api|endpoints?|routes?)\\//i, type: 'service' },\n { pattern: /\\/(guide|tutorial|howto|getting-started)\\//i, type: 'guide' },\n { pattern: /\\/(component|ui|widget)\\//i, type: 'technical' },\n { pattern: /\\/(feature|capability)\\//i, type: 'feature' },\n { pattern: /\\/(standard|convention|style)\\//i, type: 'standard' },\n { pattern: /\\/(integration|plugin|adapter)\\//i, type: 'integration' },\n { pattern: /\\/(service|worker|job)\\//i, type: 'service' },\n { pattern: /\\/(concept|architecture|design)\\//i, type: 'concept' },\n];\n\n/**\n * Convert existing docs to weave-nn structure\n */\nexport async function convertDocs(options: ConvertOptions): Promise<ConvertResult> {\n const {\n sourceDir,\n targetDir = 'docs-nn',\n projectRoot,\n preserveOriginal = true,\n force = false,\n autoCategory = true,\n dryRun = false,\n } = options;\n\n const result: ConvertResult = {\n success: true,\n filesProcessed: 0,\n filesConverted: 0,\n filesSkipped: 0,\n errors: [],\n converted: [],\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createTargetStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n });\n\n for (const file of files) {\n result.filesProcessed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n // Read and parse file\n const content = readFileSync(sourceFile, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Determine node type\n const nodeType = autoCategory\n ? detectNodeType(file, body, existingFrontmatter)\n : (existingFrontmatter.type as NodeType) || 'concept';\n\n // Determine target path\n const targetSubdir = CATEGORY_DIRS[nodeType];\n const targetFile = join(targetPath, targetSubdir, basename(file));\n\n // Check if target exists\n if (existsSync(targetFile) && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(file, body, nodeType, existingFrontmatter);\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n // Ensure directory exists\n mkdirSync(dirname(targetFile), { recursive: true });\n\n // Write converted file\n writeFileSync(targetFile, newContent, 'utf-8');\n }\n\n result.filesConverted++;\n result.converted.push({\n source: file,\n target: relative(projectRoot, targetFile),\n type: nodeType,\n });\n\n } catch (error) {\n result.errors.push(`Failed to convert ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Add or update frontmatter in existing files\n */\nexport async function addFrontmatter(options: FrontmatterOptions): Promise<FrontmatterResult> {\n const {\n target,\n projectRoot,\n type,\n status = 'active',\n tags = [],\n force = false,\n dryRun = false,\n } = options;\n\n const result: FrontmatterResult = {\n success: true,\n filesProcessed: 0,\n filesUpdated: 0,\n filesSkipped: 0,\n errors: [],\n };\n\n const targetPath = join(projectRoot, target);\n\n // Handle single file or directory\n let files: string[];\n if (existsSync(targetPath) && !targetPath.endsWith('.md')) {\n // Directory - find all markdown files\n files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n } else if (existsSync(targetPath)) {\n files = [targetPath];\n } else {\n result.success = false;\n result.errors.push(`Target not found: ${targetPath}`);\n return result;\n }\n\n for (const file of files) {\n result.filesProcessed++;\n\n try {\n const content = readFileSync(file, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Skip if has frontmatter and not forcing\n if (Object.keys(existingFrontmatter).length > 0 && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Detect type if not specified\n const relPath = relative(projectRoot, file);\n const nodeType = type || detectNodeType(relPath, body, existingFrontmatter);\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(\n relPath,\n body,\n nodeType,\n force ? {} : existingFrontmatter,\n status,\n tags\n );\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n writeFileSync(file, newContent, 'utf-8');\n }\n\n result.filesUpdated++;\n\n } catch (error) {\n result.errors.push(`Failed to update ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Validate frontmatter in files\n */\nexport async function validateFrontmatter(\n target: string,\n projectRoot: string\n): Promise<{\n valid: number;\n invalid: number;\n missing: number;\n issues: Array<{ file: string; issues: string[] }>;\n}> {\n const result = {\n valid: 0,\n invalid: 0,\n missing: 0,\n issues: [] as Array<{ file: string; issues: string[] }>,\n };\n\n const targetPath = join(projectRoot, target);\n\n const files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n const validStatuses: NodeStatus[] = ['draft', 'active', 'deprecated', 'archived'];\n\n for (const file of files) {\n const content = readFileSync(file, 'utf-8');\n const { data: frontmatter } = matter(content);\n const fileIssues: string[] = [];\n\n if (Object.keys(frontmatter).length === 0) {\n result.missing++;\n fileIssues.push('Missing frontmatter');\n } else {\n // Check required fields\n if (!frontmatter.title) {\n fileIssues.push('Missing title');\n }\n if (!frontmatter.type) {\n fileIssues.push('Missing type');\n } else if (!validTypes.includes(frontmatter.type)) {\n fileIssues.push(`Invalid type: ${frontmatter.type}`);\n }\n if (frontmatter.status && !validStatuses.includes(frontmatter.status)) {\n fileIssues.push(`Invalid status: ${frontmatter.status}`);\n }\n if (!frontmatter.created) {\n fileIssues.push('Missing created date');\n }\n }\n\n if (fileIssues.length > 0) {\n result.invalid++;\n result.issues.push({\n file: relative(projectRoot, file),\n issues: fileIssues,\n });\n } else if (Object.keys(frontmatter).length > 0) {\n result.valid++;\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create target directory structure\n */\nfunction createTargetStructure(targetPath: string): void {\n const dirs = [\n '',\n 'concepts',\n 'concepts/architecture',\n 'concepts/patterns',\n 'components',\n 'components/ui',\n 'components/utilities',\n 'services',\n 'services/api',\n 'services/workers',\n 'features',\n 'features/core',\n 'features/advanced',\n 'integrations',\n 'integrations/databases',\n 'integrations/auth',\n 'standards',\n 'standards/coding',\n 'standards/documentation',\n 'guides',\n 'guides/getting-started',\n 'guides/tutorials',\n 'references',\n 'references/api',\n '_templates',\n '_attachments',\n ];\n\n for (const dir of dirs) {\n const fullPath = join(targetPath, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n }\n }\n}\n\n/**\n * Detect node type from file path and content\n */\nfunction detectNodeType(\n filePath: string,\n content: string,\n existingFrontmatter: Record<string, unknown>\n): NodeType {\n // Use existing type if valid\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n if (existingFrontmatter.type && validTypes.includes(existingFrontmatter.type as NodeType)) {\n return existingFrontmatter.type as NodeType;\n }\n\n // Check path patterns\n for (const { pattern, type } of PATH_PATTERNS) {\n if (pattern.test(filePath)) {\n return type;\n }\n }\n\n // Analyze content\n const lowerContent = content.toLowerCase();\n const scores: Record<NodeType, number> = {\n concept: 0,\n technical: 0,\n feature: 0,\n primitive: 0,\n service: 0,\n guide: 0,\n standard: 0,\n integration: 0,\n };\n\n for (const [nodeType, keywords] of Object.entries(CATEGORY_KEYWORDS)) {\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = lowerContent.match(regex);\n if (matches) {\n scores[nodeType as NodeType] += matches.length;\n }\n }\n }\n\n // Find highest scoring type\n let maxScore = 0;\n let detectedType: NodeType = 'concept';\n\n for (const [nodeType, score] of Object.entries(scores)) {\n if (score > maxScore) {\n maxScore = score;\n detectedType = nodeType as NodeType;\n }\n }\n\n return detectedType;\n}\n\n/**\n * Generate frontmatter for a file\n */\nfunction generateFrontmatter(\n filePath: string,\n content: string,\n nodeType: NodeType,\n existing: Record<string, unknown> = {},\n status: NodeStatus = 'active',\n additionalTags: string[] = []\n): NodeFrontmatter {\n const filename = basename(filePath, '.md');\n const title = existing.title as string || formatTitle(filename);\n\n // Extract tags from content\n const extractedTags = extractTags(content);\n const allTags = [...new Set([\n ...(existing.tags as string[] || []),\n ...extractedTags,\n ...additionalTags,\n ])];\n\n // Get dates\n const now = new Date().toISOString().split('T')[0];\n const created = existing.created as string || now;\n\n return {\n title,\n type: nodeType,\n status: existing.status as NodeStatus || status,\n tags: allTags.length > 0 ? allTags : undefined,\n category: existing.category as string || undefined,\n description: existing.description as string || extractDescription(content),\n created,\n updated: now,\n aliases: existing.aliases as string[] || undefined,\n related: existing.related as string[] || undefined,\n };\n}\n\n/**\n * Format filename as title\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n\n/**\n * Extract tags from content\n */\nfunction extractTags(content: string): string[] {\n const tags: string[] = [];\n\n // Look for #tags in content\n const tagMatches = content.match(/#[\\w-]+/g);\n if (tagMatches) {\n tags.push(...tagMatches.map(t => t.slice(1)));\n }\n\n return tags.slice(0, 10); // Limit to 10 tags\n}\n\n/**\n * Extract description from first paragraph\n */\nfunction extractDescription(content: string): string | undefined {\n // Skip headers and find first paragraph\n const lines = content.split('\\n');\n let description = '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {\n description = trimmed;\n break;\n }\n }\n\n if (description.length > 200) {\n description = description.slice(0, 197) + '...';\n }\n\n return description || undefined;\n}\n\n/**\n * Build markdown content with frontmatter\n */\nfunction buildMarkdownWithFrontmatter(\n frontmatter: NodeFrontmatter,\n content: string\n): string {\n // Clean undefined values\n const cleanFrontmatter: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(frontmatter)) {\n if (value !== undefined) {\n cleanFrontmatter[key] = value;\n }\n }\n\n // Build YAML frontmatter\n const yamlLines = ['---'];\n\n // Order: title, type, status, tags, description, dates, others\n const orderedKeys = ['title', 'type', 'status', 'tags', 'category', 'description', 'created', 'updated', 'aliases', 'related'];\n\n for (const key of orderedKeys) {\n if (cleanFrontmatter[key] !== undefined) {\n yamlLines.push(formatYamlLine(key, cleanFrontmatter[key]));\n }\n }\n\n yamlLines.push('---');\n yamlLines.push('');\n\n return yamlLines.join('\\n') + content.trim() + '\\n';\n}\n\n/**\n * Format a YAML line\n */\nfunction formatYamlLine(key: string, value: unknown): string {\n if (Array.isArray(value)) {\n if (value.length === 0) return '';\n return `${key}:\\n${value.map(v => ` - ${v}`).join('\\n')}`;\n }\n if (typeof value === 'string' && (value.includes(':') || value.includes('#'))) {\n return `${key}: \"${value}\"`;\n }\n return `${key}: ${value}`;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docs-convert.js","sources":["../../src/generators/docs-convert.ts"],"sourcesContent":["/**\n * Docs Converter\n *\n * Converts existing documentation to weave-nn structure with proper\n * frontmatter and directory organization.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, copyFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Conversion options\n */\nexport interface ConvertOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Preserve original files (copy instead of move) */\n preserveOriginal?: boolean;\n /** Overwrite existing files in target */\n force?: boolean;\n /** Auto-categorize based on content analysis */\n autoCategory?: boolean;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n}\n\n/**\n * Frontmatter options\n */\nexport interface FrontmatterOptions {\n /** Target file or directory */\n target: string;\n /** Project root */\n projectRoot: string;\n /** Override type detection */\n type?: NodeType;\n /** Override status */\n status?: NodeStatus;\n /** Additional tags to add */\n tags?: string[];\n /** Force overwrite existing frontmatter */\n force?: boolean;\n /** Dry run */\n dryRun?: boolean;\n}\n\n/**\n * Conversion result\n */\nexport interface ConvertResult {\n success: boolean;\n filesProcessed: number;\n filesConverted: number;\n filesSkipped: number;\n errors: string[];\n converted: Array<{\n source: string;\n target: string;\n type: NodeType;\n }>;\n}\n\n/**\n * Frontmatter result\n */\nexport interface FrontmatterResult {\n success: boolean;\n filesProcessed: number;\n filesUpdated: number;\n filesSkipped: number;\n errors: string[];\n}\n\n/**\n * Weave-NN directory structure mapping\n */\nconst CATEGORY_DIRS: Record<NodeType, string> = {\n concept: 'concepts',\n technical: 'components',\n feature: 'features',\n primitive: 'integrations',\n service: 'services',\n guide: 'guides',\n standard: 'standards',\n integration: 'integrations',\n};\n\n/**\n * Keywords for content-based categorization\n */\nconst CATEGORY_KEYWORDS: Record<NodeType, string[]> = {\n concept: [\n 'overview', 'introduction', 'theory', 'principle', 'concept',\n 'philosophy', 'approach', 'methodology', 'paradigm', 'model',\n ],\n technical: [\n 'component', 'implementation', 'class', 'function', 'module',\n 'algorithm', 'data structure', 'interface', 'abstract', 'utility',\n ],\n feature: [\n 'feature', 'capability', 'functionality', 'use case', 'user story',\n 'requirement', 'specification', 'product', 'roadmap',\n ],\n primitive: [\n 'library', 'framework', 'dependency', 'package', 'tool',\n 'sdk', 'runtime', 'platform', 'language',\n ],\n service: [\n 'api', 'endpoint', 'service', 'server', 'backend', 'microservice',\n 'rest', 'graphql', 'webhook', 'worker', 'queue',\n ],\n guide: [\n 'how to', 'tutorial', 'guide', 'walkthrough', 'step by step',\n 'getting started', 'setup', 'installation', 'configuration',\n ],\n standard: [\n 'standard', 'convention', 'best practice', 'rule', 'policy',\n 'guideline', 'coding style', 'lint', 'format',\n ],\n integration: [\n 'integration', 'connect', 'plugin', 'adapter', 'bridge',\n 'sync', 'import', 'export', 'webhook',\n ],\n};\n\n/**\n * Path-based categorization patterns\n */\nconst PATH_PATTERNS: Array<{ pattern: RegExp; type: NodeType }> = [\n { pattern: /\\/(api|endpoints?|routes?)\\//i, type: 'service' },\n { pattern: /\\/(guide|tutorial|howto|getting-started)\\//i, type: 'guide' },\n { pattern: /\\/(component|ui|widget)\\//i, type: 'technical' },\n { pattern: /\\/(feature|capability)\\//i, type: 'feature' },\n { pattern: /\\/(standard|convention|style)\\//i, type: 'standard' },\n { pattern: /\\/(integration|plugin|adapter)\\//i, type: 'integration' },\n { pattern: /\\/(service|worker|job)\\//i, type: 'service' },\n { pattern: /\\/(concept|architecture|design)\\//i, type: 'concept' },\n];\n\n/**\n * Convert existing docs to weave-nn structure\n */\nexport async function convertDocs(options: ConvertOptions): Promise<ConvertResult> {\n const {\n sourceDir,\n targetDir = 'docs',\n projectRoot,\n preserveOriginal = true,\n force = false,\n autoCategory = true,\n dryRun = false,\n } = options;\n\n const result: ConvertResult = {\n success: true,\n filesProcessed: 0,\n filesConverted: 0,\n filesSkipped: 0,\n errors: [],\n converted: [],\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createTargetStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n });\n\n for (const file of files) {\n result.filesProcessed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n // Read and parse file\n const content = readFileSync(sourceFile, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Determine node type\n const nodeType = autoCategory\n ? detectNodeType(file, body, existingFrontmatter)\n : (existingFrontmatter.type as NodeType) || 'concept';\n\n // Determine target path\n const targetSubdir = CATEGORY_DIRS[nodeType];\n const targetFile = join(targetPath, targetSubdir, basename(file));\n\n // Check if target exists\n if (existsSync(targetFile) && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(file, body, nodeType, existingFrontmatter);\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n // Ensure directory exists\n mkdirSync(dirname(targetFile), { recursive: true });\n\n // Write converted file\n writeFileSync(targetFile, newContent, 'utf-8');\n }\n\n result.filesConverted++;\n result.converted.push({\n source: file,\n target: relative(projectRoot, targetFile),\n type: nodeType,\n });\n\n } catch (error) {\n result.errors.push(`Failed to convert ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Add or update frontmatter in existing files\n */\nexport async function addFrontmatter(options: FrontmatterOptions): Promise<FrontmatterResult> {\n const {\n target,\n projectRoot,\n type,\n status = 'active',\n tags = [],\n force = false,\n dryRun = false,\n } = options;\n\n const result: FrontmatterResult = {\n success: true,\n filesProcessed: 0,\n filesUpdated: 0,\n filesSkipped: 0,\n errors: [],\n };\n\n const targetPath = join(projectRoot, target);\n\n // Handle single file or directory\n let files: string[];\n if (existsSync(targetPath) && !targetPath.endsWith('.md')) {\n // Directory - find all markdown files\n files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n } else if (existsSync(targetPath)) {\n files = [targetPath];\n } else {\n result.success = false;\n result.errors.push(`Target not found: ${targetPath}`);\n return result;\n }\n\n for (const file of files) {\n result.filesProcessed++;\n\n try {\n const content = readFileSync(file, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Skip if has frontmatter and not forcing\n if (Object.keys(existingFrontmatter).length > 0 && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Detect type if not specified\n const relPath = relative(projectRoot, file);\n const nodeType = type || detectNodeType(relPath, body, existingFrontmatter);\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(\n relPath,\n body,\n nodeType,\n force ? {} : existingFrontmatter,\n status,\n tags\n );\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n writeFileSync(file, newContent, 'utf-8');\n }\n\n result.filesUpdated++;\n\n } catch (error) {\n result.errors.push(`Failed to update ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Validate frontmatter in files\n */\nexport async function validateFrontmatter(\n target: string,\n projectRoot: string\n): Promise<{\n valid: number;\n invalid: number;\n missing: number;\n issues: Array<{ file: string; issues: string[] }>;\n}> {\n const result = {\n valid: 0,\n invalid: 0,\n missing: 0,\n issues: [] as Array<{ file: string; issues: string[] }>,\n };\n\n const targetPath = join(projectRoot, target);\n\n const files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n const validStatuses: NodeStatus[] = ['draft', 'active', 'deprecated', 'archived'];\n\n for (const file of files) {\n const content = readFileSync(file, 'utf-8');\n const { data: frontmatter } = matter(content);\n const fileIssues: string[] = [];\n\n if (Object.keys(frontmatter).length === 0) {\n result.missing++;\n fileIssues.push('Missing frontmatter');\n } else {\n // Check required fields\n if (!frontmatter.title) {\n fileIssues.push('Missing title');\n }\n if (!frontmatter.type) {\n fileIssues.push('Missing type');\n } else if (!validTypes.includes(frontmatter.type)) {\n fileIssues.push(`Invalid type: ${frontmatter.type}`);\n }\n if (frontmatter.status && !validStatuses.includes(frontmatter.status)) {\n fileIssues.push(`Invalid status: ${frontmatter.status}`);\n }\n if (!frontmatter.created) {\n fileIssues.push('Missing created date');\n }\n }\n\n if (fileIssues.length > 0) {\n result.invalid++;\n result.issues.push({\n file: relative(projectRoot, file),\n issues: fileIssues,\n });\n } else if (Object.keys(frontmatter).length > 0) {\n result.valid++;\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create target directory structure\n */\nfunction createTargetStructure(targetPath: string): void {\n const dirs = [\n '',\n 'concepts',\n 'concepts/architecture',\n 'concepts/patterns',\n 'components',\n 'components/ui',\n 'components/utilities',\n 'services',\n 'services/api',\n 'services/workers',\n 'features',\n 'features/core',\n 'features/advanced',\n 'integrations',\n 'integrations/databases',\n 'integrations/auth',\n 'standards',\n 'standards/coding',\n 'standards/documentation',\n 'guides',\n 'guides/getting-started',\n 'guides/tutorials',\n 'references',\n 'references/api',\n '_templates',\n '_attachments',\n ];\n\n for (const dir of dirs) {\n const fullPath = join(targetPath, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n }\n }\n}\n\n/**\n * Detect node type from file path and content\n */\nfunction detectNodeType(\n filePath: string,\n content: string,\n existingFrontmatter: Record<string, unknown>\n): NodeType {\n // Use existing type if valid\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n if (existingFrontmatter.type && validTypes.includes(existingFrontmatter.type as NodeType)) {\n return existingFrontmatter.type as NodeType;\n }\n\n // Check path patterns\n for (const { pattern, type } of PATH_PATTERNS) {\n if (pattern.test(filePath)) {\n return type;\n }\n }\n\n // Analyze content\n const lowerContent = content.toLowerCase();\n const scores: Record<NodeType, number> = {\n concept: 0,\n technical: 0,\n feature: 0,\n primitive: 0,\n service: 0,\n guide: 0,\n standard: 0,\n integration: 0,\n };\n\n for (const [nodeType, keywords] of Object.entries(CATEGORY_KEYWORDS)) {\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = lowerContent.match(regex);\n if (matches) {\n scores[nodeType as NodeType] += matches.length;\n }\n }\n }\n\n // Find highest scoring type\n let maxScore = 0;\n let detectedType: NodeType = 'concept';\n\n for (const [nodeType, score] of Object.entries(scores)) {\n if (score > maxScore) {\n maxScore = score;\n detectedType = nodeType as NodeType;\n }\n }\n\n return detectedType;\n}\n\n/**\n * Generate frontmatter for a file\n */\nfunction generateFrontmatter(\n filePath: string,\n content: string,\n nodeType: NodeType,\n existing: Record<string, unknown> = {},\n status: NodeStatus = 'active',\n additionalTags: string[] = []\n): NodeFrontmatter {\n const filename = basename(filePath, '.md');\n const title = existing.title as string || formatTitle(filename);\n\n // Extract tags from content\n const extractedTags = extractTags(content);\n const allTags = [...new Set([\n ...(existing.tags as string[] || []),\n ...extractedTags,\n ...additionalTags,\n ])];\n\n // Get dates\n const now = new Date().toISOString().split('T')[0];\n const created = existing.created as string || now;\n\n return {\n title,\n type: nodeType,\n status: existing.status as NodeStatus || status,\n tags: allTags.length > 0 ? allTags : undefined,\n category: existing.category as string || undefined,\n description: existing.description as string || extractDescription(content),\n created,\n updated: now,\n aliases: existing.aliases as string[] || undefined,\n related: existing.related as string[] || undefined,\n };\n}\n\n/**\n * Format filename as title\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n\n/**\n * Extract tags from content\n */\nfunction extractTags(content: string): string[] {\n const tags: string[] = [];\n\n // Look for #tags in content\n const tagMatches = content.match(/#[\\w-]+/g);\n if (tagMatches) {\n tags.push(...tagMatches.map(t => t.slice(1)));\n }\n\n return tags.slice(0, 10); // Limit to 10 tags\n}\n\n/**\n * Extract description from first paragraph\n */\nfunction extractDescription(content: string): string | undefined {\n // Skip headers and find first paragraph\n const lines = content.split('\\n');\n let description = '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {\n description = trimmed;\n break;\n }\n }\n\n if (description.length > 200) {\n description = description.slice(0, 197) + '...';\n }\n\n return description || undefined;\n}\n\n/**\n * Build markdown content with frontmatter\n */\nfunction buildMarkdownWithFrontmatter(\n frontmatter: NodeFrontmatter,\n content: string\n): string {\n // Clean undefined values\n const cleanFrontmatter: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(frontmatter)) {\n if (value !== undefined) {\n cleanFrontmatter[key] = value;\n }\n }\n\n // Build YAML frontmatter\n const yamlLines = ['---'];\n\n // Order: title, type, status, tags, description, dates, others\n const orderedKeys = ['title', 'type', 'status', 'tags', 'category', 'description', 'created', 'updated', 'aliases', 'related'];\n\n for (const key of orderedKeys) {\n if (cleanFrontmatter[key] !== undefined) {\n yamlLines.push(formatYamlLine(key, cleanFrontmatter[key]));\n }\n }\n\n yamlLines.push('---');\n yamlLines.push('');\n\n return yamlLines.join('\\n') + content.trim() + '\\n';\n}\n\n/**\n * Format a YAML line\n */\nfunction formatYamlLine(key: string, value: unknown): string {\n if (Array.isArray(value)) {\n if (value.length === 0) return '';\n return `${key}:\\n${value.map(v => ` - ${v}`).join('\\n')}`;\n }\n if (typeof value === 'string' && (value.includes(':') || value.includes('#'))) {\n return `${key}: \"${value}\"`;\n }\n return `${key}: ${value}`;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as dist } from "../../../../_virtual/
|
|
1
|
+
import { __exports as dist } from "../../../../_virtual/index7.js";
|
|
2
2
|
import { __require as requireCreateProjectService } from "./createProjectService.js";
|
|
3
3
|
var hasRequiredDist;
|
|
4
4
|
function requireDist() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as commonjs } from "../../../../../../../_virtual/
|
|
1
|
+
import { __exports as commonjs } from "../../../../../../../_virtual/index8.js";
|
|
2
2
|
import { __require as requireBraceExpansion } from "../../../../../../brace-expansion/index.js";
|
|
3
3
|
import { __require as requireAssertValidPattern } from "./assert-valid-pattern.js";
|
|
4
4
|
import { __require as requireAst } from "./ast.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as dist } from "../../../_virtual/
|
|
1
|
+
import { __exports as dist } from "../../../_virtual/index11.js";
|
|
2
2
|
import path__default from "path";
|
|
3
3
|
import require$$1 from "fs";
|
|
4
4
|
import { __require as requirePicomatch } from "../../picomatch/index.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavelogic/knowledge-graph-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Knowledge graph agent for Claude Code - generates knowledge graphs, initializes docs, and integrates with claude-flow",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|