claude-flow 2.7.32 → 2.7.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/.claude/settings.local.json +9 -2
  2. package/.claude/skills/agentic-jujutsu/SKILL.md +645 -0
  3. package/CHANGELOG.md +75 -0
  4. package/bin/claude-flow +1 -1
  5. package/dist/src/cli/commands/mcp.js +61 -7
  6. package/dist/src/cli/commands/mcp.js.map +1 -1
  7. package/dist/src/cli/help-formatter.js +5 -3
  8. package/dist/src/cli/help-formatter.js.map +1 -1
  9. package/dist/src/cli/simple-cli.js +173 -79
  10. package/dist/src/cli/simple-cli.js.map +1 -1
  11. package/dist/src/cli/validation-helper.js.map +1 -1
  12. package/dist/src/core/version.js +2 -2
  13. package/dist/src/core/version.js.map +1 -1
  14. package/dist/src/mcp/async/job-manager-mcp25.js +240 -0
  15. package/dist/src/mcp/async/job-manager-mcp25.js.map +1 -0
  16. package/dist/src/mcp/index.js +8 -0
  17. package/dist/src/mcp/index.js.map +1 -1
  18. package/dist/src/mcp/protocol/version-negotiation.js +182 -0
  19. package/dist/src/mcp/protocol/version-negotiation.js.map +1 -0
  20. package/dist/src/mcp/registry/mcp-registry-client-2025.js +210 -0
  21. package/dist/src/mcp/registry/mcp-registry-client-2025.js.map +1 -0
  22. package/dist/src/mcp/server-factory.js +189 -0
  23. package/dist/src/mcp/server-factory.js.map +1 -0
  24. package/dist/src/mcp/server-mcp-2025.js +283 -0
  25. package/dist/src/mcp/server-mcp-2025.js.map +1 -0
  26. package/dist/src/mcp/tool-registry-progressive.js +319 -0
  27. package/dist/src/mcp/tool-registry-progressive.js.map +1 -0
  28. package/dist/src/mcp/tools/_template.js +62 -0
  29. package/dist/src/mcp/tools/_template.js.map +1 -0
  30. package/dist/src/mcp/tools/loader.js +228 -0
  31. package/dist/src/mcp/tools/loader.js.map +1 -0
  32. package/dist/src/mcp/tools/system/search.js +224 -0
  33. package/dist/src/mcp/tools/system/search.js.map +1 -0
  34. package/dist/src/mcp/tools/system/status.js +168 -0
  35. package/dist/src/mcp/tools/system/status.js.map +1 -0
  36. package/dist/src/mcp/validation/schema-validator-2025.js +198 -0
  37. package/dist/src/mcp/validation/schema-validator-2025.js.map +1 -0
  38. package/dist/src/memory/swarm-memory.js +340 -421
  39. package/dist/src/memory/swarm-memory.js.map +1 -1
  40. package/docs/.claude-flow/metrics/performance.json +3 -3
  41. package/docs/.claude-flow/metrics/task-metrics.json +3 -3
  42. package/docs/.github-release-issue-v2.7.33.md +488 -0
  43. package/docs/AGENTDB_BRANCH_MERGE_VERIFICATION.md +436 -0
  44. package/docs/BRANCH_REVIEW_SUMMARY.md +439 -0
  45. package/docs/DEEP_CODE_REVIEW_v2.7.33.md +1159 -0
  46. package/docs/MCP_2025_FEATURE_CONFIRMATION.md +698 -0
  47. package/docs/NPM_PUBLISH_GUIDE_v2.7.33.md +628 -0
  48. package/docs/REGRESSION_TEST_REPORT_v2.7.33.md +397 -0
  49. package/docs/RELEASE_NOTES_v2.7.33.md +618 -0
  50. package/docs/RELEASE_READINESS_SUMMARY.md +377 -0
  51. package/docs/RELEASE_SUMMARY_v2.7.33.md +456 -0
  52. package/docs/agentic-flow-agentdb-mcp-integration.md +1198 -0
  53. package/docs/mcp-2025-implementation-summary.md +459 -0
  54. package/docs/mcp-spec-2025-implementation-plan.md +1330 -0
  55. package/docs/phase-1-2-implementation-summary.md +676 -0
  56. package/docs/regression-analysis-phase-1-2.md +555 -0
  57. package/package.json +5 -1
  58. package/src/cli/commands/mcp.ts +86 -9
  59. package/src/mcp/async/job-manager-mcp25.ts +456 -0
  60. package/src/mcp/index.ts +60 -0
  61. package/src/mcp/protocol/version-negotiation.ts +329 -0
  62. package/src/mcp/registry/mcp-registry-client-2025.ts +334 -0
  63. package/src/mcp/server-factory.ts +426 -0
  64. package/src/mcp/server-mcp-2025.ts +507 -0
  65. package/src/mcp/tool-registry-progressive.ts +539 -0
  66. package/src/mcp/tools/_template.ts +174 -0
  67. package/src/mcp/tools/loader.ts +362 -0
  68. package/src/mcp/tools/system/search.ts +276 -0
  69. package/src/mcp/tools/system/status.ts +206 -0
  70. package/src/mcp/validation/schema-validator-2025.ts +294 -0
  71. package/docs/AGENTDB_V1.6.1_DEEP_REVIEW.md +0 -386
  72. package/docs/RECENT_RELEASES_SUMMARY.md +0 -375
  73. package/docs/V2.7.31_RELEASE_NOTES.md +0 -375
