@weavelogic/knowledge-graph-agent 0.10.0 → 0.10.2

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.
Files changed (36) hide show
  1. package/README.md +166 -2
  2. package/dist/agents/base-agent.js +3 -3
  3. package/dist/agents/base-agent.js.map +1 -1
  4. package/dist/cli/commands/analyze.js +3 -3
  5. package/dist/cli/commands/analyze.js.map +1 -1
  6. package/dist/cli/commands/convert.js +1 -1
  7. package/dist/cli/commands/convert.js.map +1 -1
  8. package/dist/cli/commands/cultivate.js +8 -3
  9. package/dist/cli/commands/cultivate.js.map +1 -1
  10. package/dist/cli/index.js +1 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cultivation/deep-analyzer.d.ts +8 -1
  13. package/dist/cultivation/deep-analyzer.d.ts.map +1 -1
  14. package/dist/cultivation/deep-analyzer.js +36 -8
  15. package/dist/cultivation/deep-analyzer.js.map +1 -1
  16. package/dist/generators/claude-md.js +1 -1
  17. package/dist/generators/claude-md.js.map +1 -1
  18. package/dist/generators/doc-cultivator.js +2 -3
  19. package/dist/generators/doc-cultivator.js.map +1 -1
  20. package/dist/generators/doc-generator-agents.js +18 -9
  21. package/dist/generators/doc-generator-agents.js.map +1 -1
  22. package/dist/generators/docs-analyzer.d.ts +2 -2
  23. package/dist/generators/docs-analyzer.d.ts.map +1 -1
  24. package/dist/generators/docs-analyzer.js +1 -1
  25. package/dist/generators/docs-analyzer.js.map +1 -1
  26. package/dist/generators/docs-convert.d.ts +1 -1
  27. package/dist/generators/docs-convert.d.ts.map +1 -1
  28. package/dist/generators/docs-convert.js +1 -1
  29. package/dist/generators/docs-convert.js.map +1 -1
  30. package/dist/integrations/claude-flow.js +4 -4
  31. package/dist/integrations/claude-flow.js.map +1 -1
  32. package/dist/mcp/clients/mcp-client-adapter.d.ts +1 -1
  33. package/dist/mcp/clients/mcp-client-adapter.d.ts.map +1 -1
  34. package/dist/mcp/clients/mcp-client-adapter.js +1 -1
  35. package/dist/mcp/clients/mcp-client-adapter.js.map +1 -1
  36. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"docs-analyzer.d.ts","sourceRoot":"","sources":["../../src/generators/docs-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAA+B,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAClC;AAgDD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoHnF"}
