@weavelogic/knowledge-graph-agent 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -2
- package/dist/_virtual/index10.js +2 -2
- package/dist/_virtual/index11.js +2 -2
- package/dist/_virtual/index8.js +2 -2
- package/dist/_virtual/index9.js +2 -2
- package/dist/cli/commands/analyze.js +3 -3
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/convert.js +1 -1
- package/dist/cli/commands/convert.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/docs-analyzer.d.ts +2 -2
- package/dist/generators/docs-analyzer.d.ts.map +1 -1
- package/dist/generators/docs-analyzer.js +1 -1
- package/dist/generators/docs-analyzer.js.map +1 -1
- package/dist/generators/docs-convert.d.ts +1 -1
- package/dist/generators/docs-convert.d.ts.map +1 -1
- package/dist/generators/docs-convert.js +1 -1
- package/dist/generators/docs-convert.js.map +1 -1
- package/dist/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/dist/commonjs/index.js +1 -1
- package/dist/node_modules/fdir/dist/index.js +1 -1
- package/dist/node_modules/tinyglobby/dist/index.js +1 -1
- package/dist/node_modules/ts-api-utils/lib/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,8 +10,9 @@ A powerful NPM library for creating and managing knowledge graphs for Claude Cod
|
|
|
10
10
|
| Category | Features |
|
|
11
11
|
|----------|----------|
|
|
12
12
|
| **Core** | Knowledge graph generation, Obsidian integration, CLAUDE.md management |
|
|
13
|
-
| **Cultivation** | Codebase analysis, seed generation, deep analysis with claude-flow |
|
|
13
|
+
| **Cultivation** | Codebase analysis, seed generation, deep analysis with claude-flow, doc cultivation |
|
|
14
14
|
| **Agents** | Multi-agent system, rules engine, workflows, MCP server with 30+ tools |
|
|
15
|
+
| **Claude Hooks** | Capture all interactions, hierarchical storage, sub-agent tracking, swarm tracking |
|
|
15
16
|
| **Services** | Service management, config migrations, health monitoring |
|
|
16
17
|
| **Enterprise** | Chunking, backup/recovery, advanced caching, diagnostics |
|
|
17
18
|
| **Integrations** | Workflow DevKit, RuVector semantic search, Exochain audit trail |
|
|
@@ -431,6 +432,110 @@ npx @weavelogic/knowledge-graph-agent mcp start
|
|
|
431
432
|
|
|
432
433
|
---
|
|
433
434
|
|
|
435
|
+
## Claude Code Hooks
|
|
436
|
+
|
|
437
|
+
Capture all Claude Code interactions and store them in a hierarchical knowledge graph structure.
|
|
438
|
+
|
|
439
|
+
### Installation
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
# Install hooks to capture all interactions
|
|
443
|
+
kg hooks install
|
|
444
|
+
|
|
445
|
+
# Check hooks status
|
|
446
|
+
kg hooks status
|
|
447
|
+
|
|
448
|
+
# View captured sessions
|
|
449
|
+
kg hooks sessions
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Features
|
|
453
|
+
|
|
454
|
+
- **Hierarchical Storage**: Sessions → Conversations → Messages → Tool Calls
|
|
455
|
+
- **Sub-Agent Tracking**: Automatically tracks Task tool spawns
|
|
456
|
+
- **Swarm Tracking**: Captures claude-flow swarm operations
|
|
457
|
+
- **Markdown Generation**: Creates documentation for all interactions
|
|
458
|
+
- **Tool Output Separation**: Stores tool outputs in dedicated files
|
|
459
|
+
|
|
460
|
+
### Hook Events Captured
|
|
461
|
+
|
|
462
|
+
| Event | Description |
|
|
463
|
+
|-------|-------------|
|
|
464
|
+
| `UserPromptSubmit` | All user prompts |
|
|
465
|
+
| `PreToolUse` | Tool invocations with inputs |
|
|
466
|
+
| `PostToolUse` | Tool results and outputs |
|
|
467
|
+
| `Stop` | Session completion |
|
|
468
|
+
| `PreCompact` | Before context compaction |
|
|
469
|
+
|
|
470
|
+
### Storage Structure
|
|
471
|
+
|
|
472
|
+
```
|
|
473
|
+
.kg/claude/
|
|
474
|
+
├── sessions/ # JSON session data
|
|
475
|
+
├── agents/ # Sub-agent tracking
|
|
476
|
+
├── tool-outputs/ # Separated tool outputs
|
|
477
|
+
├── docs/
|
|
478
|
+
│ ├── sessions/ # Session markdown docs
|
|
479
|
+
│ ├── conversations/ # Conversation logs
|
|
480
|
+
│ └── agents/ # Sub-agent markdown docs
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Programmatic Usage
|
|
484
|
+
|
|
485
|
+
```typescript
|
|
486
|
+
import { HookCaptureSystem, generateHookConfig } from '@weavelogic/knowledge-graph-agent';
|
|
487
|
+
|
|
488
|
+
// Create capture system
|
|
489
|
+
const capture = new HookCaptureSystem('/project', {
|
|
490
|
+
createMarkdown: true,
|
|
491
|
+
separateToolOutputs: true,
|
|
492
|
+
captureSubAgents: true,
|
|
493
|
+
captureSwarms: true,
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Start a session
|
|
497
|
+
const session = capture.startSession('Development Session', 'Feature implementation');
|
|
498
|
+
|
|
499
|
+
// Handle hook events
|
|
500
|
+
capture.handleHookEvent({
|
|
501
|
+
event: 'UserPromptSubmit',
|
|
502
|
+
timestamp: new Date().toISOString(),
|
|
503
|
+
userPrompt: 'Help me implement...',
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
// End session
|
|
507
|
+
const completedSession = capture.endSession();
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## Document Cultivation
|
|
513
|
+
|
|
514
|
+
Automatically build out comprehensive documentation using claude-flow swarm orchestration.
|
|
515
|
+
|
|
516
|
+
### Usage
|
|
517
|
+
|
|
518
|
+
```bash
|
|
519
|
+
# Cultivate documentation with swarm agents
|
|
520
|
+
kg cultivate --path /project
|
|
521
|
+
|
|
522
|
+
# Include SOP compliance analysis
|
|
523
|
+
kg cultivate --include-sops
|
|
524
|
+
|
|
525
|
+
# Dry run to preview
|
|
526
|
+
kg cultivate --dry-run
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### Features
|
|
530
|
+
|
|
531
|
+
- **7-Phase Cultivation Process**: Structure analysis through completion
|
|
532
|
+
- **Development Planning**: Generates phased development plans
|
|
533
|
+
- **Infrastructure Planning**: Creates dev/staging/production infrastructure plans
|
|
534
|
+
- **SOP Compliance**: Integrates AI-SDLC SOP analysis
|
|
535
|
+
- **Swarm Orchestration**: Uses claude-flow for parallel documentation generation
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
434
539
|
## Enterprise Features
|
|
435
540
|
|
|
436
541
|
### Chunker for Large Documents
|
|
@@ -592,13 +697,25 @@ const execution = await workflow.start('document-analysis', {
|
|
|
592
697
|
| `kg dashboard serve` | Serve production build |
|
|
593
698
|
| `kg dashboard status` | Check dashboard status |
|
|
594
699
|
|
|
595
|
-
### Documentation
|
|
700
|
+
### Documentation & Cultivation
|
|
596
701
|
|
|
597
702
|
| Command | Description |
|
|
598
703
|
|---------|-------------|
|
|
599
704
|
| `kg docs init` | Initialize docs directory |
|
|
600
705
|
| `kg analyze` | Analyze & migrate to knowledge graph |
|
|
601
706
|
| `kg convert docs` | Convert docs/ to docs-nn/ |
|
|
707
|
+
| `kg cultivate` | Cultivate docs using swarm orchestration |
|
|
708
|
+
| `kg cultivate --include-sops` | Include SOP compliance analysis |
|
|
709
|
+
|
|
710
|
+
### Claude Code Hooks
|
|
711
|
+
|
|
712
|
+
| Command | Description |
|
|
713
|
+
|---------|-------------|
|
|
714
|
+
| `kg hooks install` | Install hooks to capture interactions |
|
|
715
|
+
| `kg hooks uninstall` | Remove hooks configuration |
|
|
716
|
+
| `kg hooks status` | Show hooks status |
|
|
717
|
+
| `kg hooks sessions` | List captured sessions |
|
|
718
|
+
| `kg hooks export` | Export captured sessions |
|
|
602
719
|
|
|
603
720
|
### Configuration
|
|
604
721
|
|
|
@@ -724,6 +841,53 @@ import {
|
|
|
724
841
|
|
|
725
842
|
## Changelog
|
|
726
843
|
|
|
844
|
+
### v0.10.1
|
|
845
|
+
|
|
846
|
+
**Default Directory Fix:**
|
|
847
|
+
- Changed default target directory from `docs-nn` to `docs`
|
|
848
|
+
- `kg analyze`, `kg convert docs`, and related commands now output to `docs/` by default
|
|
849
|
+
- Use `--target docs-nn` if you specifically need the old behavior
|
|
850
|
+
- Updated help text and documentation to reflect the change
|
|
851
|
+
|
|
852
|
+
### v0.10.0
|
|
853
|
+
|
|
854
|
+
**Claude Code Hooks System:**
|
|
855
|
+
- **Hook Capture System** - Capture all Claude interactions (prompts, responses, tool calls)
|
|
856
|
+
- **Hierarchical Storage** - Sessions → Conversations → Messages → Tool Calls
|
|
857
|
+
- **Sub-Agent Tracking** - Automatically tracks Task tool spawns with full context
|
|
858
|
+
- **Swarm Tracking** - Captures claude-flow swarm operations
|
|
859
|
+
- **Markdown Generation** - Creates documentation for sessions, conversations, agents
|
|
860
|
+
- **Tool Output Separation** - Stores tool outputs in dedicated JSON files
|
|
861
|
+
- **CLI Commands** - `kg hooks install/uninstall/status/sessions/export`
|
|
862
|
+
- Comprehensive type definitions with Zod validation
|
|
863
|
+
- 22 new tests for hook system
|
|
864
|
+
|
|
865
|
+
### v0.9.0
|
|
866
|
+
|
|
867
|
+
**Document Cultivation System:**
|
|
868
|
+
- **Doc Cultivation Command** - `kg cultivate` for automated documentation buildout
|
|
869
|
+
- **7-Phase Cultivation Process** - Structure → Content → Architecture → Development → Infrastructure → Review → Completion
|
|
870
|
+
- **Development Planning** - Generates phased development plans with tasks
|
|
871
|
+
- **Infrastructure Planning** - Creates dev/staging/production infrastructure plans
|
|
872
|
+
- **SOP Compliance Analysis** - Integrates AI-SDLC SOP requirements
|
|
873
|
+
- **Swarm Orchestration** - Uses claude-flow for parallel documentation generation
|
|
874
|
+
- Support for multi-service projects (api, backend, frontend, admin)
|
|
875
|
+
|
|
876
|
+
### v0.8.8
|
|
877
|
+
|
|
878
|
+
- Added `src/{service}/docs` directory scanning and copying for doc generation
|
|
879
|
+
- Enhanced service documentation detection
|
|
880
|
+
|
|
881
|
+
### v0.8.7
|
|
882
|
+
|
|
883
|
+
- Improved Python project detection for doc generation
|
|
884
|
+
- Better handling of `requirements.txt` and `pyproject.toml`
|
|
885
|
+
|
|
886
|
+
### v0.8.6
|
|
887
|
+
|
|
888
|
+
- Fixed vault-sync.test.ts timeout issues
|
|
889
|
+
- Improved test stability
|
|
890
|
+
|
|
727
891
|
### v0.7.4
|
|
728
892
|
|
|
729
893
|
- Fixed repository URL in package.json to match actual GitHub repo name
|
package/dist/_virtual/index10.js
CHANGED
package/dist/_virtual/index11.js
CHANGED
package/dist/_virtual/index8.js
CHANGED
package/dist/_virtual/index9.js
CHANGED
|
@@ -7,7 +7,7 @@ import { analyzeDocs } from "../../generators/docs-analyzer.js";
|
|
|
7
7
|
import { validateProjectRoot } from "../../core/security.js";
|
|
8
8
|
function createAnalyzeCommand() {
|
|
9
9
|
const command = new Command("analyze");
|
|
10
|
-
command.description("Analyze and migrate docs to knowledge graph structure").option("-p, --path <path>", "Project root path", ".").option("-s, --source <dir>", "Source docs directory", "docs").option("-t, --target <dir>", "Target directory", "docs
|
|
10
|
+
command.description("Analyze and migrate docs to knowledge graph structure").option("-p, --path <path>", "Project root path", ".").option("-s, --source <dir>", "Source docs directory", "docs").option("-t, --target <dir>", "Target directory", "docs").option("--use-claude-flow", "Use claude-flow for deep analysis").option("--no-moc", "Skip MOC (Map of Content) generation").option("--no-link-original", "Do not link back to original docs").option("--max-depth <n>", "Maximum analysis depth", "3").option("--dry-run", "Show what would be done without making changes").option("-v, --verbose", "Verbose output").action(async (options) => {
|
|
11
11
|
const spinner = ora("Analyzing documentation...").start();
|
|
12
12
|
try {
|
|
13
13
|
const projectRoot = validateProjectRoot(options.path);
|
|
@@ -119,7 +119,7 @@ function createAnalyzeCommand() {
|
|
|
119
119
|
process.exit(1);
|
|
120
120
|
}
|
|
121
121
|
});
|
|
122
|
-
command.command("deep").description("Deep analysis using claude-flow agents for comprehensive knowledge extraction").option("-p, --path <path>", "Project root path", ".").option("-s, --source <dir>", "Source docs directory", "docs").option("-t, --target <dir>", "Target directory", "docs
|
|
122
|
+
command.command("deep").description("Deep analysis using claude-flow agents for comprehensive knowledge extraction").option("-p, --path <path>", "Project root path", ".").option("-s, --source <dir>", "Source docs directory", "docs").option("-t, --target <dir>", "Target directory", "docs").option("--agents <n>", "Number of parallel agents", "3").action(async (options) => {
|
|
123
123
|
const spinner = ora("Initializing deep analysis with claude-flow...").start();
|
|
124
124
|
try {
|
|
125
125
|
const projectRoot = validateProjectRoot(options.path);
|
|
@@ -184,7 +184,7 @@ function createAnalyzeCommand() {
|
|
|
184
184
|
}
|
|
185
185
|
const result = await analyzeDocs({
|
|
186
186
|
sourceDir,
|
|
187
|
-
targetDir: "docs
|
|
187
|
+
targetDir: "docs",
|
|
188
188
|
projectRoot,
|
|
189
189
|
useClaudeFlow: false,
|
|
190
190
|
createMOC: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sources":["../../../src/cli/commands/analyze.ts"],"sourcesContent":["/**\n * Analyze Command\n *\n * Advanced documentation analyzer using claude-flow for deep analysis\n * and creating proper knowledge graph documentation structure.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { analyzeDocs } from '../../generators/docs-analyzer.js';\nimport { validateProjectRoot } from '../../core/security.js';\n\n/**\n * Create analyze command\n */\nexport function createAnalyzeCommand(): Command {\n const command = new Command('analyze');\n\n command\n .description('Analyze and migrate docs to knowledge graph structure')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('-t, --target <dir>', 'Target directory', 'docs-nn')\n .option('--use-claude-flow', 'Use claude-flow for deep analysis')\n .option('--no-moc', 'Skip MOC (Map of Content) generation')\n .option('--no-link-original', 'Do not link back to original docs')\n .option('--max-depth <n>', 'Maximum analysis depth', '3')\n .option('--dry-run', 'Show what would be done without making changes')\n .option('-v, --verbose', 'Verbose output')\n .action(async (options) => {\n const spinner = ora('Analyzing documentation...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n const targetDir = options.target;\n\n // Check source exists\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n console.log(chalk.gray(' Specify source with --source <dir>'));\n process.exit(1);\n }\n\n // Check if target already exists\n if (existsSync(join(projectRoot, targetDir)) && !options.dryRun) {\n spinner.warn(`Target directory exists: ${targetDir}`);\n console.log(chalk.yellow(' Files may be overwritten. Use --dry-run to preview.'));\n }\n\n if (options.dryRun) {\n spinner.text = 'Analyzing documentation (dry run)...';\n }\n\n if (options.useClaudeFlow) {\n spinner.text = 'Analyzing with claude-flow (deep analysis)...';\n }\n\n const result = await analyzeDocs({\n sourceDir,\n targetDir,\n projectRoot,\n useClaudeFlow: options.useClaudeFlow,\n createMOC: options.moc !== false,\n linkOriginal: options.linkOriginal !== false,\n maxDepth: parseInt(options.maxDepth, 10),\n dryRun: options.dryRun,\n verbose: options.verbose,\n });\n\n if (result.success) {\n if (options.dryRun) {\n spinner.succeed('Dry run complete!');\n } else {\n spinner.succeed('Documentation analyzed and migrated!');\n }\n } else {\n spinner.warn('Analysis completed with errors');\n }\n\n // Display results\n console.log();\n console.log(chalk.cyan.bold(' Analysis Results'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log();\n console.log(chalk.white(' Summary:'));\n console.log(chalk.gray(` Source: ${sourceDir}/`));\n console.log(chalk.gray(` Target: ${targetDir}/`));\n console.log(chalk.green(` Files analyzed: ${result.filesAnalyzed}`));\n console.log(chalk.green(` Files created: ${result.filesCreated}`));\n console.log(chalk.blue(` MOC files: ${result.mocFilesCreated}`));\n\n // Category breakdown\n if (result.structure.size > 0) {\n console.log();\n console.log(chalk.white(' Categories:'));\n for (const [category, docs] of result.structure) {\n console.log(chalk.cyan(` ${category.padEnd(15)}`), chalk.gray(`${docs.length} docs`));\n }\n }\n\n // Show sample analyzed documents\n if (result.analyzed.length > 0 && options.verbose) {\n console.log();\n console.log(chalk.white(' Sample documents:'));\n result.analyzed.slice(0, 5).forEach(doc => {\n console.log(chalk.gray(` ${doc.originalPath}`));\n console.log(chalk.cyan(` → ${doc.newPath}`) + chalk.gray(` [${doc.type}]`));\n if (doc.tags.length > 0) {\n console.log(chalk.gray(` tags: ${doc.tags.slice(0, 5).map(t => `#${t}`).join(' ')}`));\n }\n });\n if (result.analyzed.length > 5) {\n console.log(chalk.gray(` ... and ${result.analyzed.length - 5} more`));\n }\n }\n\n // Show errors\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(' Errors:'));\n result.errors.slice(0, 5).forEach(err => {\n console.log(chalk.gray(` - ${err}`));\n });\n if (result.errors.length > 5) {\n console.log(chalk.gray(` ... and ${result.errors.length - 5} more`));\n }\n }\n\n // Research needed summary\n const researchDocs = result.analyzed.filter(d => d.researchNeeded.length > 0);\n const todoDocs = result.analyzed.filter(d => d.todos.length > 0);\n\n if (researchDocs.length > 0 || todoDocs.length > 0) {\n console.log();\n console.log(chalk.yellow(' Attention Needed:'));\n if (researchDocs.length > 0) {\n console.log(chalk.yellow(` 📚 ${researchDocs.length} docs need research`));\n }\n if (todoDocs.length > 0) {\n console.log(chalk.yellow(` ✏️ ${todoDocs.length} docs have TODOs`));\n }\n }\n\n // Next steps\n if (!options.dryRun && result.filesCreated > 0) {\n console.log();\n console.log(chalk.cyan(' Next steps:'));\n console.log(chalk.white(` 1. Review ${targetDir}/MOC.md (Master Index)`));\n console.log(chalk.white(` 2. Check ${targetDir}/PRIMITIVES.md`));\n console.log(chalk.white(` 3. Run: kg graph --docs ${targetDir}`));\n console.log(chalk.white(` 4. Run: kg stats --docs ${targetDir}`));\n if (researchDocs.length > 0) {\n console.log(chalk.white(` 5. Address research items in flagged docs`));\n }\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Analysis failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Deep analyze subcommand (uses claude-flow agents)\n command\n .command('deep')\n .description('Deep analysis using claude-flow agents for comprehensive knowledge extraction')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('-t, --target <dir>', 'Target directory', 'docs-nn')\n .option('--agents <n>', 'Number of parallel agents', '3')\n .action(async (options) => {\n const spinner = ora('Initializing deep analysis with claude-flow...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n const targetDir = options.target;\n\n // Check source exists\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n process.exit(1);\n }\n\n spinner.text = 'Running claude-flow deep analysis...';\n\n // Run deep analysis with claude-flow\n const result = await analyzeDocs({\n sourceDir,\n targetDir,\n projectRoot,\n useClaudeFlow: true,\n createMOC: true,\n linkOriginal: true,\n maxDepth: 5,\n dryRun: false,\n verbose: true,\n });\n\n if (result.success) {\n spinner.succeed('Deep analysis complete!');\n } else {\n spinner.warn('Deep analysis completed with some errors');\n }\n\n console.log();\n console.log(chalk.cyan.bold(' Deep Analysis Results'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log(chalk.green(` Documents analyzed: ${result.filesAnalyzed}`));\n console.log(chalk.green(` Knowledge docs: ${result.filesCreated}`));\n console.log(chalk.blue(` Index files (MOC): ${result.mocFilesCreated}`));\n console.log(chalk.gray(` Categories: ${result.structure.size}`));\n\n // Research summary\n const totalResearch = result.analyzed.reduce((sum, d) => sum + d.researchNeeded.length, 0);\n const totalTodos = result.analyzed.reduce((sum, d) => sum + d.todos.length, 0);\n\n console.log();\n console.log(chalk.white(' Knowledge extraction:'));\n console.log(chalk.cyan(` Research areas: ${totalResearch}`));\n console.log(chalk.cyan(` TODOs found: ${totalTodos}`));\n console.log(chalk.cyan(` Concepts: ${result.analyzed.reduce((sum, d) => sum + d.concepts.length, 0)}`));\n console.log(chalk.cyan(` Cross-refs: ${result.analyzed.reduce((sum, d) => sum + d.related.length, 0)}`));\n\n console.log();\n console.log(chalk.white(` Output: ${targetDir}/`));\n console.log(chalk.gray(` MOC.md Master index`));\n console.log(chalk.gray(` PRIMITIVES.md Core building blocks`));\n console.log(chalk.gray(` */\\_MOC.md Category indexes`));\n console.log();\n\n } catch (error) {\n spinner.fail('Deep analysis failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Report subcommand\n command\n .command('report')\n .description('Generate analysis report without creating files')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const spinner = ora('Generating analysis report...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n process.exit(1);\n }\n\n const result = await analyzeDocs({\n sourceDir,\n targetDir: 'docs-nn',\n projectRoot,\n useClaudeFlow: false,\n createMOC: false,\n linkOriginal: false,\n dryRun: true,\n verbose: false,\n });\n\n spinner.succeed('Report generated!');\n\n if (options.json) {\n // JSON output\n const report = {\n summary: {\n totalDocs: result.filesAnalyzed,\n categories: Object.fromEntries(result.structure),\n },\n documents: result.analyzed.map(d => ({\n original: d.originalPath,\n target: d.newPath,\n type: d.type,\n category: d.category,\n tags: d.tags,\n concepts: d.concepts,\n researchNeeded: d.researchNeeded,\n todos: d.todos,\n })),\n researchAreas: result.analyzed\n .flatMap(d => d.researchNeeded.map(r => ({ doc: d.title, area: r }))),\n todos: result.analyzed\n .flatMap(d => d.todos.map(t => ({ doc: d.title, todo: t }))),\n };\n console.log(JSON.stringify(report, null, 2));\n } else {\n // Human-readable output\n console.log();\n console.log(chalk.cyan.bold(' Documentation Analysis Report'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log();\n console.log(chalk.white(` Total documents: ${result.filesAnalyzed}`));\n console.log();\n\n // Type breakdown\n const byType = new Map<string, number>();\n result.analyzed.forEach(d => {\n byType.set(d.type, (byType.get(d.type) || 0) + 1);\n });\n\n console.log(chalk.white(' By Type:'));\n for (const [type, count] of byType) {\n const bar = '█'.repeat(Math.ceil(count / result.filesAnalyzed * 20));\n console.log(chalk.cyan(` ${type.padEnd(12)} ${bar} ${count}`));\n }\n console.log();\n\n // Category breakdown\n console.log(chalk.white(' By Category:'));\n for (const [category, docs] of result.structure) {\n const bar = '█'.repeat(Math.ceil(docs.length / result.filesAnalyzed * 20));\n console.log(chalk.cyan(` ${category.padEnd(12)} ${bar} ${docs.length}`));\n }\n console.log();\n\n // Issues\n const withResearch = result.analyzed.filter(d => d.researchNeeded.length > 0);\n const withTodos = result.analyzed.filter(d => d.todos.length > 0);\n\n console.log(chalk.white(' Areas Needing Attention:'));\n console.log(chalk.yellow(` 📚 Research needed: ${withResearch.length} docs`));\n console.log(chalk.yellow(` ✏️ With TODOs: ${withTodos.length} docs`));\n console.log();\n\n // Top research areas\n if (withResearch.length > 0) {\n console.log(chalk.white(' Top Research Areas:'));\n withResearch.slice(0, 5).forEach(d => {\n console.log(chalk.gray(` ${d.title}:`));\n d.researchNeeded.slice(0, 2).forEach(r => {\n console.log(chalk.yellow(` - ${r.slice(0, 60)}...`));\n });\n });\n console.log();\n }\n\n console.log(chalk.cyan(' Run `kg analyze` to migrate documentation'));\n console.log();\n }\n\n } catch (error) {\n spinner.fail('Report generation failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyze.js","sources":["../../../src/cli/commands/analyze.ts"],"sourcesContent":["/**\n * Analyze Command\n *\n * Advanced documentation analyzer using claude-flow for deep analysis\n * and creating proper knowledge graph documentation structure.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { analyzeDocs } from '../../generators/docs-analyzer.js';\nimport { validateProjectRoot } from '../../core/security.js';\n\n/**\n * Create analyze command\n */\nexport function createAnalyzeCommand(): Command {\n const command = new Command('analyze');\n\n command\n .description('Analyze and migrate docs to knowledge graph structure')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('-t, --target <dir>', 'Target directory', 'docs')\n .option('--use-claude-flow', 'Use claude-flow for deep analysis')\n .option('--no-moc', 'Skip MOC (Map of Content) generation')\n .option('--no-link-original', 'Do not link back to original docs')\n .option('--max-depth <n>', 'Maximum analysis depth', '3')\n .option('--dry-run', 'Show what would be done without making changes')\n .option('-v, --verbose', 'Verbose output')\n .action(async (options) => {\n const spinner = ora('Analyzing documentation...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n const targetDir = options.target;\n\n // Check source exists\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n console.log(chalk.gray(' Specify source with --source <dir>'));\n process.exit(1);\n }\n\n // Check if target already exists\n if (existsSync(join(projectRoot, targetDir)) && !options.dryRun) {\n spinner.warn(`Target directory exists: ${targetDir}`);\n console.log(chalk.yellow(' Files may be overwritten. Use --dry-run to preview.'));\n }\n\n if (options.dryRun) {\n spinner.text = 'Analyzing documentation (dry run)...';\n }\n\n if (options.useClaudeFlow) {\n spinner.text = 'Analyzing with claude-flow (deep analysis)...';\n }\n\n const result = await analyzeDocs({\n sourceDir,\n targetDir,\n projectRoot,\n useClaudeFlow: options.useClaudeFlow,\n createMOC: options.moc !== false,\n linkOriginal: options.linkOriginal !== false,\n maxDepth: parseInt(options.maxDepth, 10),\n dryRun: options.dryRun,\n verbose: options.verbose,\n });\n\n if (result.success) {\n if (options.dryRun) {\n spinner.succeed('Dry run complete!');\n } else {\n spinner.succeed('Documentation analyzed and migrated!');\n }\n } else {\n spinner.warn('Analysis completed with errors');\n }\n\n // Display results\n console.log();\n console.log(chalk.cyan.bold(' Analysis Results'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log();\n console.log(chalk.white(' Summary:'));\n console.log(chalk.gray(` Source: ${sourceDir}/`));\n console.log(chalk.gray(` Target: ${targetDir}/`));\n console.log(chalk.green(` Files analyzed: ${result.filesAnalyzed}`));\n console.log(chalk.green(` Files created: ${result.filesCreated}`));\n console.log(chalk.blue(` MOC files: ${result.mocFilesCreated}`));\n\n // Category breakdown\n if (result.structure.size > 0) {\n console.log();\n console.log(chalk.white(' Categories:'));\n for (const [category, docs] of result.structure) {\n console.log(chalk.cyan(` ${category.padEnd(15)}`), chalk.gray(`${docs.length} docs`));\n }\n }\n\n // Show sample analyzed documents\n if (result.analyzed.length > 0 && options.verbose) {\n console.log();\n console.log(chalk.white(' Sample documents:'));\n result.analyzed.slice(0, 5).forEach(doc => {\n console.log(chalk.gray(` ${doc.originalPath}`));\n console.log(chalk.cyan(` → ${doc.newPath}`) + chalk.gray(` [${doc.type}]`));\n if (doc.tags.length > 0) {\n console.log(chalk.gray(` tags: ${doc.tags.slice(0, 5).map(t => `#${t}`).join(' ')}`));\n }\n });\n if (result.analyzed.length > 5) {\n console.log(chalk.gray(` ... and ${result.analyzed.length - 5} more`));\n }\n }\n\n // Show errors\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(' Errors:'));\n result.errors.slice(0, 5).forEach(err => {\n console.log(chalk.gray(` - ${err}`));\n });\n if (result.errors.length > 5) {\n console.log(chalk.gray(` ... and ${result.errors.length - 5} more`));\n }\n }\n\n // Research needed summary\n const researchDocs = result.analyzed.filter(d => d.researchNeeded.length > 0);\n const todoDocs = result.analyzed.filter(d => d.todos.length > 0);\n\n if (researchDocs.length > 0 || todoDocs.length > 0) {\n console.log();\n console.log(chalk.yellow(' Attention Needed:'));\n if (researchDocs.length > 0) {\n console.log(chalk.yellow(` 📚 ${researchDocs.length} docs need research`));\n }\n if (todoDocs.length > 0) {\n console.log(chalk.yellow(` ✏️ ${todoDocs.length} docs have TODOs`));\n }\n }\n\n // Next steps\n if (!options.dryRun && result.filesCreated > 0) {\n console.log();\n console.log(chalk.cyan(' Next steps:'));\n console.log(chalk.white(` 1. Review ${targetDir}/MOC.md (Master Index)`));\n console.log(chalk.white(` 2. Check ${targetDir}/PRIMITIVES.md`));\n console.log(chalk.white(` 3. Run: kg graph --docs ${targetDir}`));\n console.log(chalk.white(` 4. Run: kg stats --docs ${targetDir}`));\n if (researchDocs.length > 0) {\n console.log(chalk.white(` 5. Address research items in flagged docs`));\n }\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Analysis failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Deep analyze subcommand (uses claude-flow agents)\n command\n .command('deep')\n .description('Deep analysis using claude-flow agents for comprehensive knowledge extraction')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('-t, --target <dir>', 'Target directory', 'docs')\n .option('--agents <n>', 'Number of parallel agents', '3')\n .action(async (options) => {\n const spinner = ora('Initializing deep analysis with claude-flow...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n const targetDir = options.target;\n\n // Check source exists\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n process.exit(1);\n }\n\n spinner.text = 'Running claude-flow deep analysis...';\n\n // Run deep analysis with claude-flow\n const result = await analyzeDocs({\n sourceDir,\n targetDir,\n projectRoot,\n useClaudeFlow: true,\n createMOC: true,\n linkOriginal: true,\n maxDepth: 5,\n dryRun: false,\n verbose: true,\n });\n\n if (result.success) {\n spinner.succeed('Deep analysis complete!');\n } else {\n spinner.warn('Deep analysis completed with some errors');\n }\n\n console.log();\n console.log(chalk.cyan.bold(' Deep Analysis Results'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log(chalk.green(` Documents analyzed: ${result.filesAnalyzed}`));\n console.log(chalk.green(` Knowledge docs: ${result.filesCreated}`));\n console.log(chalk.blue(` Index files (MOC): ${result.mocFilesCreated}`));\n console.log(chalk.gray(` Categories: ${result.structure.size}`));\n\n // Research summary\n const totalResearch = result.analyzed.reduce((sum, d) => sum + d.researchNeeded.length, 0);\n const totalTodos = result.analyzed.reduce((sum, d) => sum + d.todos.length, 0);\n\n console.log();\n console.log(chalk.white(' Knowledge extraction:'));\n console.log(chalk.cyan(` Research areas: ${totalResearch}`));\n console.log(chalk.cyan(` TODOs found: ${totalTodos}`));\n console.log(chalk.cyan(` Concepts: ${result.analyzed.reduce((sum, d) => sum + d.concepts.length, 0)}`));\n console.log(chalk.cyan(` Cross-refs: ${result.analyzed.reduce((sum, d) => sum + d.related.length, 0)}`));\n\n console.log();\n console.log(chalk.white(` Output: ${targetDir}/`));\n console.log(chalk.gray(` MOC.md Master index`));\n console.log(chalk.gray(` PRIMITIVES.md Core building blocks`));\n console.log(chalk.gray(` */\\_MOC.md Category indexes`));\n console.log();\n\n } catch (error) {\n spinner.fail('Deep analysis failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Report subcommand\n command\n .command('report')\n .description('Generate analysis report without creating files')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const spinner = ora('Generating analysis report...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n process.exit(1);\n }\n\n const result = await analyzeDocs({\n sourceDir,\n targetDir: 'docs',\n projectRoot,\n useClaudeFlow: false,\n createMOC: false,\n linkOriginal: false,\n dryRun: true,\n verbose: false,\n });\n\n spinner.succeed('Report generated!');\n\n if (options.json) {\n // JSON output\n const report = {\n summary: {\n totalDocs: result.filesAnalyzed,\n categories: Object.fromEntries(result.structure),\n },\n documents: result.analyzed.map(d => ({\n original: d.originalPath,\n target: d.newPath,\n type: d.type,\n category: d.category,\n tags: d.tags,\n concepts: d.concepts,\n researchNeeded: d.researchNeeded,\n todos: d.todos,\n })),\n researchAreas: result.analyzed\n .flatMap(d => d.researchNeeded.map(r => ({ doc: d.title, area: r }))),\n todos: result.analyzed\n .flatMap(d => d.todos.map(t => ({ doc: d.title, todo: t }))),\n };\n console.log(JSON.stringify(report, null, 2));\n } else {\n // Human-readable output\n console.log();\n console.log(chalk.cyan.bold(' Documentation Analysis Report'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log();\n console.log(chalk.white(` Total documents: ${result.filesAnalyzed}`));\n console.log();\n\n // Type breakdown\n const byType = new Map<string, number>();\n result.analyzed.forEach(d => {\n byType.set(d.type, (byType.get(d.type) || 0) + 1);\n });\n\n console.log(chalk.white(' By Type:'));\n for (const [type, count] of byType) {\n const bar = '█'.repeat(Math.ceil(count / result.filesAnalyzed * 20));\n console.log(chalk.cyan(` ${type.padEnd(12)} ${bar} ${count}`));\n }\n console.log();\n\n // Category breakdown\n console.log(chalk.white(' By Category:'));\n for (const [category, docs] of result.structure) {\n const bar = '█'.repeat(Math.ceil(docs.length / result.filesAnalyzed * 20));\n console.log(chalk.cyan(` ${category.padEnd(12)} ${bar} ${docs.length}`));\n }\n console.log();\n\n // Issues\n const withResearch = result.analyzed.filter(d => d.researchNeeded.length > 0);\n const withTodos = result.analyzed.filter(d => d.todos.length > 0);\n\n console.log(chalk.white(' Areas Needing Attention:'));\n console.log(chalk.yellow(` 📚 Research needed: ${withResearch.length} docs`));\n console.log(chalk.yellow(` ✏️ With TODOs: ${withTodos.length} docs`));\n console.log();\n\n // Top research areas\n if (withResearch.length > 0) {\n console.log(chalk.white(' Top Research Areas:'));\n withResearch.slice(0, 5).forEach(d => {\n console.log(chalk.gray(` ${d.title}:`));\n d.researchNeeded.slice(0, 2).forEach(r => {\n console.log(chalk.yellow(` - ${r.slice(0, 60)}...`));\n });\n });\n console.log();\n }\n\n console.log(chalk.cyan(' Run `kg analyze` to migrate documentation'));\n console.log();\n }\n\n } catch (error) {\n spinner.fail('Report generation failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { validateProjectRoot } from "../../core/security.js";
|
|
|
8
8
|
function createConvertCommand() {
|
|
9
9
|
const command = new Command("convert");
|
|
10
10
|
command.description("Convert existing docs to weave-nn structure");
|
|
11
|
-
command.command("docs").description("Convert existing documentation
|
|
11
|
+
command.command("docs").description("Convert existing documentation with proper structure").option("-p, --path <path>", "Project root path", ".").option("-s, --source <dir>", "Source docs directory", "docs").option("-t, --target <dir>", "Target directory", "docs").option("--no-auto-category", "Disable auto-categorization").option("-f, --force", "Overwrite existing files").option("--dry-run", "Show what would be done without making changes").action(async (options) => {
|
|
12
12
|
const spinner = ora("Converting documentation...").start();
|
|
13
13
|
try {
|
|
14
14
|
const projectRoot = validateProjectRoot(options.path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sources":["../../../src/cli/commands/convert.ts"],"sourcesContent":["/**\n * Convert Command\n *\n * Convert existing documentation to weave-nn structure.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport {\n convertDocs,\n addFrontmatter,\n validateFrontmatter,\n} from '../../generators/docs-convert.js';\nimport { validateProjectRoot, validateDocsPath } from '../../core/security.js';\n\n/**\n * Create convert command\n */\nexport function createConvertCommand(): Command {\n const command = new Command('convert');\n\n command\n .description('Convert existing docs to weave-nn structure');\n\n // Main convert subcommand\n command\n .command('docs')\n .description('Convert existing documentation to docs-nn/ with proper structure')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('-t, --target <dir>', 'Target directory', 'docs-nn')\n .option('--no-auto-category', 'Disable auto-categorization')\n .option('-f, --force', 'Overwrite existing files')\n .option('--dry-run', 'Show what would be done without making changes')\n .action(async (options) => {\n const spinner = ora('Converting documentation...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n const targetDir = options.target;\n\n // Check source exists\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n console.log(chalk.gray(' Specify source with --source <dir>'));\n process.exit(1);\n }\n\n if (options.dryRun) {\n spinner.text = 'Analyzing documentation (dry run)...';\n }\n\n const result = await convertDocs({\n sourceDir,\n targetDir,\n projectRoot,\n preserveOriginal: true,\n force: options.force,\n autoCategory: options.autoCategory !== false,\n dryRun: options.dryRun,\n });\n\n if (result.success) {\n if (options.dryRun) {\n spinner.succeed('Dry run complete!');\n } else {\n spinner.succeed('Documentation converted!');\n }\n } else {\n spinner.warn('Conversion completed with errors');\n }\n\n console.log();\n console.log(chalk.white(' Summary:'));\n console.log(chalk.gray(` Source: ${sourceDir}/`));\n console.log(chalk.gray(` Target: ${targetDir}/`));\n console.log(chalk.green(` Converted: ${result.filesConverted}`));\n console.log(chalk.yellow(` Skipped: ${result.filesSkipped}`));\n console.log(chalk.gray(` Total: ${result.filesProcessed}`));\n\n if (result.converted.length > 0 && result.converted.length <= 10) {\n console.log();\n console.log(chalk.white(' Converted files:'));\n result.converted.forEach(({ source, target, type }) => {\n console.log(chalk.gray(` ${source}`));\n console.log(chalk.cyan(` → ${target}`) + chalk.gray(` [${type}]`));\n });\n } else if (result.converted.length > 10) {\n console.log();\n console.log(chalk.white(' Sample conversions:'));\n result.converted.slice(0, 5).forEach(({ source, target, type }) => {\n console.log(chalk.gray(` ${source}`));\n console.log(chalk.cyan(` → ${target}`) + chalk.gray(` [${type}]`));\n });\n console.log(chalk.gray(` ... and ${result.converted.length - 5} more`));\n }\n\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(' Errors:'));\n result.errors.slice(0, 5).forEach(err => {\n console.log(chalk.gray(` - ${err}`));\n });\n if (result.errors.length > 5) {\n console.log(chalk.gray(` ... and ${result.errors.length - 5} more`));\n }\n }\n\n if (!options.dryRun && result.filesConverted > 0) {\n console.log();\n console.log(chalk.cyan('Next steps:'));\n console.log(chalk.white(` 1. Review ${targetDir}/ structure`));\n console.log(chalk.white(' 2. Run: kg graph --docs ' + targetDir));\n console.log(chalk.white(' 3. Run: kg stats'));\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Conversion failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n\n/**\n * Create frontmatter command\n */\nexport function createFrontmatterCommand(): Command {\n const command = new Command('frontmatter');\n\n command\n .description('Manage frontmatter in markdown files');\n\n // Add frontmatter\n command\n .command('add [target]')\n .description('Add frontmatter to files missing it')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-t, --type <type>', 'Node type (concept, technical, feature, service, guide, standard, integration)')\n .option('-s, --status <status>', 'Status (draft, active, deprecated, archived)', 'active')\n .option('--tags <tags>', 'Comma-separated tags')\n .option('-f, --force', 'Overwrite existing frontmatter')\n .option('--dry-run', 'Show what would be done')\n .action(async (target, options) => {\n const spinner = ora('Adding frontmatter...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const targetPath = target || 'docs';\n\n const tags = options.tags ? options.tags.split(',').map((t: string) => t.trim()) : [];\n\n const result = await addFrontmatter({\n target: targetPath,\n projectRoot,\n type: options.type,\n status: options.status,\n tags,\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.success) {\n spinner.succeed(options.dryRun ? 'Dry run complete!' : 'Frontmatter added!');\n } else {\n spinner.warn('Completed with errors');\n }\n\n console.log();\n console.log(chalk.white(' Summary:'));\n console.log(chalk.green(` Updated: ${result.filesUpdated}`));\n console.log(chalk.yellow(` Skipped: ${result.filesSkipped}`));\n console.log(chalk.gray(` Total: ${result.filesProcessed}`));\n\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(' Errors:'));\n result.errors.forEach(err => {\n console.log(chalk.gray(` - ${err}`));\n });\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to add frontmatter');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Validate frontmatter\n command\n .command('validate [target]')\n .description('Validate frontmatter in markdown files')\n .option('-p, --path <path>', 'Project root path', '.')\n .action(async (target, options) => {\n const spinner = ora('Validating frontmatter...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const targetPath = target || 'docs';\n\n const result = await validateFrontmatter(targetPath, projectRoot);\n\n spinner.succeed('Validation complete!');\n\n console.log();\n console.log(chalk.white(' Frontmatter Validation:'));\n console.log(chalk.green(` Valid: ${result.valid}`));\n console.log(chalk.red(` Invalid: ${result.invalid}`));\n console.log(chalk.yellow(` Missing: ${result.missing}`));\n\n if (result.issues.length > 0) {\n console.log();\n console.log(chalk.yellow(' Issues found:'));\n result.issues.slice(0, 10).forEach(({ file, issues }) => {\n console.log(chalk.white(` ${file}`));\n issues.forEach(issue => {\n console.log(chalk.gray(` - ${issue}`));\n });\n });\n if (result.issues.length > 10) {\n console.log(chalk.gray(` ... and ${result.issues.length - 10} more files`));\n }\n\n console.log();\n console.log(chalk.cyan('Fix with: ') + chalk.white('kg frontmatter add <target>'));\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Validation failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Update frontmatter (force mode)\n command\n .command('update [target]')\n .description('Update/regenerate frontmatter (overwrites existing)')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-t, --type <type>', 'Force specific node type')\n .option('--dry-run', 'Show what would be done')\n .action(async (target, options) => {\n const spinner = ora('Updating frontmatter...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const targetPath = target || 'docs';\n\n const result = await addFrontmatter({\n target: targetPath,\n projectRoot,\n type: options.type,\n force: true,\n dryRun: options.dryRun,\n });\n\n if (result.success) {\n spinner.succeed(options.dryRun ? 'Dry run complete!' : 'Frontmatter updated!');\n } else {\n spinner.warn('Completed with errors');\n }\n\n console.log();\n console.log(chalk.green(` Updated: ${result.filesUpdated} files`));\n\n if (result.errors.length > 0) {\n console.log(chalk.red(` Errors: ${result.errors.length}`));\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to update frontmatter');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert.js","sources":["../../../src/cli/commands/convert.ts"],"sourcesContent":["/**\n * Convert Command\n *\n * Convert existing documentation to weave-nn structure.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport {\n convertDocs,\n addFrontmatter,\n validateFrontmatter,\n} from '../../generators/docs-convert.js';\nimport { validateProjectRoot, validateDocsPath } from '../../core/security.js';\n\n/**\n * Create convert command\n */\nexport function createConvertCommand(): Command {\n const command = new Command('convert');\n\n command\n .description('Convert existing docs to weave-nn structure');\n\n // Main convert subcommand\n command\n .command('docs')\n .description('Convert existing documentation with proper structure')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --source <dir>', 'Source docs directory', 'docs')\n .option('-t, --target <dir>', 'Target directory', 'docs')\n .option('--no-auto-category', 'Disable auto-categorization')\n .option('-f, --force', 'Overwrite existing files')\n .option('--dry-run', 'Show what would be done without making changes')\n .action(async (options) => {\n const spinner = ora('Converting documentation...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const sourceDir = options.source;\n const targetDir = options.target;\n\n // Check source exists\n if (!existsSync(join(projectRoot, sourceDir))) {\n spinner.fail(`Source directory not found: ${sourceDir}`);\n console.log(chalk.gray(' Specify source with --source <dir>'));\n process.exit(1);\n }\n\n if (options.dryRun) {\n spinner.text = 'Analyzing documentation (dry run)...';\n }\n\n const result = await convertDocs({\n sourceDir,\n targetDir,\n projectRoot,\n preserveOriginal: true,\n force: options.force,\n autoCategory: options.autoCategory !== false,\n dryRun: options.dryRun,\n });\n\n if (result.success) {\n if (options.dryRun) {\n spinner.succeed('Dry run complete!');\n } else {\n spinner.succeed('Documentation converted!');\n }\n } else {\n spinner.warn('Conversion completed with errors');\n }\n\n console.log();\n console.log(chalk.white(' Summary:'));\n console.log(chalk.gray(` Source: ${sourceDir}/`));\n console.log(chalk.gray(` Target: ${targetDir}/`));\n console.log(chalk.green(` Converted: ${result.filesConverted}`));\n console.log(chalk.yellow(` Skipped: ${result.filesSkipped}`));\n console.log(chalk.gray(` Total: ${result.filesProcessed}`));\n\n if (result.converted.length > 0 && result.converted.length <= 10) {\n console.log();\n console.log(chalk.white(' Converted files:'));\n result.converted.forEach(({ source, target, type }) => {\n console.log(chalk.gray(` ${source}`));\n console.log(chalk.cyan(` → ${target}`) + chalk.gray(` [${type}]`));\n });\n } else if (result.converted.length > 10) {\n console.log();\n console.log(chalk.white(' Sample conversions:'));\n result.converted.slice(0, 5).forEach(({ source, target, type }) => {\n console.log(chalk.gray(` ${source}`));\n console.log(chalk.cyan(` → ${target}`) + chalk.gray(` [${type}]`));\n });\n console.log(chalk.gray(` ... and ${result.converted.length - 5} more`));\n }\n\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(' Errors:'));\n result.errors.slice(0, 5).forEach(err => {\n console.log(chalk.gray(` - ${err}`));\n });\n if (result.errors.length > 5) {\n console.log(chalk.gray(` ... and ${result.errors.length - 5} more`));\n }\n }\n\n if (!options.dryRun && result.filesConverted > 0) {\n console.log();\n console.log(chalk.cyan('Next steps:'));\n console.log(chalk.white(` 1. Review ${targetDir}/ structure`));\n console.log(chalk.white(' 2. Run: kg graph --docs ' + targetDir));\n console.log(chalk.white(' 3. Run: kg stats'));\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Conversion failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n\n/**\n * Create frontmatter command\n */\nexport function createFrontmatterCommand(): Command {\n const command = new Command('frontmatter');\n\n command\n .description('Manage frontmatter in markdown files');\n\n // Add frontmatter\n command\n .command('add [target]')\n .description('Add frontmatter to files missing it')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-t, --type <type>', 'Node type (concept, technical, feature, service, guide, standard, integration)')\n .option('-s, --status <status>', 'Status (draft, active, deprecated, archived)', 'active')\n .option('--tags <tags>', 'Comma-separated tags')\n .option('-f, --force', 'Overwrite existing frontmatter')\n .option('--dry-run', 'Show what would be done')\n .action(async (target, options) => {\n const spinner = ora('Adding frontmatter...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const targetPath = target || 'docs';\n\n const tags = options.tags ? options.tags.split(',').map((t: string) => t.trim()) : [];\n\n const result = await addFrontmatter({\n target: targetPath,\n projectRoot,\n type: options.type,\n status: options.status,\n tags,\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.success) {\n spinner.succeed(options.dryRun ? 'Dry run complete!' : 'Frontmatter added!');\n } else {\n spinner.warn('Completed with errors');\n }\n\n console.log();\n console.log(chalk.white(' Summary:'));\n console.log(chalk.green(` Updated: ${result.filesUpdated}`));\n console.log(chalk.yellow(` Skipped: ${result.filesSkipped}`));\n console.log(chalk.gray(` Total: ${result.filesProcessed}`));\n\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(' Errors:'));\n result.errors.forEach(err => {\n console.log(chalk.gray(` - ${err}`));\n });\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to add frontmatter');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Validate frontmatter\n command\n .command('validate [target]')\n .description('Validate frontmatter in markdown files')\n .option('-p, --path <path>', 'Project root path', '.')\n .action(async (target, options) => {\n const spinner = ora('Validating frontmatter...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const targetPath = target || 'docs';\n\n const result = await validateFrontmatter(targetPath, projectRoot);\n\n spinner.succeed('Validation complete!');\n\n console.log();\n console.log(chalk.white(' Frontmatter Validation:'));\n console.log(chalk.green(` Valid: ${result.valid}`));\n console.log(chalk.red(` Invalid: ${result.invalid}`));\n console.log(chalk.yellow(` Missing: ${result.missing}`));\n\n if (result.issues.length > 0) {\n console.log();\n console.log(chalk.yellow(' Issues found:'));\n result.issues.slice(0, 10).forEach(({ file, issues }) => {\n console.log(chalk.white(` ${file}`));\n issues.forEach(issue => {\n console.log(chalk.gray(` - ${issue}`));\n });\n });\n if (result.issues.length > 10) {\n console.log(chalk.gray(` ... and ${result.issues.length - 10} more files`));\n }\n\n console.log();\n console.log(chalk.cyan('Fix with: ') + chalk.white('kg frontmatter add <target>'));\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Validation failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Update frontmatter (force mode)\n command\n .command('update [target]')\n .description('Update/regenerate frontmatter (overwrites existing)')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-t, --type <type>', 'Force specific node type')\n .option('--dry-run', 'Show what would be done')\n .action(async (target, options) => {\n const spinner = ora('Updating frontmatter...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const targetPath = target || 'docs';\n\n const result = await addFrontmatter({\n target: targetPath,\n projectRoot,\n type: options.type,\n force: true,\n dryRun: options.dryRun,\n });\n\n if (result.success) {\n spinner.succeed(options.dryRun ? 'Dry run complete!' : 'Frontmatter updated!');\n } else {\n spinner.warn('Completed with errors');\n }\n\n console.log();\n console.log(chalk.green(` Updated: ${result.filesUpdated} files`));\n\n if (result.errors.length > 0) {\n console.log(chalk.red(` Errors: ${result.errors.length}`));\n }\n\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to update frontmatter');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":";;;;;;;AAqBO,SAAS,uBAAgC;AAC9C,QAAM,UAAU,IAAI,QAAQ,SAAS;AAErC,UACG,YAAY,6CAA6C;AAG5D,UACG,QAAQ,MAAM,EACd,YAAY,sDAAsD,EAClE,OAAO,qBAAqB,qBAAqB,GAAG,EACpD,OAAO,sBAAsB,yBAAyB,MAAM,EAC5D,OAAO,sBAAsB,oBAAoB,MAAM,EACvD,OAAO,sBAAsB,6BAA6B,EAC1D,OAAO,eAAe,0BAA0B,EAChD,OAAO,aAAa,gDAAgD,EACpE,OAAO,OAAO,YAAY;AACzB,UAAM,UAAU,IAAI,6BAA6B,EAAE,MAAA;AAEnD,QAAI;AACF,YAAM,cAAc,oBAAoB,QAAQ,IAAI;AACpD,YAAM,YAAY,QAAQ;AAC1B,YAAM,YAAY,QAAQ;AAG1B,UAAI,CAAC,WAAW,KAAK,aAAa,SAAS,CAAC,GAAG;AAC7C,gBAAQ,KAAK,+BAA+B,SAAS,EAAE;AACvD,gBAAQ,IAAI,MAAM,KAAK,sCAAsC,CAAC;AAC9D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,OAAO;AAAA,MACjB;AAEA,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,OAAO,QAAQ;AAAA,QACf,cAAc,QAAQ,iBAAiB;AAAA,QACvC,QAAQ,QAAQ;AAAA,MAAA,CACjB;AAED,UAAI,OAAO,SAAS;AAClB,YAAI,QAAQ,QAAQ;AAClB,kBAAQ,QAAQ,mBAAmB;AAAA,QACrC,OAAO;AACL,kBAAQ,QAAQ,0BAA0B;AAAA,QAC5C;AAAA,MACF,OAAO;AACL,gBAAQ,KAAK,kCAAkC;AAAA,MACjD;AAEA,cAAQ,IAAA;AACR,cAAQ,IAAI,MAAM,MAAM,YAAY,CAAC;AACrC,cAAQ,IAAI,MAAM,KAAK,oBAAoB,SAAS,GAAG,CAAC;AACxD,cAAQ,IAAI,MAAM,KAAK,oBAAoB,SAAS,GAAG,CAAC;AACxD,cAAQ,IAAI,MAAM,MAAM,oBAAoB,OAAO,cAAc,EAAE,CAAC;AACpE,cAAQ,IAAI,MAAM,OAAO,oBAAoB,OAAO,YAAY,EAAE,CAAC;AACnE,cAAQ,IAAI,MAAM,KAAK,oBAAoB,OAAO,cAAc,EAAE,CAAC;AAEnE,UAAI,OAAO,UAAU,SAAS,KAAK,OAAO,UAAU,UAAU,IAAI;AAChE,gBAAQ,IAAA;AACR,gBAAQ,IAAI,MAAM,MAAM,oBAAoB,CAAC;AAC7C,eAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,QAAQ,WAAW;AACrD,kBAAQ,IAAI,MAAM,KAAK,OAAO,MAAM,EAAE,CAAC;AACvC,kBAAQ,IAAI,MAAM,KAAK,WAAW,MAAM,EAAE,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC;AAAA,QACxE,CAAC;AAAA,MACH,WAAW,OAAO,UAAU,SAAS,IAAI;AACvC,gBAAQ,IAAA;AACR,gBAAQ,IAAI,MAAM,MAAM,uBAAuB,CAAC;AAChD,eAAO,UAAU,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,QAAQ,KAAA,MAAW;AACjE,kBAAQ,IAAI,MAAM,KAAK,OAAO,MAAM,EAAE,CAAC;AACvC,kBAAQ,IAAI,MAAM,KAAK,WAAW,MAAM,EAAE,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC;AAAA,QACxE,CAAC;AACD,gBAAQ,IAAI,MAAM,KAAK,eAAe,OAAO,UAAU,SAAS,CAAC,OAAO,CAAC;AAAA,MAC3E;AAEA,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,IAAA;AACR,gBAAQ,IAAI,MAAM,IAAI,WAAW,CAAC;AAClC,eAAO,OAAO,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAA,QAAO;AACvC,kBAAQ,IAAI,MAAM,KAAK,SAAS,GAAG,EAAE,CAAC;AAAA,QACxC,CAAC;AACD,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,kBAAQ,IAAI,MAAM,KAAK,eAAe,OAAO,OAAO,SAAS,CAAC,OAAO,CAAC;AAAA,QACxE;AAAA,MACF;AAEA,UAAI,CAAC,QAAQ,UAAU,OAAO,iBAAiB,GAAG;AAChD,gBAAQ,IAAA;AACR,gBAAQ,IAAI,MAAM,KAAK,aAAa,CAAC;AACrC,gBAAQ,IAAI,MAAM,MAAM,eAAe,SAAS,aAAa,CAAC;AAC9D,gBAAQ,IAAI,MAAM,MAAM,+BAA+B,SAAS,CAAC;AACjE,gBAAQ,IAAI,MAAM,MAAM,oBAAoB,CAAC;AAAA,MAC/C;AAEA,cAAQ,IAAA;AAAA,IAEV,SAAS,OAAO;AACd,cAAQ,KAAK,mBAAmB;AAChC,cAAQ,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAKO,SAAS,2BAAoC;AAClD,QAAM,UAAU,IAAI,QAAQ,aAAa;AAEzC,UACG,YAAY,sCAAsC;AAGrD,UACG,QAAQ,cAAc,EACtB,YAAY,qCAAqC,EACjD,OAAO,qBAAqB,qBAAqB,GAAG,EACpD,OAAO,qBAAqB,gFAAgF,EAC5G,OAAO,yBAAyB,gDAAgD,QAAQ,EACxF,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,eAAe,gCAAgC,EACtD,OAAO,aAAa,yBAAyB,EAC7C,OAAO,OAAO,QAAQ,YAAY;AACjC,UAAM,UAAU,IAAI,uBAAuB,EAAE,MAAA;AAE7C,QAAI;AACF,YAAM,cAAc,oBAAoB,QAAQ,IAAI;AACpD,YAAM,aAAa,UAAU;AAE7B,YAAM,OAAO,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAA,CAAM,IAAI,CAAA;AAEnF,YAAM,SAAS,MAAM,eAAe;AAAA,QAClC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAAA,CACjB;AAED,UAAI,OAAO,SAAS;AAClB,gBAAQ,QAAQ,QAAQ,SAAS,sBAAsB,oBAAoB;AAAA,MAC7E,OAAO;AACL,gBAAQ,KAAK,uBAAuB;AAAA,MACtC;AAEA,cAAQ,IAAA;AACR,cAAQ,IAAI,MAAM,MAAM,YAAY,CAAC;AACrC,cAAQ,IAAI,MAAM,MAAM,iBAAiB,OAAO,YAAY,EAAE,CAAC;AAC/D,cAAQ,IAAI,MAAM,OAAO,iBAAiB,OAAO,YAAY,EAAE,CAAC;AAChE,cAAQ,IAAI,MAAM,KAAK,iBAAiB,OAAO,cAAc,EAAE,CAAC;AAEhE,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,IAAA;AACR,gBAAQ,IAAI,MAAM,IAAI,WAAW,CAAC;AAClC,eAAO,OAAO,QAAQ,CAAA,QAAO;AAC3B,kBAAQ,IAAI,MAAM,KAAK,SAAS,GAAG,EAAE,CAAC;AAAA,QACxC,CAAC;AAAA,MACH;AAEA,cAAQ,IAAA;AAAA,IAEV,SAAS,OAAO;AACd,cAAQ,KAAK,2BAA2B;AACxC,cAAQ,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,UACG,QAAQ,mBAAmB,EAC3B,YAAY,wCAAwC,EACpD,OAAO,qBAAqB,qBAAqB,GAAG,EACpD,OAAO,OAAO,QAAQ,YAAY;AACjC,UAAM,UAAU,IAAI,2BAA2B,EAAE,MAAA;AAEjD,QAAI;AACF,YAAM,cAAc,oBAAoB,QAAQ,IAAI;AACpD,YAAM,aAAa,UAAU;AAE7B,YAAM,SAAS,MAAM,oBAAoB,YAAY,WAAW;AAEhE,cAAQ,QAAQ,sBAAsB;AAEtC,cAAQ,IAAA;AACR,cAAQ,IAAI,MAAM,MAAM,2BAA2B,CAAC;AACpD,cAAQ,IAAI,MAAM,MAAM,iBAAiB,OAAO,KAAK,EAAE,CAAC;AACxD,cAAQ,IAAI,MAAM,IAAI,iBAAiB,OAAO,OAAO,EAAE,CAAC;AACxD,cAAQ,IAAI,MAAM,OAAO,iBAAiB,OAAO,OAAO,EAAE,CAAC;AAE3D,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,IAAA;AACR,gBAAQ,IAAI,MAAM,OAAO,iBAAiB,CAAC;AAC3C,eAAO,OAAO,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,aAAa;AACvD,kBAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,EAAE,CAAC;AACtC,iBAAO,QAAQ,CAAA,UAAS;AACtB,oBAAQ,IAAI,MAAM,KAAK,WAAW,KAAK,EAAE,CAAC;AAAA,UAC5C,CAAC;AAAA,QACH,CAAC;AACD,YAAI,OAAO,OAAO,SAAS,IAAI;AAC7B,kBAAQ,IAAI,MAAM,KAAK,eAAe,OAAO,OAAO,SAAS,EAAE,aAAa,CAAC;AAAA,QAC/E;AAEA,gBAAQ,IAAA;AACR,gBAAQ,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,MAAM,6BAA6B,CAAC;AAAA,MACnF;AAEA,cAAQ,IAAA;AAAA,IAEV,SAAS,OAAO;AACd,cAAQ,KAAK,mBAAmB;AAChC,cAAQ,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,UACG,QAAQ,iBAAiB,EACzB,YAAY,qDAAqD,EACjE,OAAO,qBAAqB,qBAAqB,GAAG,EACpD,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,aAAa,yBAAyB,EAC7C,OAAO,OAAO,QAAQ,YAAY;AACjC,UAAM,UAAU,IAAI,yBAAyB,EAAE,MAAA;AAE/C,QAAI;AACF,YAAM,cAAc,oBAAoB,QAAQ,IAAI;AACpD,YAAM,aAAa,UAAU;AAE7B,YAAM,SAAS,MAAM,eAAe;AAAA,QAClC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,OAAO;AAAA,QACP,QAAQ,QAAQ;AAAA,MAAA,CACjB;AAED,UAAI,OAAO,SAAS;AAClB,gBAAQ,QAAQ,QAAQ,SAAS,sBAAsB,sBAAsB;AAAA,MAC/E,OAAO;AACL,gBAAQ,KAAK,uBAAuB;AAAA,MACtC;AAEA,cAAQ,IAAA;AACR,cAAQ,IAAI,MAAM,MAAM,cAAc,OAAO,YAAY,QAAQ,CAAC;AAElE,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,IAAI,MAAM,IAAI,aAAa,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,MAC5D;AAEA,cAAQ,IAAA;AAAA,IAEV,SAAS,OAAO;AACd,cAAQ,KAAK,8BAA8B;AAC3C,cAAQ,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;"}
|
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/
|
|
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:"));
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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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"}
|
|
@@ -12,7 +12,7 @@ import type { NodeType } from '../core/types.js';
|
|
|
12
12
|
export interface AnalyzerOptions {
|
|
13
13
|
/** Source directory with existing docs */
|
|
14
14
|
sourceDir: string;
|
|
15
|
-
/** Target directory (default: docs
|
|
15
|
+
/** Target directory (default: docs) */
|
|
16
16
|
targetDir?: string;
|
|
17
17
|
/** Project root for path resolution */
|
|
18
18
|
projectRoot: string;
|
|
@@ -35,7 +35,7 @@ export interface AnalyzerOptions {
|
|
|
35
35
|
export interface AnalyzedDoc {
|
|
36
36
|
/** Original file path */
|
|
37
37
|
originalPath: string;
|
|
38
|
-
/** New file path in
|
|
38
|
+
/** New file path in target directory */
|
|
39
39
|
newPath: string;
|
|
40
40
|
/** Document title */
|
|
41
41
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-analyzer.d.ts","sourceRoot":"","sources":["../../src/generators/docs-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAA+B,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"docs-analyzer.d.ts","sourceRoot":"","sources":["../../src/generators/docs-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAA+B,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAClC;AAgDD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoHnF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-analyzer.js","sources":["../../src/generators/docs-analyzer.ts"],"sourcesContent":["/**\n * Docs Analyzer\n *\n * Advanced documentation analyzer that uses claude-flow to create\n * comprehensive knowledge graph documentation with proper structure,\n * wikilinks, frontmatter, and tags following Obsidian conventions.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport { execSync, spawn } from 'child_process';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Analyzer options\n */\nexport interface AnalyzerOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs-nn) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Use claude-flow for deep analysis */\n useClaudeFlow?: boolean;\n /** Create MOC (Map of Content) files */\n createMOC?: boolean;\n /** Link back to original docs */\n linkOriginal?: boolean;\n /** Maximum depth for analysis */\n maxDepth?: number;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\n/**\n * Analyzed document\n */\nexport interface AnalyzedDoc {\n /** Original file path */\n originalPath: string;\n /** New file path in docs-nn */\n newPath: string;\n /** Document title */\n title: string;\n /** Detected node type */\n type: NodeType;\n /** Extracted tags */\n tags: string[];\n /** Related documents (wikilinks) */\n related: string[];\n /** Key concepts extracted */\n concepts: string[];\n /** Areas needing research */\n researchNeeded: string[];\n /** TODOs found or generated */\n todos: string[];\n /** Summary/description */\n summary: string;\n /** Category path in structure */\n category: string;\n}\n\n/**\n * Analyzer result\n */\nexport interface AnalyzerResult {\n success: boolean;\n filesAnalyzed: number;\n filesCreated: number;\n mocFilesCreated: number;\n errors: string[];\n analyzed: AnalyzedDoc[];\n structure: Map<string, string[]>;\n}\n\n/**\n * Weave-NN category structure with descriptions\n */\nconst CATEGORY_STRUCTURE: Record<string, { type: NodeType; description: string; subcategories: string[] }> = {\n concepts: {\n type: 'concept',\n description: 'Abstract concepts, theories, and architectural principles',\n subcategories: ['architecture', 'patterns', 'principles', 'models'],\n },\n components: {\n type: 'technical',\n description: 'Reusable technical components and implementations',\n subcategories: ['ui', 'utilities', 'core', 'shared'],\n },\n services: {\n type: 'service',\n description: 'Backend services, APIs, and workers',\n subcategories: ['api', 'workers', 'handlers', 'middleware'],\n },\n features: {\n type: 'feature',\n description: 'Product features and capabilities',\n subcategories: ['core', 'advanced', 'experimental'],\n },\n integrations: {\n type: 'integration',\n description: 'External integrations and adapters',\n subcategories: ['databases', 'auth', 'storage', 'monitoring', 'third-party'],\n },\n standards: {\n type: 'standard',\n description: 'Coding standards, conventions, and best practices',\n subcategories: ['coding', 'documentation', 'testing', 'security'],\n },\n guides: {\n type: 'guide',\n description: 'How-to guides and tutorials',\n subcategories: ['getting-started', 'tutorials', 'troubleshooting', 'deployment'],\n },\n references: {\n type: 'technical',\n description: 'API references and technical documentation',\n subcategories: ['api', 'cli', 'config', 'schemas'],\n },\n};\n\n/**\n * Analyze and migrate documentation to weave-nn structure\n */\nexport async function analyzeDocs(options: AnalyzerOptions): Promise<AnalyzerResult> {\n const {\n sourceDir,\n targetDir = 'docs-nn',\n projectRoot,\n useClaudeFlow = false,\n createMOC = true,\n linkOriginal = true,\n maxDepth = 3,\n dryRun = false,\n verbose = false,\n } = options;\n\n const result: AnalyzerResult = {\n success: true,\n filesAnalyzed: 0,\n filesCreated: 0,\n mocFilesCreated: 0,\n errors: [],\n analyzed: [],\n structure: new Map(),\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createFullStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**', 'docs-nn/**'],\n });\n\n // First pass: Analyze all documents\n const analyzedDocs: AnalyzedDoc[] = [];\n\n for (const file of files) {\n result.filesAnalyzed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n const analyzed = await analyzeDocument(sourceFile, file, sourcePath, {\n useClaudeFlow,\n linkOriginal,\n verbose,\n });\n analyzedDocs.push(analyzed);\n\n // Track structure\n const category = analyzed.category.split('/')[0];\n if (!result.structure.has(category)) {\n result.structure.set(category, []);\n }\n result.structure.get(category)!.push(analyzed.title);\n\n } catch (error) {\n result.errors.push(`Failed to analyze ${file}: ${error}`);\n }\n }\n\n // Build cross-references between documents\n buildCrossReferences(analyzedDocs);\n\n // Second pass: Create new documents\n for (const doc of analyzedDocs) {\n try {\n const targetFile = join(targetPath, doc.newPath);\n\n if (!dryRun) {\n mkdirSync(dirname(targetFile), { recursive: true });\n const content = generateKnowledgeDoc(doc, sourceDir, linkOriginal, analyzedDocs);\n writeFileSync(targetFile, content, 'utf-8');\n }\n\n result.filesCreated++;\n result.analyzed.push(doc);\n\n } catch (error) {\n result.errors.push(`Failed to create ${doc.newPath}: ${error}`);\n }\n }\n\n // Create MOC files for each category\n if (createMOC && !dryRun) {\n for (const [category, docs] of result.structure) {\n const mocPath = join(targetPath, category, '_MOC.md');\n const mocContent = generateMOC(category, docs, analyzedDocs);\n writeFileSync(mocPath, mocContent, 'utf-8');\n result.mocFilesCreated++;\n }\n\n // Create master MOC\n const masterMocPath = join(targetPath, 'MOC.md');\n const masterMocContent = generateMasterMOC(result.structure, analyzedDocs);\n writeFileSync(masterMocPath, masterMocContent, 'utf-8');\n result.mocFilesCreated++;\n\n // Create PRIMITIVES.md\n const primitivesPath = join(targetPath, 'PRIMITIVES.md');\n const primitivesContent = generatePrimitives(analyzedDocs);\n writeFileSync(primitivesPath, primitivesContent, 'utf-8');\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Analyze a single document\n */\nasync function analyzeDocument(\n filePath: string,\n relativePath: string,\n sourcePath: string,\n options: { useClaudeFlow?: boolean; linkOriginal?: boolean; verbose?: boolean }\n): Promise<AnalyzedDoc> {\n const content = readFileSync(filePath, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n const filename = basename(filePath, '.md');\n const title = existingFrontmatter.title as string || formatTitle(filename);\n\n // Detect node type and category\n const { type, category } = detectTypeAndCategory(relativePath, body, existingFrontmatter);\n\n // Extract tags\n const tags = extractAllTags(body, existingFrontmatter, relativePath);\n\n // Extract wikilinks and markdown links\n const related = extractLinks(body);\n\n // Extract key concepts\n const concepts = extractConcepts(body);\n\n // Find areas needing research\n const researchNeeded = findResearchAreas(body, filename);\n\n // Extract existing TODOs and generate new ones\n const todos = extractAndGenerateTodos(body, content, filename);\n\n // Generate summary\n const summary = generateSummary(body, existingFrontmatter);\n\n // Determine new path\n const newPath = join(category, formatFilename(filename) + '.md');\n\n return {\n originalPath: relativePath,\n newPath,\n title,\n type,\n tags,\n related,\n concepts,\n researchNeeded,\n todos,\n summary,\n category,\n };\n}\n\n/**\n * Create full target directory structure\n */\nfunction createFullStructure(targetPath: string): void {\n // Create all category directories and subcategories\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n mkdirSync(join(targetPath, category), { recursive: true });\n for (const sub of config.subcategories) {\n mkdirSync(join(targetPath, category, sub), { recursive: true });\n }\n }\n\n // Create meta directories\n mkdirSync(join(targetPath, '_templates'), { recursive: true });\n mkdirSync(join(targetPath, '_attachments'), { recursive: true });\n mkdirSync(join(targetPath, '_archive'), { recursive: true });\n}\n\n/**\n * Detect node type and category from content\n */\nfunction detectTypeAndCategory(\n filePath: string,\n content: string,\n frontmatter: Record<string, unknown>\n): { type: NodeType; category: string } {\n // Check frontmatter first\n if (frontmatter.type && frontmatter.category) {\n return {\n type: frontmatter.type as NodeType,\n category: frontmatter.category as string,\n };\n }\n\n const lowerContent = content.toLowerCase();\n const lowerPath = filePath.toLowerCase();\n\n // Score each category\n const scores: Record<string, number> = {};\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n scores[category] = 0;\n\n // Path matching\n if (lowerPath.includes(category)) scores[category] += 10;\n for (const sub of config.subcategories) {\n if (lowerPath.includes(sub)) scores[category] += 5;\n }\n\n // Content analysis based on type\n const keywords = getKeywordsForType(config.type);\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = content.match(regex);\n if (matches) scores[category] += matches.length;\n }\n }\n\n // Find best match\n let bestCategory = 'concepts';\n let bestScore = 0;\n\n for (const [category, score] of Object.entries(scores)) {\n if (score > bestScore) {\n bestScore = score;\n bestCategory = category;\n }\n }\n\n return {\n type: CATEGORY_STRUCTURE[bestCategory].type,\n category: bestCategory,\n };\n}\n\n/**\n * Get keywords for a node type\n */\nfunction getKeywordsForType(type: NodeType): string[] {\n const keywords: Record<NodeType, string[]> = {\n concept: ['concept', 'theory', 'principle', 'overview', 'introduction', 'architecture', 'design', 'pattern'],\n technical: ['component', 'implementation', 'class', 'function', 'module', 'utility', 'helper'],\n feature: ['feature', 'capability', 'functionality', 'user', 'requirement', 'use case'],\n primitive: ['library', 'framework', 'dependency', 'tool', 'sdk'],\n service: ['api', 'endpoint', 'service', 'server', 'backend', 'worker', 'handler'],\n guide: ['how to', 'tutorial', 'guide', 'step', 'walkthrough', 'getting started'],\n standard: ['standard', 'convention', 'best practice', 'rule', 'guideline', 'style'],\n integration: ['integration', 'connect', 'plugin', 'adapter', 'sync', 'import', 'export'],\n };\n\n return keywords[type] || [];\n}\n\n/**\n * Extract all tags from content and path\n */\nfunction extractAllTags(\n content: string,\n frontmatter: Record<string, unknown>,\n filePath: string\n): string[] {\n const tags = new Set<string>();\n\n // Add existing frontmatter tags\n if (Array.isArray(frontmatter.tags)) {\n frontmatter.tags.forEach(t => tags.add(String(t)));\n }\n\n // Extract #tags from content\n const hashTags = content.match(/#[\\w-]+/g);\n if (hashTags) {\n hashTags.forEach(t => tags.add(t.slice(1)));\n }\n\n // Generate tags from path\n const pathParts = filePath.split('/').filter(p => p && !p.endsWith('.md'));\n pathParts.forEach(p => {\n if (p.length > 2 && p.length < 20) {\n tags.add(p.replace(/[-_]/g, '-').toLowerCase());\n }\n });\n\n // Add status tags\n if (content.match(/\\b(wip|draft|todo)\\b/i)) tags.add('needs-work');\n if (content.match(/\\b(deprecated|legacy)\\b/i)) tags.add('deprecated');\n if (content.match(/\\b(experimental|beta)\\b/i)) tags.add('experimental');\n\n return [...tags].slice(0, 15);\n}\n\n/**\n * Extract wikilinks and markdown links\n */\nfunction extractLinks(content: string): string[] {\n const links = new Set<string>();\n\n // Wikilinks\n const wikilinks = content.match(/\\[\\[([^\\]|]+)(?:\\|[^\\]]+)?\\]\\]/g);\n if (wikilinks) {\n wikilinks.forEach(link => {\n const match = link.match(/\\[\\[([^\\]|]+)/);\n if (match) links.add(match[1].trim());\n });\n }\n\n // Markdown links (internal only)\n const mdLinks = content.match(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g);\n if (mdLinks) {\n mdLinks.forEach(link => {\n const match = link.match(/\\]\\(([^)]+)\\)/);\n if (match && !match[1].startsWith('http')) {\n links.add(match[1].replace(/\\.md$/, '').trim());\n }\n });\n }\n\n return [...links];\n}\n\n/**\n * Extract key concepts from content\n */\nfunction extractConcepts(content: string): string[] {\n const concepts: string[] = [];\n\n // Look for headers as concepts\n const headers = content.match(/^##\\s+(.+)$/gm);\n if (headers) {\n headers.slice(0, 5).forEach(h => {\n concepts.push(h.replace(/^##\\s+/, '').trim());\n });\n }\n\n // Look for bold terms as concepts\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n boldTerms.slice(0, 5).forEach(term => {\n const clean = term.replace(/\\*\\*/g, '').trim();\n if (clean.length > 2 && clean.length < 50) {\n concepts.push(clean);\n }\n });\n }\n\n return [...new Set(concepts)].slice(0, 10);\n}\n\n/**\n * Find areas needing research\n */\nfunction findResearchAreas(content: string, filename: string): string[] {\n const areas: string[] = [];\n\n // Look for question marks indicating uncertainty\n const questions = content.match(/[^.!?]*\\?/g);\n if (questions) {\n questions.slice(0, 3).forEach(q => {\n if (q.length > 10 && q.length < 200) {\n areas.push(q.trim());\n }\n });\n }\n\n // Look for placeholders\n if (content.match(/\\bTBD\\b|\\bTODO\\b|\\bFIXME\\b/i)) {\n areas.push('Contains placeholders that need completion');\n }\n\n // Look for empty sections\n const emptyHeaders = content.match(/^##[^#\\n]+\\n\\n##/gm);\n if (emptyHeaders) {\n areas.push('Has empty sections that need content');\n }\n\n // Check for missing content indicators\n if (content.length < 500) {\n areas.push('Document is short - may need expansion');\n }\n\n return areas;\n}\n\n/**\n * Extract and generate TODOs\n */\nfunction extractAndGenerateTodos(body: string, fullContent: string, filename: string): string[] {\n const todos: string[] = [];\n\n // Extract existing TODOs\n const existingTodos = fullContent.match(/[-*]\\s*\\[[ x]\\]\\s*(.+)/g);\n if (existingTodos) {\n existingTodos.forEach(todo => {\n todos.push(todo.replace(/^[-*]\\s*\\[[ x]\\]\\s*/, '').trim());\n });\n }\n\n // Extract TODO comments\n const todoComments = fullContent.match(/(?:TODO|FIXME|XXX):\\s*(.+)/gi);\n if (todoComments) {\n todoComments.forEach(todo => {\n todos.push(todo.replace(/^(?:TODO|FIXME|XXX):\\s*/i, '').trim());\n });\n }\n\n // Generate suggested TODOs based on analysis\n if (!fullContent.match(/^---[\\s\\S]*?---/)) {\n todos.push('Add proper frontmatter');\n }\n\n if (!fullContent.match(/\\[\\[/)) {\n todos.push('Add wikilinks to related documents');\n }\n\n if (!fullContent.match(/^##\\s/m)) {\n todos.push('Add section structure with headers');\n }\n\n return [...new Set(todos)].slice(0, 10);\n}\n\n/**\n * Generate summary from content\n */\nfunction generateSummary(body: string, frontmatter: Record<string, unknown>): string {\n // Use existing description\n if (frontmatter.description) {\n return String(frontmatter.description);\n }\n\n // Extract first meaningful paragraph\n const lines = body.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```') && trimmed.length > 30) {\n return trimmed.length > 200 ? trimmed.slice(0, 197) + '...' : trimmed;\n }\n }\n\n return 'Documentation requiring summary.';\n}\n\n/**\n * Build cross-references between documents\n */\nfunction buildCrossReferences(docs: AnalyzedDoc[]): void {\n const titleMap = new Map<string, AnalyzedDoc>();\n\n // Build title lookup\n docs.forEach(doc => {\n titleMap.set(doc.title.toLowerCase(), doc);\n titleMap.set(formatFilename(doc.title), doc);\n });\n\n // Update related links\n docs.forEach(doc => {\n const newRelated: string[] = [];\n\n doc.related.forEach(link => {\n const linkedDoc = titleMap.get(link.toLowerCase()) || titleMap.get(formatFilename(link));\n if (linkedDoc) {\n newRelated.push(linkedDoc.title);\n } else {\n newRelated.push(link);\n }\n });\n\n // Find related docs by shared tags\n const sharedTagDocs = docs.filter(other =>\n other !== doc &&\n other.tags.some(t => doc.tags.includes(t))\n );\n\n sharedTagDocs.slice(0, 3).forEach(other => {\n if (!newRelated.includes(other.title)) {\n newRelated.push(other.title);\n }\n });\n\n doc.related = [...new Set(newRelated)].slice(0, 10);\n });\n}\n\n/**\n * Generate knowledge document content\n */\nfunction generateKnowledgeDoc(\n doc: AnalyzedDoc,\n sourceDir: string,\n linkOriginal: boolean,\n allDocs: AnalyzedDoc[]\n): string {\n const lines: string[] = [];\n\n // Frontmatter\n lines.push('---');\n lines.push(`title: \"${doc.title}\"`);\n lines.push(`type: ${doc.type}`);\n lines.push(`status: active`);\n if (doc.tags.length > 0) {\n lines.push('tags:');\n doc.tags.forEach(tag => lines.push(` - ${tag}`));\n }\n lines.push(`category: ${doc.category}`);\n lines.push(`description: \"${doc.summary.replace(/\"/g, '\\\\\"')}\"`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push(`updated: ${new Date().toISOString().split('T')[0]}`);\n if (linkOriginal) {\n lines.push(`original: \"${sourceDir}/${doc.originalPath}\"`);\n }\n if (doc.related.length > 0) {\n lines.push('related:');\n doc.related.slice(0, 5).forEach(r => lines.push(` - \"[[${r}]]\"`));\n }\n lines.push('---');\n lines.push('');\n\n // Title\n lines.push(`# ${doc.title}`);\n lines.push('');\n\n // Summary\n lines.push('## Overview');\n lines.push('');\n lines.push(doc.summary);\n lines.push('');\n\n // Original reference\n if (linkOriginal) {\n lines.push(`> [!info] Original Documentation`);\n lines.push(`> See [[${sourceDir}/${doc.originalPath}|original document]] for full details.`);\n lines.push('');\n }\n\n // Key concepts\n if (doc.concepts.length > 0) {\n lines.push('## Key Concepts');\n lines.push('');\n doc.concepts.forEach(concept => {\n lines.push(`- **${concept}**`);\n });\n lines.push('');\n }\n\n // Related documents\n if (doc.related.length > 0) {\n lines.push('## Related');\n lines.push('');\n doc.related.forEach(rel => {\n lines.push(`- [[${rel}]]`);\n });\n lines.push('');\n }\n\n // Research needed\n if (doc.researchNeeded.length > 0) {\n lines.push('## Research Needed');\n lines.push('');\n lines.push('> [!warning] Areas Requiring Further Research');\n doc.researchNeeded.forEach(area => {\n lines.push(`> - ${area}`);\n });\n lines.push('');\n }\n\n // TODOs\n if (doc.todos.length > 0) {\n lines.push('## TODOs');\n lines.push('');\n doc.todos.forEach(todo => {\n lines.push(`- [ ] ${todo}`);\n });\n lines.push('');\n }\n\n // Tags section\n lines.push('## Tags');\n lines.push('');\n lines.push(doc.tags.map(t => `#${t}`).join(' '));\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate MOC (Map of Content) for a category\n */\nfunction generateMOC(category: string, docTitles: string[], allDocs: AnalyzedDoc[]): string {\n const config = CATEGORY_STRUCTURE[category];\n const categoryDocs = allDocs.filter(d => d.category.startsWith(category));\n\n const lines: string[] = [];\n\n lines.push('---');\n lines.push(`title: \"${formatTitle(category)} - Map of Content\"`);\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(` - ${category}`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push(`# ${formatTitle(category)}`);\n lines.push('');\n lines.push(config?.description || `Documentation related to ${category}.`);\n lines.push('');\n\n // Group by subcategory\n const bySubcategory = new Map<string, AnalyzedDoc[]>();\n categoryDocs.forEach(doc => {\n const parts = doc.category.split('/');\n const sub = parts[1] || 'general';\n if (!bySubcategory.has(sub)) {\n bySubcategory.set(sub, []);\n }\n bySubcategory.get(sub)!.push(doc);\n });\n\n for (const [sub, docs] of bySubcategory) {\n lines.push(`## ${formatTitle(sub)}`);\n lines.push('');\n docs.forEach(doc => {\n lines.push(`- [[${doc.title}]] - ${doc.summary.slice(0, 60)}...`);\n });\n lines.push('');\n }\n\n lines.push('---');\n lines.push(`*${categoryDocs.length} documents in this category*`);\n\n return lines.join('\\n');\n}\n\n/**\n * Generate master MOC\n */\nfunction generateMasterMOC(structure: Map<string, string[]>, allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Knowledge Graph - Master Index\"');\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(' - index');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Knowledge Graph');\n lines.push('');\n lines.push('Welcome to the knowledge graph. This is the master index of all documentation.');\n lines.push('');\n lines.push('## Categories');\n lines.push('');\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n const count = structure.get(category)?.length || 0;\n lines.push(`### [[${category}/_MOC|${formatTitle(category)}]]`);\n lines.push('');\n lines.push(`${config.description}`);\n lines.push(`*${count} documents*`);\n lines.push('');\n }\n\n lines.push('## Quick Links');\n lines.push('');\n lines.push('- [[PRIMITIVES]] - Core building blocks and technologies');\n lines.push('- [[guides/_MOC|Getting Started]]');\n lines.push('- [[standards/_MOC|Coding Standards]]');\n lines.push('');\n\n lines.push('## Statistics');\n lines.push('');\n lines.push(`- **Total Documents**: ${allDocs.length}`);\n lines.push(`- **Categories**: ${structure.size}`);\n lines.push(`- **Generated**: ${new Date().toISOString()}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate PRIMITIVES.md\n */\nfunction generatePrimitives(allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Primitives\"');\n lines.push('type: primitive');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - primitives');\n lines.push(' - foundation');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Primitives');\n lines.push('');\n lines.push('Core building blocks and foundational technologies used in this project.');\n lines.push('');\n\n // Group docs by type\n const byType = new Map<NodeType, AnalyzedDoc[]>();\n allDocs.forEach(doc => {\n if (!byType.has(doc.type)) {\n byType.set(doc.type, []);\n }\n byType.get(doc.type)!.push(doc);\n });\n\n for (const [type, docs] of byType) {\n lines.push(`## ${formatTitle(type)}`);\n lines.push('');\n docs.slice(0, 10).forEach(doc => {\n lines.push(`- [[${doc.title}]]`);\n });\n if (docs.length > 10) {\n lines.push(`- *...and ${docs.length - 10} more*`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format filename from title\n */\nfunction formatFilename(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 50);\n}\n\n/**\n * Format title from filename\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docs-analyzer.js","sources":["../../src/generators/docs-analyzer.ts"],"sourcesContent":["/**\n * Docs Analyzer\n *\n * Advanced documentation analyzer that uses claude-flow to create\n * comprehensive knowledge graph documentation with proper structure,\n * wikilinks, frontmatter, and tags following Obsidian conventions.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport { execSync, spawn } from 'child_process';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Analyzer options\n */\nexport interface AnalyzerOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Use claude-flow for deep analysis */\n useClaudeFlow?: boolean;\n /** Create MOC (Map of Content) files */\n createMOC?: boolean;\n /** Link back to original docs */\n linkOriginal?: boolean;\n /** Maximum depth for analysis */\n maxDepth?: number;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\n/**\n * Analyzed document\n */\nexport interface AnalyzedDoc {\n /** Original file path */\n originalPath: string;\n /** New file path in target directory */\n newPath: string;\n /** Document title */\n title: string;\n /** Detected node type */\n type: NodeType;\n /** Extracted tags */\n tags: string[];\n /** Related documents (wikilinks) */\n related: string[];\n /** Key concepts extracted */\n concepts: string[];\n /** Areas needing research */\n researchNeeded: string[];\n /** TODOs found or generated */\n todos: string[];\n /** Summary/description */\n summary: string;\n /** Category path in structure */\n category: string;\n}\n\n/**\n * Analyzer result\n */\nexport interface AnalyzerResult {\n success: boolean;\n filesAnalyzed: number;\n filesCreated: number;\n mocFilesCreated: number;\n errors: string[];\n analyzed: AnalyzedDoc[];\n structure: Map<string, string[]>;\n}\n\n/**\n * Weave-NN category structure with descriptions\n */\nconst CATEGORY_STRUCTURE: Record<string, { type: NodeType; description: string; subcategories: string[] }> = {\n concepts: {\n type: 'concept',\n description: 'Abstract concepts, theories, and architectural principles',\n subcategories: ['architecture', 'patterns', 'principles', 'models'],\n },\n components: {\n type: 'technical',\n description: 'Reusable technical components and implementations',\n subcategories: ['ui', 'utilities', 'core', 'shared'],\n },\n services: {\n type: 'service',\n description: 'Backend services, APIs, and workers',\n subcategories: ['api', 'workers', 'handlers', 'middleware'],\n },\n features: {\n type: 'feature',\n description: 'Product features and capabilities',\n subcategories: ['core', 'advanced', 'experimental'],\n },\n integrations: {\n type: 'integration',\n description: 'External integrations and adapters',\n subcategories: ['databases', 'auth', 'storage', 'monitoring', 'third-party'],\n },\n standards: {\n type: 'standard',\n description: 'Coding standards, conventions, and best practices',\n subcategories: ['coding', 'documentation', 'testing', 'security'],\n },\n guides: {\n type: 'guide',\n description: 'How-to guides and tutorials',\n subcategories: ['getting-started', 'tutorials', 'troubleshooting', 'deployment'],\n },\n references: {\n type: 'technical',\n description: 'API references and technical documentation',\n subcategories: ['api', 'cli', 'config', 'schemas'],\n },\n};\n\n/**\n * Analyze and migrate documentation to weave-nn structure\n */\nexport async function analyzeDocs(options: AnalyzerOptions): Promise<AnalyzerResult> {\n const {\n sourceDir,\n targetDir = 'docs',\n projectRoot,\n useClaudeFlow = false,\n createMOC = true,\n linkOriginal = true,\n maxDepth = 3,\n dryRun = false,\n verbose = false,\n } = options;\n\n const result: AnalyzerResult = {\n success: true,\n filesAnalyzed: 0,\n filesCreated: 0,\n mocFilesCreated: 0,\n errors: [],\n analyzed: [],\n structure: new Map(),\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createFullStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**', 'docs-nn/**'],\n });\n\n // First pass: Analyze all documents\n const analyzedDocs: AnalyzedDoc[] = [];\n\n for (const file of files) {\n result.filesAnalyzed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n const analyzed = await analyzeDocument(sourceFile, file, sourcePath, {\n useClaudeFlow,\n linkOriginal,\n verbose,\n });\n analyzedDocs.push(analyzed);\n\n // Track structure\n const category = analyzed.category.split('/')[0];\n if (!result.structure.has(category)) {\n result.structure.set(category, []);\n }\n result.structure.get(category)!.push(analyzed.title);\n\n } catch (error) {\n result.errors.push(`Failed to analyze ${file}: ${error}`);\n }\n }\n\n // Build cross-references between documents\n buildCrossReferences(analyzedDocs);\n\n // Second pass: Create new documents\n for (const doc of analyzedDocs) {\n try {\n const targetFile = join(targetPath, doc.newPath);\n\n if (!dryRun) {\n mkdirSync(dirname(targetFile), { recursive: true });\n const content = generateKnowledgeDoc(doc, sourceDir, linkOriginal, analyzedDocs);\n writeFileSync(targetFile, content, 'utf-8');\n }\n\n result.filesCreated++;\n result.analyzed.push(doc);\n\n } catch (error) {\n result.errors.push(`Failed to create ${doc.newPath}: ${error}`);\n }\n }\n\n // Create MOC files for each category\n if (createMOC && !dryRun) {\n for (const [category, docs] of result.structure) {\n const mocPath = join(targetPath, category, '_MOC.md');\n const mocContent = generateMOC(category, docs, analyzedDocs);\n writeFileSync(mocPath, mocContent, 'utf-8');\n result.mocFilesCreated++;\n }\n\n // Create master MOC\n const masterMocPath = join(targetPath, 'MOC.md');\n const masterMocContent = generateMasterMOC(result.structure, analyzedDocs);\n writeFileSync(masterMocPath, masterMocContent, 'utf-8');\n result.mocFilesCreated++;\n\n // Create PRIMITIVES.md\n const primitivesPath = join(targetPath, 'PRIMITIVES.md');\n const primitivesContent = generatePrimitives(analyzedDocs);\n writeFileSync(primitivesPath, primitivesContent, 'utf-8');\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Analyze a single document\n */\nasync function analyzeDocument(\n filePath: string,\n relativePath: string,\n sourcePath: string,\n options: { useClaudeFlow?: boolean; linkOriginal?: boolean; verbose?: boolean }\n): Promise<AnalyzedDoc> {\n const content = readFileSync(filePath, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n const filename = basename(filePath, '.md');\n const title = existingFrontmatter.title as string || formatTitle(filename);\n\n // Detect node type and category\n const { type, category } = detectTypeAndCategory(relativePath, body, existingFrontmatter);\n\n // Extract tags\n const tags = extractAllTags(body, existingFrontmatter, relativePath);\n\n // Extract wikilinks and markdown links\n const related = extractLinks(body);\n\n // Extract key concepts\n const concepts = extractConcepts(body);\n\n // Find areas needing research\n const researchNeeded = findResearchAreas(body, filename);\n\n // Extract existing TODOs and generate new ones\n const todos = extractAndGenerateTodos(body, content, filename);\n\n // Generate summary\n const summary = generateSummary(body, existingFrontmatter);\n\n // Determine new path\n const newPath = join(category, formatFilename(filename) + '.md');\n\n return {\n originalPath: relativePath,\n newPath,\n title,\n type,\n tags,\n related,\n concepts,\n researchNeeded,\n todos,\n summary,\n category,\n };\n}\n\n/**\n * Create full target directory structure\n */\nfunction createFullStructure(targetPath: string): void {\n // Create all category directories and subcategories\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n mkdirSync(join(targetPath, category), { recursive: true });\n for (const sub of config.subcategories) {\n mkdirSync(join(targetPath, category, sub), { recursive: true });\n }\n }\n\n // Create meta directories\n mkdirSync(join(targetPath, '_templates'), { recursive: true });\n mkdirSync(join(targetPath, '_attachments'), { recursive: true });\n mkdirSync(join(targetPath, '_archive'), { recursive: true });\n}\n\n/**\n * Detect node type and category from content\n */\nfunction detectTypeAndCategory(\n filePath: string,\n content: string,\n frontmatter: Record<string, unknown>\n): { type: NodeType; category: string } {\n // Check frontmatter first\n if (frontmatter.type && frontmatter.category) {\n return {\n type: frontmatter.type as NodeType,\n category: frontmatter.category as string,\n };\n }\n\n const lowerContent = content.toLowerCase();\n const lowerPath = filePath.toLowerCase();\n\n // Score each category\n const scores: Record<string, number> = {};\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n scores[category] = 0;\n\n // Path matching\n if (lowerPath.includes(category)) scores[category] += 10;\n for (const sub of config.subcategories) {\n if (lowerPath.includes(sub)) scores[category] += 5;\n }\n\n // Content analysis based on type\n const keywords = getKeywordsForType(config.type);\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = content.match(regex);\n if (matches) scores[category] += matches.length;\n }\n }\n\n // Find best match\n let bestCategory = 'concepts';\n let bestScore = 0;\n\n for (const [category, score] of Object.entries(scores)) {\n if (score > bestScore) {\n bestScore = score;\n bestCategory = category;\n }\n }\n\n return {\n type: CATEGORY_STRUCTURE[bestCategory].type,\n category: bestCategory,\n };\n}\n\n/**\n * Get keywords for a node type\n */\nfunction getKeywordsForType(type: NodeType): string[] {\n const keywords: Record<NodeType, string[]> = {\n concept: ['concept', 'theory', 'principle', 'overview', 'introduction', 'architecture', 'design', 'pattern'],\n technical: ['component', 'implementation', 'class', 'function', 'module', 'utility', 'helper'],\n feature: ['feature', 'capability', 'functionality', 'user', 'requirement', 'use case'],\n primitive: ['library', 'framework', 'dependency', 'tool', 'sdk'],\n service: ['api', 'endpoint', 'service', 'server', 'backend', 'worker', 'handler'],\n guide: ['how to', 'tutorial', 'guide', 'step', 'walkthrough', 'getting started'],\n standard: ['standard', 'convention', 'best practice', 'rule', 'guideline', 'style'],\n integration: ['integration', 'connect', 'plugin', 'adapter', 'sync', 'import', 'export'],\n };\n\n return keywords[type] || [];\n}\n\n/**\n * Extract all tags from content and path\n */\nfunction extractAllTags(\n content: string,\n frontmatter: Record<string, unknown>,\n filePath: string\n): string[] {\n const tags = new Set<string>();\n\n // Add existing frontmatter tags\n if (Array.isArray(frontmatter.tags)) {\n frontmatter.tags.forEach(t => tags.add(String(t)));\n }\n\n // Extract #tags from content\n const hashTags = content.match(/#[\\w-]+/g);\n if (hashTags) {\n hashTags.forEach(t => tags.add(t.slice(1)));\n }\n\n // Generate tags from path\n const pathParts = filePath.split('/').filter(p => p && !p.endsWith('.md'));\n pathParts.forEach(p => {\n if (p.length > 2 && p.length < 20) {\n tags.add(p.replace(/[-_]/g, '-').toLowerCase());\n }\n });\n\n // Add status tags\n if (content.match(/\\b(wip|draft|todo)\\b/i)) tags.add('needs-work');\n if (content.match(/\\b(deprecated|legacy)\\b/i)) tags.add('deprecated');\n if (content.match(/\\b(experimental|beta)\\b/i)) tags.add('experimental');\n\n return [...tags].slice(0, 15);\n}\n\n/**\n * Extract wikilinks and markdown links\n */\nfunction extractLinks(content: string): string[] {\n const links = new Set<string>();\n\n // Wikilinks\n const wikilinks = content.match(/\\[\\[([^\\]|]+)(?:\\|[^\\]]+)?\\]\\]/g);\n if (wikilinks) {\n wikilinks.forEach(link => {\n const match = link.match(/\\[\\[([^\\]|]+)/);\n if (match) links.add(match[1].trim());\n });\n }\n\n // Markdown links (internal only)\n const mdLinks = content.match(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g);\n if (mdLinks) {\n mdLinks.forEach(link => {\n const match = link.match(/\\]\\(([^)]+)\\)/);\n if (match && !match[1].startsWith('http')) {\n links.add(match[1].replace(/\\.md$/, '').trim());\n }\n });\n }\n\n return [...links];\n}\n\n/**\n * Extract key concepts from content\n */\nfunction extractConcepts(content: string): string[] {\n const concepts: string[] = [];\n\n // Look for headers as concepts\n const headers = content.match(/^##\\s+(.+)$/gm);\n if (headers) {\n headers.slice(0, 5).forEach(h => {\n concepts.push(h.replace(/^##\\s+/, '').trim());\n });\n }\n\n // Look for bold terms as concepts\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n boldTerms.slice(0, 5).forEach(term => {\n const clean = term.replace(/\\*\\*/g, '').trim();\n if (clean.length > 2 && clean.length < 50) {\n concepts.push(clean);\n }\n });\n }\n\n return [...new Set(concepts)].slice(0, 10);\n}\n\n/**\n * Find areas needing research\n */\nfunction findResearchAreas(content: string, filename: string): string[] {\n const areas: string[] = [];\n\n // Look for question marks indicating uncertainty\n const questions = content.match(/[^.!?]*\\?/g);\n if (questions) {\n questions.slice(0, 3).forEach(q => {\n if (q.length > 10 && q.length < 200) {\n areas.push(q.trim());\n }\n });\n }\n\n // Look for placeholders\n if (content.match(/\\bTBD\\b|\\bTODO\\b|\\bFIXME\\b/i)) {\n areas.push('Contains placeholders that need completion');\n }\n\n // Look for empty sections\n const emptyHeaders = content.match(/^##[^#\\n]+\\n\\n##/gm);\n if (emptyHeaders) {\n areas.push('Has empty sections that need content');\n }\n\n // Check for missing content indicators\n if (content.length < 500) {\n areas.push('Document is short - may need expansion');\n }\n\n return areas;\n}\n\n/**\n * Extract and generate TODOs\n */\nfunction extractAndGenerateTodos(body: string, fullContent: string, filename: string): string[] {\n const todos: string[] = [];\n\n // Extract existing TODOs\n const existingTodos = fullContent.match(/[-*]\\s*\\[[ x]\\]\\s*(.+)/g);\n if (existingTodos) {\n existingTodos.forEach(todo => {\n todos.push(todo.replace(/^[-*]\\s*\\[[ x]\\]\\s*/, '').trim());\n });\n }\n\n // Extract TODO comments\n const todoComments = fullContent.match(/(?:TODO|FIXME|XXX):\\s*(.+)/gi);\n if (todoComments) {\n todoComments.forEach(todo => {\n todos.push(todo.replace(/^(?:TODO|FIXME|XXX):\\s*/i, '').trim());\n });\n }\n\n // Generate suggested TODOs based on analysis\n if (!fullContent.match(/^---[\\s\\S]*?---/)) {\n todos.push('Add proper frontmatter');\n }\n\n if (!fullContent.match(/\\[\\[/)) {\n todos.push('Add wikilinks to related documents');\n }\n\n if (!fullContent.match(/^##\\s/m)) {\n todos.push('Add section structure with headers');\n }\n\n return [...new Set(todos)].slice(0, 10);\n}\n\n/**\n * Generate summary from content\n */\nfunction generateSummary(body: string, frontmatter: Record<string, unknown>): string {\n // Use existing description\n if (frontmatter.description) {\n return String(frontmatter.description);\n }\n\n // Extract first meaningful paragraph\n const lines = body.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```') && trimmed.length > 30) {\n return trimmed.length > 200 ? trimmed.slice(0, 197) + '...' : trimmed;\n }\n }\n\n return 'Documentation requiring summary.';\n}\n\n/**\n * Build cross-references between documents\n */\nfunction buildCrossReferences(docs: AnalyzedDoc[]): void {\n const titleMap = new Map<string, AnalyzedDoc>();\n\n // Build title lookup\n docs.forEach(doc => {\n titleMap.set(doc.title.toLowerCase(), doc);\n titleMap.set(formatFilename(doc.title), doc);\n });\n\n // Update related links\n docs.forEach(doc => {\n const newRelated: string[] = [];\n\n doc.related.forEach(link => {\n const linkedDoc = titleMap.get(link.toLowerCase()) || titleMap.get(formatFilename(link));\n if (linkedDoc) {\n newRelated.push(linkedDoc.title);\n } else {\n newRelated.push(link);\n }\n });\n\n // Find related docs by shared tags\n const sharedTagDocs = docs.filter(other =>\n other !== doc &&\n other.tags.some(t => doc.tags.includes(t))\n );\n\n sharedTagDocs.slice(0, 3).forEach(other => {\n if (!newRelated.includes(other.title)) {\n newRelated.push(other.title);\n }\n });\n\n doc.related = [...new Set(newRelated)].slice(0, 10);\n });\n}\n\n/**\n * Generate knowledge document content\n */\nfunction generateKnowledgeDoc(\n doc: AnalyzedDoc,\n sourceDir: string,\n linkOriginal: boolean,\n allDocs: AnalyzedDoc[]\n): string {\n const lines: string[] = [];\n\n // Frontmatter\n lines.push('---');\n lines.push(`title: \"${doc.title}\"`);\n lines.push(`type: ${doc.type}`);\n lines.push(`status: active`);\n if (doc.tags.length > 0) {\n lines.push('tags:');\n doc.tags.forEach(tag => lines.push(` - ${tag}`));\n }\n lines.push(`category: ${doc.category}`);\n lines.push(`description: \"${doc.summary.replace(/\"/g, '\\\\\"')}\"`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push(`updated: ${new Date().toISOString().split('T')[0]}`);\n if (linkOriginal) {\n lines.push(`original: \"${sourceDir}/${doc.originalPath}\"`);\n }\n if (doc.related.length > 0) {\n lines.push('related:');\n doc.related.slice(0, 5).forEach(r => lines.push(` - \"[[${r}]]\"`));\n }\n lines.push('---');\n lines.push('');\n\n // Title\n lines.push(`# ${doc.title}`);\n lines.push('');\n\n // Summary\n lines.push('## Overview');\n lines.push('');\n lines.push(doc.summary);\n lines.push('');\n\n // Original reference\n if (linkOriginal) {\n lines.push(`> [!info] Original Documentation`);\n lines.push(`> See [[${sourceDir}/${doc.originalPath}|original document]] for full details.`);\n lines.push('');\n }\n\n // Key concepts\n if (doc.concepts.length > 0) {\n lines.push('## Key Concepts');\n lines.push('');\n doc.concepts.forEach(concept => {\n lines.push(`- **${concept}**`);\n });\n lines.push('');\n }\n\n // Related documents\n if (doc.related.length > 0) {\n lines.push('## Related');\n lines.push('');\n doc.related.forEach(rel => {\n lines.push(`- [[${rel}]]`);\n });\n lines.push('');\n }\n\n // Research needed\n if (doc.researchNeeded.length > 0) {\n lines.push('## Research Needed');\n lines.push('');\n lines.push('> [!warning] Areas Requiring Further Research');\n doc.researchNeeded.forEach(area => {\n lines.push(`> - ${area}`);\n });\n lines.push('');\n }\n\n // TODOs\n if (doc.todos.length > 0) {\n lines.push('## TODOs');\n lines.push('');\n doc.todos.forEach(todo => {\n lines.push(`- [ ] ${todo}`);\n });\n lines.push('');\n }\n\n // Tags section\n lines.push('## Tags');\n lines.push('');\n lines.push(doc.tags.map(t => `#${t}`).join(' '));\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate MOC (Map of Content) for a category\n */\nfunction generateMOC(category: string, docTitles: string[], allDocs: AnalyzedDoc[]): string {\n const config = CATEGORY_STRUCTURE[category];\n const categoryDocs = allDocs.filter(d => d.category.startsWith(category));\n\n const lines: string[] = [];\n\n lines.push('---');\n lines.push(`title: \"${formatTitle(category)} - Map of Content\"`);\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(` - ${category}`);\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push(`# ${formatTitle(category)}`);\n lines.push('');\n lines.push(config?.description || `Documentation related to ${category}.`);\n lines.push('');\n\n // Group by subcategory\n const bySubcategory = new Map<string, AnalyzedDoc[]>();\n categoryDocs.forEach(doc => {\n const parts = doc.category.split('/');\n const sub = parts[1] || 'general';\n if (!bySubcategory.has(sub)) {\n bySubcategory.set(sub, []);\n }\n bySubcategory.get(sub)!.push(doc);\n });\n\n for (const [sub, docs] of bySubcategory) {\n lines.push(`## ${formatTitle(sub)}`);\n lines.push('');\n docs.forEach(doc => {\n lines.push(`- [[${doc.title}]] - ${doc.summary.slice(0, 60)}...`);\n });\n lines.push('');\n }\n\n lines.push('---');\n lines.push(`*${categoryDocs.length} documents in this category*`);\n\n return lines.join('\\n');\n}\n\n/**\n * Generate master MOC\n */\nfunction generateMasterMOC(structure: Map<string, string[]>, allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Knowledge Graph - Master Index\"');\n lines.push('type: concept');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - moc');\n lines.push(' - index');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Knowledge Graph');\n lines.push('');\n lines.push('Welcome to the knowledge graph. This is the master index of all documentation.');\n lines.push('');\n lines.push('## Categories');\n lines.push('');\n\n for (const [category, config] of Object.entries(CATEGORY_STRUCTURE)) {\n const count = structure.get(category)?.length || 0;\n lines.push(`### [[${category}/_MOC|${formatTitle(category)}]]`);\n lines.push('');\n lines.push(`${config.description}`);\n lines.push(`*${count} documents*`);\n lines.push('');\n }\n\n lines.push('## Quick Links');\n lines.push('');\n lines.push('- [[PRIMITIVES]] - Core building blocks and technologies');\n lines.push('- [[guides/_MOC|Getting Started]]');\n lines.push('- [[standards/_MOC|Coding Standards]]');\n lines.push('');\n\n lines.push('## Statistics');\n lines.push('');\n lines.push(`- **Total Documents**: ${allDocs.length}`);\n lines.push(`- **Categories**: ${structure.size}`);\n lines.push(`- **Generated**: ${new Date().toISOString()}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate PRIMITIVES.md\n */\nfunction generatePrimitives(allDocs: AnalyzedDoc[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('title: \"Primitives\"');\n lines.push('type: primitive');\n lines.push('status: active');\n lines.push('tags:');\n lines.push(' - primitives');\n lines.push(' - foundation');\n lines.push(' - knowledge-graph');\n lines.push(`created: ${new Date().toISOString().split('T')[0]}`);\n lines.push('---');\n lines.push('');\n lines.push('# Primitives');\n lines.push('');\n lines.push('Core building blocks and foundational technologies used in this project.');\n lines.push('');\n\n // Group docs by type\n const byType = new Map<NodeType, AnalyzedDoc[]>();\n allDocs.forEach(doc => {\n if (!byType.has(doc.type)) {\n byType.set(doc.type, []);\n }\n byType.get(doc.type)!.push(doc);\n });\n\n for (const [type, docs] of byType) {\n lines.push(`## ${formatTitle(type)}`);\n lines.push('');\n docs.slice(0, 10).forEach(doc => {\n lines.push(`- [[${doc.title}]]`);\n });\n if (docs.length > 10) {\n lines.push(`- *...and ${docs.length - 10} more*`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format filename from title\n */\nfunction formatFilename(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 50);\n}\n\n/**\n * Format title from filename\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import type { NodeType, NodeStatus } from '../core/types.js';
|
|
|
11
11
|
export interface ConvertOptions {
|
|
12
12
|
/** Source directory with existing docs */
|
|
13
13
|
sourceDir: string;
|
|
14
|
-
/** Target directory (default: docs
|
|
14
|
+
/** Target directory (default: docs) */
|
|
15
15
|
targetDir?: string;
|
|
16
16
|
/** Project root for path resolution */
|
|
17
17
|
projectRoot: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-convert.d.ts","sourceRoot":"","sources":["../../src/generators/docs-convert.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"docs-convert.d.ts","sourceRoot":"","sources":["../../src/generators/docs-convert.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,sBAAsB;IACtB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,QAAQ,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA6FjF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiF5F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACnD,CAAC,CA6DD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-convert.js","sources":["../../src/generators/docs-convert.ts"],"sourcesContent":["/**\n * Docs Converter\n *\n * Converts existing documentation to weave-nn structure with proper\n * frontmatter and directory organization.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, copyFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Conversion options\n */\nexport interface ConvertOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs-nn) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Preserve original files (copy instead of move) */\n preserveOriginal?: boolean;\n /** Overwrite existing files in target */\n force?: boolean;\n /** Auto-categorize based on content analysis */\n autoCategory?: boolean;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n}\n\n/**\n * Frontmatter options\n */\nexport interface FrontmatterOptions {\n /** Target file or directory */\n target: string;\n /** Project root */\n projectRoot: string;\n /** Override type detection */\n type?: NodeType;\n /** Override status */\n status?: NodeStatus;\n /** Additional tags to add */\n tags?: string[];\n /** Force overwrite existing frontmatter */\n force?: boolean;\n /** Dry run */\n dryRun?: boolean;\n}\n\n/**\n * Conversion result\n */\nexport interface ConvertResult {\n success: boolean;\n filesProcessed: number;\n filesConverted: number;\n filesSkipped: number;\n errors: string[];\n converted: Array<{\n source: string;\n target: string;\n type: NodeType;\n }>;\n}\n\n/**\n * Frontmatter result\n */\nexport interface FrontmatterResult {\n success: boolean;\n filesProcessed: number;\n filesUpdated: number;\n filesSkipped: number;\n errors: string[];\n}\n\n/**\n * Weave-NN directory structure mapping\n */\nconst CATEGORY_DIRS: Record<NodeType, string> = {\n concept: 'concepts',\n technical: 'components',\n feature: 'features',\n primitive: 'integrations',\n service: 'services',\n guide: 'guides',\n standard: 'standards',\n integration: 'integrations',\n};\n\n/**\n * Keywords for content-based categorization\n */\nconst CATEGORY_KEYWORDS: Record<NodeType, string[]> = {\n concept: [\n 'overview', 'introduction', 'theory', 'principle', 'concept',\n 'philosophy', 'approach', 'methodology', 'paradigm', 'model',\n ],\n technical: [\n 'component', 'implementation', 'class', 'function', 'module',\n 'algorithm', 'data structure', 'interface', 'abstract', 'utility',\n ],\n feature: [\n 'feature', 'capability', 'functionality', 'use case', 'user story',\n 'requirement', 'specification', 'product', 'roadmap',\n ],\n primitive: [\n 'library', 'framework', 'dependency', 'package', 'tool',\n 'sdk', 'runtime', 'platform', 'language',\n ],\n service: [\n 'api', 'endpoint', 'service', 'server', 'backend', 'microservice',\n 'rest', 'graphql', 'webhook', 'worker', 'queue',\n ],\n guide: [\n 'how to', 'tutorial', 'guide', 'walkthrough', 'step by step',\n 'getting started', 'setup', 'installation', 'configuration',\n ],\n standard: [\n 'standard', 'convention', 'best practice', 'rule', 'policy',\n 'guideline', 'coding style', 'lint', 'format',\n ],\n integration: [\n 'integration', 'connect', 'plugin', 'adapter', 'bridge',\n 'sync', 'import', 'export', 'webhook',\n ],\n};\n\n/**\n * Path-based categorization patterns\n */\nconst PATH_PATTERNS: Array<{ pattern: RegExp; type: NodeType }> = [\n { pattern: /\\/(api|endpoints?|routes?)\\//i, type: 'service' },\n { pattern: /\\/(guide|tutorial|howto|getting-started)\\//i, type: 'guide' },\n { pattern: /\\/(component|ui|widget)\\//i, type: 'technical' },\n { pattern: /\\/(feature|capability)\\//i, type: 'feature' },\n { pattern: /\\/(standard|convention|style)\\//i, type: 'standard' },\n { pattern: /\\/(integration|plugin|adapter)\\//i, type: 'integration' },\n { pattern: /\\/(service|worker|job)\\//i, type: 'service' },\n { pattern: /\\/(concept|architecture|design)\\//i, type: 'concept' },\n];\n\n/**\n * Convert existing docs to weave-nn structure\n */\nexport async function convertDocs(options: ConvertOptions): Promise<ConvertResult> {\n const {\n sourceDir,\n targetDir = 'docs-nn',\n projectRoot,\n preserveOriginal = true,\n force = false,\n autoCategory = true,\n dryRun = false,\n } = options;\n\n const result: ConvertResult = {\n success: true,\n filesProcessed: 0,\n filesConverted: 0,\n filesSkipped: 0,\n errors: [],\n converted: [],\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createTargetStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n });\n\n for (const file of files) {\n result.filesProcessed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n // Read and parse file\n const content = readFileSync(sourceFile, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Determine node type\n const nodeType = autoCategory\n ? detectNodeType(file, body, existingFrontmatter)\n : (existingFrontmatter.type as NodeType) || 'concept';\n\n // Determine target path\n const targetSubdir = CATEGORY_DIRS[nodeType];\n const targetFile = join(targetPath, targetSubdir, basename(file));\n\n // Check if target exists\n if (existsSync(targetFile) && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(file, body, nodeType, existingFrontmatter);\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n // Ensure directory exists\n mkdirSync(dirname(targetFile), { recursive: true });\n\n // Write converted file\n writeFileSync(targetFile, newContent, 'utf-8');\n }\n\n result.filesConverted++;\n result.converted.push({\n source: file,\n target: relative(projectRoot, targetFile),\n type: nodeType,\n });\n\n } catch (error) {\n result.errors.push(`Failed to convert ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Add or update frontmatter in existing files\n */\nexport async function addFrontmatter(options: FrontmatterOptions): Promise<FrontmatterResult> {\n const {\n target,\n projectRoot,\n type,\n status = 'active',\n tags = [],\n force = false,\n dryRun = false,\n } = options;\n\n const result: FrontmatterResult = {\n success: true,\n filesProcessed: 0,\n filesUpdated: 0,\n filesSkipped: 0,\n errors: [],\n };\n\n const targetPath = join(projectRoot, target);\n\n // Handle single file or directory\n let files: string[];\n if (existsSync(targetPath) && !targetPath.endsWith('.md')) {\n // Directory - find all markdown files\n files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n } else if (existsSync(targetPath)) {\n files = [targetPath];\n } else {\n result.success = false;\n result.errors.push(`Target not found: ${targetPath}`);\n return result;\n }\n\n for (const file of files) {\n result.filesProcessed++;\n\n try {\n const content = readFileSync(file, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Skip if has frontmatter and not forcing\n if (Object.keys(existingFrontmatter).length > 0 && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Detect type if not specified\n const relPath = relative(projectRoot, file);\n const nodeType = type || detectNodeType(relPath, body, existingFrontmatter);\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(\n relPath,\n body,\n nodeType,\n force ? {} : existingFrontmatter,\n status,\n tags\n );\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n writeFileSync(file, newContent, 'utf-8');\n }\n\n result.filesUpdated++;\n\n } catch (error) {\n result.errors.push(`Failed to update ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Validate frontmatter in files\n */\nexport async function validateFrontmatter(\n target: string,\n projectRoot: string\n): Promise<{\n valid: number;\n invalid: number;\n missing: number;\n issues: Array<{ file: string; issues: string[] }>;\n}> {\n const result = {\n valid: 0,\n invalid: 0,\n missing: 0,\n issues: [] as Array<{ file: string; issues: string[] }>,\n };\n\n const targetPath = join(projectRoot, target);\n\n const files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n const validStatuses: NodeStatus[] = ['draft', 'active', 'deprecated', 'archived'];\n\n for (const file of files) {\n const content = readFileSync(file, 'utf-8');\n const { data: frontmatter } = matter(content);\n const fileIssues: string[] = [];\n\n if (Object.keys(frontmatter).length === 0) {\n result.missing++;\n fileIssues.push('Missing frontmatter');\n } else {\n // Check required fields\n if (!frontmatter.title) {\n fileIssues.push('Missing title');\n }\n if (!frontmatter.type) {\n fileIssues.push('Missing type');\n } else if (!validTypes.includes(frontmatter.type)) {\n fileIssues.push(`Invalid type: ${frontmatter.type}`);\n }\n if (frontmatter.status && !validStatuses.includes(frontmatter.status)) {\n fileIssues.push(`Invalid status: ${frontmatter.status}`);\n }\n if (!frontmatter.created) {\n fileIssues.push('Missing created date');\n }\n }\n\n if (fileIssues.length > 0) {\n result.invalid++;\n result.issues.push({\n file: relative(projectRoot, file),\n issues: fileIssues,\n });\n } else if (Object.keys(frontmatter).length > 0) {\n result.valid++;\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create target directory structure\n */\nfunction createTargetStructure(targetPath: string): void {\n const dirs = [\n '',\n 'concepts',\n 'concepts/architecture',\n 'concepts/patterns',\n 'components',\n 'components/ui',\n 'components/utilities',\n 'services',\n 'services/api',\n 'services/workers',\n 'features',\n 'features/core',\n 'features/advanced',\n 'integrations',\n 'integrations/databases',\n 'integrations/auth',\n 'standards',\n 'standards/coding',\n 'standards/documentation',\n 'guides',\n 'guides/getting-started',\n 'guides/tutorials',\n 'references',\n 'references/api',\n '_templates',\n '_attachments',\n ];\n\n for (const dir of dirs) {\n const fullPath = join(targetPath, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n }\n }\n}\n\n/**\n * Detect node type from file path and content\n */\nfunction detectNodeType(\n filePath: string,\n content: string,\n existingFrontmatter: Record<string, unknown>\n): NodeType {\n // Use existing type if valid\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n if (existingFrontmatter.type && validTypes.includes(existingFrontmatter.type as NodeType)) {\n return existingFrontmatter.type as NodeType;\n }\n\n // Check path patterns\n for (const { pattern, type } of PATH_PATTERNS) {\n if (pattern.test(filePath)) {\n return type;\n }\n }\n\n // Analyze content\n const lowerContent = content.toLowerCase();\n const scores: Record<NodeType, number> = {\n concept: 0,\n technical: 0,\n feature: 0,\n primitive: 0,\n service: 0,\n guide: 0,\n standard: 0,\n integration: 0,\n };\n\n for (const [nodeType, keywords] of Object.entries(CATEGORY_KEYWORDS)) {\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = lowerContent.match(regex);\n if (matches) {\n scores[nodeType as NodeType] += matches.length;\n }\n }\n }\n\n // Find highest scoring type\n let maxScore = 0;\n let detectedType: NodeType = 'concept';\n\n for (const [nodeType, score] of Object.entries(scores)) {\n if (score > maxScore) {\n maxScore = score;\n detectedType = nodeType as NodeType;\n }\n }\n\n return detectedType;\n}\n\n/**\n * Generate frontmatter for a file\n */\nfunction generateFrontmatter(\n filePath: string,\n content: string,\n nodeType: NodeType,\n existing: Record<string, unknown> = {},\n status: NodeStatus = 'active',\n additionalTags: string[] = []\n): NodeFrontmatter {\n const filename = basename(filePath, '.md');\n const title = existing.title as string || formatTitle(filename);\n\n // Extract tags from content\n const extractedTags = extractTags(content);\n const allTags = [...new Set([\n ...(existing.tags as string[] || []),\n ...extractedTags,\n ...additionalTags,\n ])];\n\n // Get dates\n const now = new Date().toISOString().split('T')[0];\n const created = existing.created as string || now;\n\n return {\n title,\n type: nodeType,\n status: existing.status as NodeStatus || status,\n tags: allTags.length > 0 ? allTags : undefined,\n category: existing.category as string || undefined,\n description: existing.description as string || extractDescription(content),\n created,\n updated: now,\n aliases: existing.aliases as string[] || undefined,\n related: existing.related as string[] || undefined,\n };\n}\n\n/**\n * Format filename as title\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n\n/**\n * Extract tags from content\n */\nfunction extractTags(content: string): string[] {\n const tags: string[] = [];\n\n // Look for #tags in content\n const tagMatches = content.match(/#[\\w-]+/g);\n if (tagMatches) {\n tags.push(...tagMatches.map(t => t.slice(1)));\n }\n\n return tags.slice(0, 10); // Limit to 10 tags\n}\n\n/**\n * Extract description from first paragraph\n */\nfunction extractDescription(content: string): string | undefined {\n // Skip headers and find first paragraph\n const lines = content.split('\\n');\n let description = '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {\n description = trimmed;\n break;\n }\n }\n\n if (description.length > 200) {\n description = description.slice(0, 197) + '...';\n }\n\n return description || undefined;\n}\n\n/**\n * Build markdown content with frontmatter\n */\nfunction buildMarkdownWithFrontmatter(\n frontmatter: NodeFrontmatter,\n content: string\n): string {\n // Clean undefined values\n const cleanFrontmatter: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(frontmatter)) {\n if (value !== undefined) {\n cleanFrontmatter[key] = value;\n }\n }\n\n // Build YAML frontmatter\n const yamlLines = ['---'];\n\n // Order: title, type, status, tags, description, dates, others\n const orderedKeys = ['title', 'type', 'status', 'tags', 'category', 'description', 'created', 'updated', 'aliases', 'related'];\n\n for (const key of orderedKeys) {\n if (cleanFrontmatter[key] !== undefined) {\n yamlLines.push(formatYamlLine(key, cleanFrontmatter[key]));\n }\n }\n\n yamlLines.push('---');\n yamlLines.push('');\n\n return yamlLines.join('\\n') + content.trim() + '\\n';\n}\n\n/**\n * Format a YAML line\n */\nfunction formatYamlLine(key: string, value: unknown): string {\n if (Array.isArray(value)) {\n if (value.length === 0) return '';\n return `${key}:\\n${value.map(v => ` - ${v}`).join('\\n')}`;\n }\n if (typeof value === 'string' && (value.includes(':') || value.includes('#'))) {\n return `${key}: \"${value}\"`;\n }\n return `${key}: ${value}`;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docs-convert.js","sources":["../../src/generators/docs-convert.ts"],"sourcesContent":["/**\n * Docs Converter\n *\n * Converts existing documentation to weave-nn structure with proper\n * frontmatter and directory organization.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, copyFileSync } from 'fs';\nimport { join, basename, dirname, relative, extname } from 'path';\nimport fg from 'fast-glob';\nimport matter from 'gray-matter';\nimport type { NodeType, NodeStatus, NodeFrontmatter } from '../core/types.js';\n\n/**\n * Conversion options\n */\nexport interface ConvertOptions {\n /** Source directory with existing docs */\n sourceDir: string;\n /** Target directory (default: docs) */\n targetDir?: string;\n /** Project root for path resolution */\n projectRoot: string;\n /** Preserve original files (copy instead of move) */\n preserveOriginal?: boolean;\n /** Overwrite existing files in target */\n force?: boolean;\n /** Auto-categorize based on content analysis */\n autoCategory?: boolean;\n /** Dry run - show what would be done */\n dryRun?: boolean;\n}\n\n/**\n * Frontmatter options\n */\nexport interface FrontmatterOptions {\n /** Target file or directory */\n target: string;\n /** Project root */\n projectRoot: string;\n /** Override type detection */\n type?: NodeType;\n /** Override status */\n status?: NodeStatus;\n /** Additional tags to add */\n tags?: string[];\n /** Force overwrite existing frontmatter */\n force?: boolean;\n /** Dry run */\n dryRun?: boolean;\n}\n\n/**\n * Conversion result\n */\nexport interface ConvertResult {\n success: boolean;\n filesProcessed: number;\n filesConverted: number;\n filesSkipped: number;\n errors: string[];\n converted: Array<{\n source: string;\n target: string;\n type: NodeType;\n }>;\n}\n\n/**\n * Frontmatter result\n */\nexport interface FrontmatterResult {\n success: boolean;\n filesProcessed: number;\n filesUpdated: number;\n filesSkipped: number;\n errors: string[];\n}\n\n/**\n * Weave-NN directory structure mapping\n */\nconst CATEGORY_DIRS: Record<NodeType, string> = {\n concept: 'concepts',\n technical: 'components',\n feature: 'features',\n primitive: 'integrations',\n service: 'services',\n guide: 'guides',\n standard: 'standards',\n integration: 'integrations',\n};\n\n/**\n * Keywords for content-based categorization\n */\nconst CATEGORY_KEYWORDS: Record<NodeType, string[]> = {\n concept: [\n 'overview', 'introduction', 'theory', 'principle', 'concept',\n 'philosophy', 'approach', 'methodology', 'paradigm', 'model',\n ],\n technical: [\n 'component', 'implementation', 'class', 'function', 'module',\n 'algorithm', 'data structure', 'interface', 'abstract', 'utility',\n ],\n feature: [\n 'feature', 'capability', 'functionality', 'use case', 'user story',\n 'requirement', 'specification', 'product', 'roadmap',\n ],\n primitive: [\n 'library', 'framework', 'dependency', 'package', 'tool',\n 'sdk', 'runtime', 'platform', 'language',\n ],\n service: [\n 'api', 'endpoint', 'service', 'server', 'backend', 'microservice',\n 'rest', 'graphql', 'webhook', 'worker', 'queue',\n ],\n guide: [\n 'how to', 'tutorial', 'guide', 'walkthrough', 'step by step',\n 'getting started', 'setup', 'installation', 'configuration',\n ],\n standard: [\n 'standard', 'convention', 'best practice', 'rule', 'policy',\n 'guideline', 'coding style', 'lint', 'format',\n ],\n integration: [\n 'integration', 'connect', 'plugin', 'adapter', 'bridge',\n 'sync', 'import', 'export', 'webhook',\n ],\n};\n\n/**\n * Path-based categorization patterns\n */\nconst PATH_PATTERNS: Array<{ pattern: RegExp; type: NodeType }> = [\n { pattern: /\\/(api|endpoints?|routes?)\\//i, type: 'service' },\n { pattern: /\\/(guide|tutorial|howto|getting-started)\\//i, type: 'guide' },\n { pattern: /\\/(component|ui|widget)\\//i, type: 'technical' },\n { pattern: /\\/(feature|capability)\\//i, type: 'feature' },\n { pattern: /\\/(standard|convention|style)\\//i, type: 'standard' },\n { pattern: /\\/(integration|plugin|adapter)\\//i, type: 'integration' },\n { pattern: /\\/(service|worker|job)\\//i, type: 'service' },\n { pattern: /\\/(concept|architecture|design)\\//i, type: 'concept' },\n];\n\n/**\n * Convert existing docs to weave-nn structure\n */\nexport async function convertDocs(options: ConvertOptions): Promise<ConvertResult> {\n const {\n sourceDir,\n targetDir = 'docs',\n projectRoot,\n preserveOriginal = true,\n force = false,\n autoCategory = true,\n dryRun = false,\n } = options;\n\n const result: ConvertResult = {\n success: true,\n filesProcessed: 0,\n filesConverted: 0,\n filesSkipped: 0,\n errors: [],\n converted: [],\n };\n\n const sourcePath = join(projectRoot, sourceDir);\n const targetPath = join(projectRoot, targetDir);\n\n // Validate source exists\n if (!existsSync(sourcePath)) {\n result.success = false;\n result.errors.push(`Source directory not found: ${sourcePath}`);\n return result;\n }\n\n // Create target structure\n if (!dryRun) {\n createTargetStructure(targetPath);\n }\n\n // Find all markdown files\n const files = await fg('**/*.md', {\n cwd: sourcePath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n });\n\n for (const file of files) {\n result.filesProcessed++;\n const sourceFile = join(sourcePath, file);\n\n try {\n // Read and parse file\n const content = readFileSync(sourceFile, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Determine node type\n const nodeType = autoCategory\n ? detectNodeType(file, body, existingFrontmatter)\n : (existingFrontmatter.type as NodeType) || 'concept';\n\n // Determine target path\n const targetSubdir = CATEGORY_DIRS[nodeType];\n const targetFile = join(targetPath, targetSubdir, basename(file));\n\n // Check if target exists\n if (existsSync(targetFile) && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(file, body, nodeType, existingFrontmatter);\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n // Ensure directory exists\n mkdirSync(dirname(targetFile), { recursive: true });\n\n // Write converted file\n writeFileSync(targetFile, newContent, 'utf-8');\n }\n\n result.filesConverted++;\n result.converted.push({\n source: file,\n target: relative(projectRoot, targetFile),\n type: nodeType,\n });\n\n } catch (error) {\n result.errors.push(`Failed to convert ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Add or update frontmatter in existing files\n */\nexport async function addFrontmatter(options: FrontmatterOptions): Promise<FrontmatterResult> {\n const {\n target,\n projectRoot,\n type,\n status = 'active',\n tags = [],\n force = false,\n dryRun = false,\n } = options;\n\n const result: FrontmatterResult = {\n success: true,\n filesProcessed: 0,\n filesUpdated: 0,\n filesSkipped: 0,\n errors: [],\n };\n\n const targetPath = join(projectRoot, target);\n\n // Handle single file or directory\n let files: string[];\n if (existsSync(targetPath) && !targetPath.endsWith('.md')) {\n // Directory - find all markdown files\n files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n } else if (existsSync(targetPath)) {\n files = [targetPath];\n } else {\n result.success = false;\n result.errors.push(`Target not found: ${targetPath}`);\n return result;\n }\n\n for (const file of files) {\n result.filesProcessed++;\n\n try {\n const content = readFileSync(file, 'utf-8');\n const { data: existingFrontmatter, content: body } = matter(content);\n\n // Skip if has frontmatter and not forcing\n if (Object.keys(existingFrontmatter).length > 0 && !force) {\n result.filesSkipped++;\n continue;\n }\n\n // Detect type if not specified\n const relPath = relative(projectRoot, file);\n const nodeType = type || detectNodeType(relPath, body, existingFrontmatter);\n\n // Generate frontmatter\n const frontmatter = generateFrontmatter(\n relPath,\n body,\n nodeType,\n force ? {} : existingFrontmatter,\n status,\n tags\n );\n\n // Build new content\n const newContent = buildMarkdownWithFrontmatter(frontmatter, body);\n\n if (!dryRun) {\n writeFileSync(file, newContent, 'utf-8');\n }\n\n result.filesUpdated++;\n\n } catch (error) {\n result.errors.push(`Failed to update ${file}: ${error}`);\n }\n }\n\n result.success = result.errors.length === 0;\n return result;\n}\n\n/**\n * Validate frontmatter in files\n */\nexport async function validateFrontmatter(\n target: string,\n projectRoot: string\n): Promise<{\n valid: number;\n invalid: number;\n missing: number;\n issues: Array<{ file: string; issues: string[] }>;\n}> {\n const result = {\n valid: 0,\n invalid: 0,\n missing: 0,\n issues: [] as Array<{ file: string; issues: string[] }>,\n };\n\n const targetPath = join(projectRoot, target);\n\n const files = await fg('**/*.md', {\n cwd: targetPath,\n ignore: ['node_modules/**', '.git/**', '_templates/**'],\n absolute: true,\n });\n\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n const validStatuses: NodeStatus[] = ['draft', 'active', 'deprecated', 'archived'];\n\n for (const file of files) {\n const content = readFileSync(file, 'utf-8');\n const { data: frontmatter } = matter(content);\n const fileIssues: string[] = [];\n\n if (Object.keys(frontmatter).length === 0) {\n result.missing++;\n fileIssues.push('Missing frontmatter');\n } else {\n // Check required fields\n if (!frontmatter.title) {\n fileIssues.push('Missing title');\n }\n if (!frontmatter.type) {\n fileIssues.push('Missing type');\n } else if (!validTypes.includes(frontmatter.type)) {\n fileIssues.push(`Invalid type: ${frontmatter.type}`);\n }\n if (frontmatter.status && !validStatuses.includes(frontmatter.status)) {\n fileIssues.push(`Invalid status: ${frontmatter.status}`);\n }\n if (!frontmatter.created) {\n fileIssues.push('Missing created date');\n }\n }\n\n if (fileIssues.length > 0) {\n result.invalid++;\n result.issues.push({\n file: relative(projectRoot, file),\n issues: fileIssues,\n });\n } else if (Object.keys(frontmatter).length > 0) {\n result.valid++;\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create target directory structure\n */\nfunction createTargetStructure(targetPath: string): void {\n const dirs = [\n '',\n 'concepts',\n 'concepts/architecture',\n 'concepts/patterns',\n 'components',\n 'components/ui',\n 'components/utilities',\n 'services',\n 'services/api',\n 'services/workers',\n 'features',\n 'features/core',\n 'features/advanced',\n 'integrations',\n 'integrations/databases',\n 'integrations/auth',\n 'standards',\n 'standards/coding',\n 'standards/documentation',\n 'guides',\n 'guides/getting-started',\n 'guides/tutorials',\n 'references',\n 'references/api',\n '_templates',\n '_attachments',\n ];\n\n for (const dir of dirs) {\n const fullPath = join(targetPath, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n }\n }\n}\n\n/**\n * Detect node type from file path and content\n */\nfunction detectNodeType(\n filePath: string,\n content: string,\n existingFrontmatter: Record<string, unknown>\n): NodeType {\n // Use existing type if valid\n const validTypes: NodeType[] = [\n 'concept', 'technical', 'feature', 'primitive',\n 'service', 'guide', 'standard', 'integration',\n ];\n\n if (existingFrontmatter.type && validTypes.includes(existingFrontmatter.type as NodeType)) {\n return existingFrontmatter.type as NodeType;\n }\n\n // Check path patterns\n for (const { pattern, type } of PATH_PATTERNS) {\n if (pattern.test(filePath)) {\n return type;\n }\n }\n\n // Analyze content\n const lowerContent = content.toLowerCase();\n const scores: Record<NodeType, number> = {\n concept: 0,\n technical: 0,\n feature: 0,\n primitive: 0,\n service: 0,\n guide: 0,\n standard: 0,\n integration: 0,\n };\n\n for (const [nodeType, keywords] of Object.entries(CATEGORY_KEYWORDS)) {\n for (const keyword of keywords) {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, 'gi');\n const matches = lowerContent.match(regex);\n if (matches) {\n scores[nodeType as NodeType] += matches.length;\n }\n }\n }\n\n // Find highest scoring type\n let maxScore = 0;\n let detectedType: NodeType = 'concept';\n\n for (const [nodeType, score] of Object.entries(scores)) {\n if (score > maxScore) {\n maxScore = score;\n detectedType = nodeType as NodeType;\n }\n }\n\n return detectedType;\n}\n\n/**\n * Generate frontmatter for a file\n */\nfunction generateFrontmatter(\n filePath: string,\n content: string,\n nodeType: NodeType,\n existing: Record<string, unknown> = {},\n status: NodeStatus = 'active',\n additionalTags: string[] = []\n): NodeFrontmatter {\n const filename = basename(filePath, '.md');\n const title = existing.title as string || formatTitle(filename);\n\n // Extract tags from content\n const extractedTags = extractTags(content);\n const allTags = [...new Set([\n ...(existing.tags as string[] || []),\n ...extractedTags,\n ...additionalTags,\n ])];\n\n // Get dates\n const now = new Date().toISOString().split('T')[0];\n const created = existing.created as string || now;\n\n return {\n title,\n type: nodeType,\n status: existing.status as NodeStatus || status,\n tags: allTags.length > 0 ? allTags : undefined,\n category: existing.category as string || undefined,\n description: existing.description as string || extractDescription(content),\n created,\n updated: now,\n aliases: existing.aliases as string[] || undefined,\n related: existing.related as string[] || undefined,\n };\n}\n\n/**\n * Format filename as title\n */\nfunction formatTitle(filename: string): string {\n return filename\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n\n/**\n * Extract tags from content\n */\nfunction extractTags(content: string): string[] {\n const tags: string[] = [];\n\n // Look for #tags in content\n const tagMatches = content.match(/#[\\w-]+/g);\n if (tagMatches) {\n tags.push(...tagMatches.map(t => t.slice(1)));\n }\n\n return tags.slice(0, 10); // Limit to 10 tags\n}\n\n/**\n * Extract description from first paragraph\n */\nfunction extractDescription(content: string): string | undefined {\n // Skip headers and find first paragraph\n const lines = content.split('\\n');\n let description = '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {\n description = trimmed;\n break;\n }\n }\n\n if (description.length > 200) {\n description = description.slice(0, 197) + '...';\n }\n\n return description || undefined;\n}\n\n/**\n * Build markdown content with frontmatter\n */\nfunction buildMarkdownWithFrontmatter(\n frontmatter: NodeFrontmatter,\n content: string\n): string {\n // Clean undefined values\n const cleanFrontmatter: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(frontmatter)) {\n if (value !== undefined) {\n cleanFrontmatter[key] = value;\n }\n }\n\n // Build YAML frontmatter\n const yamlLines = ['---'];\n\n // Order: title, type, status, tags, description, dates, others\n const orderedKeys = ['title', 'type', 'status', 'tags', 'category', 'description', 'created', 'updated', 'aliases', 'related'];\n\n for (const key of orderedKeys) {\n if (cleanFrontmatter[key] !== undefined) {\n yamlLines.push(formatYamlLine(key, cleanFrontmatter[key]));\n }\n }\n\n yamlLines.push('---');\n yamlLines.push('');\n\n return yamlLines.join('\\n') + content.trim() + '\\n';\n}\n\n/**\n * Format a YAML line\n */\nfunction formatYamlLine(key: string, value: unknown): string {\n if (Array.isArray(value)) {\n if (value.length === 0) return '';\n return `${key}:\\n${value.map(v => ` - ${v}`).join('\\n')}`;\n }\n if (typeof value === 'string' && (value.includes(':') || value.includes('#'))) {\n return `${key}: \"${value}\"`;\n }\n return `${key}: ${value}`;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as commonjs } from "../../../../../../../_virtual/
|
|
1
|
+
import { __exports as commonjs } from "../../../../../../../_virtual/index8.js";
|
|
2
2
|
import { __require as requireBraceExpansion } from "../../../../../../brace-expansion/index.js";
|
|
3
3
|
import { __require as requireAssertValidPattern } from "./assert-valid-pattern.js";
|
|
4
4
|
import { __require as requireAst } from "./ast.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as dist } from "../../../_virtual/
|
|
1
|
+
import { __exports as dist } from "../../../_virtual/index11.js";
|
|
2
2
|
import path__default from "path";
|
|
3
3
|
import require$$1 from "fs";
|
|
4
4
|
import { __require as requirePicomatch } from "../../picomatch/index.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavelogic/knowledge-graph-agent",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Knowledge graph agent for Claude Code - generates knowledge graphs, initializes docs, and integrates with claude-flow",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|