@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
@@ -125,7 +125,7 @@ function createCultivateCommand() {
125
125
  const hasClaudeFlow = await checkClaudeFlowAvailable();
126
126
  if (!hasClaudeFlow) {
127
127
  console.log(chalk.yellow(" ⚠️ claude-flow not available"));
128
- console.log(chalk.gray(" Install with: npm install -g claude-flow@alpha"));
128
+ console.log(chalk.gray(" Install with: npm install -g claude-flow"));
129
129
  result.warnings.push("claude-flow not available for deep analysis");
130
130
  } else {
131
131
  if (dryRun) {
@@ -240,9 +240,14 @@ function displaySummary(result, dryRun) {
240
240
  }
241
241
  }
242
242
  async function checkClaudeFlowAvailable() {
243
+ const { execSync } = await import("child_process");
243
244
  try {
244
- const { execSync } = await import("child_process");
245
- execSync("npx claude-flow@alpha --version", { stdio: "pipe", timeout: 5e3 });
245
+ execSync("claude-flow --version", { stdio: "pipe", timeout: 5e3 });
246
+ return true;
247
+ } catch {
248
+ }
249
+ try {
250
+ execSync("npx claude-flow --version", { stdio: "pipe", timeout: 3e4 });
246
251
  return true;
247
252
  } catch {
248
253
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"cultivate.js","sources":["../../../src/cli/commands/cultivate.ts"],"sourcesContent":["/**\n * Cultivate Command - Systematically enhance the knowledge graph\n *\n * This command provides cultivation tasks:\n * - Seed primitives from codebase analysis\n * - Deep analysis with claude-flow integration\n * - Graph enhancement and optimization\n *\n * @module cli/commands/cultivate\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve, join, relative } from 'path';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { SeedGenerator } from '../../cultivation/seed-generator.js';\nimport { ShadowCache, loadShadowCache } from '../../core/cache.js';\nimport type { CultivationOptions, Ecosystem, SeedAnalysis } from '../../cultivation/types.js';\n\n/**\n * Cultivation result\n */\ninterface CultivationResult {\n success: boolean;\n seed: {\n created: number;\n documents: Array<{ title: string; path: string; type: string }>;\n };\n analysis: {\n filesProcessed: number;\n dependenciesFound: number;\n servicesFound: number;\n };\n cache: {\n updated: number;\n hits: number;\n misses: number;\n };\n duration: number;\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Create cultivate command\n */\nexport function createCultivateCommand(): Command {\n return new Command('cultivate')\n .description('Systematically cultivate and enhance the knowledge graph')\n .argument('[path]', 'Directory to cultivate (defaults to current directory)', '.')\n .option('--dry-run', 'Preview changes without executing', false)\n .option('-d, --docs <path>', 'Documentation path', 'docs')\n .option('-v, --verbose', 'Verbose output', false)\n .option('--seed', 'Bootstrap vault with primitives from codebase analysis', false)\n .option('--deep-analysis', 'Use claude-flow agents for deep analysis', false)\n .option('--cache', 'Use shadow cache for incremental updates', true)\n .option('--ecosystem <ecosystems>', 'Filter to specific ecosystems (comma-separated)', undefined)\n .option('--include-dev', 'Include dev dependencies', false)\n .option('--major-only', 'Only process major dependencies', false)\n .option('--refresh-cache', 'Force refresh the shadow cache', false)\n .action(async (targetPath: string, options: {\n dryRun?: boolean;\n docs?: string;\n verbose?: boolean;\n seed?: boolean;\n deepAnalysis?: boolean;\n cache?: boolean;\n ecosystem?: string;\n includeDev?: boolean;\n majorOnly?: boolean;\n refreshCache?: boolean;\n }) => {\n const projectRoot = resolve(targetPath);\n const docsPath = options.docs || 'docs';\n const verbose = options.verbose || false;\n const dryRun = options.dryRun || false;\n\n console.log(chalk.bold.green('\\n🌱 Knowledge Graph Cultivator\\n'));\n console.log(` Project: ${projectRoot}`);\n console.log(` Docs: ${docsPath}`);\n if (dryRun) {\n console.log(` Mode: ${chalk.yellow('Dry Run')}`);\n }\n console.log('');\n\n // Determine tasks\n const tasks = {\n seed: options.seed || false,\n deepAnalysis: options.deepAnalysis || false,\n };\n\n // If no tasks selected, show help\n if (!tasks.seed && !tasks.deepAnalysis) {\n console.log(chalk.yellow('💡 No tasks selected. Use one or more of:'));\n console.log(' --seed Bootstrap vault with primitives from codebase');\n console.log(' --deep-analysis Use claude-flow for deep codebase analysis');\n console.log('');\n console.log(chalk.gray('Options:'));\n console.log(' --dry-run Preview without writing files');\n console.log(' --cache Use shadow cache for incremental updates (default: true)');\n console.log(' --refresh-cache Force refresh the shadow cache');\n console.log(' --ecosystem Filter to ecosystems (nodejs,python,rust,go,php,java)');\n console.log(' --include-dev Include dev dependencies');\n console.log(' --major-only Only process major dependencies');\n console.log('');\n console.log('Run \"kg cultivate --help\" for more options');\n return;\n }\n\n const startTime = Date.now();\n const result: CultivationResult = {\n success: true,\n seed: { created: 0, documents: [] },\n analysis: { filesProcessed: 0, dependenciesFound: 0, servicesFound: 0 },\n cache: { updated: 0, hits: 0, misses: 0 },\n duration: 0,\n warnings: [],\n errors: [],\n };\n\n try {\n // Initialize shadow cache\n let cache: ShadowCache | undefined;\n if (options.cache !== false) {\n console.log(chalk.cyan('📦 Initializing shadow cache...'));\n cache = await loadShadowCache(projectRoot);\n\n if (options.refreshCache) {\n cache.clear();\n console.log(chalk.gray(' Cache cleared (refresh mode)'));\n }\n\n const stats = cache.getStats();\n console.log(chalk.gray(` Entries: ${stats.totalEntries}, Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`));\n console.log('');\n }\n\n // Task 1: Seed primitives\n if (tasks.seed) {\n console.log(chalk.cyan('🌱 Seeding primitives from codebase...\\n'));\n\n // Parse ecosystem filter\n let ecosystems: Ecosystem[] | undefined;\n if (options.ecosystem) {\n ecosystems = options.ecosystem.split(',').map(e => e.trim() as Ecosystem);\n console.log(chalk.gray(` Ecosystems: ${ecosystems.join(', ')}`));\n }\n\n // Create generator\n const generator = await SeedGenerator.create(projectRoot, docsPath);\n\n // Analyze\n console.log(chalk.gray(' Analyzing codebase...'));\n const analysis = await generator.analyze();\n\n result.analysis = {\n filesProcessed: analysis.metadata.filesScanned,\n dependenciesFound: analysis.dependencies.length,\n servicesFound: analysis.services.length,\n };\n\n // Display analysis\n console.log(`\\n ${chalk.bold('Analysis Results:')}`);\n console.log(` Languages: ${analysis.languages.join(', ') || 'none'}`);\n console.log(` Dependencies: ${analysis.dependencies.length}`);\n console.log(` Frameworks: ${analysis.frameworks.length}`);\n console.log(` Services: ${analysis.services.length}`);\n console.log(` Deployments: ${analysis.deployments.length}`);\n\n if (verbose) {\n displayDetailedAnalysis(analysis);\n }\n\n console.log('');\n\n // Generate primitives\n console.log(chalk.gray(' Generating primitive nodes...'));\n const documents = await generator.generatePrimitives(analysis);\n\n if (dryRun) {\n console.log(`\\n ${chalk.yellow('[DRY RUN]')} Would create ${documents.length} primitives:`);\n for (const doc of documents.slice(0, 10)) {\n console.log(` - ${doc.frontmatter.type}: ${doc.title}`);\n }\n if (documents.length > 10) {\n console.log(` ... and ${documents.length - 10} more`);\n }\n result.seed.documents = documents.map(d => ({\n title: d.title,\n path: d.path,\n type: d.frontmatter.type || 'unknown',\n }));\n } else {\n const writeResult = await generator.writePrimitives(documents);\n result.seed.created = writeResult.documentsGenerated.length;\n result.seed.documents = writeResult.documentsGenerated;\n\n console.log(`\\n ${chalk.green('✓')} Created ${writeResult.documentsGenerated.length} primitives`);\n\n if (writeResult.warnings.length > 0) {\n result.warnings.push(...writeResult.warnings);\n if (verbose) {\n console.log(chalk.yellow(` Warnings: ${writeResult.warnings.length}`));\n }\n }\n\n if (writeResult.errors.length > 0) {\n result.errors.push(...writeResult.errors);\n console.log(chalk.red(` Errors: ${writeResult.errors.length}`));\n }\n }\n\n console.log('');\n }\n\n // Task 2: Deep Analysis with claude-flow\n if (tasks.deepAnalysis) {\n console.log(chalk.cyan('🧠 Running deep analysis with claude-flow...\\n'));\n\n // Check if claude-flow is available\n const hasClaudeFlow = await checkClaudeFlowAvailable();\n\n if (!hasClaudeFlow) {\n console.log(chalk.yellow(' ⚠️ claude-flow not available'));\n console.log(chalk.gray(' Install with: npm install -g claude-flow@alpha'));\n result.warnings.push('claude-flow not available for deep analysis');\n } else {\n if (dryRun) {\n console.log(chalk.yellow(' [DRY RUN] Would spawn claude-flow agents:'));\n console.log(' - Researcher: Analyze codebase patterns');\n console.log(' - Analyst: Identify architectural decisions');\n console.log(' - Coder: Detect implementation patterns');\n console.log(' - Tester: Analyze testing coverage');\n } else {\n // Import and run DeepAnalyzer\n try {\n const { DeepAnalyzer } = await import('../../cultivation/deep-analyzer.js');\n const analyzer = new DeepAnalyzer({\n projectRoot,\n docsPath,\n verbose,\n });\n\n const deepResult = await analyzer.analyze();\n\n console.log(` ${chalk.green('✓')} Deep analysis complete`);\n console.log(` Agents spawned: ${deepResult.agentsSpawned}`);\n console.log(` Insights generated: ${deepResult.insightsCount}`);\n console.log(` Documentation created: ${deepResult.documentsCreated}`);\n } catch (error) {\n result.errors.push(`Deep analysis failed: ${error instanceof Error ? error.message : String(error)}`);\n console.log(chalk.red(` ✗ Deep analysis failed: ${error instanceof Error ? error.message : String(error)}`));\n }\n }\n }\n\n console.log('');\n }\n\n // Update cache\n if (cache) {\n const stats = cache.getStats();\n result.cache = {\n updated: stats.totalEntries,\n hits: stats.hitCount,\n misses: stats.missCount,\n };\n\n await cache.save();\n }\n\n result.duration = Date.now() - startTime;\n result.success = result.errors.length === 0;\n\n // Final summary\n displaySummary(result, dryRun);\n\n } catch (error) {\n console.error(chalk.red('\\n❌ Cultivation failed:'), error);\n process.exit(1);\n }\n });\n}\n\n/**\n * Display detailed analysis output\n */\nfunction displayDetailedAnalysis(analysis: SeedAnalysis): void {\n if (analysis.frameworks.length > 0) {\n console.log(`\\n ${chalk.gray('Frameworks:')}`);\n for (const fw of analysis.frameworks) {\n console.log(` - ${fw.name} (${fw.ecosystem}) v${fw.version}`);\n }\n }\n\n if (analysis.services.length > 0) {\n console.log(`\\n ${chalk.gray('Services:')}`);\n for (const svc of analysis.services) {\n console.log(` - ${svc.name}: ${svc.type} (${svc.technology})`);\n }\n }\n\n if (analysis.deployments.length > 0) {\n console.log(`\\n ${chalk.gray('Deployments:')}`);\n for (const dep of analysis.deployments) {\n console.log(` - ${dep}`);\n }\n }\n}\n\n/**\n * Display cultivation summary\n */\nfunction displaySummary(result: CultivationResult, dryRun: boolean): void {\n console.log(chalk.bold.blue('📊 Cultivation Summary\\n'));\n\n if (dryRun) {\n console.log(chalk.yellow('[DRY RUN] No changes were made\\n'));\n }\n\n console.log(' Analysis:');\n console.log(` Files processed: ${result.analysis.filesProcessed}`);\n console.log(` Dependencies: ${result.analysis.dependenciesFound}`);\n console.log(` Services: ${result.analysis.servicesFound}`);\n\n if (result.seed.created > 0 || result.seed.documents.length > 0) {\n console.log('\\n Seed:');\n console.log(` Primitives ${dryRun ? 'would create' : 'created'}: ${dryRun ? result.seed.documents.length : result.seed.created}`);\n }\n\n if (result.cache.updated > 0) {\n console.log('\\n Cache:');\n console.log(` Entries: ${result.cache.updated}`);\n const hitRate = result.cache.hits + result.cache.misses > 0\n ? (result.cache.hits / (result.cache.hits + result.cache.misses) * 100).toFixed(1)\n : 0;\n console.log(` Hit rate: ${hitRate}%`);\n }\n\n console.log(`\\n Duration: ${(result.duration / 1000).toFixed(2)}s`);\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`\\n ⚠️ Warnings: ${result.warnings.length}`));\n for (const warning of result.warnings.slice(0, 5)) {\n console.log(chalk.gray(` - ${warning}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red(`\\n ❌ Errors: ${result.errors.length}`));\n for (const error of result.errors.slice(0, 5)) {\n console.log(chalk.gray(` - ${error}`));\n }\n }\n\n if (result.success && !dryRun) {\n console.log(chalk.bold.green('\\n✨ Cultivation complete!\\n'));\n } else if (!result.success) {\n console.log(chalk.yellow('\\n⚠️ Cultivation completed with errors\\n'));\n } else {\n console.log(chalk.gray('\\nRun without --dry-run to apply changes\\n'));\n }\n}\n\n/**\n * Check if claude-flow is available\n */\nasync function checkClaudeFlowAvailable(): Promise<boolean> {\n try {\n const { execSync } = await import('child_process');\n execSync('npx claude-flow@alpha --version', { stdio: 'pipe', timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cultivate.js","sources":["../../../src/cli/commands/cultivate.ts"],"sourcesContent":["/**\n * Cultivate Command - Systematically enhance the knowledge graph\n *\n * This command provides cultivation tasks:\n * - Seed primitives from codebase analysis\n * - Deep analysis with claude-flow integration\n * - Graph enhancement and optimization\n *\n * @module cli/commands/cultivate\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve, join, relative } from 'path';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { SeedGenerator } from '../../cultivation/seed-generator.js';\nimport { ShadowCache, loadShadowCache } from '../../core/cache.js';\nimport type { CultivationOptions, Ecosystem, SeedAnalysis } from '../../cultivation/types.js';\n\n/**\n * Cultivation result\n */\ninterface CultivationResult {\n success: boolean;\n seed: {\n created: number;\n documents: Array<{ title: string; path: string; type: string }>;\n };\n analysis: {\n filesProcessed: number;\n dependenciesFound: number;\n servicesFound: number;\n };\n cache: {\n updated: number;\n hits: number;\n misses: number;\n };\n duration: number;\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Create cultivate command\n */\nexport function createCultivateCommand(): Command {\n return new Command('cultivate')\n .description('Systematically cultivate and enhance the knowledge graph')\n .argument('[path]', 'Directory to cultivate (defaults to current directory)', '.')\n .option('--dry-run', 'Preview changes without executing', false)\n .option('-d, --docs <path>', 'Documentation path', 'docs')\n .option('-v, --verbose', 'Verbose output', false)\n .option('--seed', 'Bootstrap vault with primitives from codebase analysis', false)\n .option('--deep-analysis', 'Use claude-flow agents for deep analysis', false)\n .option('--cache', 'Use shadow cache for incremental updates', true)\n .option('--ecosystem <ecosystems>', 'Filter to specific ecosystems (comma-separated)', undefined)\n .option('--include-dev', 'Include dev dependencies', false)\n .option('--major-only', 'Only process major dependencies', false)\n .option('--refresh-cache', 'Force refresh the shadow cache', false)\n .action(async (targetPath: string, options: {\n dryRun?: boolean;\n docs?: string;\n verbose?: boolean;\n seed?: boolean;\n deepAnalysis?: boolean;\n cache?: boolean;\n ecosystem?: string;\n includeDev?: boolean;\n majorOnly?: boolean;\n refreshCache?: boolean;\n }) => {\n const projectRoot = resolve(targetPath);\n const docsPath = options.docs || 'docs';\n const verbose = options.verbose || false;\n const dryRun = options.dryRun || false;\n\n console.log(chalk.bold.green('\\n🌱 Knowledge Graph Cultivator\\n'));\n console.log(` Project: ${projectRoot}`);\n console.log(` Docs: ${docsPath}`);\n if (dryRun) {\n console.log(` Mode: ${chalk.yellow('Dry Run')}`);\n }\n console.log('');\n\n // Determine tasks\n const tasks = {\n seed: options.seed || false,\n deepAnalysis: options.deepAnalysis || false,\n };\n\n // If no tasks selected, show help\n if (!tasks.seed && !tasks.deepAnalysis) {\n console.log(chalk.yellow('💡 No tasks selected. Use one or more of:'));\n console.log(' --seed Bootstrap vault with primitives from codebase');\n console.log(' --deep-analysis Use claude-flow for deep codebase analysis');\n console.log('');\n console.log(chalk.gray('Options:'));\n console.log(' --dry-run Preview without writing files');\n console.log(' --cache Use shadow cache for incremental updates (default: true)');\n console.log(' --refresh-cache Force refresh the shadow cache');\n console.log(' --ecosystem Filter to ecosystems (nodejs,python,rust,go,php,java)');\n console.log(' --include-dev Include dev dependencies');\n console.log(' --major-only Only process major dependencies');\n console.log('');\n console.log('Run \"kg cultivate --help\" for more options');\n return;\n }\n\n const startTime = Date.now();\n const result: CultivationResult = {\n success: true,\n seed: { created: 0, documents: [] },\n analysis: { filesProcessed: 0, dependenciesFound: 0, servicesFound: 0 },\n cache: { updated: 0, hits: 0, misses: 0 },\n duration: 0,\n warnings: [],\n errors: [],\n };\n\n try {\n // Initialize shadow cache\n let cache: ShadowCache | undefined;\n if (options.cache !== false) {\n console.log(chalk.cyan('📦 Initializing shadow cache...'));\n cache = await loadShadowCache(projectRoot);\n\n if (options.refreshCache) {\n cache.clear();\n console.log(chalk.gray(' Cache cleared (refresh mode)'));\n }\n\n const stats = cache.getStats();\n console.log(chalk.gray(` Entries: ${stats.totalEntries}, Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`));\n console.log('');\n }\n\n // Task 1: Seed primitives\n if (tasks.seed) {\n console.log(chalk.cyan('🌱 Seeding primitives from codebase...\\n'));\n\n // Parse ecosystem filter\n let ecosystems: Ecosystem[] | undefined;\n if (options.ecosystem) {\n ecosystems = options.ecosystem.split(',').map(e => e.trim() as Ecosystem);\n console.log(chalk.gray(` Ecosystems: ${ecosystems.join(', ')}`));\n }\n\n // Create generator\n const generator = await SeedGenerator.create(projectRoot, docsPath);\n\n // Analyze\n console.log(chalk.gray(' Analyzing codebase...'));\n const analysis = await generator.analyze();\n\n result.analysis = {\n filesProcessed: analysis.metadata.filesScanned,\n dependenciesFound: analysis.dependencies.length,\n servicesFound: analysis.services.length,\n };\n\n // Display analysis\n console.log(`\\n ${chalk.bold('Analysis Results:')}`);\n console.log(` Languages: ${analysis.languages.join(', ') || 'none'}`);\n console.log(` Dependencies: ${analysis.dependencies.length}`);\n console.log(` Frameworks: ${analysis.frameworks.length}`);\n console.log(` Services: ${analysis.services.length}`);\n console.log(` Deployments: ${analysis.deployments.length}`);\n\n if (verbose) {\n displayDetailedAnalysis(analysis);\n }\n\n console.log('');\n\n // Generate primitives\n console.log(chalk.gray(' Generating primitive nodes...'));\n const documents = await generator.generatePrimitives(analysis);\n\n if (dryRun) {\n console.log(`\\n ${chalk.yellow('[DRY RUN]')} Would create ${documents.length} primitives:`);\n for (const doc of documents.slice(0, 10)) {\n console.log(` - ${doc.frontmatter.type}: ${doc.title}`);\n }\n if (documents.length > 10) {\n console.log(` ... and ${documents.length - 10} more`);\n }\n result.seed.documents = documents.map(d => ({\n title: d.title,\n path: d.path,\n type: d.frontmatter.type || 'unknown',\n }));\n } else {\n const writeResult = await generator.writePrimitives(documents);\n result.seed.created = writeResult.documentsGenerated.length;\n result.seed.documents = writeResult.documentsGenerated;\n\n console.log(`\\n ${chalk.green('✓')} Created ${writeResult.documentsGenerated.length} primitives`);\n\n if (writeResult.warnings.length > 0) {\n result.warnings.push(...writeResult.warnings);\n if (verbose) {\n console.log(chalk.yellow(` Warnings: ${writeResult.warnings.length}`));\n }\n }\n\n if (writeResult.errors.length > 0) {\n result.errors.push(...writeResult.errors);\n console.log(chalk.red(` Errors: ${writeResult.errors.length}`));\n }\n }\n\n console.log('');\n }\n\n // Task 2: Deep Analysis with claude-flow\n if (tasks.deepAnalysis) {\n console.log(chalk.cyan('🧠 Running deep analysis with claude-flow...\\n'));\n\n // Check if claude-flow is available\n const hasClaudeFlow = await checkClaudeFlowAvailable();\n\n if (!hasClaudeFlow) {\n console.log(chalk.yellow(' ⚠️ claude-flow not available'));\n console.log(chalk.gray(' Install with: npm install -g claude-flow'));\n result.warnings.push('claude-flow not available for deep analysis');\n } else {\n if (dryRun) {\n console.log(chalk.yellow(' [DRY RUN] Would spawn claude-flow agents:'));\n console.log(' - Researcher: Analyze codebase patterns');\n console.log(' - Analyst: Identify architectural decisions');\n console.log(' - Coder: Detect implementation patterns');\n console.log(' - Tester: Analyze testing coverage');\n } else {\n // Import and run DeepAnalyzer\n try {\n const { DeepAnalyzer } = await import('../../cultivation/deep-analyzer.js');\n const analyzer = new DeepAnalyzer({\n projectRoot,\n docsPath,\n verbose,\n });\n\n const deepResult = await analyzer.analyze();\n\n console.log(` ${chalk.green('✓')} Deep analysis complete`);\n console.log(` Agents spawned: ${deepResult.agentsSpawned}`);\n console.log(` Insights generated: ${deepResult.insightsCount}`);\n console.log(` Documentation created: ${deepResult.documentsCreated}`);\n } catch (error) {\n result.errors.push(`Deep analysis failed: ${error instanceof Error ? error.message : String(error)}`);\n console.log(chalk.red(` ✗ Deep analysis failed: ${error instanceof Error ? error.message : String(error)}`));\n }\n }\n }\n\n console.log('');\n }\n\n // Update cache\n if (cache) {\n const stats = cache.getStats();\n result.cache = {\n updated: stats.totalEntries,\n hits: stats.hitCount,\n misses: stats.missCount,\n };\n\n await cache.save();\n }\n\n result.duration = Date.now() - startTime;\n result.success = result.errors.length === 0;\n\n // Final summary\n displaySummary(result, dryRun);\n\n } catch (error) {\n console.error(chalk.red('\\n❌ Cultivation failed:'), error);\n process.exit(1);\n }\n });\n}\n\n/**\n * Display detailed analysis output\n */\nfunction displayDetailedAnalysis(analysis: SeedAnalysis): void {\n if (analysis.frameworks.length > 0) {\n console.log(`\\n ${chalk.gray('Frameworks:')}`);\n for (const fw of analysis.frameworks) {\n console.log(` - ${fw.name} (${fw.ecosystem}) v${fw.version}`);\n }\n }\n\n if (analysis.services.length > 0) {\n console.log(`\\n ${chalk.gray('Services:')}`);\n for (const svc of analysis.services) {\n console.log(` - ${svc.name}: ${svc.type} (${svc.technology})`);\n }\n }\n\n if (analysis.deployments.length > 0) {\n console.log(`\\n ${chalk.gray('Deployments:')}`);\n for (const dep of analysis.deployments) {\n console.log(` - ${dep}`);\n }\n }\n}\n\n/**\n * Display cultivation summary\n */\nfunction displaySummary(result: CultivationResult, dryRun: boolean): void {\n console.log(chalk.bold.blue('📊 Cultivation Summary\\n'));\n\n if (dryRun) {\n console.log(chalk.yellow('[DRY RUN] No changes were made\\n'));\n }\n\n console.log(' Analysis:');\n console.log(` Files processed: ${result.analysis.filesProcessed}`);\n console.log(` Dependencies: ${result.analysis.dependenciesFound}`);\n console.log(` Services: ${result.analysis.servicesFound}`);\n\n if (result.seed.created > 0 || result.seed.documents.length > 0) {\n console.log('\\n Seed:');\n console.log(` Primitives ${dryRun ? 'would create' : 'created'}: ${dryRun ? result.seed.documents.length : result.seed.created}`);\n }\n\n if (result.cache.updated > 0) {\n console.log('\\n Cache:');\n console.log(` Entries: ${result.cache.updated}`);\n const hitRate = result.cache.hits + result.cache.misses > 0\n ? (result.cache.hits / (result.cache.hits + result.cache.misses) * 100).toFixed(1)\n : 0;\n console.log(` Hit rate: ${hitRate}%`);\n }\n\n console.log(`\\n Duration: ${(result.duration / 1000).toFixed(2)}s`);\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`\\n ⚠️ Warnings: ${result.warnings.length}`));\n for (const warning of result.warnings.slice(0, 5)) {\n console.log(chalk.gray(` - ${warning}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red(`\\n ❌ Errors: ${result.errors.length}`));\n for (const error of result.errors.slice(0, 5)) {\n console.log(chalk.gray(` - ${error}`));\n }\n }\n\n if (result.success && !dryRun) {\n console.log(chalk.bold.green('\\n✨ Cultivation complete!\\n'));\n } else if (!result.success) {\n console.log(chalk.yellow('\\n⚠️ Cultivation completed with errors\\n'));\n } else {\n console.log(chalk.gray('\\nRun without --dry-run to apply changes\\n'));\n }\n}\n\n/**\n * Check if claude-flow is available\n * Checks for direct command first (globally installed), then falls back to npx\n */\nasync function checkClaudeFlowAvailable(): Promise<boolean> {\n const { execSync } = await import('child_process');\n\n // First try direct command (globally installed claude-flow)\n try {\n execSync('claude-flow --version', { stdio: 'pipe', timeout: 5000 });\n return true;\n } catch {\n // Direct command not available, try npx\n }\n\n // Fall back to npx\n try {\n execSync('npx claude-flow --version', { stdio: 'pipe', timeout: 30000 });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -69,7 +69,7 @@ function createCLI() {
69
69
  console.log(chalk.gray(" $ kg analyze # Analyze & migrate to knowledge graph"));
70
70
  console.log(chalk.gray(" $ kg analyze deep # Deep analysis with claude-flow"));
71
71
  console.log(chalk.gray(" $ kg analyze report # Generate analysis report"));
72
- console.log(chalk.gray(" $ kg convert docs # Convert docs/ docs-nn/"));
72
+ console.log(chalk.gray(" $ kg convert docs # Convert docs/ with proper structure"));
73
73
  console.log(chalk.gray(" $ kg frontmatter add # Add frontmatter to files"));
74
74
  console.log(chalk.gray(" $ kg frontmatter validate # Validate frontmatter\n"));
75
75
  console.log(chalk.white(" AI-SDLC SOP Compliance:"));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/cli/index.ts"],"sourcesContent":["/**\n * Knowledge Graph Agent CLI\n *\n * Main CLI setup and command registration.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createInitCommand } from './commands/init.js';\nimport { createGraphCommand } from './commands/graph.js';\nimport { createDocsCommand } from './commands/docs.js';\nimport { createClaudeCommand } from './commands/claude.js';\nimport { createSyncCommand } from './commands/sync.js';\nimport { createStatsCommand } from './commands/stats.js';\nimport { createSearchCommand } from './commands/search.js';\nimport { createConvertCommand, createFrontmatterCommand } from './commands/convert.js';\nimport { createAnalyzeCommand } from './commands/analyze.js';\nimport { createSOPCommands } from './commands/sop.js';\nimport { createInitPrimitivesCommand, createAnalyzeCodebaseCommand } from './commands/init-primitives.js';\nimport { createCultivateCommand } from './commands/cultivate.js';\nimport { createCommitCommand } from './commands/commit.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createDiagnosticsCommand } from './commands/diagnostics.js';\nimport { createWorkflowCommand } from './commands/workflow.js';\nimport { createAuditCommand } from './commands/audit.js';\nimport { createVectorCommand } from './commands/vector.js';\nimport { createServeCommand } from './commands/serve.js';\nimport { createDashboardCommand } from './commands/dashboard.js';\nimport { createPluginCommand } from './commands/plugin.js';\nimport { createHiveMindCommand } from './commands/hive-mind/index.js';\nimport { createHooksCommand } from './commands/hooks.js';\n\n/**\n * CLI version\n */\nconst VERSION = '0.4.0';\n\n/**\n * Create and configure the CLI program\n */\nexport function createCLI(): Command {\n const program = new Command();\n\n program\n .name('kg')\n .description('Knowledge Graph Agent - Generate and manage knowledge graphs for Claude Code')\n .version(VERSION, '-v, --version', 'Display version number');\n\n // Configure help\n program.configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n });\n\n // Add commands\n program.addCommand(createInitCommand());\n program.addCommand(createGraphCommand());\n program.addCommand(createDocsCommand());\n program.addCommand(createClaudeCommand());\n program.addCommand(createSyncCommand());\n program.addCommand(createStatsCommand());\n program.addCommand(createSearchCommand());\n program.addCommand(createConvertCommand());\n program.addCommand(createFrontmatterCommand());\n program.addCommand(createAnalyzeCommand());\n program.addCommand(createSOPCommands());\n program.addCommand(createInitPrimitivesCommand());\n program.addCommand(createAnalyzeCodebaseCommand());\n program.addCommand(createCultivateCommand());\n program.addCommand(createCommitCommand());\n program.addCommand(createConfigCommand());\n program.addCommand(createDiagnosticsCommand());\n program.addCommand(createWorkflowCommand());\n program.addCommand(createAuditCommand());\n program.addCommand(createVectorCommand());\n program.addCommand(createServeCommand());\n program.addCommand(createDashboardCommand());\n program.addCommand(createPluginCommand());\n program.addCommand(createHiveMindCommand());\n program.addCommand(createHooksCommand());\n\n // Default action (show help)\n program.action(() => {\n console.log(chalk.cyan.bold('\\n Knowledge Graph Agent\\n'));\n console.log(chalk.gray(' Generate and manage knowledge graphs for Claude Code\\n'));\n\n console.log(chalk.white(' Quick Start:'));\n console.log(chalk.gray(' $ kg init # Initialize knowledge graph'));\n console.log(chalk.gray(' $ kg docs init # Initialize docs directory'));\n console.log(chalk.gray(' $ kg graph # Generate knowledge graph'));\n console.log(chalk.gray(' $ kg claude update # Update CLAUDE.md'));\n console.log(chalk.gray(' $ kg sync # Sync with claude-flow\\n'));\n\n console.log(chalk.white(' Migration & Analysis:'));\n console.log(chalk.gray(' $ kg analyze # Analyze & migrate to knowledge graph'));\n console.log(chalk.gray(' $ kg analyze deep # Deep analysis with claude-flow'));\n console.log(chalk.gray(' $ kg analyze report # Generate analysis report'));\n console.log(chalk.gray(' $ kg convert docs # Convert docs/ → docs-nn/'));\n console.log(chalk.gray(' $ kg frontmatter add # Add frontmatter to files'));\n console.log(chalk.gray(' $ kg frontmatter validate # Validate frontmatter\\n'));\n\n console.log(chalk.white(' AI-SDLC SOP Compliance:'));\n console.log(chalk.gray(' $ kg sop init # Initialize SOP standards layer'));\n console.log(chalk.gray(' $ kg sop check # Check compliance against SOPs'));\n console.log(chalk.gray(' $ kg sop gaps # Analyze compliance gaps'));\n console.log(chalk.gray(' $ kg sop report # Generate compliance report'));\n console.log(chalk.gray(' $ kg sop list # List available SOPs\\n'));\n\n console.log(chalk.white(' Cultivation & Primitives:'));\n console.log(chalk.gray(' $ kg init-primitives # Bootstrap primitives from codebase'));\n console.log(chalk.gray(' $ kg analyze-codebase # Analyze dependencies & services'));\n console.log(chalk.gray(' $ kg init-primitives --dry-run # Preview without writing\\n'));\n\n console.log(chalk.white(' Git Integration:'));\n console.log(chalk.gray(' $ kg commit # Show status and suggested message'));\n console.log(chalk.gray(' $ kg commit -a # Auto-commit with generated message'));\n console.log(chalk.gray(' $ kg commit -i # Interactive commit mode'));\n console.log(chalk.gray(' $ kg commit -m \"message\" # Commit with custom message'));\n console.log(chalk.gray(' $ kg commit status # Show git status with analysis'));\n console.log(chalk.gray(' $ kg commit log # Show recent commits'));\n console.log(chalk.gray(' $ kg commit diff # Show diff of changes\\n'));\n\n console.log(chalk.white(' Diagnostics & Health:'));\n console.log(chalk.gray(' $ kg diag run # Run full diagnostics'));\n console.log(chalk.gray(' $ kg diag run --fix # Attempt to fix issues'));\n console.log(chalk.gray(' $ kg diag health # Check system health'));\n console.log(chalk.gray(' $ kg diag repair # Repair database issues'));\n console.log(chalk.gray(' $ kg diag backup # Create database backup'));\n console.log(chalk.gray(' $ kg diag backup --list # List existing backups'));\n console.log(chalk.gray(' $ kg diag info # Show system information\\n'));\n\n console.log(chalk.white(' Workflow Management:'));\n console.log(chalk.gray(' $ kg workflow start <type> # Start a workflow'));\n console.log(chalk.gray(' $ kg workflow status [id] # Check workflow status'));\n console.log(chalk.gray(' $ kg workflow list # List active workflows'));\n console.log(chalk.gray(' $ kg workflow stop <id> # Stop a workflow'));\n console.log(chalk.gray(' $ kg workflow history # Show workflow history\\n'));\n\n console.log(chalk.white(' Vector Operations:'));\n console.log(chalk.gray(' $ kg vector search <query> # Semantic search'));\n console.log(chalk.gray(' $ kg vector stats # Vector store statistics'));\n console.log(chalk.gray(' $ kg vector rebuild # Rebuild vector index'));\n console.log(chalk.gray(' $ kg vector traj list # List trajectories'));\n console.log(chalk.gray(' $ kg vector traj show <id> # Show trajectory details'));\n console.log(chalk.gray(' $ kg vector traj patterns # Show detected patterns\\n'));\n\n console.log(chalk.white(' Audit & Exochain:'));\n console.log(chalk.gray(' $ kg audit query # Query the audit log'));\n console.log(chalk.gray(' $ kg audit checkpoint # Create a checkpoint'));\n console.log(chalk.gray(' $ kg audit verify # Verify chain integrity'));\n console.log(chalk.gray(' $ kg audit sync status # Check sync status'));\n console.log(chalk.gray(' $ kg audit sync peers # List sync peers'));\n console.log(chalk.gray(' $ kg audit export # Export audit log\\n'));\n\n console.log(chalk.white(' Server Mode:'));\n console.log(chalk.gray(' $ kg serve # Start MCP server (stdio)'));\n console.log(chalk.gray(' $ kg serve --graphql # Start GraphQL server'));\n console.log(chalk.gray(' $ kg serve --dashboard # Start web dashboard'));\n console.log(chalk.gray(' $ kg serve --all # Start all servers'));\n console.log(chalk.gray(' $ kg serve status # Show server status\\n'));\n\n console.log(chalk.white(' Dashboard:'));\n console.log(chalk.gray(' $ kg dashboard start # Start dashboard dev server'));\n console.log(chalk.gray(' $ kg dashboard build # Build dashboard for production'));\n console.log(chalk.gray(' $ kg dashboard serve # Serve built dashboard'));\n console.log(chalk.gray(' $ kg dashboard open # Open dashboard in browser'));\n console.log(chalk.gray(' $ kg dashboard status # Check dashboard status\\n'));\n\n console.log(chalk.white(' Plugin Management:'));\n console.log(chalk.gray(' $ kg plugin list # List installed plugins'));\n console.log(chalk.gray(' $ kg plugin install <pkg> # Install a plugin'));\n console.log(chalk.gray(' $ kg plugin uninstall <n> # Uninstall a plugin'));\n console.log(chalk.gray(' $ kg plugin enable <name> # Enable a plugin'));\n console.log(chalk.gray(' $ kg plugin disable <name> # Disable a plugin'));\n console.log(chalk.gray(' $ kg plugin info <name> # Show plugin details'));\n console.log(chalk.gray(' $ kg plugin run <n> <file> # Run analyzer plugin'));\n console.log(chalk.gray(' $ kg plugin create <name> # Create new plugin\\n'));\n\n console.log(chalk.white(' Hive Mind (Graph Reconnection):'));\n console.log(chalk.gray(' $ kg hive-mind analyze-links <vault> # Analyze wiki-links'));\n console.log(chalk.gray(' $ kg hive-mind find-connections <vault> # Find potential links'));\n console.log(chalk.gray(' $ kg hive-mind validate-names <vault> # Validate file names'));\n console.log(chalk.gray(' $ kg hive-mind add-frontmatter <vault> # Add YAML frontmatter\\n'));\n\n console.log(chalk.white(' Claude Code Hooks:'));\n console.log(chalk.gray(' $ kg hooks install # Install hooks to capture interactions'));\n console.log(chalk.gray(' $ kg hooks uninstall # Remove hooks'));\n console.log(chalk.gray(' $ kg hooks status # Show hooks status'));\n console.log(chalk.gray(' $ kg hooks sessions # List captured sessions'));\n console.log(chalk.gray(' $ kg hooks export # Export captured sessions\\n'));\n\n console.log(chalk.white(' Commands:'));\n program.commands.forEach(cmd => {\n console.log(chalk.cyan(` ${cmd.name().padEnd(20)}`), chalk.gray(cmd.description() || ''));\n });\n\n console.log('\\n Run', chalk.cyan('kg <command> --help'), 'for more information\\n');\n });\n\n return program;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/cli/index.ts"],"sourcesContent":["/**\n * Knowledge Graph Agent CLI\n *\n * Main CLI setup and command registration.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createInitCommand } from './commands/init.js';\nimport { createGraphCommand } from './commands/graph.js';\nimport { createDocsCommand } from './commands/docs.js';\nimport { createClaudeCommand } from './commands/claude.js';\nimport { createSyncCommand } from './commands/sync.js';\nimport { createStatsCommand } from './commands/stats.js';\nimport { createSearchCommand } from './commands/search.js';\nimport { createConvertCommand, createFrontmatterCommand } from './commands/convert.js';\nimport { createAnalyzeCommand } from './commands/analyze.js';\nimport { createSOPCommands } from './commands/sop.js';\nimport { createInitPrimitivesCommand, createAnalyzeCodebaseCommand } from './commands/init-primitives.js';\nimport { createCultivateCommand } from './commands/cultivate.js';\nimport { createCommitCommand } from './commands/commit.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createDiagnosticsCommand } from './commands/diagnostics.js';\nimport { createWorkflowCommand } from './commands/workflow.js';\nimport { createAuditCommand } from './commands/audit.js';\nimport { createVectorCommand } from './commands/vector.js';\nimport { createServeCommand } from './commands/serve.js';\nimport { createDashboardCommand } from './commands/dashboard.js';\nimport { createPluginCommand } from './commands/plugin.js';\nimport { createHiveMindCommand } from './commands/hive-mind/index.js';\nimport { createHooksCommand } from './commands/hooks.js';\n\n/**\n * CLI version\n */\nconst VERSION = '0.4.0';\n\n/**\n * Create and configure the CLI program\n */\nexport function createCLI(): Command {\n const program = new Command();\n\n program\n .name('kg')\n .description('Knowledge Graph Agent - Generate and manage knowledge graphs for Claude Code')\n .version(VERSION, '-v, --version', 'Display version number');\n\n // Configure help\n program.configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n });\n\n // Add commands\n program.addCommand(createInitCommand());\n program.addCommand(createGraphCommand());\n program.addCommand(createDocsCommand());\n program.addCommand(createClaudeCommand());\n program.addCommand(createSyncCommand());\n program.addCommand(createStatsCommand());\n program.addCommand(createSearchCommand());\n program.addCommand(createConvertCommand());\n program.addCommand(createFrontmatterCommand());\n program.addCommand(createAnalyzeCommand());\n program.addCommand(createSOPCommands());\n program.addCommand(createInitPrimitivesCommand());\n program.addCommand(createAnalyzeCodebaseCommand());\n program.addCommand(createCultivateCommand());\n program.addCommand(createCommitCommand());\n program.addCommand(createConfigCommand());\n program.addCommand(createDiagnosticsCommand());\n program.addCommand(createWorkflowCommand());\n program.addCommand(createAuditCommand());\n program.addCommand(createVectorCommand());\n program.addCommand(createServeCommand());\n program.addCommand(createDashboardCommand());\n program.addCommand(createPluginCommand());\n program.addCommand(createHiveMindCommand());\n program.addCommand(createHooksCommand());\n\n // Default action (show help)\n program.action(() => {\n console.log(chalk.cyan.bold('\\n Knowledge Graph Agent\\n'));\n console.log(chalk.gray(' Generate and manage knowledge graphs for Claude Code\\n'));\n\n console.log(chalk.white(' Quick Start:'));\n console.log(chalk.gray(' $ kg init # Initialize knowledge graph'));\n console.log(chalk.gray(' $ kg docs init # Initialize docs directory'));\n console.log(chalk.gray(' $ kg graph # Generate knowledge graph'));\n console.log(chalk.gray(' $ kg claude update # Update CLAUDE.md'));\n console.log(chalk.gray(' $ kg sync # Sync with claude-flow\\n'));\n\n console.log(chalk.white(' Migration & Analysis:'));\n console.log(chalk.gray(' $ kg analyze # Analyze & migrate to knowledge graph'));\n console.log(chalk.gray(' $ kg analyze deep # Deep analysis with claude-flow'));\n console.log(chalk.gray(' $ kg analyze report # Generate analysis report'));\n console.log(chalk.gray(' $ kg convert docs # Convert docs/ with proper structure'));\n console.log(chalk.gray(' $ kg frontmatter add # Add frontmatter to files'));\n console.log(chalk.gray(' $ kg frontmatter validate # Validate frontmatter\\n'));\n\n console.log(chalk.white(' AI-SDLC SOP Compliance:'));\n console.log(chalk.gray(' $ kg sop init # Initialize SOP standards layer'));\n console.log(chalk.gray(' $ kg sop check # Check compliance against SOPs'));\n console.log(chalk.gray(' $ kg sop gaps # Analyze compliance gaps'));\n console.log(chalk.gray(' $ kg sop report # Generate compliance report'));\n console.log(chalk.gray(' $ kg sop list # List available SOPs\\n'));\n\n console.log(chalk.white(' Cultivation & Primitives:'));\n console.log(chalk.gray(' $ kg init-primitives # Bootstrap primitives from codebase'));\n console.log(chalk.gray(' $ kg analyze-codebase # Analyze dependencies & services'));\n console.log(chalk.gray(' $ kg init-primitives --dry-run # Preview without writing\\n'));\n\n console.log(chalk.white(' Git Integration:'));\n console.log(chalk.gray(' $ kg commit # Show status and suggested message'));\n console.log(chalk.gray(' $ kg commit -a # Auto-commit with generated message'));\n console.log(chalk.gray(' $ kg commit -i # Interactive commit mode'));\n console.log(chalk.gray(' $ kg commit -m \"message\" # Commit with custom message'));\n console.log(chalk.gray(' $ kg commit status # Show git status with analysis'));\n console.log(chalk.gray(' $ kg commit log # Show recent commits'));\n console.log(chalk.gray(' $ kg commit diff # Show diff of changes\\n'));\n\n console.log(chalk.white(' Diagnostics & Health:'));\n console.log(chalk.gray(' $ kg diag run # Run full diagnostics'));\n console.log(chalk.gray(' $ kg diag run --fix # Attempt to fix issues'));\n console.log(chalk.gray(' $ kg diag health # Check system health'));\n console.log(chalk.gray(' $ kg diag repair # Repair database issues'));\n console.log(chalk.gray(' $ kg diag backup # Create database backup'));\n console.log(chalk.gray(' $ kg diag backup --list # List existing backups'));\n console.log(chalk.gray(' $ kg diag info # Show system information\\n'));\n\n console.log(chalk.white(' Workflow Management:'));\n console.log(chalk.gray(' $ kg workflow start <type> # Start a workflow'));\n console.log(chalk.gray(' $ kg workflow status [id] # Check workflow status'));\n console.log(chalk.gray(' $ kg workflow list # List active workflows'));\n console.log(chalk.gray(' $ kg workflow stop <id> # Stop a workflow'));\n console.log(chalk.gray(' $ kg workflow history # Show workflow history\\n'));\n\n console.log(chalk.white(' Vector Operations:'));\n console.log(chalk.gray(' $ kg vector search <query> # Semantic search'));\n console.log(chalk.gray(' $ kg vector stats # Vector store statistics'));\n console.log(chalk.gray(' $ kg vector rebuild # Rebuild vector index'));\n console.log(chalk.gray(' $ kg vector traj list # List trajectories'));\n console.log(chalk.gray(' $ kg vector traj show <id> # Show trajectory details'));\n console.log(chalk.gray(' $ kg vector traj patterns # Show detected patterns\\n'));\n\n console.log(chalk.white(' Audit & Exochain:'));\n console.log(chalk.gray(' $ kg audit query # Query the audit log'));\n console.log(chalk.gray(' $ kg audit checkpoint # Create a checkpoint'));\n console.log(chalk.gray(' $ kg audit verify # Verify chain integrity'));\n console.log(chalk.gray(' $ kg audit sync status # Check sync status'));\n console.log(chalk.gray(' $ kg audit sync peers # List sync peers'));\n console.log(chalk.gray(' $ kg audit export # Export audit log\\n'));\n\n console.log(chalk.white(' Server Mode:'));\n console.log(chalk.gray(' $ kg serve # Start MCP server (stdio)'));\n console.log(chalk.gray(' $ kg serve --graphql # Start GraphQL server'));\n console.log(chalk.gray(' $ kg serve --dashboard # Start web dashboard'));\n console.log(chalk.gray(' $ kg serve --all # Start all servers'));\n console.log(chalk.gray(' $ kg serve status # Show server status\\n'));\n\n console.log(chalk.white(' Dashboard:'));\n console.log(chalk.gray(' $ kg dashboard start # Start dashboard dev server'));\n console.log(chalk.gray(' $ kg dashboard build # Build dashboard for production'));\n console.log(chalk.gray(' $ kg dashboard serve # Serve built dashboard'));\n console.log(chalk.gray(' $ kg dashboard open # Open dashboard in browser'));\n console.log(chalk.gray(' $ kg dashboard status # Check dashboard status\\n'));\n\n console.log(chalk.white(' Plugin Management:'));\n console.log(chalk.gray(' $ kg plugin list # List installed plugins'));\n console.log(chalk.gray(' $ kg plugin install <pkg> # Install a plugin'));\n console.log(chalk.gray(' $ kg plugin uninstall <n> # Uninstall a plugin'));\n console.log(chalk.gray(' $ kg plugin enable <name> # Enable a plugin'));\n console.log(chalk.gray(' $ kg plugin disable <name> # Disable a plugin'));\n console.log(chalk.gray(' $ kg plugin info <name> # Show plugin details'));\n console.log(chalk.gray(' $ kg plugin run <n> <file> # Run analyzer plugin'));\n console.log(chalk.gray(' $ kg plugin create <name> # Create new plugin\\n'));\n\n console.log(chalk.white(' Hive Mind (Graph Reconnection):'));\n console.log(chalk.gray(' $ kg hive-mind analyze-links <vault> # Analyze wiki-links'));\n console.log(chalk.gray(' $ kg hive-mind find-connections <vault> # Find potential links'));\n console.log(chalk.gray(' $ kg hive-mind validate-names <vault> # Validate file names'));\n console.log(chalk.gray(' $ kg hive-mind add-frontmatter <vault> # Add YAML frontmatter\\n'));\n\n console.log(chalk.white(' Claude Code Hooks:'));\n console.log(chalk.gray(' $ kg hooks install # Install hooks to capture interactions'));\n console.log(chalk.gray(' $ kg hooks uninstall # Remove hooks'));\n console.log(chalk.gray(' $ kg hooks status # Show hooks status'));\n console.log(chalk.gray(' $ kg hooks sessions # List captured sessions'));\n console.log(chalk.gray(' $ kg hooks export # Export captured sessions\\n'));\n\n console.log(chalk.white(' Commands:'));\n program.commands.forEach(cmd => {\n console.log(chalk.cyan(` ${cmd.name().padEnd(20)}`), chalk.gray(cmd.description() || ''));\n });\n\n console.log('\\n Run', chalk.cyan('kg <command> --help'), 'for more information\\n');\n });\n\n return program;\n}\n"],"names":[],"mappings":"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"}
@@ -76,11 +76,18 @@ export declare class DeepAnalyzer {
76
76
  private maxAgents;
77
77
  private agentMode;
78
78
  private agentTimeout;
79
+ private claudeFlowCommand;
79
80
  constructor(options: DeepAnalyzerOptions);
80
81
  /**
81
- * Check if claude-flow is available
82
+ * Check if claude-flow is available and determine the best command to use
83
+ * Checks for direct command first (globally installed), then falls back to npx
82
84
  */
83
85
  isAvailable(): Promise<boolean>;
86
+ /**
87
+ * Detect which claude-flow command to use
88
+ * Returns the command configuration or null if not available
89
+ */
90
+ private detectClaudeFlowCommand;
84
91
  /**
85
92
  * Run deep analysis
86
93
  */
@@ -1 +1 @@
1
- {"version":3,"file":"deep-analyzer.d.ts","sourceRoot":"","sources":["../../src/cultivation/deep-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsBH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;IACnD,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAYD;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,mBAAmB;IAWxC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAerC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyF5C;;OAEG;YACW,eAAe;IAK7B;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;YACW,eAAe;IA2B7B;;OAEG;YACW,YAAY;IA0C1B;;OAEG;IACH,OAAO,CAAC,WAAW;IA8BnB;;OAEG;YACW,kBAAkB;IA2ChC;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,YAAY;CA4BrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAE7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAG7B"}
1
+ {"version":3,"file":"deep-analyzer.d.ts","sourceRoot":"","sources":["../../src/cultivation/deep-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsBH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;IACnD,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAYD;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAgD;gBAE7D,OAAO,EAAE,mBAAmB;IAWxC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC;;;OAGG;YACW,uBAAuB;IAkCrC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyF5C;;OAEG;YACW,eAAe;IAK7B;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;YACW,eAAe;IA2B7B;;OAEG;YACW,YAAY;IA0C1B;;OAEG;IACH,OAAO,CAAC,WAAW;IA8BnB;;OAEG;YACW,kBAAkB;IAkDhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,YAAY;CA4BrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAE7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAG7B"}
@@ -20,6 +20,7 @@ class DeepAnalyzer {
20
20
  maxAgents;
21
21
  agentMode;
22
22
  agentTimeout;
23
+ claudeFlowCommand = null;
23
24
  constructor(options) {
24
25
  this.projectRoot = resolve(options.projectRoot);
25
26
  this.docsPath = options.docsPath || "docs";
@@ -30,18 +31,41 @@ class DeepAnalyzer {
30
31
  this.agentTimeout = options.agentTimeout || 6e4;
31
32
  }
32
33
  /**
33
- * Check if claude-flow is available
34
+ * Check if claude-flow is available and determine the best command to use
35
+ * Checks for direct command first (globally installed), then falls back to npx
34
36
  */
35
37
  async isAvailable() {
38
+ const command = await this.detectClaudeFlowCommand();
39
+ return command !== null;
40
+ }
41
+ /**
42
+ * Detect which claude-flow command to use
43
+ * Returns the command configuration or null if not available
44
+ */
45
+ async detectClaudeFlowCommand() {
46
+ if (this.claudeFlowCommand !== null) {
47
+ return this.claudeFlowCommand;
48
+ }
36
49
  try {
37
- execFileSync("npx", ["claude-flow@alpha", "--version"], {
50
+ execFileSync("claude-flow", ["--version"], {
38
51
  stdio: "pipe",
39
52
  timeout: 5e3,
40
53
  windowsHide: true
41
54
  });
42
- return true;
55
+ this.claudeFlowCommand = { cmd: "claude-flow", args: [] };
56
+ return this.claudeFlowCommand;
43
57
  } catch {
44
- return false;
58
+ }
59
+ try {
60
+ execFileSync("npx", ["claude-flow", "--version"], {
61
+ stdio: "pipe",
62
+ timeout: 3e4,
63
+ windowsHide: true
64
+ });
65
+ this.claudeFlowCommand = { cmd: "npx", args: ["claude-flow"] };
66
+ return this.claudeFlowCommand;
67
+ } catch {
68
+ return null;
45
69
  }
46
70
  }
47
71
  /**
@@ -198,7 +222,7 @@ class DeepAnalyzer {
198
222
 
199
223
  **COORDINATION PROTOCOL**:
200
224
  \`\`\`bash
201
- npx claude-flow@alpha hooks pre-task --description "${agent.task}"
225
+ claude-flow hooks pre-task --description "${agent.task}"
202
226
  \`\`\`
203
227
 
204
228
  **YOUR TASKS**:
@@ -216,7 +240,7 @@ npx claude-flow@alpha hooks pre-task --description "${agent.task}"
216
240
 
217
241
  After completing:
218
242
  \`\`\`bash
219
- npx claude-flow@alpha hooks post-task --task-id "${agent.type}-analysis"
243
+ claude-flow hooks post-task --task-id "${agent.type}-analysis"
220
244
  \`\`\`
221
245
  `;
222
246
  }
@@ -228,9 +252,13 @@ npx claude-flow@alpha hooks post-task --task-id "${agent.type}-analysis"
228
252
  throw new Error(`Invalid agent type: ${type}. Valid types: ${[...VALID_AGENT_TYPES].join(", ")}`);
229
253
  }
230
254
  const sanitizedPrompt = prompt.replace(/[`$\\]/g, "");
255
+ const commandConfig = await this.detectClaudeFlowCommand();
256
+ if (!commandConfig) {
257
+ throw new Error("claude-flow is not available");
258
+ }
231
259
  return new Promise((resolve2, reject) => {
232
- const args = ["claude-flow@alpha", "agent", "execute", type, sanitizedPrompt, "--json"];
233
- const proc = spawn("npx", args, {
260
+ const args = [...commandConfig.args, "agent", "execute", type, sanitizedPrompt, "--json"];
261
+ const proc = spawn(commandConfig.cmd, args, {
234
262
  cwd: this.projectRoot,
235
263
  shell: false,
236
264
  // Security: Disable shell to prevent command injection
@@ -1 +1 @@
1
- {"version":3,"file":"deep-analyzer.js","sources":["../../src/cultivation/deep-analyzer.ts"],"sourcesContent":["/**\n * DeepAnalyzer - Claude-Flow Integration for Deep Codebase Analysis\n *\n * Uses claude-flow agents for comprehensive codebase analysis:\n * - Pattern detection and architectural insights\n * - Documentation gap analysis\n * - Standards compliance checking\n *\n * @module cultivation/deep-analyzer\n */\n\nimport { execFileSync, spawn } from 'child_process';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { createLogger } from '../utils/index.js';\n\nconst logger = createLogger('deep-analyzer');\n\n/**\n * Valid agent types for security validation\n */\nconst VALID_AGENT_TYPES = new Set([\n 'researcher',\n 'architect',\n 'analyst',\n 'coder',\n 'tester',\n 'reviewer',\n 'documenter',\n]);\n\n/**\n * Deep analyzer options\n */\nexport interface DeepAnalyzerOptions {\n /** Project root directory */\n projectRoot: string;\n /** Documentation path (relative to project root) */\n docsPath?: string;\n /** Output directory for analysis results */\n outputDir?: string;\n /** Enable verbose logging */\n verbose?: boolean;\n /** Maximum agents to spawn */\n maxAgents?: number;\n /** Agent execution mode */\n agentMode?: 'sequential' | 'parallel' | 'adaptive';\n /** Timeout for each agent (ms) */\n agentTimeout?: number;\n}\n\n/**\n * Analysis result from an agent\n */\nexport interface AgentResult {\n name: string;\n type: string;\n success: boolean;\n insights: string[];\n documents: Array<{ path: string; title: string }>;\n duration: number;\n error?: string;\n}\n\n/**\n * Deep analysis result\n */\nexport interface DeepAnalysisResult {\n success: boolean;\n agentsSpawned: number;\n insightsCount: number;\n documentsCreated: number;\n results: AgentResult[];\n duration: number;\n errors: string[];\n}\n\n/**\n * Agent configuration\n */\ninterface AgentConfig {\n name: string;\n type: 'researcher' | 'analyst' | 'coder' | 'tester' | 'reviewer';\n task: string;\n outputFile: string;\n}\n\n/**\n * DeepAnalyzer - Uses claude-flow for deep codebase analysis\n *\n * @example\n * ```typescript\n * const analyzer = new DeepAnalyzer({\n * projectRoot: '/my/project',\n * docsPath: 'docs',\n * });\n *\n * const result = await analyzer.analyze();\n * console.log(`Generated ${result.insightsCount} insights`);\n * ```\n */\nexport class DeepAnalyzer {\n private projectRoot: string;\n private docsPath: string;\n private outputDir: string;\n private verbose: boolean;\n private maxAgents: number;\n private agentMode: 'sequential' | 'parallel' | 'adaptive';\n private agentTimeout: number;\n\n constructor(options: DeepAnalyzerOptions) {\n this.projectRoot = resolve(options.projectRoot);\n this.docsPath = options.docsPath || 'docs';\n this.outputDir = options.outputDir || join(this.projectRoot, this.docsPath, 'analysis');\n this.verbose = options.verbose || false;\n this.maxAgents = options.maxAgents || 5;\n this.agentMode = options.agentMode || 'adaptive';\n // Default timeout of 60 seconds (configurable via agentTimeout option)\n this.agentTimeout = options.agentTimeout || 60000;\n }\n\n /**\n * Check if claude-flow is available\n */\n async isAvailable(): Promise<boolean> {\n try {\n // SECURITY: execFileSync does not spawn a shell by default, preventing shell injection\n // Using npx with explicit arguments avoids shell metacharacter interpretation\n execFileSync('npx', ['claude-flow@alpha', '--version'], {\n stdio: 'pipe',\n timeout: 5000,\n windowsHide: true,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Run deep analysis\n */\n async analyze(): Promise<DeepAnalysisResult> {\n const startTime = Date.now();\n\n const result: DeepAnalysisResult = {\n success: false,\n agentsSpawned: 0,\n insightsCount: 0,\n documentsCreated: 0,\n results: [],\n duration: 0,\n errors: [],\n };\n\n // Check availability\n if (!(await this.isAvailable())) {\n result.errors.push('claude-flow is not available');\n result.duration = Date.now() - startTime;\n return result;\n }\n\n // Ensure output directory exists\n if (!existsSync(this.outputDir)) {\n mkdirSync(this.outputDir, { recursive: true });\n }\n\n // Define agents\n const agents: AgentConfig[] = [\n {\n name: 'Pattern Researcher',\n type: 'researcher',\n task: 'Analyze codebase architecture, patterns, and design decisions',\n outputFile: 'architecture-patterns.md',\n },\n {\n name: 'Code Analyst',\n type: 'analyst',\n task: 'Identify code quality issues, complexity hotspots, and improvement opportunities',\n outputFile: 'code-analysis.md',\n },\n {\n name: 'Implementation Reviewer',\n type: 'coder',\n task: 'Review implementation patterns, naming conventions, and code style',\n outputFile: 'implementation-review.md',\n },\n {\n name: 'Test Analyzer',\n type: 'tester',\n task: 'Analyze test coverage, testing patterns, and testing gaps',\n outputFile: 'testing-analysis.md',\n },\n ];\n\n logger.info('Starting deep analysis', { agents: agents.length, mode: this.agentMode });\n\n // Execute agents based on mode\n if (this.agentMode === 'parallel') {\n result.results = await this.executeParallel(agents);\n } else if (this.agentMode === 'sequential') {\n result.results = await this.executeSequential(agents);\n } else {\n // Adaptive: start with 2, scale based on success\n result.results = await this.executeAdaptive(agents);\n }\n\n // Calculate totals\n result.agentsSpawned = result.results.length;\n result.insightsCount = result.results.reduce((sum, r) => sum + r.insights.length, 0);\n result.documentsCreated = result.results.reduce((sum, r) => sum + r.documents.length, 0);\n result.success = result.results.every(r => r.success);\n result.duration = Date.now() - startTime;\n\n // Collect errors\n for (const agentResult of result.results) {\n if (agentResult.error) {\n result.errors.push(`${agentResult.name}: ${agentResult.error}`);\n }\n }\n\n logger.info('Deep analysis complete', {\n success: result.success,\n insights: result.insightsCount,\n documents: result.documentsCreated,\n duration: result.duration,\n });\n\n return result;\n }\n\n /**\n * Execute agents in parallel\n */\n private async executeParallel(agents: AgentConfig[]): Promise<AgentResult[]> {\n const promises = agents.map(agent => this.executeAgent(agent));\n return Promise.all(promises);\n }\n\n /**\n * Execute agents sequentially\n */\n private async executeSequential(agents: AgentConfig[]): Promise<AgentResult[]> {\n const results: AgentResult[] = [];\n for (const agent of agents) {\n results.push(await this.executeAgent(agent));\n }\n return results;\n }\n\n /**\n * Execute agents adaptively (start with 2, scale based on success)\n */\n private async executeAdaptive(agents: AgentConfig[]): Promise<AgentResult[]> {\n const results: AgentResult[] = [];\n\n // First batch: 2 agents\n const firstBatch = agents.slice(0, 2);\n const firstResults = await Promise.all(firstBatch.map(a => this.executeAgent(a)));\n results.push(...firstResults);\n\n // Check success rate\n const successRate = firstResults.filter(r => r.success).length / firstResults.length;\n\n if (successRate >= 0.5 && agents.length > 2) {\n // Continue with remaining agents in parallel\n const remaining = agents.slice(2);\n const remainingResults = await Promise.all(remaining.map(a => this.executeAgent(a)));\n results.push(...remainingResults);\n } else if (agents.length > 2) {\n // Fall back to sequential\n logger.warn('Low success rate, switching to sequential mode');\n for (const agent of agents.slice(2)) {\n results.push(await this.executeAgent(agent));\n }\n }\n\n return results;\n }\n\n /**\n * Execute a single agent\n */\n private async executeAgent(agent: AgentConfig): Promise<AgentResult> {\n const startTime = Date.now();\n const outputPath = join(this.outputDir, agent.outputFile);\n\n const result: AgentResult = {\n name: agent.name,\n type: agent.type,\n success: false,\n insights: [],\n documents: [],\n duration: 0,\n };\n\n try {\n logger.info(`Spawning agent: ${agent.name}`, { type: agent.type });\n\n const prompt = this.buildPrompt(agent);\n\n // Execute claude-flow agent\n const output = await this.runClaudeFlowAgent(agent.type, prompt);\n\n // Parse output for insights\n result.insights = this.extractInsights(output);\n\n // Write output to file\n writeFileSync(outputPath, this.formatOutput(agent, output));\n result.documents.push({ path: outputPath, title: agent.name });\n\n result.success = true;\n\n if (this.verbose) {\n logger.debug(`Agent completed: ${agent.name}`, { insights: result.insights.length });\n }\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n logger.error(`Agent failed: ${agent.name}`, error instanceof Error ? error : new Error(String(error)));\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Build prompt for agent\n */\n private buildPrompt(agent: AgentConfig): string {\n return `You are a ${agent.name} analyzing the project at ${this.projectRoot}.\n\n**OBJECTIVE**: ${agent.task}\n\n**COORDINATION PROTOCOL**:\n\\`\\`\\`bash\nnpx claude-flow@alpha hooks pre-task --description \"${agent.task}\"\n\\`\\`\\`\n\n**YOUR TASKS**:\n1. Analyze the codebase at ${this.projectRoot}\n2. Identify key patterns and conventions\n3. Document your findings with specific examples\n4. Provide actionable recommendations\n5. Generate comprehensive markdown documentation\n\n**OUTPUT REQUIREMENTS**:\n- Use clear markdown formatting\n- Include code examples from the project\n- Organize findings by category\n- Prioritize actionable insights\n\nAfter completing:\n\\`\\`\\`bash\nnpx claude-flow@alpha hooks post-task --task-id \"${agent.type}-analysis\"\n\\`\\`\\`\n`;\n }\n\n /**\n * Run claude-flow agent\n */\n private async runClaudeFlowAgent(type: string, prompt: string): Promise<string> {\n // Security: Validate agent type against allowlist to prevent command injection\n if (!VALID_AGENT_TYPES.has(type)) {\n throw new Error(`Invalid agent type: ${type}. Valid types: ${[...VALID_AGENT_TYPES].join(', ')}`);\n }\n\n // Security: Sanitize prompt to prevent injection via shell metacharacters\n const sanitizedPrompt = prompt.replace(/[`$\\\\]/g, '');\n\n return new Promise((resolve, reject) => {\n const args = ['claude-flow@alpha', 'agent', 'execute', type, sanitizedPrompt, '--json'];\n\n const proc = spawn('npx', args, {\n cwd: this.projectRoot,\n shell: false, // Security: Disable shell to prevent command injection\n timeout: this.agentTimeout,\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr || `Agent exited with code ${code}`));\n }\n });\n\n proc.on('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Extract insights from agent output\n */\n private extractInsights(output: string): string[] {\n const insights: string[] = [];\n\n // Look for patterns like \"- Insight:\" or \"## Finding:\"\n const patterns = [\n /[-*]\\s*(?:insight|finding|observation|recommendation):\\s*(.+)/gi,\n /##\\s*(?:insight|finding|observation|recommendation):\\s*(.+)/gi,\n /(?:key\\s+)?(?:insight|finding|observation|recommendation):\\s*(.+)/gi,\n ];\n\n for (const pattern of patterns) {\n const matches = output.matchAll(pattern);\n for (const match of matches) {\n if (match[1]) {\n insights.push(match[1].trim());\n }\n }\n }\n\n // Deduplicate\n return [...new Set(insights)];\n }\n\n /**\n * Format output for documentation\n */\n private formatOutput(agent: AgentConfig, output: string): string {\n const timestamp = new Date().toISOString();\n\n return `---\ntitle: \"${agent.name} Analysis\"\ntype: analysis\ngenerator: deep-analyzer\nagent: ${agent.type}\ncreated: ${timestamp}\n---\n\n# ${agent.name} Analysis\n\n> Generated by DeepAnalyzer using claude-flow\n\n## Overview\n\n${agent.task}\n\n## Analysis\n\n${output}\n\n---\n\n*Generated on ${new Date().toLocaleString()}*\n`;\n }\n}\n\n/**\n * Create a deep analyzer instance\n */\nexport function createDeepAnalyzer(options: DeepAnalyzerOptions): DeepAnalyzer {\n return new DeepAnalyzer(options);\n}\n\n/**\n * Run deep analysis on a project\n */\nexport async function analyzeDeep(\n projectRoot: string,\n docsPath?: string\n): Promise<DeepAnalysisResult> {\n const analyzer = new DeepAnalyzer({ projectRoot, docsPath });\n return analyzer.analyze();\n}\n"],"names":["resolve"],"mappings":"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"}
1
+ {"version":3,"file":"deep-analyzer.js","sources":["../../src/cultivation/deep-analyzer.ts"],"sourcesContent":["/**\n * DeepAnalyzer - Claude-Flow Integration for Deep Codebase Analysis\n *\n * Uses claude-flow agents for comprehensive codebase analysis:\n * - Pattern detection and architectural insights\n * - Documentation gap analysis\n * - Standards compliance checking\n *\n * @module cultivation/deep-analyzer\n */\n\nimport { execFileSync, spawn } from 'child_process';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { createLogger } from '../utils/index.js';\n\nconst logger = createLogger('deep-analyzer');\n\n/**\n * Valid agent types for security validation\n */\nconst VALID_AGENT_TYPES = new Set([\n 'researcher',\n 'architect',\n 'analyst',\n 'coder',\n 'tester',\n 'reviewer',\n 'documenter',\n]);\n\n/**\n * Deep analyzer options\n */\nexport interface DeepAnalyzerOptions {\n /** Project root directory */\n projectRoot: string;\n /** Documentation path (relative to project root) */\n docsPath?: string;\n /** Output directory for analysis results */\n outputDir?: string;\n /** Enable verbose logging */\n verbose?: boolean;\n /** Maximum agents to spawn */\n maxAgents?: number;\n /** Agent execution mode */\n agentMode?: 'sequential' | 'parallel' | 'adaptive';\n /** Timeout for each agent (ms) */\n agentTimeout?: number;\n}\n\n/**\n * Analysis result from an agent\n */\nexport interface AgentResult {\n name: string;\n type: string;\n success: boolean;\n insights: string[];\n documents: Array<{ path: string; title: string }>;\n duration: number;\n error?: string;\n}\n\n/**\n * Deep analysis result\n */\nexport interface DeepAnalysisResult {\n success: boolean;\n agentsSpawned: number;\n insightsCount: number;\n documentsCreated: number;\n results: AgentResult[];\n duration: number;\n errors: string[];\n}\n\n/**\n * Agent configuration\n */\ninterface AgentConfig {\n name: string;\n type: 'researcher' | 'analyst' | 'coder' | 'tester' | 'reviewer';\n task: string;\n outputFile: string;\n}\n\n/**\n * DeepAnalyzer - Uses claude-flow for deep codebase analysis\n *\n * @example\n * ```typescript\n * const analyzer = new DeepAnalyzer({\n * projectRoot: '/my/project',\n * docsPath: 'docs',\n * });\n *\n * const result = await analyzer.analyze();\n * console.log(`Generated ${result.insightsCount} insights`);\n * ```\n */\nexport class DeepAnalyzer {\n private projectRoot: string;\n private docsPath: string;\n private outputDir: string;\n private verbose: boolean;\n private maxAgents: number;\n private agentMode: 'sequential' | 'parallel' | 'adaptive';\n private agentTimeout: number;\n private claudeFlowCommand: { cmd: string; args: string[] } | null = null;\n\n constructor(options: DeepAnalyzerOptions) {\n this.projectRoot = resolve(options.projectRoot);\n this.docsPath = options.docsPath || 'docs';\n this.outputDir = options.outputDir || join(this.projectRoot, this.docsPath, 'analysis');\n this.verbose = options.verbose || false;\n this.maxAgents = options.maxAgents || 5;\n this.agentMode = options.agentMode || 'adaptive';\n // Default timeout of 60 seconds (configurable via agentTimeout option)\n this.agentTimeout = options.agentTimeout || 60000;\n }\n\n /**\n * Check if claude-flow is available and determine the best command to use\n * Checks for direct command first (globally installed), then falls back to npx\n */\n async isAvailable(): Promise<boolean> {\n const command = await this.detectClaudeFlowCommand();\n return command !== null;\n }\n\n /**\n * Detect which claude-flow command to use\n * Returns the command configuration or null if not available\n */\n private async detectClaudeFlowCommand(): Promise<{ cmd: string; args: string[] } | null> {\n // Return cached result if available\n if (this.claudeFlowCommand !== null) {\n return this.claudeFlowCommand;\n }\n\n // First try direct command (globally installed claude-flow)\n try {\n // SECURITY: execFileSync does not spawn a shell by default, preventing shell injection\n execFileSync('claude-flow', ['--version'], {\n stdio: 'pipe',\n timeout: 5000,\n windowsHide: true,\n });\n this.claudeFlowCommand = { cmd: 'claude-flow', args: [] };\n return this.claudeFlowCommand;\n } catch {\n // Direct command not available, try npx\n }\n\n // Fall back to npx\n try {\n execFileSync('npx', ['claude-flow', '--version'], {\n stdio: 'pipe',\n timeout: 30000,\n windowsHide: true,\n });\n this.claudeFlowCommand = { cmd: 'npx', args: ['claude-flow'] };\n return this.claudeFlowCommand;\n } catch {\n return null;\n }\n }\n\n /**\n * Run deep analysis\n */\n async analyze(): Promise<DeepAnalysisResult> {\n const startTime = Date.now();\n\n const result: DeepAnalysisResult = {\n success: false,\n agentsSpawned: 0,\n insightsCount: 0,\n documentsCreated: 0,\n results: [],\n duration: 0,\n errors: [],\n };\n\n // Check availability\n if (!(await this.isAvailable())) {\n result.errors.push('claude-flow is not available');\n result.duration = Date.now() - startTime;\n return result;\n }\n\n // Ensure output directory exists\n if (!existsSync(this.outputDir)) {\n mkdirSync(this.outputDir, { recursive: true });\n }\n\n // Define agents\n const agents: AgentConfig[] = [\n {\n name: 'Pattern Researcher',\n type: 'researcher',\n task: 'Analyze codebase architecture, patterns, and design decisions',\n outputFile: 'architecture-patterns.md',\n },\n {\n name: 'Code Analyst',\n type: 'analyst',\n task: 'Identify code quality issues, complexity hotspots, and improvement opportunities',\n outputFile: 'code-analysis.md',\n },\n {\n name: 'Implementation Reviewer',\n type: 'coder',\n task: 'Review implementation patterns, naming conventions, and code style',\n outputFile: 'implementation-review.md',\n },\n {\n name: 'Test Analyzer',\n type: 'tester',\n task: 'Analyze test coverage, testing patterns, and testing gaps',\n outputFile: 'testing-analysis.md',\n },\n ];\n\n logger.info('Starting deep analysis', { agents: agents.length, mode: this.agentMode });\n\n // Execute agents based on mode\n if (this.agentMode === 'parallel') {\n result.results = await this.executeParallel(agents);\n } else if (this.agentMode === 'sequential') {\n result.results = await this.executeSequential(agents);\n } else {\n // Adaptive: start with 2, scale based on success\n result.results = await this.executeAdaptive(agents);\n }\n\n // Calculate totals\n result.agentsSpawned = result.results.length;\n result.insightsCount = result.results.reduce((sum, r) => sum + r.insights.length, 0);\n result.documentsCreated = result.results.reduce((sum, r) => sum + r.documents.length, 0);\n result.success = result.results.every(r => r.success);\n result.duration = Date.now() - startTime;\n\n // Collect errors\n for (const agentResult of result.results) {\n if (agentResult.error) {\n result.errors.push(`${agentResult.name}: ${agentResult.error}`);\n }\n }\n\n logger.info('Deep analysis complete', {\n success: result.success,\n insights: result.insightsCount,\n documents: result.documentsCreated,\n duration: result.duration,\n });\n\n return result;\n }\n\n /**\n * Execute agents in parallel\n */\n private async executeParallel(agents: AgentConfig[]): Promise<AgentResult[]> {\n const promises = agents.map(agent => this.executeAgent(agent));\n return Promise.all(promises);\n }\n\n /**\n * Execute agents sequentially\n */\n private async executeSequential(agents: AgentConfig[]): Promise<AgentResult[]> {\n const results: AgentResult[] = [];\n for (const agent of agents) {\n results.push(await this.executeAgent(agent));\n }\n return results;\n }\n\n /**\n * Execute agents adaptively (start with 2, scale based on success)\n */\n private async executeAdaptive(agents: AgentConfig[]): Promise<AgentResult[]> {\n const results: AgentResult[] = [];\n\n // First batch: 2 agents\n const firstBatch = agents.slice(0, 2);\n const firstResults = await Promise.all(firstBatch.map(a => this.executeAgent(a)));\n results.push(...firstResults);\n\n // Check success rate\n const successRate = firstResults.filter(r => r.success).length / firstResults.length;\n\n if (successRate >= 0.5 && agents.length > 2) {\n // Continue with remaining agents in parallel\n const remaining = agents.slice(2);\n const remainingResults = await Promise.all(remaining.map(a => this.executeAgent(a)));\n results.push(...remainingResults);\n } else if (agents.length > 2) {\n // Fall back to sequential\n logger.warn('Low success rate, switching to sequential mode');\n for (const agent of agents.slice(2)) {\n results.push(await this.executeAgent(agent));\n }\n }\n\n return results;\n }\n\n /**\n * Execute a single agent\n */\n private async executeAgent(agent: AgentConfig): Promise<AgentResult> {\n const startTime = Date.now();\n const outputPath = join(this.outputDir, agent.outputFile);\n\n const result: AgentResult = {\n name: agent.name,\n type: agent.type,\n success: false,\n insights: [],\n documents: [],\n duration: 0,\n };\n\n try {\n logger.info(`Spawning agent: ${agent.name}`, { type: agent.type });\n\n const prompt = this.buildPrompt(agent);\n\n // Execute claude-flow agent\n const output = await this.runClaudeFlowAgent(agent.type, prompt);\n\n // Parse output for insights\n result.insights = this.extractInsights(output);\n\n // Write output to file\n writeFileSync(outputPath, this.formatOutput(agent, output));\n result.documents.push({ path: outputPath, title: agent.name });\n\n result.success = true;\n\n if (this.verbose) {\n logger.debug(`Agent completed: ${agent.name}`, { insights: result.insights.length });\n }\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n logger.error(`Agent failed: ${agent.name}`, error instanceof Error ? error : new Error(String(error)));\n }\n\n result.duration = Date.now() - startTime;\n return result;\n }\n\n /**\n * Build prompt for agent\n */\n private buildPrompt(agent: AgentConfig): string {\n return `You are a ${agent.name} analyzing the project at ${this.projectRoot}.\n\n**OBJECTIVE**: ${agent.task}\n\n**COORDINATION PROTOCOL**:\n\\`\\`\\`bash\nclaude-flow hooks pre-task --description \"${agent.task}\"\n\\`\\`\\`\n\n**YOUR TASKS**:\n1. Analyze the codebase at ${this.projectRoot}\n2. Identify key patterns and conventions\n3. Document your findings with specific examples\n4. Provide actionable recommendations\n5. Generate comprehensive markdown documentation\n\n**OUTPUT REQUIREMENTS**:\n- Use clear markdown formatting\n- Include code examples from the project\n- Organize findings by category\n- Prioritize actionable insights\n\nAfter completing:\n\\`\\`\\`bash\nclaude-flow hooks post-task --task-id \"${agent.type}-analysis\"\n\\`\\`\\`\n`;\n }\n\n /**\n * Run claude-flow agent\n */\n private async runClaudeFlowAgent(type: string, prompt: string): Promise<string> {\n // Security: Validate agent type against allowlist to prevent command injection\n if (!VALID_AGENT_TYPES.has(type)) {\n throw new Error(`Invalid agent type: ${type}. Valid types: ${[...VALID_AGENT_TYPES].join(', ')}`);\n }\n\n // Security: Sanitize prompt to prevent injection via shell metacharacters\n const sanitizedPrompt = prompt.replace(/[`$\\\\]/g, '');\n\n // Get the detected command configuration\n const commandConfig = await this.detectClaudeFlowCommand();\n if (!commandConfig) {\n throw new Error('claude-flow is not available');\n }\n\n return new Promise((resolve, reject) => {\n // Build args based on detected command\n const args = [...commandConfig.args, 'agent', 'execute', type, sanitizedPrompt, '--json'];\n\n const proc = spawn(commandConfig.cmd, args, {\n cwd: this.projectRoot,\n shell: false, // Security: Disable shell to prevent command injection\n timeout: this.agentTimeout,\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr || `Agent exited with code ${code}`));\n }\n });\n\n proc.on('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Extract insights from agent output\n */\n private extractInsights(output: string): string[] {\n const insights: string[] = [];\n\n // Look for patterns like \"- Insight:\" or \"## Finding:\"\n const patterns = [\n /[-*]\\s*(?:insight|finding|observation|recommendation):\\s*(.+)/gi,\n /##\\s*(?:insight|finding|observation|recommendation):\\s*(.+)/gi,\n /(?:key\\s+)?(?:insight|finding|observation|recommendation):\\s*(.+)/gi,\n ];\n\n for (const pattern of patterns) {\n const matches = output.matchAll(pattern);\n for (const match of matches) {\n if (match[1]) {\n insights.push(match[1].trim());\n }\n }\n }\n\n // Deduplicate\n return [...new Set(insights)];\n }\n\n /**\n * Format output for documentation\n */\n private formatOutput(agent: AgentConfig, output: string): string {\n const timestamp = new Date().toISOString();\n\n return `---\ntitle: \"${agent.name} Analysis\"\ntype: analysis\ngenerator: deep-analyzer\nagent: ${agent.type}\ncreated: ${timestamp}\n---\n\n# ${agent.name} Analysis\n\n> Generated by DeepAnalyzer using claude-flow\n\n## Overview\n\n${agent.task}\n\n## Analysis\n\n${output}\n\n---\n\n*Generated on ${new Date().toLocaleString()}*\n`;\n }\n}\n\n/**\n * Create a deep analyzer instance\n */\nexport function createDeepAnalyzer(options: DeepAnalyzerOptions): DeepAnalyzer {\n return new DeepAnalyzer(options);\n}\n\n/**\n * Run deep analysis on a project\n */\nexport async function analyzeDeep(\n projectRoot: string,\n docsPath?: string\n): Promise<DeepAnalysisResult> {\n const analyzer = new DeepAnalyzer({ projectRoot, docsPath });\n return analyzer.analyze();\n}\n"],"names":["resolve"],"mappings":"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"}
@@ -79,7 +79,7 @@ This project uses claude-flow for AI coordination:
79
79
  ### MCP Configuration
80
80
 
81
81
  \`\`\`bash
82
- claude mcp add claude-flow npx claude-flow@alpha mcp start
82
+ claude mcp add claude-flow npx claude-flow mcp start
83
83
  \`\`\`
84
84
 
85
85
  ### Memory Namespace
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.js","sources":["../../src/generators/claude-md.ts"],"sourcesContent":["/**\n * CLAUDE.md Generator\n *\n * Generates and manages CLAUDE.md configuration files for Claude Code\n * with knowledge graph integration.\n *\n * SECURITY NOTES (Handlebars Templates):\n * - All templates use double-braces {{}} which HTML-escapes output\n * - Triple-braces {{{raw}}} are NOT used, preventing XSS in HTML contexts\n * - User input is sanitized via sanitizeTemplateInput() before template use\n * - Template content is validated and Handlebars delimiters are stripped from user input\n * - See: https://handlebarsjs.com/guide/#html-escaping\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, basename, resolve, normalize } from 'path';\nimport Handlebars from 'handlebars';\nimport type {\n ClaudeMdGeneratorOptions,\n ClaudeMdSection,\n ClaudeMdTemplate,\n} from '../core/types.js';\n\n/**\n * Validate that a template path is within the project directory\n * and is a markdown file\n */\nfunction validateTemplatePath(projectRoot: string, templatePath: string): string | null {\n // Resolve both paths to absolute\n const resolvedRoot = resolve(projectRoot);\n const resolvedTemplate = resolve(projectRoot, templatePath);\n const normalizedTemplate = normalize(resolvedTemplate);\n\n // Ensure template is within project directory\n if (!normalizedTemplate.startsWith(resolvedRoot + '/') && normalizedTemplate !== resolvedRoot) {\n return null; // Path traversal attempt\n }\n\n // Must be a markdown file\n if (!normalizedTemplate.endsWith('.md')) {\n return null;\n }\n\n return normalizedTemplate;\n}\n\n/**\n * Default CLAUDE.md template with knowledge graph integration\n */\nconst DEFAULT_TEMPLATE = `# Claude Code Configuration - {{projectName}}\n\n## Project Overview\n\n{{description}}\n\n## Knowledge Graph Integration\n\nThis project uses @weavelogic/knowledge-graph-agent for documentation and planning.\n\n### Quick Commands\n\n\\`\\`\\`bash\n# Initialize knowledge graph\nnpx kg init\n\n# Generate/update graph from docs\nnpx kg graph\n\n# Sync with claude-flow memory\nnpx kg sync\n\n# Initialize docs directory\nnpx kg docs init\n\n# Update CLAUDE.md\nnpx kg claude update\n\\`\\`\\`\n\n### Vault Location\n\nDocumentation is stored in: \\`{{docsPath}}\\`\n\n## File Organization\n\n{{#if customDirectories}}\n{{#each customDirectories}}\n- \\`{{this.path}}\\` - {{this.description}}\n{{/each}}\n{{else}}\n- \\`/src\\` - Source code files\n- \\`/docs\\` - Documentation and knowledge base\n- \\`/tests\\` - Test files\n- \\`/config\\` - Configuration files\n{{/if}}\n\n## Build Commands\n\n{{#each buildCommands}}\n- \\`{{this.command}}\\` - {{this.description}}\n{{/each}}\n\n## Code Style & Best Practices\n\n{{#each codeStyleRules}}\n- **{{this.name}}**: {{this.description}}\n{{/each}}\n\n{{#if includeClaudeFlow}}\n## Claude-Flow Integration\n\nThis project uses claude-flow for AI coordination:\n\n### MCP Configuration\n\n\\`\\`\\`bash\nclaude mcp add claude-flow npx claude-flow@alpha mcp start\n\\`\\`\\`\n\n### Memory Namespace\n\n- **Namespace**: \\`{{namespace}}\\`\n- **Sync on change**: {{syncOnChange}}\n\n### Available Tools\n\n- \\`mcp__claude-flow__memory_usage\\` - Store/retrieve knowledge\n- \\`mcp__claude-flow__swarm_init\\` - Initialize agent swarms\n- \\`mcp__claude-flow__task_orchestrate\\` - Coordinate tasks\n\n{{/if}}\n{{#if includeKnowledgeGraph}}\n## Knowledge Graph Commands\n\nThe knowledge graph provides semantic navigation of the codebase:\n\n### CLI Commands\n\n| Command | Description |\n|---------|-------------|\n| \\`kg init\\` | Initialize knowledge graph in project |\n| \\`kg graph\\` | Generate/update knowledge graph |\n| \\`kg docs init\\` | Initialize docs directory |\n| \\`kg docs generate\\` | Generate docs from codebase |\n| \\`kg claude update\\` | Update CLAUDE.md |\n| \\`kg sync\\` | Sync with claude-flow memory |\n| \\`kg stats\\` | Show graph statistics |\n| \\`kg search <query>\\` | Search the knowledge graph |\n\n### Graph Structure\n\n\\`\\`\\`\n{{docsPath}}/\n├── concepts/ # Abstract concepts\n├── components/ # Reusable components\n├── services/ # Backend services\n├── features/ # Product features\n├── integrations/ # External integrations\n├── standards/ # Coding standards\n├── guides/ # How-to guides\n└── references/ # API references\n\\`\\`\\`\n\n{{/if}}\n{{#if customSections}}\n{{#each customSections}}\n## {{this.title}}\n\n{{this.content}}\n\n{{/each}}\n{{/if}}\n## Important Instructions\n\n- NEVER create files unless absolutely necessary\n- ALWAYS prefer editing existing files\n- Use the knowledge graph for documentation\n- Follow the file organization above\n- Run tests before committing\n\n---\n*Generated by @weavelogic/knowledge-graph-agent*\n`;\n\n/**\n * Section templates for common configurations\n */\nconst SECTION_TEMPLATES: Record<string, ClaudeMdSection> = {\n sparc: {\n title: 'SPARC Methodology',\n order: 10,\n content: `This project follows the SPARC development methodology:\n\n1. **Specification** - Requirements analysis\n2. **Pseudocode** - Algorithm design\n3. **Architecture** - System design\n4. **Refinement** - TDD implementation\n5. **Completion** - Integration\n\n### SPARC Commands\n\n\\`\\`\\`bash\nnpx claude-flow sparc modes # List available modes\nnpx claude-flow sparc tdd \"<task>\" # Run TDD workflow\nnpx claude-flow sparc run <mode> # Execute specific mode\n\\`\\`\\``,\n },\n\n testing: {\n title: 'Testing Requirements',\n order: 20,\n content: `All code changes must include appropriate tests:\n\n- **Unit tests**: For individual functions and components\n- **Integration tests**: For API endpoints and services\n- **E2E tests**: For critical user flows\n\n### Running Tests\n\n\\`\\`\\`bash\nnpm run test # Run all tests\nnpm run test:watch # Watch mode\nnpm run test:cov # With coverage\n\\`\\`\\``,\n },\n\n security: {\n title: 'Security Guidelines',\n order: 30,\n content: `Security is a priority. Follow these guidelines:\n\n- Never hardcode secrets or API keys\n- Use environment variables for sensitive data\n- Validate all user inputs\n- Sanitize outputs to prevent XSS\n- Follow OWASP guidelines`,\n },\n\n agents: {\n title: 'Available Agents',\n order: 40,\n content: `Use Claude Code's Task tool to spawn specialized agents:\n\n### Core Agents\n\\`coder\\`, \\`reviewer\\`, \\`tester\\`, \\`planner\\`, \\`researcher\\`\n\n### SPARC Agents\n\\`sparc-coord\\`, \\`sparc-coder\\`, \\`specification\\`, \\`architecture\\`\n\n### Specialized Agents\n\\`backend-dev\\`, \\`system-architect\\`, \\`code-analyzer\\`, \\`api-docs\\`\n\n### Usage\n\n\\`\\`\\`javascript\nTask(\"Implement feature\", \"Description...\", \"coder\")\nTask(\"Review code\", \"Description...\", \"reviewer\")\n\\`\\`\\``,\n },\n};\n\n/**\n * Generate CLAUDE.md content\n */\nexport function generateClaudeMd(options: ClaudeMdGeneratorOptions): string {\n const {\n projectRoot,\n template,\n includeKnowledgeGraph = true,\n includeClaudeFlow = true,\n customSections = [],\n } = options;\n\n // Detect project info\n const projectInfo = detectProjectInfo(projectRoot);\n\n // Prepare context\n const context = {\n projectName: projectInfo.name,\n description: projectInfo.description || `${projectInfo.name} project`,\n docsPath: getDocsPath(projectRoot),\n includeKnowledgeGraph,\n includeClaudeFlow,\n namespace: 'knowledge-graph',\n syncOnChange: true,\n buildCommands: projectInfo.scripts,\n codeStyleRules: getDefaultCodeStyleRules(),\n customSections: [...customSections],\n customDirectories: null,\n };\n\n // Get template content (pass projectRoot for path validation)\n const templateContent = template ? getTemplateContent(template, projectRoot) : DEFAULT_TEMPLATE;\n\n // Compile and render\n const compiled = Handlebars.compile(templateContent);\n return compiled(context);\n}\n\n/**\n * Create or update CLAUDE.md file\n */\nexport async function updateClaudeMd(options: ClaudeMdGeneratorOptions): Promise<{\n created: boolean;\n updated: boolean;\n path: string;\n content: string;\n}> {\n const { projectRoot, outputPath } = options;\n const filePath = outputPath || join(projectRoot, 'CLAUDE.md');\n\n const exists = existsSync(filePath);\n const content = generateClaudeMd(options);\n\n writeFileSync(filePath, content, 'utf-8');\n\n return {\n created: !exists,\n updated: exists,\n path: filePath,\n content,\n };\n}\n\n/**\n * Add section to existing CLAUDE.md\n */\nexport function addSection(\n projectRoot: string,\n section: ClaudeMdSection\n): boolean {\n const filePath = join(projectRoot, 'CLAUDE.md');\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n const content = readFileSync(filePath, 'utf-8');\n\n // Check if section already exists\n const sectionRegex = new RegExp(`^## ${section.title}`, 'm');\n if (sectionRegex.test(content)) {\n return false; // Section already exists\n }\n\n // Find the best position to insert (before Important Instructions or at end)\n const importantMatch = content.match(/^## Important Instructions/m);\n let newContent: string;\n\n const sectionContent = `\\n## ${section.title}\\n\\n${section.content}\\n`;\n\n if (importantMatch && importantMatch.index !== undefined) {\n newContent =\n content.slice(0, importantMatch.index) +\n sectionContent +\n '\\n' +\n content.slice(importantMatch.index);\n } else {\n newContent = content + sectionContent;\n }\n\n writeFileSync(filePath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Get predefined section template\n */\nexport function getSectionTemplate(name: string): ClaudeMdSection | null {\n return SECTION_TEMPLATES[name] || null;\n}\n\n/**\n * List available section templates\n */\nexport function listSectionTemplates(): string[] {\n return Object.keys(SECTION_TEMPLATES);\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ninterface ProjectInfo {\n name: string;\n description?: string;\n scripts: Array<{ command: string; description: string }>;\n}\n\n/**\n * Sanitize string for safe template use\n * Prevents template injection and removes dangerous characters\n */\nfunction sanitizeForTemplate(str: string | undefined, maxLength = 200): string {\n if (!str || typeof str !== 'string') return '';\n return str\n .replace(/[<>&\"'`{}\\\\]/g, '') // Remove template-sensitive chars\n .replace(/\\{\\{/g, '') // Remove Handlebars delimiters\n .replace(/\\}\\}/g, '')\n .slice(0, maxLength)\n .trim();\n}\n\nfunction detectProjectInfo(projectRoot: string): ProjectInfo {\n const info: ProjectInfo = {\n name: sanitizeForTemplate(basename(projectRoot), 100) || 'project',\n scripts: [],\n };\n\n try {\n const pkgPath = join(projectRoot, 'package.json');\n if (existsSync(pkgPath)) {\n let pkg;\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n } catch {\n return info; // Return default info on JSON parse error\n }\n\n // Sanitize project name\n const rawName = (pkg.name || basename(projectRoot)).replace(/^@[^/]+\\//, '');\n info.name = sanitizeForTemplate(rawName, 100) || 'project';\n\n // Sanitize description\n info.description = sanitizeForTemplate(pkg.description, 500);\n\n // Extract common scripts (sanitize script names)\n if (pkg.scripts && typeof pkg.scripts === 'object') {\n const commonScripts = ['build', 'test', 'dev', 'start', 'lint', 'typecheck'];\n for (const script of commonScripts) {\n if (pkg.scripts[script] && typeof pkg.scripts[script] === 'string') {\n info.scripts.push({\n command: `npm run ${script}`,\n description: sanitizeForTemplate(\n getScriptDescription(script, pkg.scripts[script]),\n 200\n ),\n });\n }\n }\n }\n }\n } catch {\n // Ignore errors - return default info\n }\n\n // Add default scripts if none found\n if (info.scripts.length === 0) {\n info.scripts = [\n { command: 'npm run build', description: 'Build the project' },\n { command: 'npm run test', description: 'Run tests' },\n { command: 'npm run dev', description: 'Development mode' },\n ];\n }\n\n return info;\n}\n\nfunction getScriptDescription(name: string, script: string): string {\n const descriptions: Record<string, string> = {\n build: 'Build the project',\n test: 'Run tests',\n dev: 'Start development server',\n start: 'Start production server',\n lint: 'Run linter',\n typecheck: 'Type checking',\n };\n\n return descriptions[name] || `Run ${name}`;\n}\n\nfunction getDocsPath(projectRoot: string): string {\n const possiblePaths = ['docs', 'documentation', 'doc'];\n\n for (const path of possiblePaths) {\n if (existsSync(join(projectRoot, path))) {\n return path;\n }\n }\n\n return 'docs';\n}\n\nfunction getDefaultCodeStyleRules(): Array<{ name: string; description: string }> {\n return [\n { name: 'Modular Design', description: 'Files under 500 lines' },\n { name: 'Environment Safety', description: 'Never hardcode secrets' },\n { name: 'Test-First', description: 'Write tests before implementation' },\n { name: 'Clean Architecture', description: 'Separate concerns' },\n { name: 'Documentation', description: 'Keep docs updated' },\n ];\n}\n\nfunction getTemplateContent(templateName: string, projectRoot?: string): string {\n // Check for built-in templates\n if (templateName === 'minimal') {\n return `# {{projectName}}\n\n{{description}}\n\n## Commands\n\n{{#each buildCommands}}\n- \\`{{this.command}}\\` - {{this.description}}\n{{/each}}\n\n---\n*Generated by @weavelogic/knowledge-graph-agent*\n`;\n }\n\n if (templateName === 'full') {\n // Add all sections\n let content = DEFAULT_TEMPLATE;\n for (const section of Object.values(SECTION_TEMPLATES)) {\n content = content.replace(\n /^## Important Instructions/m,\n `## ${section.title}\\n\\n${section.content}\\n\\n## Important Instructions`\n );\n }\n return content;\n }\n\n // Try to read as file path - only if within project directory\n if (projectRoot && (templateName.includes('/') || templateName.includes('.'))) {\n const validatedPath = validateTemplatePath(projectRoot, templateName);\n if (validatedPath && existsSync(validatedPath)) {\n return readFileSync(validatedPath, 'utf-8');\n }\n }\n\n return DEFAULT_TEMPLATE;\n}\n"],"names":[],"mappings":";;;AA2BA,SAAS,qBAAqB,aAAqB,cAAqC;AAEtF,QAAM,eAAe,QAAQ,WAAW;AACxC,QAAM,mBAAmB,QAAQ,aAAa,YAAY;AAC1D,QAAM,qBAAqB,UAAU,gBAAgB;AAGrD,MAAI,CAAC,mBAAmB,WAAW,eAAe,GAAG,KAAK,uBAAuB,cAAc;AAC7F,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,mBAAmB,SAAS,KAAK,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyIzB,MAAM,oBAAqD;AAAA,EACzD,OAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAiBX,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAeX,UAAU;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EASX,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAkBb;AAKO,SAAS,iBAAiB,SAA2C;AAC1E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,wBAAwB;AAAA,IACxB,oBAAoB;AAAA,IACpB,iBAAiB,CAAA;AAAA,EAAC,IAChB;AAGJ,QAAM,cAAc,kBAAkB,WAAW;AAGjD,QAAM,UAAU;AAAA,IACd,aAAa,YAAY;AAAA,IACzB,aAAa,YAAY,eAAe,GAAG,YAAY,IAAI;AAAA,IAC3D,UAAU,YAAY,WAAW;AAAA,IACjC;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe,YAAY;AAAA,IAC3B,gBAAgB,yBAAA;AAAA,IAChB,gBAAgB,CAAC,GAAG,cAAc;AAAA,IAClC,mBAAmB;AAAA,EAAA;AAIrB,QAAM,kBAAkB,WAAW,mBAAmB,UAAU,WAAW,IAAI;AAG/E,QAAM,WAAW,WAAW,QAAQ,eAAe;AACnD,SAAO,SAAS,OAAO;AACzB;AAKA,eAAsB,eAAe,SAKlC;AACD,QAAM,EAAE,aAAa,WAAA,IAAe;AACpC,QAAM,WAAW,cAAc,KAAK,aAAa,WAAW;AAE5D,QAAM,SAAS,WAAW,QAAQ;AAClC,QAAM,UAAU,iBAAiB,OAAO;AAExC,gBAAc,UAAU,SAAS,OAAO;AAExC,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,EAAA;AAEJ;AAKO,SAAS,WACd,aACA,SACS;AACT,QAAM,WAAW,KAAK,aAAa,WAAW;AAE9C,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,aAAa,UAAU,OAAO;AAG9C,QAAM,eAAe,IAAI,OAAO,OAAO,QAAQ,KAAK,IAAI,GAAG;AAC3D,MAAI,aAAa,KAAK,OAAO,GAAG;AAC9B,WAAO;AAAA,EACT;AAGA,QAAM,iBAAiB,QAAQ,MAAM,6BAA6B;AAClE,MAAI;AAEJ,QAAM,iBAAiB;AAAA,KAAQ,QAAQ,KAAK;AAAA;AAAA,EAAO,QAAQ,OAAO;AAAA;AAElE,MAAI,kBAAkB,eAAe,UAAU,QAAW;AACxD,iBACE,QAAQ,MAAM,GAAG,eAAe,KAAK,IACrC,iBACA,OACA,QAAQ,MAAM,eAAe,KAAK;AAAA,EACtC,OAAO;AACL,iBAAa,UAAU;AAAA,EACzB;AAEA,gBAAc,UAAU,YAAY,OAAO;AAC3C,SAAO;AACT;AAKO,SAAS,mBAAmB,MAAsC;AACvE,SAAO,kBAAkB,IAAI,KAAK;AACpC;AAKO,SAAS,uBAAiC;AAC/C,SAAO,OAAO,KAAK,iBAAiB;AACtC;AAgBA,SAAS,oBAAoB,KAAyB,YAAY,KAAa;AAC7E,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,SAAO,IACJ,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,SAAS,EAAE,EACnB,QAAQ,SAAS,EAAE,EACnB,MAAM,GAAG,SAAS,EAClB,KAAA;AACL;AAEA,SAAS,kBAAkB,aAAkC;AAC3D,QAAM,OAAoB;AAAA,IACxB,MAAM,oBAAoB,SAAS,WAAW,GAAG,GAAG,KAAK;AAAA,IACzD,SAAS,CAAA;AAAA,EAAC;AAGZ,MAAI;AACF,UAAM,UAAU,KAAK,aAAa,cAAc;AAChD,QAAI,WAAW,OAAO,GAAG;AACvB,UAAI;AACJ,UAAI;AACF,cAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AAAA,MACjD,QAAQ;AACN,eAAO;AAAA,MACT;AAGA,YAAM,WAAW,IAAI,QAAQ,SAAS,WAAW,GAAG,QAAQ,aAAa,EAAE;AAC3E,WAAK,OAAO,oBAAoB,SAAS,GAAG,KAAK;AAGjD,WAAK,cAAc,oBAAoB,IAAI,aAAa,GAAG;AAG3D,UAAI,IAAI,WAAW,OAAO,IAAI,YAAY,UAAU;AAClD,cAAM,gBAAgB,CAAC,SAAS,QAAQ,OAAO,SAAS,QAAQ,WAAW;AAC3E,mBAAW,UAAU,eAAe;AAClC,cAAI,IAAI,QAAQ,MAAM,KAAK,OAAO,IAAI,QAAQ,MAAM,MAAM,UAAU;AAClE,iBAAK,QAAQ,KAAK;AAAA,cAChB,SAAS,WAAW,MAAM;AAAA,cAC1B,aAAa;AAAA,gBACX,qBAAqB,QAAQ,IAAI,QAAQ,MAAM,CAAC;AAAA,gBAChD;AAAA,cAAA;AAAA,YACF,CACD;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,SAAK,UAAU;AAAA,MACb,EAAE,SAAS,iBAAiB,aAAa,oBAAA;AAAA,MACzC,EAAE,SAAS,gBAAgB,aAAa,YAAA;AAAA,MACxC,EAAE,SAAS,eAAe,aAAa,mBAAA;AAAA,IAAmB;AAAA,EAE9D;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAc,QAAwB;AAClE,QAAM,eAAuC;AAAA,IAC3C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAGb,SAAO,aAAa,IAAI,KAAK,OAAO,IAAI;AAC1C;AAEA,SAAS,YAAY,aAA6B;AAChD,QAAM,gBAAgB,CAAC,QAAQ,iBAAiB,KAAK;AAErD,aAAW,QAAQ,eAAe;AAChC,QAAI,WAAW,KAAK,aAAa,IAAI,CAAC,GAAG;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BAAyE;AAChF,SAAO;AAAA,IACL,EAAE,MAAM,kBAAkB,aAAa,wBAAA;AAAA,IACvC,EAAE,MAAM,sBAAsB,aAAa,yBAAA;AAAA,IAC3C,EAAE,MAAM,cAAc,aAAa,oCAAA;AAAA,IACnC,EAAE,MAAM,sBAAsB,aAAa,oBAAA;AAAA,IAC3C,EAAE,MAAM,iBAAiB,aAAa,oBAAA;AAAA,EAAoB;AAE9D;AAEA,SAAS,mBAAmB,cAAsB,aAA8B;AAE9E,MAAI,iBAAiB,WAAW;AAC9B,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaT;AAEA,MAAI,iBAAiB,QAAQ;AAE3B,QAAI,UAAU;AACd,eAAW,WAAW,OAAO,OAAO,iBAAiB,GAAG;AACtD,gBAAU,QAAQ;AAAA,QAChB;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA;AAAA,EAAO,QAAQ,OAAO;AAAA;AAAA;AAAA,MAAA;AAAA,IAE7C;AACA,WAAO;AAAA,EACT;AAGA,MAAI,gBAAgB,aAAa,SAAS,GAAG,KAAK,aAAa,SAAS,GAAG,IAAI;AAC7E,UAAM,gBAAgB,qBAAqB,aAAa,YAAY;AACpE,QAAI,iBAAiB,WAAW,aAAa,GAAG;AAC9C,aAAO,aAAa,eAAe,OAAO;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"claude-md.js","sources":["../../src/generators/claude-md.ts"],"sourcesContent":["/**\n * CLAUDE.md Generator\n *\n * Generates and manages CLAUDE.md configuration files for Claude Code\n * with knowledge graph integration.\n *\n * SECURITY NOTES (Handlebars Templates):\n * - All templates use double-braces {{}} which HTML-escapes output\n * - Triple-braces {{{raw}}} are NOT used, preventing XSS in HTML contexts\n * - User input is sanitized via sanitizeTemplateInput() before template use\n * - Template content is validated and Handlebars delimiters are stripped from user input\n * - See: https://handlebarsjs.com/guide/#html-escaping\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, basename, resolve, normalize } from 'path';\nimport Handlebars from 'handlebars';\nimport type {\n ClaudeMdGeneratorOptions,\n ClaudeMdSection,\n ClaudeMdTemplate,\n} from '../core/types.js';\n\n/**\n * Validate that a template path is within the project directory\n * and is a markdown file\n */\nfunction validateTemplatePath(projectRoot: string, templatePath: string): string | null {\n // Resolve both paths to absolute\n const resolvedRoot = resolve(projectRoot);\n const resolvedTemplate = resolve(projectRoot, templatePath);\n const normalizedTemplate = normalize(resolvedTemplate);\n\n // Ensure template is within project directory\n if (!normalizedTemplate.startsWith(resolvedRoot + '/') && normalizedTemplate !== resolvedRoot) {\n return null; // Path traversal attempt\n }\n\n // Must be a markdown file\n if (!normalizedTemplate.endsWith('.md')) {\n return null;\n }\n\n return normalizedTemplate;\n}\n\n/**\n * Default CLAUDE.md template with knowledge graph integration\n */\nconst DEFAULT_TEMPLATE = `# Claude Code Configuration - {{projectName}}\n\n## Project Overview\n\n{{description}}\n\n## Knowledge Graph Integration\n\nThis project uses @weavelogic/knowledge-graph-agent for documentation and planning.\n\n### Quick Commands\n\n\\`\\`\\`bash\n# Initialize knowledge graph\nnpx kg init\n\n# Generate/update graph from docs\nnpx kg graph\n\n# Sync with claude-flow memory\nnpx kg sync\n\n# Initialize docs directory\nnpx kg docs init\n\n# Update CLAUDE.md\nnpx kg claude update\n\\`\\`\\`\n\n### Vault Location\n\nDocumentation is stored in: \\`{{docsPath}}\\`\n\n## File Organization\n\n{{#if customDirectories}}\n{{#each customDirectories}}\n- \\`{{this.path}}\\` - {{this.description}}\n{{/each}}\n{{else}}\n- \\`/src\\` - Source code files\n- \\`/docs\\` - Documentation and knowledge base\n- \\`/tests\\` - Test files\n- \\`/config\\` - Configuration files\n{{/if}}\n\n## Build Commands\n\n{{#each buildCommands}}\n- \\`{{this.command}}\\` - {{this.description}}\n{{/each}}\n\n## Code Style & Best Practices\n\n{{#each codeStyleRules}}\n- **{{this.name}}**: {{this.description}}\n{{/each}}\n\n{{#if includeClaudeFlow}}\n## Claude-Flow Integration\n\nThis project uses claude-flow for AI coordination:\n\n### MCP Configuration\n\n\\`\\`\\`bash\nclaude mcp add claude-flow npx claude-flow mcp start\n\\`\\`\\`\n\n### Memory Namespace\n\n- **Namespace**: \\`{{namespace}}\\`\n- **Sync on change**: {{syncOnChange}}\n\n### Available Tools\n\n- \\`mcp__claude-flow__memory_usage\\` - Store/retrieve knowledge\n- \\`mcp__claude-flow__swarm_init\\` - Initialize agent swarms\n- \\`mcp__claude-flow__task_orchestrate\\` - Coordinate tasks\n\n{{/if}}\n{{#if includeKnowledgeGraph}}\n## Knowledge Graph Commands\n\nThe knowledge graph provides semantic navigation of the codebase:\n\n### CLI Commands\n\n| Command | Description |\n|---------|-------------|\n| \\`kg init\\` | Initialize knowledge graph in project |\n| \\`kg graph\\` | Generate/update knowledge graph |\n| \\`kg docs init\\` | Initialize docs directory |\n| \\`kg docs generate\\` | Generate docs from codebase |\n| \\`kg claude update\\` | Update CLAUDE.md |\n| \\`kg sync\\` | Sync with claude-flow memory |\n| \\`kg stats\\` | Show graph statistics |\n| \\`kg search <query>\\` | Search the knowledge graph |\n\n### Graph Structure\n\n\\`\\`\\`\n{{docsPath}}/\n├── concepts/ # Abstract concepts\n├── components/ # Reusable components\n├── services/ # Backend services\n├── features/ # Product features\n├── integrations/ # External integrations\n├── standards/ # Coding standards\n├── guides/ # How-to guides\n└── references/ # API references\n\\`\\`\\`\n\n{{/if}}\n{{#if customSections}}\n{{#each customSections}}\n## {{this.title}}\n\n{{this.content}}\n\n{{/each}}\n{{/if}}\n## Important Instructions\n\n- NEVER create files unless absolutely necessary\n- ALWAYS prefer editing existing files\n- Use the knowledge graph for documentation\n- Follow the file organization above\n- Run tests before committing\n\n---\n*Generated by @weavelogic/knowledge-graph-agent*\n`;\n\n/**\n * Section templates for common configurations\n */\nconst SECTION_TEMPLATES: Record<string, ClaudeMdSection> = {\n sparc: {\n title: 'SPARC Methodology',\n order: 10,\n content: `This project follows the SPARC development methodology:\n\n1. **Specification** - Requirements analysis\n2. **Pseudocode** - Algorithm design\n3. **Architecture** - System design\n4. **Refinement** - TDD implementation\n5. **Completion** - Integration\n\n### SPARC Commands\n\n\\`\\`\\`bash\nnpx claude-flow sparc modes # List available modes\nnpx claude-flow sparc tdd \"<task>\" # Run TDD workflow\nnpx claude-flow sparc run <mode> # Execute specific mode\n\\`\\`\\``,\n },\n\n testing: {\n title: 'Testing Requirements',\n order: 20,\n content: `All code changes must include appropriate tests:\n\n- **Unit tests**: For individual functions and components\n- **Integration tests**: For API endpoints and services\n- **E2E tests**: For critical user flows\n\n### Running Tests\n\n\\`\\`\\`bash\nnpm run test # Run all tests\nnpm run test:watch # Watch mode\nnpm run test:cov # With coverage\n\\`\\`\\``,\n },\n\n security: {\n title: 'Security Guidelines',\n order: 30,\n content: `Security is a priority. Follow these guidelines:\n\n- Never hardcode secrets or API keys\n- Use environment variables for sensitive data\n- Validate all user inputs\n- Sanitize outputs to prevent XSS\n- Follow OWASP guidelines`,\n },\n\n agents: {\n title: 'Available Agents',\n order: 40,\n content: `Use Claude Code's Task tool to spawn specialized agents:\n\n### Core Agents\n\\`coder\\`, \\`reviewer\\`, \\`tester\\`, \\`planner\\`, \\`researcher\\`\n\n### SPARC Agents\n\\`sparc-coord\\`, \\`sparc-coder\\`, \\`specification\\`, \\`architecture\\`\n\n### Specialized Agents\n\\`backend-dev\\`, \\`system-architect\\`, \\`code-analyzer\\`, \\`api-docs\\`\n\n### Usage\n\n\\`\\`\\`javascript\nTask(\"Implement feature\", \"Description...\", \"coder\")\nTask(\"Review code\", \"Description...\", \"reviewer\")\n\\`\\`\\``,\n },\n};\n\n/**\n * Generate CLAUDE.md content\n */\nexport function generateClaudeMd(options: ClaudeMdGeneratorOptions): string {\n const {\n projectRoot,\n template,\n includeKnowledgeGraph = true,\n includeClaudeFlow = true,\n customSections = [],\n } = options;\n\n // Detect project info\n const projectInfo = detectProjectInfo(projectRoot);\n\n // Prepare context\n const context = {\n projectName: projectInfo.name,\n description: projectInfo.description || `${projectInfo.name} project`,\n docsPath: getDocsPath(projectRoot),\n includeKnowledgeGraph,\n includeClaudeFlow,\n namespace: 'knowledge-graph',\n syncOnChange: true,\n buildCommands: projectInfo.scripts,\n codeStyleRules: getDefaultCodeStyleRules(),\n customSections: [...customSections],\n customDirectories: null,\n };\n\n // Get template content (pass projectRoot for path validation)\n const templateContent = template ? getTemplateContent(template, projectRoot) : DEFAULT_TEMPLATE;\n\n // Compile and render\n const compiled = Handlebars.compile(templateContent);\n return compiled(context);\n}\n\n/**\n * Create or update CLAUDE.md file\n */\nexport async function updateClaudeMd(options: ClaudeMdGeneratorOptions): Promise<{\n created: boolean;\n updated: boolean;\n path: string;\n content: string;\n}> {\n const { projectRoot, outputPath } = options;\n const filePath = outputPath || join(projectRoot, 'CLAUDE.md');\n\n const exists = existsSync(filePath);\n const content = generateClaudeMd(options);\n\n writeFileSync(filePath, content, 'utf-8');\n\n return {\n created: !exists,\n updated: exists,\n path: filePath,\n content,\n };\n}\n\n/**\n * Add section to existing CLAUDE.md\n */\nexport function addSection(\n projectRoot: string,\n section: ClaudeMdSection\n): boolean {\n const filePath = join(projectRoot, 'CLAUDE.md');\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n const content = readFileSync(filePath, 'utf-8');\n\n // Check if section already exists\n const sectionRegex = new RegExp(`^## ${section.title}`, 'm');\n if (sectionRegex.test(content)) {\n return false; // Section already exists\n }\n\n // Find the best position to insert (before Important Instructions or at end)\n const importantMatch = content.match(/^## Important Instructions/m);\n let newContent: string;\n\n const sectionContent = `\\n## ${section.title}\\n\\n${section.content}\\n`;\n\n if (importantMatch && importantMatch.index !== undefined) {\n newContent =\n content.slice(0, importantMatch.index) +\n sectionContent +\n '\\n' +\n content.slice(importantMatch.index);\n } else {\n newContent = content + sectionContent;\n }\n\n writeFileSync(filePath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Get predefined section template\n */\nexport function getSectionTemplate(name: string): ClaudeMdSection | null {\n return SECTION_TEMPLATES[name] || null;\n}\n\n/**\n * List available section templates\n */\nexport function listSectionTemplates(): string[] {\n return Object.keys(SECTION_TEMPLATES);\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ninterface ProjectInfo {\n name: string;\n description?: string;\n scripts: Array<{ command: string; description: string }>;\n}\n\n/**\n * Sanitize string for safe template use\n * Prevents template injection and removes dangerous characters\n */\nfunction sanitizeForTemplate(str: string | undefined, maxLength = 200): string {\n if (!str || typeof str !== 'string') return '';\n return str\n .replace(/[<>&\"'`{}\\\\]/g, '') // Remove template-sensitive chars\n .replace(/\\{\\{/g, '') // Remove Handlebars delimiters\n .replace(/\\}\\}/g, '')\n .slice(0, maxLength)\n .trim();\n}\n\nfunction detectProjectInfo(projectRoot: string): ProjectInfo {\n const info: ProjectInfo = {\n name: sanitizeForTemplate(basename(projectRoot), 100) || 'project',\n scripts: [],\n };\n\n try {\n const pkgPath = join(projectRoot, 'package.json');\n if (existsSync(pkgPath)) {\n let pkg;\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n } catch {\n return info; // Return default info on JSON parse error\n }\n\n // Sanitize project name\n const rawName = (pkg.name || basename(projectRoot)).replace(/^@[^/]+\\//, '');\n info.name = sanitizeForTemplate(rawName, 100) || 'project';\n\n // Sanitize description\n info.description = sanitizeForTemplate(pkg.description, 500);\n\n // Extract common scripts (sanitize script names)\n if (pkg.scripts && typeof pkg.scripts === 'object') {\n const commonScripts = ['build', 'test', 'dev', 'start', 'lint', 'typecheck'];\n for (const script of commonScripts) {\n if (pkg.scripts[script] && typeof pkg.scripts[script] === 'string') {\n info.scripts.push({\n command: `npm run ${script}`,\n description: sanitizeForTemplate(\n getScriptDescription(script, pkg.scripts[script]),\n 200\n ),\n });\n }\n }\n }\n }\n } catch {\n // Ignore errors - return default info\n }\n\n // Add default scripts if none found\n if (info.scripts.length === 0) {\n info.scripts = [\n { command: 'npm run build', description: 'Build the project' },\n { command: 'npm run test', description: 'Run tests' },\n { command: 'npm run dev', description: 'Development mode' },\n ];\n }\n\n return info;\n}\n\nfunction getScriptDescription(name: string, script: string): string {\n const descriptions: Record<string, string> = {\n build: 'Build the project',\n test: 'Run tests',\n dev: 'Start development server',\n start: 'Start production server',\n lint: 'Run linter',\n typecheck: 'Type checking',\n };\n\n return descriptions[name] || `Run ${name}`;\n}\n\nfunction getDocsPath(projectRoot: string): string {\n const possiblePaths = ['docs', 'documentation', 'doc'];\n\n for (const path of possiblePaths) {\n if (existsSync(join(projectRoot, path))) {\n return path;\n }\n }\n\n return 'docs';\n}\n\nfunction getDefaultCodeStyleRules(): Array<{ name: string; description: string }> {\n return [\n { name: 'Modular Design', description: 'Files under 500 lines' },\n { name: 'Environment Safety', description: 'Never hardcode secrets' },\n { name: 'Test-First', description: 'Write tests before implementation' },\n { name: 'Clean Architecture', description: 'Separate concerns' },\n { name: 'Documentation', description: 'Keep docs updated' },\n ];\n}\n\nfunction getTemplateContent(templateName: string, projectRoot?: string): string {\n // Check for built-in templates\n if (templateName === 'minimal') {\n return `# {{projectName}}\n\n{{description}}\n\n## Commands\n\n{{#each buildCommands}}\n- \\`{{this.command}}\\` - {{this.description}}\n{{/each}}\n\n---\n*Generated by @weavelogic/knowledge-graph-agent*\n`;\n }\n\n if (templateName === 'full') {\n // Add all sections\n let content = DEFAULT_TEMPLATE;\n for (const section of Object.values(SECTION_TEMPLATES)) {\n content = content.replace(\n /^## Important Instructions/m,\n `## ${section.title}\\n\\n${section.content}\\n\\n## Important Instructions`\n );\n }\n return content;\n }\n\n // Try to read as file path - only if within project directory\n if (projectRoot && (templateName.includes('/') || templateName.includes('.'))) {\n const validatedPath = validateTemplatePath(projectRoot, templateName);\n if (validatedPath && existsSync(validatedPath)) {\n return readFileSync(validatedPath, 'utf-8');\n }\n }\n\n return DEFAULT_TEMPLATE;\n}\n"],"names":[],"mappings":"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"}
@@ -354,8 +354,7 @@ async function executeCultivationSwarm(tasks, result, options) {
354
354
  }
355
355
  async function executeSwarmTask(task, options) {
356
356
  return new Promise((resolve) => {
357
- const agentProcess = spawn("npx", [
358
- "claude-flow@alpha",
357
+ const agentProcess = spawn("claude-flow", [
359
358
  "agent",
360
359
  "spawn",
361
360
  "--type",
@@ -364,7 +363,7 @@ async function executeSwarmTask(task, options) {
364
363
  task.prompt.slice(0, 1e3)
365
364
  // Truncate for CLI
366
365
  ], {
367
- shell: true,
366
+ shell: false,
368
367
  timeout: 12e4
369
368
  });
370
369
  let output = "";