1
+ {"version":3,"file":"docs-analyzer.d.ts","sourceRoot":"","sources":["../../src/generators/docs-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAA+B,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAClC;AAgDD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoHnF"}
@@ -47,7 +47,7 @@ const CATEGORY_STRUCTURE = {
47
47
  async function analyzeDocs(options) {
48
48
  const {
49
49
  sourceDir,
50
- targetDir = "docs-nn",
50
+ targetDir = "docs",
51
51
  projectRoot,
52
52
  useClaudeFlow = false,
53
53
  createMOC = true,
@@ -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-nn) */
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,0CAA0C;IAC1C,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
+ {"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"}
@@ -119,7 +119,7 @@ const PATH_PATTERNS = [
119
119
  async function convertDocs(options) {
120
120
  const {
121
121
  sourceDir,
122
- targetDir = "docs-nn",
122
+ targetDir = "docs",
123
123
  projectRoot,
124
124
  preserveOriginal = true,
125
125
  force = false,
@@ -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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"}
@@ -122,13 +122,13 @@ class ClaudeFlowIntegration {
122
122
  generateHookCommands() {
123
123
  return [
124
124
  `# Pre-task hook to restore graph context`,
125
- `npx claude-flow@alpha hooks session-restore --session-id "kg-${this.config.namespace}"`,
125
+ `claude-flow hooks session-restore --session-id "kg-${this.config.namespace}"`,
126
126
  ``,
127
127
  `# Post-edit hook to sync changes`,
128
- `npx claude-flow@alpha hooks post-edit --file "<file>" --memory-key "kg/${this.config.namespace}/changes"`,
128
+ `claude-flow hooks post-edit --file "<file>" --memory-key "kg/${this.config.namespace}/changes"`,
129
129
  ``,
130
130
  `# Session end hook to persist`,
131
- `npx claude-flow@alpha hooks session-end --export-metrics true`
131
+ `claude-flow hooks session-end --export-metrics true`
132
132
  ];
133
133
  }
134
134
  /**
@@ -196,7 +196,7 @@ function generateMcpConfig(namespace) {
196
196
  Add this to your Claude Code configuration:
197
197
 
198
198
  \`\`\`bash
199
- claude mcp add claude-flow npx claude-flow@alpha mcp start
199
+ claude mcp add claude-flow npx claude-flow mcp start
200
200
  \`\`\`
201
201
 
202
202
  ### Memory Namespace
@@ -1 +1 @@
1
- {"version":3,"file":"claude-flow.js","sources":["../../src/integrations/claude-flow.ts"],"sourcesContent":["/**\n * Claude-Flow Integration\n *\n * Integrates knowledge graph with claude-flow memory and coordination.\n */\n\nimport type {\n KnowledgeNode,\n GraphStats,\n MemoryEntry,\n SyncResult,\n} from '../core/types.js';\nimport { KnowledgeGraphDatabase } from '../core/database.js';\n\n/**\n * Claude-Flow client configuration\n */\nexport interface ClaudeFlowConfig {\n namespace: string;\n defaultTTL?: number;\n syncOnChange?: boolean;\n}\n\n/**\n * Memory entry for knowledge graph node\n */\ninterface NodeMemoryEntry {\n id: string;\n title: string;\n type: string;\n status: string;\n path: string;\n tags: string[];\n outgoingLinks: string[];\n incomingLinks: string[];\n summary?: string;\n lastModified: string;\n}\n\n/**\n * Claude-Flow Knowledge Graph Integration\n *\n * Syncs knowledge graph data with claude-flow memory for\n * cross-session persistence and agent coordination.\n */\nexport class ClaudeFlowIntegration {\n private config: Required<ClaudeFlowConfig>;\n\n constructor(config: ClaudeFlowConfig) {\n this.config = {\n namespace: config.namespace,\n defaultTTL: config.defaultTTL || 0,\n syncOnChange: config.syncOnChange ?? true,\n };\n }\n\n /**\n * Sync all nodes to claude-flow memory\n */\n async syncToMemory(db: KnowledgeGraphDatabase): Promise<SyncResult> {\n const result: SyncResult = {\n synced: 0,\n failed: 0,\n errors: [],\n };\n\n const nodes = db.getAllNodes();\n const entries: MemoryEntry[] = [];\n\n // Convert nodes to memory entries\n for (const node of nodes) {\n try {\n const entry = this.nodeToMemoryEntry(node);\n entries.push({\n key: `node/${node.id}`,\n value: entry,\n namespace: this.config.namespace,\n ttl: this.config.defaultTTL,\n });\n } catch (error) {\n result.failed++;\n result.errors.push({\n key: node.id,\n error: String(error),\n });\n }\n }\n\n // Store graph stats\n const stats = db.getStats();\n entries.push({\n key: 'stats',\n value: stats,\n namespace: this.config.namespace,\n });\n\n // Store metadata\n entries.push({\n key: 'metadata',\n value: {\n lastSync: new Date().toISOString(),\n nodeCount: nodes.length,\n version: db.getMetadata('version'),\n },\n namespace: this.config.namespace,\n });\n\n // Store index of all node IDs for quick lookup\n entries.push({\n key: 'index/nodes',\n value: nodes.map(n => ({\n id: n.id,\n title: n.title,\n type: n.type,\n path: n.path,\n })),\n namespace: this.config.namespace,\n });\n\n // Store tag index\n const tagIndex = this.buildTagIndex(nodes);\n entries.push({\n key: 'index/tags',\n value: tagIndex,\n namespace: this.config.namespace,\n });\n\n // Log what would be synced (MCP call would happen here)\n result.synced = entries.length;\n\n // Generate MCP commands for actual sync\n console.log(`\\n[Claude-Flow Sync] Would sync ${entries.length} entries to namespace: ${this.config.namespace}`);\n console.log('\\nTo sync, run these MCP commands:');\n\n for (const entry of entries.slice(0, 5)) {\n console.log(`mcp__claude-flow__memory_usage { action: \"store\", key: \"${entry.key}\", namespace: \"${this.config.namespace}\", value: \"...\" }`);\n }\n\n if (entries.length > 5) {\n console.log(`... and ${entries.length - 5} more entries`);\n }\n\n return result;\n }\n\n /**\n * Sync a single node to memory\n */\n async syncNode(node: KnowledgeNode): Promise<boolean> {\n try {\n const entry = this.nodeToMemoryEntry(node);\n\n // Generate MCP command\n console.log(`\\n[Claude-Flow Sync] Syncing node: ${node.id}`);\n console.log(`mcp__claude-flow__memory_usage {`);\n console.log(` action: \"store\",`);\n console.log(` key: \"node/${node.id}\",`);\n console.log(` namespace: \"${this.config.namespace}\",`);\n console.log(` value: ${JSON.stringify(entry, null, 2)}`);\n console.log(`}`);\n\n return true;\n } catch (error) {\n console.error(`Failed to sync node ${node.id}: ${error}`);\n return false;\n }\n }\n\n /**\n * Generate memory retrieval commands\n */\n generateRetrievalCommands(): string[] {\n return [\n `// Get graph stats`,\n `mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"stats\", namespace: \"${this.config.namespace}\" }`,\n ``,\n `// Get node index`,\n `mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"index/nodes\", namespace: \"${this.config.namespace}\" }`,\n ``,\n `// Get specific node`,\n `mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"node/<node-id>\", namespace: \"${this.config.namespace}\" }`,\n ``,\n `// Search by pattern`,\n `mcp__claude-flow__memory_search { pattern: \"node/*\", namespace: \"${this.config.namespace}\" }`,\n ];\n }\n\n /**\n * Generate hook commands for automatic sync\n */\n generateHookCommands(): string[] {\n return [\n `# Pre-task hook to restore graph context`,\n `npx claude-flow@alpha hooks session-restore --session-id \"kg-${this.config.namespace}\"`,\n ``,\n `# Post-edit hook to sync changes`,\n `npx claude-flow@alpha hooks post-edit --file \"<file>\" --memory-key \"kg/${this.config.namespace}/changes\"`,\n ``,\n `# Session end hook to persist`,\n `npx claude-flow@alpha hooks session-end --export-metrics true`,\n ];\n }\n\n /**\n * Convert node to memory entry format\n */\n private nodeToMemoryEntry(node: KnowledgeNode): NodeMemoryEntry {\n // Extract first paragraph as summary\n const summary = this.extractSummary(node.content);\n\n return {\n id: node.id,\n title: node.title,\n type: node.type,\n status: node.status,\n path: node.path,\n tags: node.tags,\n outgoingLinks: node.outgoingLinks.map(l => l.target),\n incomingLinks: node.incomingLinks.map(l => l.target),\n summary,\n lastModified: node.lastModified.toISOString(),\n };\n }\n\n /**\n * Extract summary from content\n */\n private extractSummary(content: string, maxLength = 200): string {\n // Skip frontmatter and headers\n const lines = content.split('\\n');\n let summary = '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines, headers, and code blocks\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('```')) {\n continue;\n }\n\n // Skip frontmatter markers\n if (trimmed === '---') {\n continue;\n }\n\n summary = trimmed;\n break;\n }\n\n // Truncate if needed\n if (summary.length > maxLength) {\n summary = summary.slice(0, maxLength - 3) + '...';\n }\n\n return summary;\n }\n\n /**\n * Build tag index from nodes\n */\n private buildTagIndex(nodes: KnowledgeNode[]): Record<string, string[]> {\n const index: Record<string, string[]> = {};\n\n for (const node of nodes) {\n for (const tag of node.tags) {\n if (!index[tag]) {\n index[tag] = [];\n }\n index[tag].push(node.id);\n }\n }\n\n return index;\n }\n}\n\n/**\n * Create claude-flow integration instance\n */\nexport function createClaudeFlowIntegration(\n config: ClaudeFlowConfig\n): ClaudeFlowIntegration {\n return new ClaudeFlowIntegration(config);\n}\n\n/**\n * Generate MCP configuration for CLAUDE.md\n */\nexport function generateMcpConfig(namespace: string): string {\n return `## Claude-Flow MCP Configuration\n\nAdd this to your Claude Code configuration:\n\n\\`\\`\\`bash\nclaude mcp add claude-flow npx claude-flow@alpha mcp start\n\\`\\`\\`\n\n### Memory Namespace\n\nThe knowledge graph uses namespace: \\`${namespace}\\`\n\n### Available Operations\n\n\\`\\`\\`javascript\n// Store knowledge\nmcp__claude-flow__memory_usage {\n action: \"store\",\n key: \"node/<id>\",\n namespace: \"${namespace}\",\n value: { ... }\n}\n\n// Retrieve knowledge\nmcp__claude-flow__memory_usage {\n action: \"retrieve\",\n key: \"node/<id>\",\n namespace: \"${namespace}\"\n}\n\n// Search knowledge\nmcp__claude-flow__memory_search {\n pattern: \"node/*\",\n namespace: \"${namespace}\"\n}\n\n// List all keys\nmcp__claude-flow__memory_usage {\n action: \"list\",\n namespace: \"${namespace}\"\n}\n\\`\\`\\`\n`;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-flow.js","sources":["../../src/integrations/claude-flow.ts"],"sourcesContent":["/**\n * Claude-Flow Integration\n *\n * Integrates knowledge graph with claude-flow memory and coordination.\n */\n\nimport type {\n KnowledgeNode,\n GraphStats,\n MemoryEntry,\n SyncResult,\n} from '../core/types.js';\nimport { KnowledgeGraphDatabase } from '../core/database.js';\n\n/**\n * Claude-Flow client configuration\n */\nexport interface ClaudeFlowConfig {\n namespace: string;\n defaultTTL?: number;\n syncOnChange?: boolean;\n}\n\n/**\n * Memory entry for knowledge graph node\n */\ninterface NodeMemoryEntry {\n id: string;\n title: string;\n type: string;\n status: string;\n path: string;\n tags: string[];\n outgoingLinks: string[];\n incomingLinks: string[];\n summary?: string;\n lastModified: string;\n}\n\n/**\n * Claude-Flow Knowledge Graph Integration\n *\n * Syncs knowledge graph data with claude-flow memory for\n * cross-session persistence and agent coordination.\n */\nexport class ClaudeFlowIntegration {\n private config: Required<ClaudeFlowConfig>;\n\n constructor(config: ClaudeFlowConfig) {\n this.config = {\n namespace: config.namespace,\n defaultTTL: config.defaultTTL || 0,\n syncOnChange: config.syncOnChange ?? true,\n };\n }\n\n /**\n * Sync all nodes to claude-flow memory\n */\n async syncToMemory(db: KnowledgeGraphDatabase): Promise<SyncResult> {\n const result: SyncResult = {\n synced: 0,\n failed: 0,\n errors: [],\n };\n\n const nodes = db.getAllNodes();\n const entries: MemoryEntry[] = [];\n\n // Convert nodes to memory entries\n for (const node of nodes) {\n try {\n const entry = this.nodeToMemoryEntry(node);\n entries.push({\n key: `node/${node.id}`,\n value: entry,\n namespace: this.config.namespace,\n ttl: this.config.defaultTTL,\n });\n } catch (error) {\n result.failed++;\n result.errors.push({\n key: node.id,\n error: String(error),\n });\n }\n }\n\n // Store graph stats\n const stats = db.getStats();\n entries.push({\n key: 'stats',\n value: stats,\n namespace: this.config.namespace,\n });\n\n // Store metadata\n entries.push({\n key: 'metadata',\n value: {\n lastSync: new Date().toISOString(),\n nodeCount: nodes.length,\n version: db.getMetadata('version'),\n },\n namespace: this.config.namespace,\n });\n\n // Store index of all node IDs for quick lookup\n entries.push({\n key: 'index/nodes',\n value: nodes.map(n => ({\n id: n.id,\n title: n.title,\n type: n.type,\n path: n.path,\n })),\n namespace: this.config.namespace,\n });\n\n // Store tag index\n const tagIndex = this.buildTagIndex(nodes);\n entries.push({\n key: 'index/tags',\n value: tagIndex,\n namespace: this.config.namespace,\n });\n\n // Log what would be synced (MCP call would happen here)\n result.synced = entries.length;\n\n // Generate MCP commands for actual sync\n console.log(`\\n[Claude-Flow Sync] Would sync ${entries.length} entries to namespace: ${this.config.namespace}`);\n console.log('\\nTo sync, run these MCP commands:');\n\n for (const entry of entries.slice(0, 5)) {\n console.log(`mcp__claude-flow__memory_usage { action: \"store\", key: \"${entry.key}\", namespace: \"${this.config.namespace}\", value: \"...\" }`);\n }\n\n if (entries.length > 5) {\n console.log(`... and ${entries.length - 5} more entries`);\n }\n\n return result;\n }\n\n /**\n * Sync a single node to memory\n */\n async syncNode(node: KnowledgeNode): Promise<boolean> {\n try {\n const entry = this.nodeToMemoryEntry(node);\n\n // Generate MCP command\n console.log(`\\n[Claude-Flow Sync] Syncing node: ${node.id}`);\n console.log(`mcp__claude-flow__memory_usage {`);\n console.log(` action: \"store\",`);\n console.log(` key: \"node/${node.id}\",`);\n console.log(` namespace: \"${this.config.namespace}\",`);\n console.log(` value: ${JSON.stringify(entry, null, 2)}`);\n console.log(`}`);\n\n return true;\n } catch (error) {\n console.error(`Failed to sync node ${node.id}: ${error}`);\n return false;\n }\n }\n\n /**\n * Generate memory retrieval commands\n */\n generateRetrievalCommands(): string[] {\n return [\n `// Get graph stats`,\n `mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"stats\", namespace: \"${this.config.namespace}\" }`,\n ``,\n `// Get node index`,\n `mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"index/nodes\", namespace: \"${this.config.namespace}\" }`,\n ``,\n `// Get specific node`,\n `mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"node/<node-id>\", namespace: \"${this.config.namespace}\" }`,\n ``,\n `// Search by pattern`,\n `mcp__claude-flow__memory_search { pattern: \"node/*\", namespace: \"${this.config.namespace}\" }`,\n ];\n }\n\n /**\n * Generate hook commands for automatic sync\n */\n generateHookCommands(): string[] {\n return [\n `# Pre-task hook to restore graph context`,\n `claude-flow hooks session-restore --session-id \"kg-${this.config.namespace}\"`,\n ``,\n `# Post-edit hook to sync changes`,\n `claude-flow hooks post-edit --file \"<file>\" --memory-key \"kg/${this.config.namespace}/changes\"`,\n ``,\n `# Session end hook to persist`,\n `claude-flow hooks session-end --export-metrics true`,\n ];\n }\n\n /**\n * Convert node to memory entry format\n */\n private nodeToMemoryEntry(node: KnowledgeNode): NodeMemoryEntry {\n // Extract first paragraph as summary\n const summary = this.extractSummary(node.content);\n\n return {\n id: node.id,\n title: node.title,\n type: node.type,\n status: node.status,\n path: node.path,\n tags: node.tags,\n outgoingLinks: node.outgoingLinks.map(l => l.target),\n incomingLinks: node.incomingLinks.map(l => l.target),\n summary,\n lastModified: node.lastModified.toISOString(),\n };\n }\n\n /**\n * Extract summary from content\n */\n private extractSummary(content: string, maxLength = 200): string {\n // Skip frontmatter and headers\n const lines = content.split('\\n');\n let summary = '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines, headers, and code blocks\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('```')) {\n continue;\n }\n\n // Skip frontmatter markers\n if (trimmed === '---') {\n continue;\n }\n\n summary = trimmed;\n break;\n }\n\n // Truncate if needed\n if (summary.length > maxLength) {\n summary = summary.slice(0, maxLength - 3) + '...';\n }\n\n return summary;\n }\n\n /**\n * Build tag index from nodes\n */\n private buildTagIndex(nodes: KnowledgeNode[]): Record<string, string[]> {\n const index: Record<string, string[]> = {};\n\n for (const node of nodes) {\n for (const tag of node.tags) {\n if (!index[tag]) {\n index[tag] = [];\n }\n index[tag].push(node.id);\n }\n }\n\n return index;\n }\n}\n\n/**\n * Create claude-flow integration instance\n */\nexport function createClaudeFlowIntegration(\n config: ClaudeFlowConfig\n): ClaudeFlowIntegration {\n return new ClaudeFlowIntegration(config);\n}\n\n/**\n * Generate MCP configuration for CLAUDE.md\n */\nexport function generateMcpConfig(namespace: string): string {\n return `## Claude-Flow MCP Configuration\n\nAdd this to your Claude Code configuration:\n\n\\`\\`\\`bash\nclaude mcp add claude-flow npx claude-flow mcp start\n\\`\\`\\`\n\n### Memory Namespace\n\nThe knowledge graph uses namespace: \\`${namespace}\\`\n\n### Available Operations\n\n\\`\\`\\`javascript\n// Store knowledge\nmcp__claude-flow__memory_usage {\n action: \"store\",\n key: \"node/<id>\",\n namespace: \"${namespace}\",\n value: { ... }\n}\n\n// Retrieve knowledge\nmcp__claude-flow__memory_usage {\n action: \"retrieve\",\n key: \"node/<id>\",\n namespace: \"${namespace}\"\n}\n\n// Search knowledge\nmcp__claude-flow__memory_search {\n pattern: \"node/*\",\n namespace: \"${namespace}\"\n}\n\n// List all keys\nmcp__claude-flow__memory_usage {\n action: \"list\",\n namespace: \"${namespace}\"\n}\n\\`\\`\\`\n`;\n}\n"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ export interface McpClientConfig {
18
18
  timeoutMs: number;
19
19
  /** Whether to fallback to in-memory storage when CLI unavailable (default: true) */
20
20
  fallbackEnabled: boolean;
21
- /** Claude-flow CLI command (default: 'npx claude-flow@alpha') */
21
+ /** Claude-flow CLI command (default: 'claude-flow' or 'npx claude-flow') */
22
22
  cliCommand: string;
23
23
  /** Whether to use JSON output format from CLI when available */
24
24
  useJsonOutput: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-client-adapter.d.ts","sourceRoot":"","sources":["../../../src/mcp/clients/mcp-client-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IAErB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAElB,oFAAoF;IACpF,eAAe,EAAE,OAAO,CAAC;IAEzB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IAEnB,gEAAgE;IAChE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IAEjB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,oDAAoD;IACpD,YAAY,EAAE,OAAO,CAAC;IAEtB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAYjD;;;;;;;;OAQG;IACG,WAAW,CACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,GAAE,MAAkB,EAC7B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC;IAyBnB;;;;;;OAMG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyBxF;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAkB,EAC7B,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBpB;;;;;;OAMG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBhF;;;;;OAKG;IACG,UAAU,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBlE;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAoBxC;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAC;IAItC;;OAEG;IACH,eAAe,CAAC,SAAS,GAAE,MAAkB,GAAG,MAAM;IAItD;;OAEG;IACH,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;YAUzB,gBAAgB;YA2BhB,UAAU;IA+BxB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;CAkBrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,gBAAgB,CAE1F"}
1
+ {"version":3,"file":"mcp-client-adapter.d.ts","sourceRoot":"","sources":["../../../src/mcp/clients/mcp-client-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IAErB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAElB,oFAAoF;IACpF,eAAe,EAAE,OAAO,CAAC;IAEzB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IAEnB,gEAAgE;IAChE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IAEjB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,oDAAoD;IACpD,YAAY,EAAE,OAAO,CAAC;IAEtB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAYjD;;;;;;;;OAQG;IACG,WAAW,CACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,GAAE,MAAkB,EAC7B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC;IAyBnB;;;;;;OAMG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyBxF;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAkB,EAC7B,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBpB;;;;;;OAMG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBhF;;;;;OAKG;IACG,UAAU,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBlE;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAoBxC;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAC;IAItC;;OAEG;IACH,eAAe,CAAC,SAAS,GAAE,MAAkB,GAAG,MAAM;IAItD;;OAEG;IACH,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;YAUzB,gBAAgB;YA2BhB,UAAU;IA+BxB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;CAkBrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,gBAAgB,CAE1F"}
@@ -17,7 +17,7 @@ class McpClientAdapter {
17
17
  retryDelayMs: config.retryDelayMs ?? 1e3,
18
18
  timeoutMs: config.timeoutMs ?? 3e4,
19
19
  fallbackEnabled: config.fallbackEnabled ?? true,
20
- cliCommand: config.cliCommand ?? "npx claude-flow@alpha",
20
+ cliCommand: config.cliCommand ?? "claude-flow",
21
21
  useJsonOutput: config.useJsonOutput ?? true
22
22
  };
23
23
  this.fallbackStore = /* @__PURE__ */ new Map();