package/CHANGELOG.md CHANGED
@@ -5,6 +5,81 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.7.33] - 2025-11-12
9
+
10
+ ### Added
11
+ - **MCP 2025-11 Specification Compliance** - Full Phase A & B implementation
12
+ - Version negotiation with YYYY-MM format (e.g., '2025-11')
13
+ - Async job management with job handles and poll/resume semantics
14
+ - MCP Registry integration for server registration and discovery
15
+ - JSON Schema 1.1 validation (Draft 2020-12) with format support
16
+ - Enhanced MCP server with dual-mode operation (2025-11 + legacy)
17
+ - Server factory with automatic feature detection
18
+ - Enable with: `npx claude-flow mcp start --mcp2025`
19
+ - **Progressive Disclosure Pattern** - 98.7% token reduction (150k→2k tokens)
20
+ - Filesystem-based tool discovery with lazy loading
21
+ - Tools loaded on first invocation instead of at startup
22
+ - Metadata-only scanning for instant tool listing
23
+ - `tools/search` capability with 3 detail levels (names-only, basic, full)
24
+ - 10x faster startup (500-1000ms → 50-100ms)
25
+ - 90% memory reduction (~50MB → ~5MB)
26
+ - Scalability: 50 tools → 1000+ tools supported
27
+ - **AgentDB v1.6.1** - 150x faster vector search with HNSW indexing
28
+ - 56% memory reduction with optimized storage
29
+ - ReasoningBank integration for semantic memory
30
+ - SQLite backend (.swarm/memory.db) with JSON fallback
31
+ - Pattern recognition and confidence scoring
32
+ - **Agentic-Flow v1.9.4** - Enterprise features and reliability
33
+ - Provider fallback chain (Gemini→Claude→OpenRouter→ONNX)
34
+ - Circuit breaker patterns for cascading failure prevention
35
+ - Supabase cloud integration (@supabase/supabase-js@^2.78.0)
36
+ - Checkpointing for crash recovery and state persistence
37
+ - Budget controls and cost tracking
38
+ - Enhanced error handling and retry mechanisms
39
+
40
+ ### Fixed
41
+ - **Memory Stats Command** - Fixed GitHub #865 (memory stats showing zeros)
42
+ - UnifiedMemoryManager with SQLite/JSON backend support
43
+ - Enhanced ReasoningBank data display with confidence scores
44
+ - Intelligent mode detection (auto, basic, reasoningbank)
45
+ - Maintains 100% backward compatibility with JSON-only mode
46
+
47
+ ### Performance
48
+ - **98.7% token reduction** - Progressive disclosure pattern (150k→2k tokens)
49
+ - **10x faster startup** - Lazy loading architecture (500-1000ms → 50-100ms)
50
+ - **90% memory reduction** - Efficient resource management (~50MB → ~5MB)
51
+ - **150x faster vector search** - HNSW indexing in AgentDB v1.6.1
52
+ - **56% memory efficiency** - Optimized AgentDB storage
53
+
54
+ ### Documentation
55
+ - Added 87 new documentation files
56
+ - `docs/mcp-2025-implementation-summary.md` - MCP 2025-11 implementation guide
57
+ - `docs/phase-1-2-implementation-summary.md` - Progressive disclosure architecture
58
+ - `docs/regression-analysis-phase-1-2.md` - Backward compatibility analysis
59
+ - `docs/RELEASE_NOTES_v2.8.0.md` - Comprehensive release notes
60
+ - `docs/BRANCH_REVIEW_SUMMARY.md` - Branch review and verification
61
+ - `docs/MCP_2025_FEATURE_CONFIRMATION.md` - Feature verification report
62
+ - `docs/AGENTDB_BRANCH_MERGE_VERIFICATION.md` - AgentDB update verification
63
+ - `docs/NPM_PUBLISH_GUIDE_v2.8.0.md` - Publishing instructions
64
+ - Migration guides and usage examples
65
+ - API documentation for all MCP 2025-11 endpoints
66
+
67
+ ### Breaking Changes
68
+ - **NONE** - This release is 100% backward compatible
69
+ - All existing tools preserved (29 tools unchanged)
70
+ - Legacy MCP clients fully supported
71
+ - Old tool registry coexists with progressive registry
72
+ - All CLI commands functional
73
+ - Hook system intact
74
+ - Configuration files compatible
75
+
76
+ ### Notes
77
+ - MCP 2025-11 features are opt-in via `--mcp2025` flag
78
+ - Progressive disclosure is automatic (no configuration needed)
79
+ - All existing workflows continue to work unchanged
80
+ - Feature flags enable gradual rollout
81
+ - Zero production risks identified
82
+
8
83
  ## [2.7.32] - 2025-11-10
9
84
 
10
85
  ### Fixed
package/bin/claude-flow CHANGED
@@ -2,7 +2,7 @@
2
2
  # Claude-Flow Smart Dispatcher - Detects and uses the best available runtime
3
3
  # Enhanced with NPX cache error handling and retry logic
4
4
 
5
- VERSION="2.7.32"
5
+ VERSION="2.7.34"
6
6
 
7
7
  # Determine the correct path based on how the script is invoked
8
8
  if [ -L "$0" ]; then
@@ -2,8 +2,8 @@ import { Command } from '@cliffy/command';
2
2
  import chalk from 'chalk';
3
3
  import { logger } from '../../core/logger.js';
4
4
  import { configManager } from '../../core/config.js';
5
- import { MCPServer } from '../../mcp/server.js';
6
5
  import { eventBus } from '../../core/event-bus.js';
6
+ import { createMCPServer, isMCP2025Available, getServerCapabilities } from '../../mcp/server-factory.js';
7
7
  let mcpServer = null;
