@claude-flow/cli 3.0.0-alpha.6 → 3.0.0-alpha.7

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 (99) hide show
  1. package/.agentic-flow/intelligence.json +4 -4
  2. package/.claude-flow/agents/store.json +16 -0
  3. package/.claude-flow/daemon-state.json +123 -0
  4. package/.claude-flow/hive-mind/state.json +51 -0
  5. package/.claude-flow/metrics/codebase-map.json +11 -0
  6. package/.claude-flow/metrics/consolidation.json +6 -0
  7. package/.claude-flow/metrics/performance.json +3 -3
  8. package/.claude-flow/metrics/security-audit.json +10 -0
  9. package/.claude-flow/metrics/task-metrics.json +3 -3
  10. package/.claude-flow/metrics/test-gaps.json +6 -0
  11. package/agents/architect.yaml +1 -1
  12. package/agents/coder.yaml +1 -1
  13. package/agents/reviewer.yaml +1 -1
  14. package/agents/security-architect.yaml +1 -1
  15. package/agents/tester.yaml +1 -1
  16. package/dist/src/commands/agent.d.ts.map +1 -1
  17. package/dist/src/commands/agent.js +42 -26
  18. package/dist/src/commands/agent.js.map +1 -1
  19. package/dist/src/commands/daemon.d.ts +8 -0
  20. package/dist/src/commands/daemon.d.ts.map +1 -0
  21. package/dist/src/commands/daemon.js +351 -0
  22. package/dist/src/commands/daemon.js.map +1 -0
  23. package/dist/src/commands/hive-mind.d.ts.map +1 -1
  24. package/dist/src/commands/hive-mind.js +252 -35
  25. package/dist/src/commands/hive-mind.js.map +1 -1
  26. package/dist/src/commands/index.d.ts +1 -0
  27. package/dist/src/commands/index.d.ts.map +1 -1
  28. package/dist/src/commands/index.js +4 -1
  29. package/dist/src/commands/index.js.map +1 -1
  30. package/dist/src/commands/start.js +2 -2
  31. package/dist/src/commands/start.js.map +1 -1
  32. package/dist/src/index.d.ts.map +1 -1
  33. package/dist/src/index.js +5 -2
  34. package/dist/src/index.js.map +1 -1
  35. package/dist/src/init/settings-generator.d.ts.map +1 -1
  36. package/dist/src/init/settings-generator.js +22 -12
  37. package/dist/src/init/settings-generator.js.map +1 -1
  38. package/dist/src/mcp-client.d.ts.map +1 -1
  39. package/dist/src/mcp-client.js +13 -1
  40. package/dist/src/mcp-client.js.map +1 -1
  41. package/dist/src/mcp-tools/agent-tools.d.ts +1 -1
  42. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  43. package/dist/src/mcp-tools/agent-tools.js +350 -14
  44. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  45. package/dist/src/mcp-tools/config-tools.d.ts +1 -1
  46. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
  47. package/dist/src/mcp-tools/config-tools.js +262 -15
  48. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  49. package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
  50. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -0
  51. package/dist/src/mcp-tools/hive-mind-tools.js +447 -0
  52. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -0
  53. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  54. package/dist/src/mcp-tools/hooks-tools.js +46 -7
  55. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  56. package/dist/src/mcp-tools/index.d.ts +2 -0
  57. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  58. package/dist/src/mcp-tools/index.js +2 -0
  59. package/dist/src/mcp-tools/index.js.map +1 -1
  60. package/dist/src/mcp-tools/session-tools.d.ts +1 -1
  61. package/dist/src/mcp-tools/session-tools.d.ts.map +1 -1
  62. package/dist/src/mcp-tools/session-tools.js +237 -22
  63. package/dist/src/mcp-tools/session-tools.js.map +1 -1
  64. package/dist/src/mcp-tools/task-tools.d.ts +1 -1
  65. package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
  66. package/dist/src/mcp-tools/task-tools.js +219 -17
  67. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  68. package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
  69. package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -0
  70. package/dist/src/mcp-tools/workflow-tools.js +481 -0
  71. package/dist/src/mcp-tools/workflow-tools.js.map +1 -0
  72. package/dist/src/services/index.d.ts +7 -0
  73. package/dist/src/services/index.d.ts.map +1 -0
  74. package/dist/src/services/index.js +6 -0
  75. package/dist/src/services/index.js.map +1 -0
  76. package/dist/src/services/worker-daemon.d.ts +126 -0
  77. package/dist/src/services/worker-daemon.d.ts.map +1 -0
  78. package/dist/src/services/worker-daemon.js +464 -0
  79. package/dist/src/services/worker-daemon.js.map +1 -0
  80. package/dist/tsconfig.tsbuildinfo +1 -1
  81. package/package.json +1 -1
  82. package/src/commands/agent.ts +42 -28
  83. package/src/commands/daemon.ts +395 -0
  84. package/src/commands/hive-mind.ts +229 -63
  85. package/src/commands/index.ts +4 -1
  86. package/src/commands/start.ts +2 -2
  87. package/src/index.ts +5 -2
  88. package/src/init/settings-generator.ts +22 -12
  89. package/src/mcp-client.ts +13 -1
  90. package/src/mcp-tools/agent-tools.ts +388 -14
  91. package/src/mcp-tools/config-tools.ts +297 -15
  92. package/src/mcp-tools/hive-mind-tools.ts +521 -0
  93. package/src/mcp-tools/hooks-tools.ts +46 -7
  94. package/src/mcp-tools/index.ts +2 -0
  95. package/src/mcp-tools/session-tools.ts +280 -23
  96. package/src/mcp-tools/task-tools.ts +265 -20
  97. package/src/mcp-tools/workflow-tools.ts +573 -0
  98. package/src/services/index.ts +15 -0
  99. package/src/services/worker-daemon.ts +594 -0
@@ -0,0 +1,395 @@
1
+ /**
2
+ * V3 CLI Daemon Command
3
+ * Manages background worker daemon (Node.js-based, similar to shell helpers)
4
+ */
5
+
6
+ import type { Command, CommandContext, CommandResult } from '../types.js';
7
+ import { output } from '../output.js';
8
+ import { WorkerDaemon, getDaemon, startDaemon, stopDaemon, type WorkerType } from '../services/worker-daemon.js';
9
+
10
+ // Start daemon subcommand
11
+ const startCommand: Command = {
12
+ name: 'start',
13
+ description: 'Start the worker daemon with all enabled background workers',
14
+ options: [
15
+ { name: 'workers', short: 'w', type: 'string', description: 'Comma-separated list of workers to enable (default: map,audit,optimize,consolidate,testgaps)' },
16
+ { name: 'quiet', short: 'q', type: 'boolean', description: 'Suppress output' },
17
+ ],
18
+ examples: [
19
+ { command: 'claude-flow daemon start', description: 'Start daemon with default workers' },
20
+ { command: 'claude-flow daemon start -w map,audit,optimize', description: 'Start with specific workers' },
21
+ ],
22
+ action: async (ctx: CommandContext): Promise<CommandResult> => {
23
+ const quiet = ctx.flags.quiet as boolean;
24
+ const projectRoot = process.cwd();
25
+
26
+ try {
27
+ if (!quiet) {
28
+ const spinner = output.createSpinner({ text: 'Starting worker daemon...', spinner: 'dots' });
29
+ spinner.start();
30
+
31
+ const daemon = await startDaemon(projectRoot);
32
+ const status = daemon.getStatus();
33
+
34
+ spinner.succeed('Worker daemon started');
35
+
36
+ output.writeln();
37
+ output.printBox(
38
+ [
39
+ `PID: ${status.pid}`,
40
+ `Started: ${status.startedAt?.toISOString()}`,
41
+ `Workers: ${status.config.workers.filter(w => w.enabled).length} enabled`,
42
+ `Max Concurrent: ${status.config.maxConcurrent}`,
43
+ ].join('\n'),
44
+ 'Daemon Status'
45
+ );
46
+
47
+ output.writeln();
48
+ output.writeln(output.bold('Scheduled Workers'));
49
+ output.printTable({
50
+ columns: [
51
+ { key: 'type', header: 'Worker', width: 15 },
52
+ { key: 'interval', header: 'Interval', width: 12 },
53
+ { key: 'priority', header: 'Priority', width: 10 },
54
+ { key: 'description', header: 'Description', width: 30 },
55
+ ],
56
+ data: status.config.workers
57
+ .filter(w => w.enabled)
58
+ .map(w => ({
59
+ type: output.highlight(w.type),
60
+ interval: `${Math.round(w.intervalMs / 60000)}min`,
61
+ priority: w.priority === 'critical' ? output.error(w.priority) :
62
+ w.priority === 'high' ? output.warning(w.priority) :
63
+ output.dim(w.priority),
64
+ description: w.description,
65
+ })),
66
+ });
67
+
68
+ // Listen for worker events
69
+ daemon.on('worker:start', ({ type }: { type: string }) => {
70
+ output.writeln(output.dim(`[daemon] Worker starting: ${type}`));
71
+ });
72
+
73
+ daemon.on('worker:complete', ({ type, durationMs }: { type: string; durationMs: number }) => {
74
+ output.writeln(output.success(`[daemon] Worker completed: ${type} (${durationMs}ms)`));
75
+ });
76
+
77
+ daemon.on('worker:error', ({ type, error }: { type: string; error: string }) => {
78
+ output.writeln(output.error(`[daemon] Worker failed: ${type} - ${error}`));
79
+ });
80
+ } else {
81
+ await startDaemon(projectRoot);
82
+ }
83
+
84
+ return { success: true };
85
+ } catch (error) {
86
+ output.printError(`Failed to start daemon: ${error instanceof Error ? error.message : String(error)}`);
87
+ return { success: false, exitCode: 1 };
88
+ }
89
+ },
90
+ };
91
+
92
+ // Stop daemon subcommand
93
+ const stopCommand: Command = {
94
+ name: 'stop',
95
+ description: 'Stop the worker daemon and all background workers',
96
+ options: [
97
+ { name: 'quiet', short: 'q', type: 'boolean', description: 'Suppress output' },
98
+ ],
99
+ examples: [
100
+ { command: 'claude-flow daemon stop', description: 'Stop the daemon' },
101
+ ],
102
+ action: async (ctx: CommandContext): Promise<CommandResult> => {
103
+ const quiet = ctx.flags.quiet as boolean;
104
+
105
+ try {
106
+ if (!quiet) {
107
+ const spinner = output.createSpinner({ text: 'Stopping worker daemon...', spinner: 'dots' });
108
+ spinner.start();
109
+
110
+ await stopDaemon();
111
+
112
+ spinner.succeed('Worker daemon stopped');
113
+ } else {
114
+ await stopDaemon();
115
+ }
116
+
117
+ return { success: true };
118
+ } catch (error) {
119
+ output.printError(`Failed to stop daemon: ${error instanceof Error ? error.message : String(error)}`);
120
+ return { success: false, exitCode: 1 };
121
+ }
122
+ },
123
+ };
124
+
125
+ // Status subcommand
126
+ const statusCommand: Command = {
127
+ name: 'status',
128
+ description: 'Show daemon and worker status',
129
+ options: [
130
+ { name: 'verbose', short: 'v', type: 'boolean', description: 'Show detailed worker statistics' },
131
+ ],
132
+ examples: [
133
+ { command: 'claude-flow daemon status', description: 'Show daemon status' },
134
+ { command: 'claude-flow daemon status -v', description: 'Show detailed status' },
135
+ ],
136
+ action: async (ctx: CommandContext): Promise<CommandResult> => {
137
+ const verbose = ctx.flags.verbose as boolean;
138
+
139
+ try {
140
+ const daemon = getDaemon(process.cwd());
141
+ const status = daemon.getStatus();
142
+
143
+ output.writeln();
144
+
145
+ // Daemon status box
146
+ const statusIcon = status.running ? output.success('●') : output.error('○');
147
+ const statusText = status.running ? output.success('RUNNING') : output.error('STOPPED');
148
+
149
+ output.printBox(
150
+ [
151
+ `Status: ${statusIcon} ${statusText}`,
152
+ `PID: ${status.pid}`,
153
+ status.startedAt ? `Started: ${status.startedAt.toISOString()}` : '',
154
+ `Workers Enabled: ${status.config.workers.filter(w => w.enabled).length}`,
155
+ `Max Concurrent: ${status.config.maxConcurrent}`,
156
+ ].filter(Boolean).join('\n'),
157
+ 'Worker Daemon'
158
+ );
159
+
160
+ output.writeln();
161
+ output.writeln(output.bold('Worker Status'));
162
+
163
+ const workerData = status.config.workers.map(w => {
164
+ const state = status.workers.get(w.type);
165
+ return {
166
+ type: w.enabled ? output.highlight(w.type) : output.dim(w.type),
167
+ enabled: w.enabled ? output.success('✓') : output.dim('○'),
168
+ status: state?.isRunning ? output.warning('running') :
169
+ w.enabled ? output.success('idle') : output.dim('disabled'),
170
+ runs: state?.runCount ?? 0,
171
+ success: state ? `${Math.round((state.successCount / Math.max(state.runCount, 1)) * 100)}%` : '-',
172
+ lastRun: state?.lastRun ? formatTimeAgo(state.lastRun) : output.dim('never'),
173
+ nextRun: state?.nextRun && w.enabled ? formatTimeUntil(state.nextRun) : output.dim('-'),
174
+ };
175
+ });
176
+
177
+ output.printTable({
178
+ columns: [
179
+ { key: 'type', header: 'Worker', width: 12 },
180
+ { key: 'enabled', header: 'On', width: 4 },
181
+ { key: 'status', header: 'Status', width: 10 },
182
+ { key: 'runs', header: 'Runs', width: 6 },
183
+ { key: 'success', header: 'Success', width: 8 },
184
+ { key: 'lastRun', header: 'Last Run', width: 12 },
185
+ { key: 'nextRun', header: 'Next Run', width: 12 },
186
+ ],
187
+ data: workerData,
188
+ });
189
+
190
+ if (verbose) {
191
+ output.writeln();
192
+ output.writeln(output.bold('Worker Configuration'));
193
+ output.printTable({
194
+ columns: [
195
+ { key: 'type', header: 'Worker', width: 12 },
196
+ { key: 'interval', header: 'Interval', width: 10 },
197
+ { key: 'priority', header: 'Priority', width: 10 },
198
+ { key: 'avgDuration', header: 'Avg Duration', width: 12 },
199
+ { key: 'description', header: 'Description', width: 30 },
200
+ ],
201
+ data: status.config.workers.map(w => {
202
+ const state = status.workers.get(w.type);
203
+ return {
204
+ type: w.type,
205
+ interval: `${Math.round(w.intervalMs / 60000)}min`,
206
+ priority: w.priority,
207
+ avgDuration: state?.averageDurationMs ? `${Math.round(state.averageDurationMs)}ms` : '-',
208
+ description: w.description,
209
+ };
210
+ }),
211
+ });
212
+ }
213
+
214
+ return { success: true, data: status };
215
+ } catch (error) {
216
+ // Daemon not initialized
217
+ output.writeln();
218
+ output.printBox(
219
+ [
220
+ `Status: ${output.error('○')} ${output.error('NOT INITIALIZED')}`,
221
+ '',
222
+ 'Run "claude-flow daemon start" to start the daemon',
223
+ ].join('\n'),
224
+ 'Worker Daemon'
225
+ );
226
+
227
+ return { success: true };
228
+ }
229
+ },
230
+ };
231
+
232
+ // Trigger subcommand - manually run a worker
233
+ const triggerCommand: Command = {
234
+ name: 'trigger',
235
+ description: 'Manually trigger a specific worker',
236
+ options: [
237
+ { name: 'worker', short: 'w', type: 'string', description: 'Worker type to trigger', required: true },
238
+ ],
239
+ examples: [
240
+ { command: 'claude-flow daemon trigger -w map', description: 'Trigger the map worker' },
241
+ { command: 'claude-flow daemon trigger -w audit', description: 'Trigger security audit' },
242
+ ],
243
+ action: async (ctx: CommandContext): Promise<CommandResult> => {
244
+ const workerType = ctx.flags.worker as WorkerType;
245
+
246
+ if (!workerType) {
247
+ output.printError('Worker type is required. Use --worker or -w flag.');
248
+ output.writeln();
249
+ output.writeln('Available workers: map, audit, optimize, consolidate, testgaps, predict, document, ultralearn, refactor, benchmark, deepdive, preload');
250
+ return { success: false, exitCode: 1 };
251
+ }
252
+
253
+ try {
254
+ const daemon = getDaemon(process.cwd());
255
+
256
+ const spinner = output.createSpinner({ text: `Running ${workerType} worker...`, spinner: 'dots' });
257
+ spinner.start();
258
+
259
+ const result = await daemon.triggerWorker(workerType);
260
+
261
+ if (result.success) {
262
+ spinner.succeed(`Worker ${workerType} completed in ${result.durationMs}ms`);
263
+
264
+ if (result.output) {
265
+ output.writeln();
266
+ output.writeln(output.bold('Output'));
267
+ output.printJson(result.output);
268
+ }
269
+ } else {
270
+ spinner.fail(`Worker ${workerType} failed: ${result.error}`);
271
+ }
272
+
273
+ return { success: result.success, data: result };
274
+ } catch (error) {
275
+ output.printError(`Failed to trigger worker: ${error instanceof Error ? error.message : String(error)}`);
276
+ return { success: false, exitCode: 1 };
277
+ }
278
+ },
279
+ };
280
+
281
+ // Enable/disable worker subcommand
282
+ const enableCommand: Command = {
283
+ name: 'enable',
284
+ description: 'Enable or disable a specific worker',
285
+ options: [
286
+ { name: 'worker', short: 'w', type: 'string', description: 'Worker type', required: true },
287
+ { name: 'disable', short: 'd', type: 'boolean', description: 'Disable instead of enable' },
288
+ ],
289
+ examples: [
290
+ { command: 'claude-flow daemon enable -w predict', description: 'Enable predict worker' },
291
+ { command: 'claude-flow daemon enable -w document --disable', description: 'Disable document worker' },
292
+ ],
293
+ action: async (ctx: CommandContext): Promise<CommandResult> => {
294
+ const workerType = ctx.flags.worker as WorkerType;
295
+ const disable = ctx.flags.disable as boolean;
296
+
297
+ if (!workerType) {
298
+ output.printError('Worker type is required. Use --worker or -w flag.');
299
+ return { success: false, exitCode: 1 };
300
+ }
301
+
302
+ try {
303
+ const daemon = getDaemon(process.cwd());
304
+ daemon.setWorkerEnabled(workerType, !disable);
305
+
306
+ output.printSuccess(`Worker ${workerType} ${disable ? 'disabled' : 'enabled'}`);
307
+
308
+ return { success: true };
309
+ } catch (error) {
310
+ output.printError(`Failed to ${disable ? 'disable' : 'enable'} worker: ${error instanceof Error ? error.message : String(error)}`);
311
+ return { success: false, exitCode: 1 };
312
+ }
313
+ },
314
+ };
315
+
316
+ // Helper functions for time formatting
317
+ function formatTimeAgo(date: Date): string {
318
+ const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
319
+
320
+ if (seconds < 60) return `${seconds}s ago`;
321
+ if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;
322
+ if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;
323
+ return `${Math.floor(seconds / 86400)}d ago`;
324
+ }
325
+
326
+ function formatTimeUntil(date: Date): string {
327
+ const seconds = Math.floor((date.getTime() - Date.now()) / 1000);
328
+
329
+ if (seconds < 0) return 'now';
330
+ if (seconds < 60) return `in ${seconds}s`;
331
+ if (seconds < 3600) return `in ${Math.floor(seconds / 60)}m`;
332
+ if (seconds < 86400) return `in ${Math.floor(seconds / 3600)}h`;
333
+ return `in ${Math.floor(seconds / 86400)}d`;
334
+ }
335
+
336
+ // Main daemon command
337
+ export const daemonCommand: Command = {
338
+ name: 'daemon',
339
+ description: 'Manage background worker daemon (Node.js-based, auto-runs like shell helpers)',
340
+ subcommands: [
341
+ startCommand,
342
+ stopCommand,
343
+ statusCommand,
344
+ triggerCommand,
345
+ enableCommand,
346
+ ],
347
+ options: [],
348
+ examples: [
349
+ { command: 'claude-flow daemon start', description: 'Start the daemon' },
350
+ { command: 'claude-flow daemon status', description: 'Check daemon status' },
351
+ { command: 'claude-flow daemon stop', description: 'Stop the daemon' },
352
+ { command: 'claude-flow daemon trigger -w audit', description: 'Run security audit' },
353
+ ],
354
+ action: async (): Promise<CommandResult> => {
355
+ output.writeln();
356
+ output.writeln(output.bold('Worker Daemon - Background Task Management'));
357
+ output.writeln();
358
+ output.writeln('Node.js-based background worker system that auto-runs like shell daemons.');
359
+ output.writeln('Manages 12 specialized workers for continuous optimization and monitoring.');
360
+ output.writeln();
361
+
362
+ output.writeln(output.bold('Available Workers'));
363
+ output.printList([
364
+ `${output.highlight('map')} - Codebase mapping (5 min interval)`,
365
+ `${output.highlight('audit')} - Security analysis (10 min interval)`,
366
+ `${output.highlight('optimize')} - Performance optimization (15 min interval)`,
367
+ `${output.highlight('consolidate')} - Memory consolidation (30 min interval)`,
368
+ `${output.highlight('testgaps')} - Test coverage analysis (20 min interval)`,
369
+ `${output.highlight('predict')} - Predictive preloading (2 min, disabled by default)`,
370
+ `${output.highlight('document')} - Auto-documentation (60 min, disabled by default)`,
371
+ `${output.highlight('ultralearn')} - Deep knowledge acquisition (manual trigger)`,
372
+ `${output.highlight('refactor')} - Code refactoring suggestions (manual trigger)`,
373
+ `${output.highlight('benchmark')} - Performance benchmarking (manual trigger)`,
374
+ `${output.highlight('deepdive')} - Deep code analysis (manual trigger)`,
375
+ `${output.highlight('preload')} - Resource preloading (manual trigger)`,
376
+ ]);
377
+
378
+ output.writeln();
379
+ output.writeln(output.bold('Subcommands'));
380
+ output.printList([
381
+ `${output.highlight('start')} - Start the daemon`,
382
+ `${output.highlight('stop')} - Stop the daemon`,
383
+ `${output.highlight('status')} - Show daemon status`,
384
+ `${output.highlight('trigger')} - Manually run a worker`,
385
+ `${output.highlight('enable')} - Enable/disable a worker`,
386
+ ]);
387
+
388
+ output.writeln();
389
+ output.writeln('Run "claude-flow daemon <subcommand> --help" for details');
390
+
391
+ return { success: true };
392
+ },
393
+ };
394
+
395
+ export default daemonCommand;