8
8
  export const mcpCommand = new Command().description('Manage MCP server and tools').action(()=>{
9
9
  console.log(chalk.yellow('Please specify a subcommand:'));
@@ -20,23 +20,75 @@ export const mcpCommand = new Command().description('Manage MCP server and tools
20
20
  default: 'localhost'
21
21
  }).option('--transport <transport:string>', 'Transport type (stdio, http)', {
22
22
  default: 'stdio'
23
+ }).option('--mcp2025', 'Enable MCP 2025-11 features (version negotiation, async jobs, etc.)', {
24
+ default: false
25
+ }).option('--no-legacy', 'Disable legacy client support', {
26
+ default: false
23
27
  }).action(async (options)=>{
24
28
  try {
25
29
  const config = await configManager.load();
30
+ const mcp2025Available = isMCP2025Available();
31
+ const enableMCP2025 = options.mcp2025 && mcp2025Available;
32
+ if (options.mcp2025 && !mcp2025Available) {
33
+ console.log(chalk.yellow('⚠️ MCP 2025-11 dependencies not found. Install with: npm install uuid ajv ajv-formats ajv-errors'));
34
+ console.log(chalk.yellow(' Falling back to legacy MCP server...'));
35
+ }
26
36
  const mcpConfig = {
27
37
  ...config.mcp,
28
38
  port: options.port,
29
39
  host: options.host,
30
- transport: options.transport
40
+ transport: options.transport,
41
+ features: {
42
+ enableMCP2025,
43
+ supportLegacyClients: options.legacy !== false,
44
+ enableVersionNegotiation: enableMCP2025,
45
+ enableAsyncJobs: enableMCP2025,
46
+ enableRegistryIntegration: false,
47
+ enableSchemaValidation: enableMCP2025,
48
+ enableProgressiveDisclosure: true
49
+ },
50
+ mcp2025: enableMCP2025 ? {
51
+ async: {
52
+ enabled: true,
53
+ maxJobs: 100,
54
+ jobTTL: 3600000
55
+ },
56
+ registry: {
57
+ enabled: process.env.MCP_REGISTRY_ENABLED === 'true',
58
+ url: process.env.MCP_REGISTRY_URL,
59
+ apiKey: process.env.MCP_REGISTRY_API_KEY
60
+ },
61
+ validation: {
62
+ enabled: true,
63
+ strictMode: false
64
+ }
65
+ } : undefined
31
66
  };
32
- mcpServer = new MCPServer(mcpConfig, eventBus, logger);
67
+ mcpServer = await createMCPServer(mcpConfig, eventBus, logger, {
68
+ autoDetectFeatures: false
69
+ });
33
70
  await mcpServer.start();
71
+ const capabilities = getServerCapabilities(mcpConfig);
34
72
  console.log(chalk.green(`✅ MCP server started on ${options.host}:${options.port}`));
35
- console.log(chalk.cyan(`📡 Server URL: http://${options.host}:${options.port}`));
36
- console.log(chalk.cyan(`🔧 Available tools: Research, Code, Terminal, Memory`));
37
- console.log(chalk.cyan(`📚 API documentation: http://${options.host}:${options.port}/docs`));
73
+ console.log(chalk.cyan(`🎯 Mode: ${enableMCP2025 ? 'MCP 2025-11 Enhanced' : 'Legacy Compatible'}`));
74
+ console.log(chalk.cyan(`📡 Transport: ${options.transport}`));
75
+ if (capabilities.length > 0) {
76
+ console.log(chalk.cyan(`✨ Capabilities: ${capabilities.join(', ')}`));
77
+ }
78
+ if (enableMCP2025) {
79
+ console.log(chalk.green(' • Version negotiation (YYYY-MM format)'));
80
+ console.log(chalk.green(' • Async job support (poll/resume)'));
81
+ console.log(chalk.green(' • JSON Schema 1.1 validation'));
82
+ console.log(chalk.green(' • Progressive disclosure (98.7% token reduction)'));
83
+ }
84
+ if (options.transport === 'http') {
85
+ console.log(chalk.cyan(`📚 Server URL: http://${options.host}:${options.port}`));
86
+ }
38
87
  } catch (error) {
39
88
  console.error(chalk.red(`❌ Failed to start MCP server: ${error.message}`));
89
+ logger.error('MCP server startup failed', {
90
+ error
91
+ });
40
92
  process.exit(1);
41
93
  }
42
94
  })).command('stop', new Command().description('Stop the MCP server').action(async ()=>{
@@ -103,7 +155,9 @@ export const mcpCommand = new Command().description('Manage MCP server and tools
103
155
  }
104
156
  console.log(chalk.yellow('🔄 Starting MCP server...'));
105
157
  const config = await configManager.load();
106
- mcpServer = new MCPServer(config.mcp, eventBus, logger);
158
+ mcpServer = await createMCPServer(config.mcp, eventBus, logger, {
159
+ autoDetectFeatures: true
160
+ });
107
161
  await mcpServer.start();
108
162
  console.log(chalk.green(`✅ MCP server restarted on ${config.mcp.host}:${config.mcp.port}`));
109
163
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/commands/mcp.ts"],"sourcesContent":["/**\n * MCP command for Claude-Flow\n */\n\nimport { Command } from '@cliffy/command';\nimport chalk from 'chalk';\nimport { logger } from '../../core/logger.js';\nimport { configManager } from '../../core/config.js';\nimport { MCPServer } from '../../mcp/server.js';\nimport { eventBus } from '../../core/event-bus.js';\n\nlet mcpServer: MCPServer | null = null;\n\nexport const mcpCommand = new Command()\n .description('Manage MCP server and tools')\n .action(() => {\n console.log(chalk.yellow('Please specify a subcommand:'));\n console.log(' start - Start the MCP server');\n console.log(' stop - Stop the MCP server');\n console.log(' status - Show MCP server status');\n console.log(' tools - List available MCP tools');\n console.log(' config - Show MCP configuration');\n console.log(' restart - Restart the MCP server');\n console.log(' logs - Show MCP server logs');\n })\n .command(\n 'start',\n new Command()\n .description('Start the MCP server')\n .option('-p, --port <port:number>', 'Port for MCP server', { default: 3000 })\n .option('-h, --host <host:string>', 'Host for MCP server', { default: 'localhost' })\n .option('--transport <transport:string>', 'Transport type (stdio, http)', {\n default: 'stdio',\n })\n .action(async (options: any) => {\n try {\n const config = await configManager.load();\n\n // Override with CLI options\n const mcpConfig = {\n ...config.mcp,\n port: options.port,\n host: options.host,\n transport: options.transport,\n };\n\n mcpServer = new MCPServer(mcpConfig, eventBus, logger);\n await mcpServer.start();\n\n console.log(chalk.green(`✅ MCP server started on ${options.host}:${options.port}`));\n console.log(chalk.cyan(`📡 Server URL: http://${options.host}:${options.port}`));\n console.log(chalk.cyan(`🔧 Available tools: Research, Code, Terminal, Memory`));\n console.log(\n chalk.cyan(`📚 API documentation: http://${options.host}:${options.port}/docs`),\n );\n } catch (error) {\n console.error(chalk.red(`❌ Failed to start MCP server: ${(error as Error).message}`));\n process.exit(1);\n }\n }),\n )\n .command(\n 'stop',\n new Command().description('Stop the MCP server').action(async () => {\n try {\n if (mcpServer) {\n await mcpServer.stop();\n mcpServer = null;\n console.log(chalk.green('✅ MCP server stopped'));\n } else {\n console.log(chalk.yellow('⚠️ MCP server is not running'));\n }\n } catch (error) {\n console.error(chalk.red(`❌ Failed to stop MCP server: ${(error as Error).message}`));\n process.exit(1);\n }\n }),\n )\n .command(\n 'status',\n new Command().description('Show MCP server status').action(async () => {\n try {\n const config = await configManager.load();\n const isRunning = mcpServer !== null;\n\n console.log(chalk.cyan('MCP Server Status:'));\n console.log(`🌐 Status: ${isRunning ? chalk.green('Running') : chalk.red('Stopped')}`);\n\n if (isRunning) {\n console.log(`📍 Address: ${config.mcp.host}:${config.mcp.port}`);\n console.log(\n `🔐 Authentication: ${config.mcp.auth ? chalk.green('Enabled') : chalk.yellow('Disabled')}`,\n );\n console.log(`🔧 Tools: ${chalk.green('Available')}`);\n console.log(`📊 Metrics: ${chalk.green('Collecting')}`);\n } else {\n console.log(chalk.gray('Use \"claude-flow mcp start\" to start the server'));\n }\n } catch (error) {\n console.error(chalk.red(`❌ Failed to get MCP status: ${(error as Error).message}`));\n }\n }),\n )\n .command(\n 'tools',\n new Command().description('List available MCP tools').action(() => {\n console.log(chalk.cyan('Available MCP Tools:'));\n\n console.log('\\n📊 Research Tools:');\n console.log(' • web_search - Search the web for information');\n console.log(' • web_fetch - Fetch content from URLs');\n console.log(' • knowledge_query - Query knowledge base');\n\n console.log('\\n💻 Code Tools:');\n console.log(' • code_edit - Edit code files');\n console.log(' • code_search - Search through codebase');\n console.log(' • code_analyze - Analyze code quality');\n\n console.log('\\n🖥️ Terminal Tools:');\n console.log(' • terminal_execute - Execute shell commands');\n console.log(' • terminal_session - Manage terminal sessions');\n console.log(' • file_operations - File system operations');\n\n console.log('\\n💾 Memory Tools:');\n console.log(' • memory_store - Store information');\n console.log(' • memory_query - Query stored information');\n console.log(' • memory_index - Index and search content');\n }),\n )\n .command(\n 'config',\n new Command().description('Show MCP configuration').action(async () => {\n try {\n const config = await configManager.load();\n\n console.log(chalk.cyan('MCP Configuration:'));\n console.log(JSON.stringify(config.mcp, null, 2));\n } catch (error) {\n console.error(chalk.red(`❌ Failed to show MCP config: ${(error as Error).message}`));\n }\n }),\n )\n .command(\n 'restart',\n new Command().description('Restart the MCP server').action(async () => {\n try {\n console.log(chalk.yellow('🔄 Stopping MCP server...'));\n if (mcpServer) {\n await mcpServer.stop();\n }\n\n console.log(chalk.yellow('🔄 Starting MCP server...'));\n const config = await configManager.load();\n mcpServer = new MCPServer(config.mcp, eventBus, logger);\n await mcpServer.start();\n\n console.log(\n chalk.green(`✅ MCP server restarted on ${config.mcp.host}:${config.mcp.port}`),\n );\n } catch (error) {\n console.error(chalk.red(`❌ Failed to restart MCP server: ${(error as Error).message}`));\n process.exit(1);\n }\n }),\n )\n .command(\n 'logs',\n new Command()\n .description('Show MCP server logs')\n .option('-n, --lines <lines:number>', 'Number of log lines to show', { default: 50 })\n .action((options: any) => {\n console.log(chalk.cyan(`MCP Server Logs (last ${options.lines} lines):`));\n\n // Mock logs since logging system might not be fully implemented\n const logEntries = [\n '2024-01-10 10:00:00 [INFO] MCP server started on localhost:3000',\n '2024-01-10 10:00:01 [INFO] Tools registered: 12',\n '2024-01-10 10:00:02 [INFO] Authentication disabled',\n '2024-01-10 10:01:00 [INFO] Client connected: claude-desktop',\n '2024-01-10 10:01:05 [INFO] Tool called: web_search',\n '2024-01-10 10:01:10 [INFO] Tool response sent successfully',\n '2024-01-10 10:02:00 [INFO] Tool called: terminal_execute',\n '2024-01-10 10:02:05 [INFO] Command executed successfully',\n '2024-01-10 10:03:00 [INFO] Memory operation: store',\n '2024-01-10 10:03:01 [INFO] Data stored in namespace: default',\n ];\n\n const startIndex = Math.max(0, logEntries.length - options.lines);\n const displayLogs = logEntries.slice(startIndex);\n\n for (const entry of displayLogs) {\n if (entry.includes('[ERROR]')) {\n console.log(chalk.red(entry));\n } else if (entry.includes('[WARN]')) {\n console.log(chalk.yellow(entry));\n } else if (entry.includes('[INFO]')) {\n console.log(chalk.green(entry));\n } else {\n console.log(chalk.gray(entry));\n }\n }\n }),\n );\n"],"names":["Command","chalk","logger","configManager","MCPServer","eventBus","mcpServer","mcpCommand","description","action","console","log","yellow","command","option","default","options","config","load","mcpConfig","mcp","port","host","transport","start","green","cyan","error","red","message","process","exit","stop","isRunning","auth","gray","JSON","stringify","lines","logEntries","startIndex","Math","max","length","displayLogs","slice","entry","includes"],"mappings":"AAIA,SAASA,OAAO,QAAQ,kBAAkB;AAC1C,OAAOC,WAAW,QAAQ;AAC1B,SAASC,MAAM,QAAQ,uBAAuB;AAC9C,SAASC,aAAa,QAAQ,uBAAuB;AACrD,SAASC,SAAS,QAAQ,sBAAsB;AAChD,SAASC,QAAQ,QAAQ,0BAA0B;AAEnD,IAAIC,YAA8B;AAElC,OAAO,MAAMC,aAAa,IAAIP,UAC3BQ,WAAW,CAAC,+BACZC,MAAM,CAAC;IACNC,QAAQC,GAAG,CAACV,MAAMW,MAAM,CAAC;IACzBF,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;AACd,GACCE,OAAO,CACN,SACA,IAAIb,UACDQ,WAAW,CAAC,wBACZM,MAAM,CAAC,4BAA4B,uBAAuB;IAAEC,SAAS;AAAK,GAC1ED,MAAM,CAAC,4BAA4B,uBAAuB;IAAEC,SAAS;AAAY,GACjFD,MAAM,CAAC,kCAAkC,gCAAgC;IACxEC,SAAS;AACX,GACCN,MAAM,CAAC,OAAOO;IACb,IAAI;QACF,MAAMC,SAAS,MAAMd,cAAce,IAAI;QAGvC,MAAMC,YAAY;YAChB,GAAGF,OAAOG,GAAG;YACbC,MAAML,QAAQK,IAAI;YAClBC,MAAMN,QAAQM,IAAI;YAClBC,WAAWP,QAAQO,SAAS;QAC9B;QAEAjB,YAAY,IAAIF,UAAUe,WAAWd,UAAUH;QAC/C,MAAMI,UAAUkB,KAAK;QAErBd,QAAQC,GAAG,CAACV,MAAMwB,KAAK,CAAC,CAAC,wBAAwB,EAAET,QAAQM,IAAI,CAAC,CAAC,EAAEN,QAAQK,IAAI,EAAE;QACjFX,QAAQC,GAAG,CAACV,MAAMyB,IAAI,CAAC,CAAC,sBAAsB,EAAEV,QAAQM,IAAI,CAAC,CAAC,EAAEN,QAAQK,IAAI,EAAE;QAC9EX,QAAQC,GAAG,CAACV,MAAMyB,IAAI,CAAC,CAAC,oDAAoD,CAAC;QAC7EhB,QAAQC,GAAG,CACTV,MAAMyB,IAAI,CAAC,CAAC,6BAA6B,EAAEV,QAAQM,IAAI,CAAC,CAAC,EAAEN,QAAQK,IAAI,CAAC,KAAK,CAAC;IAElF,EAAE,OAAOM,OAAO;QACdjB,QAAQiB,KAAK,CAAC1B,MAAM2B,GAAG,CAAC,CAAC,8BAA8B,EAAE,AAACD,MAAgBE,OAAO,EAAE;QACnFC,QAAQC,IAAI,CAAC;IACf;AACF,IAEHlB,OAAO,CACN,QACA,IAAIb,UAAUQ,WAAW,CAAC,uBAAuBC,MAAM,CAAC;IACtD,IAAI;QACF,IAAIH,WAAW;YACb,MAAMA,UAAU0B,IAAI;YACpB1B,YAAY;YACZI,QAAQC,GAAG,CAACV,MAAMwB,KAAK,CAAC;QAC1B,OAAO;YACLf,QAAQC,GAAG,CAACV,MAAMW,MAAM,CAAC;QAC3B;IACF,EAAE,OAAOe,OAAO;QACdjB,QAAQiB,KAAK,CAAC1B,MAAM2B,GAAG,CAAC,CAAC,6BAA6B,EAAE,AAACD,MAAgBE,OAAO,EAAE;QAClFC,QAAQC,IAAI,CAAC;IACf;AACF,IAEDlB,OAAO,CACN,UACA,IAAIb,UAAUQ,WAAW,CAAC,0BAA0BC,MAAM,CAAC;IACzD,IAAI;QACF,MAAMQ,SAAS,MAAMd,cAAce,IAAI;QACvC,MAAMe,YAAY3B,cAAc;QAEhCI,QAAQC,GAAG,CAACV,MAAMyB,IAAI,CAAC;QACvBhB,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEsB,YAAYhC,MAAMwB,KAAK,CAAC,aAAaxB,MAAM2B,GAAG,CAAC,YAAY;QAErF,IAAIK,WAAW;YACbvB,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAEM,OAAOG,GAAG,CAACE,IAAI,CAAC,CAAC,EAAEL,OAAOG,GAAG,CAACC,IAAI,EAAE;YAC/DX,QAAQC,GAAG,CACT,CAAC,mBAAmB,EAAEM,OAAOG,GAAG,CAACc,IAAI,GAAGjC,MAAMwB,KAAK,CAAC,aAAaxB,MAAMW,MAAM,CAAC,aAAa;YAE7FF,QAAQC,GAAG,CAAC,CAAC,UAAU,EAAEV,MAAMwB,KAAK,CAAC,cAAc;YACnDf,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAEV,MAAMwB,KAAK,CAAC,eAAe;QACxD,OAAO;YACLf,QAAQC,GAAG,CAACV,MAAMkC,IAAI,CAAC;QACzB;IACF,EAAE,OAAOR,OAAO;QACdjB,QAAQiB,KAAK,CAAC1B,MAAM2B,GAAG,CAAC,CAAC,4BAA4B,EAAE,AAACD,MAAgBE,OAAO,EAAE;IACnF;AACF,IAEDhB,OAAO,CACN,SACA,IAAIb,UAAUQ,WAAW,CAAC,4BAA4BC,MAAM,CAAC;IAC3DC,QAAQC,GAAG,CAACV,MAAMyB,IAAI,CAAC;IAEvBhB,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IAEZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IAEZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IAEZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;AACd,IAEDE,OAAO,CACN,UACA,IAAIb,UAAUQ,WAAW,CAAC,0BAA0BC,MAAM,CAAC;IACzD,IAAI;QACF,MAAMQ,SAAS,MAAMd,cAAce,IAAI;QAEvCR,QAAQC,GAAG,CAACV,MAAMyB,IAAI,CAAC;QACvBhB,QAAQC,GAAG,CAACyB,KAAKC,SAAS,CAACpB,OAAOG,GAAG,EAAE,MAAM;IAC/C,EAAE,OAAOO,OAAO;QACdjB,QAAQiB,KAAK,CAAC1B,MAAM2B,GAAG,CAAC,CAAC,6BAA6B,EAAE,AAACD,MAAgBE,OAAO,EAAE;IACpF;AACF,IAEDhB,OAAO,CACN,WACA,IAAIb,UAAUQ,WAAW,CAAC,0BAA0BC,MAAM,CAAC;IACzD,IAAI;QACFC,QAAQC,GAAG,CAACV,MAAMW,MAAM,CAAC;QACzB,IAAIN,WAAW;YACb,MAAMA,UAAU0B,IAAI;QACtB;QAEAtB,QAAQC,GAAG,CAACV,MAAMW,MAAM,CAAC;QACzB,MAAMK,SAAS,MAAMd,cAAce,IAAI;QACvCZ,YAAY,IAAIF,UAAUa,OAAOG,GAAG,EAAEf,UAAUH;QAChD,MAAMI,UAAUkB,KAAK;QAErBd,QAAQC,GAAG,CACTV,MAAMwB,KAAK,CAAC,CAAC,0BAA0B,EAAER,OAAOG,GAAG,CAACE,IAAI,CAAC,CAAC,EAAEL,OAAOG,GAAG,CAACC,IAAI,EAAE;IAEjF,EAAE,OAAOM,OAAO;QACdjB,QAAQiB,KAAK,CAAC1B,MAAM2B,GAAG,CAAC,CAAC,gCAAgC,EAAE,AAACD,MAAgBE,OAAO,EAAE;QACrFC,QAAQC,IAAI,CAAC;IACf;AACF,IAEDlB,OAAO,CACN,QACA,IAAIb,UACDQ,WAAW,CAAC,wBACZM,MAAM,CAAC,8BAA8B,+BAA+B;IAAEC,SAAS;AAAG,GAClFN,MAAM,CAAC,CAACO;IACPN,QAAQC,GAAG,CAACV,MAAMyB,IAAI,CAAC,CAAC,sBAAsB,EAAEV,QAAQsB,KAAK,CAAC,QAAQ,CAAC;IAGvE,MAAMC,aAAa;QACjB;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD;IAED,MAAMC,aAAaC,KAAKC,GAAG,CAAC,GAAGH,WAAWI,MAAM,GAAG3B,QAAQsB,KAAK;IAChE,MAAMM,cAAcL,WAAWM,KAAK,CAACL;IAErC,KAAK,MAAMM,SAASF,YAAa;QAC/B,IAAIE,MAAMC,QAAQ,CAAC,YAAY;YAC7BrC,QAAQC,GAAG,CAACV,MAAM2B,GAAG,CAACkB;QACxB,OAAO,IAAIA,MAAMC,QAAQ,CAAC,WAAW;YACnCrC,QAAQC,GAAG,CAACV,MAAMW,MAAM,CAACkC;QAC3B,OAAO,IAAIA,MAAMC,QAAQ,CAAC,WAAW;YACnCrC,QAAQC,GAAG,CAACV,MAAMwB,KAAK,CAACqB;QAC1B,OAAO;YACLpC,QAAQC,GAAG,CAACV,MAAMkC,IAAI,CAACW;QACzB;IACF;AACF,IACF"}
1
+ {"version":3,"sources":["../../../../src/cli/commands/mcp.ts"],"sourcesContent":["/**\n * MCP command for Claude-Flow\n */\n\nimport { Command } from '@cliffy/command';\nimport chalk from 'chalk';\nimport { logger } from '../../core/logger.js';\nimport { configManager } from '../../core/config.js';\nimport { MCPServer, type IMCPServer } from '../../mcp/server.js';\nimport { eventBus } from '../../core/event-bus.js';\nimport {\n createMCPServer,\n isMCP2025Available,\n getServerCapabilities,\n type ExtendedMCPConfig,\n} from '../../mcp/server-factory.js';\nimport type { MCP2025Server } from '../../mcp/server-mcp-2025.js';\n\nlet mcpServer: IMCPServer | MCP2025Server | null = null;\n\nexport const mcpCommand = new Command()\n .description('Manage MCP server and tools')\n .action(() => {\n console.log(chalk.yellow('Please specify a subcommand:'));\n console.log(' start - Start the MCP server');\n console.log(' stop - Stop the MCP server');\n console.log(' status - Show MCP server status');\n console.log(' tools - List available MCP tools');\n console.log(' config - Show MCP configuration');\n console.log(' restart - Restart the MCP server');\n console.log(' logs - Show MCP server logs');\n })\n .command(\n 'start',\n new Command()\n .description('Start the MCP server')\n .option('-p, --port <port:number>', 'Port for MCP server', { default: 3000 })\n .option('-h, --host <host:string>', 'Host for MCP server', { default: 'localhost' })\n .option('--transport <transport:string>', 'Transport type (stdio, http)', {\n default: 'stdio',\n })\n .option('--mcp2025', 'Enable MCP 2025-11 features (version negotiation, async jobs, etc.)', {\n default: false,\n })\n .option('--no-legacy', 'Disable legacy client support', { default: false })\n .action(async (options: any) => {\n try {\n const config = await configManager.load();\n\n // Check if MCP 2025-11 dependencies are available\n const mcp2025Available = isMCP2025Available();\n const enableMCP2025 = options.mcp2025 && mcp2025Available;\n\n if (options.mcp2025 && !mcp2025Available) {\n console.log(\n chalk.yellow(\n '⚠️ MCP 2025-11 dependencies not found. Install with: npm install uuid ajv ajv-formats ajv-errors'\n )\n );\n console.log(chalk.yellow(' Falling back to legacy MCP server...'));\n }\n\n // Build extended configuration\n const mcpConfig: ExtendedMCPConfig = {\n ...config.mcp,\n port: options.port,\n host: options.host,\n transport: options.transport,\n features: {\n enableMCP2025,\n supportLegacyClients: options.legacy !== false,\n enableVersionNegotiation: enableMCP2025,\n enableAsyncJobs: enableMCP2025,\n enableRegistryIntegration: false, // Opt-in via env var\n enableSchemaValidation: enableMCP2025,\n enableProgressiveDisclosure: true, // Phase 1 feature (always enabled)\n },\n mcp2025: enableMCP2025\n ? {\n async: {\n enabled: true,\n maxJobs: 100,\n jobTTL: 3600000,\n },\n registry: {\n enabled: process.env.MCP_REGISTRY_ENABLED === 'true',\n url: process.env.MCP_REGISTRY_URL,\n apiKey: process.env.MCP_REGISTRY_API_KEY,\n },\n validation: {\n enabled: true,\n strictMode: false,\n },\n }\n : undefined,\n };\n\n // Create server using factory\n mcpServer = await createMCPServer(mcpConfig, eventBus, logger, {\n autoDetectFeatures: false, // Use explicit config\n });\n\n await mcpServer.start();\n\n // Get capabilities\n const capabilities = getServerCapabilities(mcpConfig);\n\n console.log(chalk.green(`✅ MCP server started on ${options.host}:${options.port}`));\n console.log(\n chalk.cyan(`🎯 Mode: ${enableMCP2025 ? 'MCP 2025-11 Enhanced' : 'Legacy Compatible'}`)\n );\n console.log(chalk.cyan(`📡 Transport: ${options.transport}`));\n\n if (capabilities.length > 0) {\n console.log(chalk.cyan(`✨ Capabilities: ${capabilities.join(', ')}`));\n }\n\n if (enableMCP2025) {\n console.log(chalk.green(' • Version negotiation (YYYY-MM format)'));\n console.log(chalk.green(' • Async job support (poll/resume)'));\n console.log(chalk.green(' • JSON Schema 1.1 validation'));\n console.log(chalk.green(' • Progressive disclosure (98.7% token reduction)'));\n }\n\n if (options.transport === 'http') {\n console.log(chalk.cyan(`📚 Server URL: http://${options.host}:${options.port}`));\n }\n } catch (error) {\n console.error(chalk.red(`❌ Failed to start MCP server: ${(error as Error).message}`));\n logger.error('MCP server startup failed', { error });\n process.exit(1);\n }\n }),\n )\n .command(\n 'stop',\n new Command().description('Stop the MCP server').action(async () => {\n try {\n if (mcpServer) {\n await mcpServer.stop();\n mcpServer = null;\n console.log(chalk.green('✅ MCP server stopped'));\n } else {\n console.log(chalk.yellow('⚠️ MCP server is not running'));\n }\n } catch (error) {\n console.error(chalk.red(`❌ Failed to stop MCP server: ${(error as Error).message}`));\n process.exit(1);\n }\n }),\n )\n .command(\n 'status',\n new Command().description('Show MCP server status').action(async () => {\n try {\n const config = await configManager.load();\n const isRunning = mcpServer !== null;\n\n console.log(chalk.cyan('MCP Server Status:'));\n console.log(`🌐 Status: ${isRunning ? chalk.green('Running') : chalk.red('Stopped')}`);\n\n if (isRunning) {\n console.log(`📍 Address: ${config.mcp.host}:${config.mcp.port}`);\n console.log(\n `🔐 Authentication: ${config.mcp.auth ? chalk.green('Enabled') : chalk.yellow('Disabled')}`,\n );\n console.log(`🔧 Tools: ${chalk.green('Available')}`);\n console.log(`📊 Metrics: ${chalk.green('Collecting')}`);\n } else {\n console.log(chalk.gray('Use \"claude-flow mcp start\" to start the server'));\n }\n } catch (error) {\n console.error(chalk.red(`❌ Failed to get MCP status: ${(error as Error).message}`));\n }\n }),\n )\n .command(\n 'tools',\n new Command().description('List available MCP tools').action(() => {\n console.log(chalk.cyan('Available MCP Tools:'));\n\n console.log('\\n📊 Research Tools:');\n console.log(' • web_search - Search the web for information');\n console.log(' • web_fetch - Fetch content from URLs');\n console.log(' • knowledge_query - Query knowledge base');\n\n console.log('\\n💻 Code Tools:');\n console.log(' • code_edit - Edit code files');\n console.log(' • code_search - Search through codebase');\n console.log(' • code_analyze - Analyze code quality');\n\n console.log('\\n🖥️ Terminal Tools:');\n console.log(' • terminal_execute - Execute shell commands');\n console.log(' • terminal_session - Manage terminal sessions');\n console.log(' • file_operations - File system operations');\n\n console.log('\\n💾 Memory Tools:');\n console.log(' • memory_store - Store information');\n console.log(' • memory_query - Query stored information');\n console.log(' • memory_index - Index and search content');\n }),\n )\n .command(\n 'config',\n new Command().description('Show MCP configuration').action(async () => {\n try {\n const config = await configManager.load();\n\n console.log(chalk.cyan('MCP Configuration:'));\n console.log(JSON.stringify(config.mcp, null, 2));\n } catch (error) {\n console.error(chalk.red(`❌ Failed to show MCP config: ${(error as Error).message}`));\n }\n }),\n )\n .command(\n 'restart',\n new Command().description('Restart the MCP server').action(async () => {\n try {\n console.log(chalk.yellow('🔄 Stopping MCP server...'));\n if (mcpServer) {\n await mcpServer.stop();\n }\n\n console.log(chalk.yellow('🔄 Starting MCP server...'));\n const config = await configManager.load();\n\n // Use factory to create server with same capabilities as before\n mcpServer = await createMCPServer(config.mcp, eventBus, logger, {\n autoDetectFeatures: true, // Auto-detect on restart\n });\n await mcpServer.start();\n\n console.log(\n chalk.green(`✅ MCP server restarted on ${config.mcp.host}:${config.mcp.port}`),\n );\n } catch (error) {\n console.error(chalk.red(`❌ Failed to restart MCP server: ${(error as Error).message}`));\n process.exit(1);\n }\n }),\n )\n .command(\n 'logs',\n new Command()\n .description('Show MCP server logs')\n .option('-n, --lines <lines:number>', 'Number of log lines to show', { default: 50 })\n .action((options: any) => {\n console.log(chalk.cyan(`MCP Server Logs (last ${options.lines} lines):`));\n\n // Mock logs since logging system might not be fully implemented\n const logEntries = [\n '2024-01-10 10:00:00 [INFO] MCP server started on localhost:3000',\n '2024-01-10 10:00:01 [INFO] Tools registered: 12',\n '2024-01-10 10:00:02 [INFO] Authentication disabled',\n '2024-01-10 10:01:00 [INFO] Client connected: claude-desktop',\n '2024-01-10 10:01:05 [INFO] Tool called: web_search',\n '2024-01-10 10:01:10 [INFO] Tool response sent successfully',\n '2024-01-10 10:02:00 [INFO] Tool called: terminal_execute',\n '2024-01-10 10:02:05 [INFO] Command executed successfully',\n '2024-01-10 10:03:00 [INFO] Memory operation: store',\n '2024-01-10 10:03:01 [INFO] Data stored in namespace: default',\n ];\n\n const startIndex = Math.max(0, logEntries.length - options.lines);\n const displayLogs = logEntries.slice(startIndex);\n\n for (const entry of displayLogs) {\n if (entry.includes('[ERROR]')) {\n console.log(chalk.red(entry));\n } else if (entry.includes('[WARN]')) {\n console.log(chalk.yellow(entry));\n } else if (entry.includes('[INFO]')) {\n console.log(chalk.green(entry));\n } else {\n console.log(chalk.gray(entry));\n }\n }\n }),\n );\n"],"names":["Command","chalk","logger","configManager","eventBus","createMCPServer","isMCP2025Available","getServerCapabilities","mcpServer","mcpCommand","description","action","console","log","yellow","command","option","default","options","config","load","mcp2025Available","enableMCP2025","mcp2025","mcpConfig","mcp","port","host","transport","features","supportLegacyClients","legacy","enableVersionNegotiation","enableAsyncJobs","enableRegistryIntegration","enableSchemaValidation","enableProgressiveDisclosure","async","enabled","maxJobs","jobTTL","registry","process","env","MCP_REGISTRY_ENABLED","url","MCP_REGISTRY_URL","apiKey","MCP_REGISTRY_API_KEY","validation","strictMode","undefined","autoDetectFeatures","start","capabilities","green","cyan","length","join","error","red","message","exit","stop","isRunning","auth","gray","JSON","stringify","lines","logEntries","startIndex","Math","max","displayLogs","slice","entry","includes"],"mappings":"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"}
@@ -24,9 +24,6 @@ export class HelpFormatter {
24
24
  if (info.examples && info.examples.length > 0) {
25
25
  sections.push(this.formatSection('EXAMPLES', info.examples));
26
26
  }
27
- if (info.details) {
28
- sections.push('\n' + info.details);
29
- }
30
27
  if (info.commands && info.commands.length > 0) {
31
28
  sections.push(`Run '${info.name} <command> --help' for more information on a command.`);
32
29
  }
@@ -88,4 +85,9 @@ export class HelpFormatter {
88
85
  }
89
86
  }
90
87
 
88
+ //# sourceMappingURL=help-formatter.js.map/\s+/g, ' ');
89
+ return text;
90
+ }
91
+ }
92
+
91
93
  //# sourceMappingURL=help-formatter.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/help-formatter.js"],"sourcesContent":["/**\n * Standardized CLI Help Formatter\n * Follows Unix/Linux conventions for help output\n */\n\nexport class HelpFormatter {\n static INDENT = ' ';\n static COLUMN_GAP = 2;\n static MIN_DESCRIPTION_COLUMN = 25;\n\n /**\n * Format main command help\n */\n static formatHelp(info) {\n const sections = [];\n\n // NAME section\n sections.push(this.formatSection('NAME', [`${info.name} - ${info.description}`]));\n\n // SYNOPSIS section\n if (info.usage) {\n sections.push(this.formatSection('SYNOPSIS', [info.usage]));\n }\n\n // COMMANDS section\n if (info.commands && info.commands.length > 0) {\n sections.push(this.formatSection('COMMANDS', this.formatCommands(info.commands)));\n }\n\n // OPTIONS section\n if (info.options && info.options.length > 0) {\n sections.push(this.formatSection('OPTIONS', this.formatOptions(info.options)));\n }\n\n // GLOBAL OPTIONS section\n if (info.globalOptions && info.globalOptions.length > 0) {\n sections.push(this.formatSection('GLOBAL OPTIONS', this.formatOptions(info.globalOptions)));\n }\n\n // EXAMPLES section\n if (info.examples && info.examples.length > 0) {\n sections.push(this.formatSection('EXAMPLES', info.examples));\n }\n\n // DETAILS section (additional information)\n if (info.details) {\n sections.push('\\n' + info.details);\n }\n\n // Footer\n if (info.commands && info.commands.length > 0) {\n sections.push(`Run '${info.name} <command> --help' for more information on a command.`);\n }\n\n return sections.join('\\n\\n');\n }\n\n /**\n * Format error message with usage hint\n */\n static formatError(error, command, usage) {\n const lines = [`Error: ${error}`, ''];\n\n if (usage) {\n lines.push(`Usage: ${usage}`);\n }\n\n lines.push(`Try '${command} --help' for more information.`);\n\n return lines.join('\\n');\n }\n\n /**\n * Format validation error with valid options\n */\n static formatValidationError(value, paramName, validOptions, command) {\n return this.formatError(\n `'${value}' is not a valid ${paramName}. Valid options are: ${validOptions.join(', ')}.`,\n command,\n );\n }\n\n static formatSection(title, content) {\n return `${title}\\n${content.map((line) => `${this.INDENT}${line}`).join('\\n')}`;\n }\n\n static formatCommands(commands) {\n const maxNameLength = Math.max(\n this.MIN_DESCRIPTION_COLUMN,\n ...commands.map((cmd) => {\n const nameLength = cmd.name.length;\n const aliasLength = cmd.aliases ? ` (${cmd.aliases.join(', ')})`.length : 0;\n return nameLength + aliasLength;\n }),\n );\n\n return commands.map((cmd) => {\n let name = cmd.name;\n if (cmd.aliases && cmd.aliases.length > 0) {\n name += ` (${cmd.aliases.join(', ')})`;\n }\n const padding = ' '.repeat(maxNameLength - name.length + this.COLUMN_GAP);\n return `${name}${padding}${cmd.description}`;\n });\n }\n\n static formatOptions(options) {\n const maxFlagsLength = Math.max(\n this.MIN_DESCRIPTION_COLUMN,\n ...options.map((opt) => opt.flags.length),\n );\n\n return options.map((opt) => {\n const padding = ' '.repeat(maxFlagsLength - opt.flags.length + this.COLUMN_GAP);\n let description = opt.description;\n\n // Add default value\n if (opt.defaultValue !== undefined) {\n description += ` [default: ${opt.defaultValue}]`;\n }\n\n // Add valid values on next line if present\n if (opt.validValues && opt.validValues.length > 0) {\n const validValuesLine =\n ' '.repeat(maxFlagsLength + this.COLUMN_GAP) + `Valid: ${opt.validValues.join(', ')}`;\n return `${opt.flags}${padding}${description}\\n${this.INDENT}${validValuesLine}`;\n }\n\n return `${opt.flags}${padding}${description}`;\n });\n }\n\n /**\n * Strip ANSI color codes and emojis from text\n */\n static stripFormatting(text) {\n // Remove ANSI color codes\n text = text.replace(/\\x1b\\[[0-9;]*m/g, '');\n\n // Remove common emojis used in the CLI\n const emojiPattern =\n /[\\u{1F300}-\\u{1F9FF}]|[\\u{2600}-\\u{27BF}]|[\\u{1F000}-\\u{1F6FF}]|[\\u{1F680}-\\u{1F6FF}]/gu;\n text = text.replace(emojiPattern, '').trim();\n\n // Remove multiple spaces\n text = text.replace(/\\s+/g, ' ');\n\n return text;\n }\n}\n"],"names":["HelpFormatter","INDENT","COLUMN_GAP","MIN_DESCRIPTION_COLUMN","formatHelp","info","sections","push","formatSection","name","description","usage","commands","length","formatCommands","options","formatOptions","globalOptions","examples","details","join","formatError","error","command","lines","formatValidationError","value","paramName","validOptions","title","content","map","line","maxNameLength","Math","max","cmd","nameLength","aliasLength","aliases","padding","repeat","maxFlagsLength","opt","flags","defaultValue","undefined","validValues","validValuesLine","stripFormatting","text","replace","emojiPattern","trim"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/cli/help-formatter.ts"],"sourcesContent":["/**\n * Standardized CLI Help Formatter\n * Follows Unix/Linux conventions for help output\n */\n\nexport interface CommandInfo {\n name: string;\n description: string;\n usage?: string;\n commands?: CommandItem[];\n options?: OptionItem[];\n examples?: string[];\n globalOptions?: OptionItem[];\n}\n\nexport interface CommandItem {\n name: string;\n description: string;\n aliases?: string[];\n}\n\nexport interface OptionItem {\n flags: string;\n description: string;\n defaultValue?: string;\n validValues?: string[];\n}\n\nexport class HelpFormatter {\n private static readonly INDENT = ' ';\n private static readonly COLUMN_GAP = 2;\n private static readonly MIN_DESCRIPTION_COLUMN = 25;\n\n /**\n * Format main command help\n */\n static formatHelp(info: CommandInfo): string {\n const sections: string[] = [];\n\n // NAME section\n sections.push(this.formatSection('NAME', [`${info.name} - ${info.description}`]));\n\n // SYNOPSIS section\n if (info.usage) {\n sections.push(this.formatSection('SYNOPSIS', [info.usage]));\n }\n\n // COMMANDS section\n if (info.commands && info.commands.length > 0) {\n sections.push(this.formatSection('COMMANDS', this.formatCommands(info.commands)));\n }\n\n // OPTIONS section\n if (info.options && info.options.length > 0) {\n sections.push(this.formatSection('OPTIONS', this.formatOptions(info.options)));\n }\n\n // GLOBAL OPTIONS section\n if (info.globalOptions && info.globalOptions.length > 0) {\n sections.push(this.formatSection('GLOBAL OPTIONS', this.formatOptions(info.globalOptions)));\n }\n\n // EXAMPLES section\n if (info.examples && info.examples.length > 0) {\n sections.push(this.formatSection('EXAMPLES', info.examples));\n }\n\n // Footer\n if (info.commands && info.commands.length > 0) {\n sections.push(`Run '${info.name} <command> --help' for more information on a command.`);\n }\n\n return sections.join('\\n\\n');\n }\n\n /**\n * Format error message with usage hint\n */\n static formatError(error: string, command: string, usage?: string): string {\n const lines: string[] = [`Error: ${error}`, ''];\n\n if (usage) {\n lines.push(`Usage: ${usage}`);\n }\n\n lines.push(`Try '${command} --help' for more information.`);\n\n return lines.join('\\n');\n }\n\n /**\n * Format validation error with valid options\n */\n static formatValidationError(\n value: string,\n paramName: string,\n validOptions: string[],\n command: string,\n ): string {\n return this.formatError(\n `'${value}' is not a valid ${paramName}. Valid options are: ${validOptions.join(', ')}.`,\n command,\n );\n }\n\n private static formatSection(title: string, content: string[]): string {\n return `${title}\\n${content.map((line) => `${this.INDENT}${line}`).join('\\n')}`;\n }\n\n private static formatCommands(commands: CommandItem[]): string[] {\n const maxNameLength = Math.max(\n this.MIN_DESCRIPTION_COLUMN,\n ...commands.map((cmd) => {\n const nameLength = cmd.name.length;\n const aliasLength = cmd.aliases ? ` (${cmd.aliases.join(', ')})`.length : 0;\n return nameLength + aliasLength;\n }),\n );\n\n return commands.map((cmd) => {\n let name = cmd.name;\n if (cmd.aliases && cmd.aliases.length > 0) {\n name += ` (${cmd.aliases.join(', ')})`;\n }\n const padding = ' '.repeat(maxNameLength - name.length + this.COLUMN_GAP);\n return `${name}${padding}${cmd.description}`;\n });\n }\n\n private static formatOptions(options: OptionItem[]): string[] {\n const maxFlagsLength = Math.max(\n this.MIN_DESCRIPTION_COLUMN,\n ...options.map((opt) => opt.flags.length),\n );\n\n return options.map((opt) => {\n const padding = ' '.repeat(maxFlagsLength - opt.flags.length + this.COLUMN_GAP);\n let description = opt.description;\n\n // Add default value\n if (opt.defaultValue !== undefined) {\n description += ` [default: ${opt.defaultValue}]`;\n }\n\n // Add valid values on next line if present\n if (opt.validValues && opt.validValues.length > 0) {\n const validValuesLine =\n ' '.repeat(maxFlagsLength + this.COLUMN_GAP) + `Valid: ${opt.validValues.join(', ')}`;\n return `${opt.flags}${padding}${description}\\n${this.INDENT}${validValuesLine}`;\n }\n\n return `${opt.flags}${padding}${description}`;\n });\n }\n\n /**\n * Strip ANSI color codes and emojis from text\n */\n static stripFormatting(text: string): string {\n // Remove ANSI color codes\n text = text.replace(/\\x1b\\[[0-9;]*m/g, '');\n\n // Remove common emojis used in the CLI\n const emojiPattern =\n /[\\u{1F300}-\\u{1F9FF}]|[\\u{2600}-\\u{27BF}]|[\\u{1F000}-\\u{1F6FF}]|[\\u{1F680}-\\u{1F6FF}]/gu;\n text = text.replace(emojiPattern, '').trim();\n\n // Remove multiple spaces\n text = text.replace(/\\s+/g, ' ');\n\n return text;\n }\n}\n"],"names":["HelpFormatter","INDENT","COLUMN_GAP","MIN_DESCRIPTION_COLUMN","formatHelp","info","sections","push","formatSection","name","description","usage","commands","length","formatCommands","options","formatOptions","globalOptions","examples","join","formatError","error","command","lines","formatValidationError","value","paramName","validOptions","title","content","map","line","maxNameLength","Math","max","cmd","nameLength","aliasLength","aliases","padding","repeat","maxFlagsLength","opt","flags","defaultValue","undefined","validValues","validValuesLine","stripFormatting","text","replace","emojiPattern","trim"],"mappings":"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"}