@claude-flow/cli 3.0.0-alpha.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.
Files changed (229) hide show
  1. package/.agentic-flow/intelligence.json +16 -0
  2. package/.claude-flow/metrics/agent-metrics.json +1 -0
  3. package/.claude-flow/metrics/performance.json +87 -0
  4. package/.claude-flow/metrics/task-metrics.json +10 -0
  5. package/README.md +1186 -0
  6. package/__tests__/README.md +140 -0
  7. package/__tests__/TEST_SUMMARY.md +144 -0
  8. package/__tests__/cli.test.ts +558 -0
  9. package/__tests__/commands.test.ts +726 -0
  10. package/__tests__/config-adapter.test.ts +362 -0
  11. package/__tests__/config-loading.test.ts +106 -0
  12. package/__tests__/coverage/.tmp/coverage-0.json +1 -0
  13. package/__tests__/coverage/.tmp/coverage-1.json +1 -0
  14. package/__tests__/coverage/.tmp/coverage-2.json +1 -0
  15. package/__tests__/coverage/.tmp/coverage-3.json +1 -0
  16. package/__tests__/coverage/.tmp/coverage-4.json +1 -0
  17. package/__tests__/coverage/.tmp/coverage-5.json +1 -0
  18. package/__tests__/mcp-client.test.ts +480 -0
  19. package/__tests__/p1-commands.test.ts +1064 -0
  20. package/bin/cli.js +14 -0
  21. package/dist/src/commands/agent.d.ts +8 -0
  22. package/dist/src/commands/agent.d.ts.map +1 -0
  23. package/dist/src/commands/agent.js +803 -0
  24. package/dist/src/commands/agent.js.map +1 -0
  25. package/dist/src/commands/config.d.ts +8 -0
  26. package/dist/src/commands/config.d.ts.map +1 -0
  27. package/dist/src/commands/config.js +406 -0
  28. package/dist/src/commands/config.js.map +1 -0
  29. package/dist/src/commands/hive-mind.d.ts +8 -0
  30. package/dist/src/commands/hive-mind.d.ts.map +1 -0
  31. package/dist/src/commands/hive-mind.js +627 -0
  32. package/dist/src/commands/hive-mind.js.map +1 -0
  33. package/dist/src/commands/hooks.d.ts +8 -0
  34. package/dist/src/commands/hooks.d.ts.map +1 -0
  35. package/dist/src/commands/hooks.js +2098 -0
  36. package/dist/src/commands/hooks.js.map +1 -0
  37. package/dist/src/commands/index.d.ts +51 -0
  38. package/dist/src/commands/index.d.ts.map +1 -0
  39. package/dist/src/commands/index.js +105 -0
  40. package/dist/src/commands/index.js.map +1 -0
  41. package/dist/src/commands/init.d.ts +8 -0
  42. package/dist/src/commands/init.d.ts.map +1 -0
  43. package/dist/src/commands/init.js +532 -0
  44. package/dist/src/commands/init.js.map +1 -0
  45. package/dist/src/commands/mcp.d.ts +11 -0
  46. package/dist/src/commands/mcp.d.ts.map +1 -0
  47. package/dist/src/commands/mcp.js +662 -0
  48. package/dist/src/commands/mcp.js.map +1 -0
  49. package/dist/src/commands/memory.d.ts +8 -0
  50. package/dist/src/commands/memory.d.ts.map +1 -0
  51. package/dist/src/commands/memory.js +911 -0
  52. package/dist/src/commands/memory.js.map +1 -0
  53. package/dist/src/commands/migrate.d.ts +8 -0
  54. package/dist/src/commands/migrate.d.ts.map +1 -0
  55. package/dist/src/commands/migrate.js +398 -0
  56. package/dist/src/commands/migrate.js.map +1 -0
  57. package/dist/src/commands/process.d.ts +10 -0
  58. package/dist/src/commands/process.d.ts.map +1 -0
  59. package/dist/src/commands/process.js +566 -0
  60. package/dist/src/commands/process.js.map +1 -0
  61. package/dist/src/commands/session.d.ts +8 -0
  62. package/dist/src/commands/session.d.ts.map +1 -0
  63. package/dist/src/commands/session.js +750 -0
  64. package/dist/src/commands/session.js.map +1 -0
  65. package/dist/src/commands/start.d.ts +8 -0
  66. package/dist/src/commands/start.d.ts.map +1 -0
  67. package/dist/src/commands/start.js +398 -0
  68. package/dist/src/commands/start.js.map +1 -0
  69. package/dist/src/commands/status.d.ts +8 -0
  70. package/dist/src/commands/status.d.ts.map +1 -0
  71. package/dist/src/commands/status.js +560 -0
  72. package/dist/src/commands/status.js.map +1 -0
  73. package/dist/src/commands/swarm.d.ts +8 -0
  74. package/dist/src/commands/swarm.d.ts.map +1 -0
  75. package/dist/src/commands/swarm.js +573 -0
  76. package/dist/src/commands/swarm.js.map +1 -0
  77. package/dist/src/commands/task.d.ts +8 -0
  78. package/dist/src/commands/task.d.ts.map +1 -0
  79. package/dist/src/commands/task.js +671 -0
  80. package/dist/src/commands/task.js.map +1 -0
  81. package/dist/src/commands/workflow.d.ts +8 -0
  82. package/dist/src/commands/workflow.d.ts.map +1 -0
  83. package/dist/src/commands/workflow.js +617 -0
  84. package/dist/src/commands/workflow.js.map +1 -0
  85. package/dist/src/config-adapter.d.ts +15 -0
  86. package/dist/src/config-adapter.d.ts.map +1 -0
  87. package/dist/src/config-adapter.js +185 -0
  88. package/dist/src/config-adapter.js.map +1 -0
  89. package/dist/src/index.d.ts +55 -0
  90. package/dist/src/index.d.ts.map +1 -0
  91. package/dist/src/index.js +312 -0
  92. package/dist/src/index.js.map +1 -0
  93. package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
  94. package/dist/src/infrastructure/in-memory-repositories.d.ts.map +1 -0
  95. package/dist/src/infrastructure/in-memory-repositories.js +264 -0
  96. package/dist/src/infrastructure/in-memory-repositories.js.map +1 -0
  97. package/dist/src/init/claudemd-generator.d.ts +15 -0
  98. package/dist/src/init/claudemd-generator.d.ts.map +1 -0
  99. package/dist/src/init/claudemd-generator.js +626 -0
  100. package/dist/src/init/claudemd-generator.js.map +1 -0
  101. package/dist/src/init/executor.d.ts +11 -0
  102. package/dist/src/init/executor.d.ts.map +1 -0
  103. package/dist/src/init/executor.js +647 -0
  104. package/dist/src/init/executor.js.map +1 -0
  105. package/dist/src/init/helpers-generator.d.ts +42 -0
  106. package/dist/src/init/helpers-generator.d.ts.map +1 -0
  107. package/dist/src/init/helpers-generator.js +613 -0
  108. package/dist/src/init/helpers-generator.js.map +1 -0
  109. package/dist/src/init/index.d.ts +12 -0
  110. package/dist/src/init/index.d.ts.map +1 -0
  111. package/dist/src/init/index.js +15 -0
  112. package/dist/src/init/index.js.map +1 -0
  113. package/dist/src/init/mcp-generator.d.ts +18 -0
  114. package/dist/src/init/mcp-generator.d.ts.map +1 -0
  115. package/dist/src/init/mcp-generator.js +71 -0
  116. package/dist/src/init/mcp-generator.js.map +1 -0
  117. package/dist/src/init/settings-generator.d.ts +14 -0
  118. package/dist/src/init/settings-generator.d.ts.map +1 -0
  119. package/dist/src/init/settings-generator.js +257 -0
  120. package/dist/src/init/settings-generator.js.map +1 -0
  121. package/dist/src/init/statusline-generator.d.ts +14 -0
  122. package/dist/src/init/statusline-generator.d.ts.map +1 -0
  123. package/dist/src/init/statusline-generator.js +206 -0
  124. package/dist/src/init/statusline-generator.js.map +1 -0
  125. package/dist/src/init/types.d.ts +240 -0
  126. package/dist/src/init/types.d.ts.map +1 -0
  127. package/dist/src/init/types.js +210 -0
  128. package/dist/src/init/types.js.map +1 -0
  129. package/dist/src/mcp-client.d.ts +92 -0
  130. package/dist/src/mcp-client.d.ts.map +1 -0
  131. package/dist/src/mcp-client.js +189 -0
  132. package/dist/src/mcp-client.js.map +1 -0
  133. package/dist/src/mcp-server.d.ts +153 -0
  134. package/dist/src/mcp-server.d.ts.map +1 -0
  135. package/dist/src/mcp-server.js +448 -0
  136. package/dist/src/mcp-server.js.map +1 -0
  137. package/dist/src/mcp-tools/agent-tools.d.ts +8 -0
  138. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -0
  139. package/dist/src/mcp-tools/agent-tools.js +90 -0
  140. package/dist/src/mcp-tools/agent-tools.js.map +1 -0
  141. package/dist/src/mcp-tools/config-tools.d.ts +8 -0
  142. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -0
  143. package/dist/src/mcp-tools/config-tools.js +86 -0
  144. package/dist/src/mcp-tools/config-tools.js.map +1 -0
  145. package/dist/src/mcp-tools/hooks-tools.d.ts +41 -0
  146. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -0
  147. package/dist/src/mcp-tools/hooks-tools.js +1646 -0
  148. package/dist/src/mcp-tools/hooks-tools.js.map +1 -0
  149. package/dist/src/mcp-tools/index.d.ts +12 -0
  150. package/dist/src/mcp-tools/index.d.ts.map +1 -0
  151. package/dist/src/mcp-tools/index.js +11 -0
  152. package/dist/src/mcp-tools/index.js.map +1 -0
  153. package/dist/src/mcp-tools/memory-tools.d.ts +8 -0
  154. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -0
  155. package/dist/src/mcp-tools/memory-tools.js +87 -0
  156. package/dist/src/mcp-tools/memory-tools.js.map +1 -0
  157. package/dist/src/mcp-tools/swarm-tools.d.ts +8 -0
  158. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -0
  159. package/dist/src/mcp-tools/swarm-tools.js +67 -0
  160. package/dist/src/mcp-tools/swarm-tools.js.map +1 -0
  161. package/dist/src/mcp-tools/types.d.ts +31 -0
  162. package/dist/src/mcp-tools/types.d.ts.map +1 -0
  163. package/dist/src/mcp-tools/types.js +7 -0
  164. package/dist/src/mcp-tools/types.js.map +1 -0
  165. package/dist/src/output.d.ts +117 -0
  166. package/dist/src/output.d.ts.map +1 -0
  167. package/dist/src/output.js +471 -0
  168. package/dist/src/output.js.map +1 -0
  169. package/dist/src/parser.d.ts +41 -0
  170. package/dist/src/parser.d.ts.map +1 -0
  171. package/dist/src/parser.js +353 -0
  172. package/dist/src/parser.js.map +1 -0
  173. package/dist/src/prompt.d.ts +44 -0
  174. package/dist/src/prompt.d.ts.map +1 -0
  175. package/dist/src/prompt.js +501 -0
  176. package/dist/src/prompt.js.map +1 -0
  177. package/dist/src/types.d.ts +198 -0
  178. package/dist/src/types.d.ts.map +1 -0
  179. package/dist/src/types.js +38 -0
  180. package/dist/src/types.js.map +1 -0
  181. package/dist/tsconfig.tsbuildinfo +1 -0
  182. package/docs/CONFIG_LOADING.md +236 -0
  183. package/docs/IMPLEMENTATION_COMPLETE.md +421 -0
  184. package/docs/MCP_CLIENT_GUIDE.md +620 -0
  185. package/docs/REFACTORING_SUMMARY.md +247 -0
  186. package/package.json +29 -0
  187. package/src/commands/agent.ts +941 -0
  188. package/src/commands/config.ts +452 -0
  189. package/src/commands/hive-mind.ts +762 -0
  190. package/src/commands/hooks.ts +2603 -0
  191. package/src/commands/index.ts +115 -0
  192. package/src/commands/init.ts +597 -0
  193. package/src/commands/mcp.ts +753 -0
  194. package/src/commands/memory.ts +1063 -0
  195. package/src/commands/migrate.ts +447 -0
  196. package/src/commands/process.ts +617 -0
  197. package/src/commands/session.ts +891 -0
  198. package/src/commands/start.ts +457 -0
  199. package/src/commands/status.ts +705 -0
  200. package/src/commands/swarm.ts +648 -0
  201. package/src/commands/task.ts +792 -0
  202. package/src/commands/workflow.ts +742 -0
  203. package/src/config-adapter.ts +210 -0
  204. package/src/index.ts +383 -0
  205. package/src/infrastructure/in-memory-repositories.ts +310 -0
  206. package/src/init/claudemd-generator.ts +631 -0
  207. package/src/init/executor.ts +756 -0
  208. package/src/init/helpers-generator.ts +628 -0
  209. package/src/init/index.ts +60 -0
  210. package/src/init/mcp-generator.ts +83 -0
  211. package/src/init/settings-generator.ts +274 -0
  212. package/src/init/statusline-generator.ts +211 -0
  213. package/src/init/types.ts +447 -0
  214. package/src/mcp-client.ts +227 -0
  215. package/src/mcp-server.ts +571 -0
  216. package/src/mcp-tools/agent-tools.ts +92 -0
  217. package/src/mcp-tools/config-tools.ts +88 -0
  218. package/src/mcp-tools/hooks-tools.ts +1819 -0
  219. package/src/mcp-tools/index.ts +12 -0
  220. package/src/mcp-tools/memory-tools.ts +89 -0
  221. package/src/mcp-tools/swarm-tools.ts +69 -0
  222. package/src/mcp-tools/types.ts +33 -0
  223. package/src/output.ts +593 -0
  224. package/src/parser.ts +417 -0
  225. package/src/prompt.ts +619 -0
  226. package/src/types.ts +287 -0
  227. package/tsconfig.json +16 -0
  228. package/tsconfig.tsbuildinfo +1 -0
  229. package/vitest.config.ts +13 -0
@@ -0,0 +1,671 @@
1
+ /**
2
+ * V3 CLI Task Command
3
+ * Task management for Claude Flow
4
+ */
5
+ import { output } from '../output.js';
6
+ import { select, confirm, input, multiSelect } from '../prompt.js';
7
+ import { callMCPTool, MCPClientError } from '../mcp-client.js';
8
+ // Task types
9
+ const TASK_TYPES = [
10
+ { value: 'implementation', label: 'Implementation', hint: 'Feature implementation' },
11
+ { value: 'bug-fix', label: 'Bug Fix', hint: 'Fix a bug or issue' },
12
+ { value: 'refactoring', label: 'Refactoring', hint: 'Code refactoring' },
13
+ { value: 'testing', label: 'Testing', hint: 'Write or update tests' },
14
+ { value: 'documentation', label: 'Documentation', hint: 'Documentation updates' },
15
+ { value: 'research', label: 'Research', hint: 'Research and analysis' },
16
+ { value: 'review', label: 'Review', hint: 'Code review' },
17
+ { value: 'optimization', label: 'Optimization', hint: 'Performance optimization' },
18
+ { value: 'security', label: 'Security', hint: 'Security audit or fix' },
19
+ { value: 'custom', label: 'Custom', hint: 'Custom task type' }
20
+ ];
21
+ // Task priorities
22
+ const TASK_PRIORITIES = [
23
+ { value: 'critical', label: 'Critical', hint: 'Highest priority' },
24
+ { value: 'high', label: 'High', hint: 'Important task' },
25
+ { value: 'normal', label: 'Normal', hint: 'Standard priority' },
26
+ { value: 'low', label: 'Low', hint: 'Lower priority' }
27
+ ];
28
+ // Format task status with color
29
+ function formatStatus(status) {
30
+ switch (status) {
31
+ case 'completed':
32
+ return output.success(status);
33
+ case 'running':
34
+ case 'in_progress':
35
+ return output.info(status);
36
+ case 'pending':
37
+ case 'queued':
38
+ return output.warning(status);
39
+ case 'failed':
40
+ case 'cancelled':
41
+ return output.error(status);
42
+ default:
43
+ return status;
44
+ }
45
+ }
46
+ // Format priority with color
47
+ function formatPriority(priority) {
48
+ switch (priority) {
49
+ case 'critical':
50
+ return output.error(priority);
51
+ case 'high':
52
+ return output.warning(priority);
53
+ case 'normal':
54
+ return priority;
55
+ case 'low':
56
+ return output.dim(priority);
57
+ default:
58
+ return priority;
59
+ }
60
+ }
61
+ // Create subcommand
62
+ const createCommand = {
63
+ name: 'create',
64
+ aliases: ['new', 'add'],
65
+ description: 'Create a new task',
66
+ options: [
67
+ {
68
+ name: 'type',
69
+ short: 't',
70
+ description: 'Task type',
71
+ type: 'string',
72
+ choices: TASK_TYPES.map(t => t.value)
73
+ },
74
+ {
75
+ name: 'description',
76
+ short: 'd',
77
+ description: 'Task description',
78
+ type: 'string'
79
+ },
80
+ {
81
+ name: 'priority',
82
+ short: 'p',
83
+ description: 'Task priority',
84
+ type: 'string',
85
+ choices: TASK_PRIORITIES.map(p => p.value),
86
+ default: 'normal'
87
+ },
88
+ {
89
+ name: 'assign',
90
+ short: 'a',
91
+ description: 'Assign to agent(s)',
92
+ type: 'string'
93
+ },
94
+ {
95
+ name: 'tags',
96
+ description: 'Comma-separated tags',
97
+ type: 'string'
98
+ },
99
+ {
100
+ name: 'parent',
101
+ description: 'Parent task ID',
102
+ type: 'string'
103
+ },
104
+ {
105
+ name: 'dependencies',
106
+ description: 'Comma-separated task IDs that must complete first',
107
+ type: 'string'
108
+ },
109
+ {
110
+ name: 'timeout',
111
+ description: 'Task timeout in seconds',
112
+ type: 'number',
113
+ default: 300
114
+ }
115
+ ],
116
+ action: async (ctx) => {
117
+ let taskType = ctx.flags.type;
118
+ let description = ctx.flags.description;
119
+ let priority = ctx.flags.priority;
120
+ // Interactive mode
121
+ if (!taskType && ctx.interactive) {
122
+ taskType = await select({
123
+ message: 'Select task type:',
124
+ options: TASK_TYPES
125
+ });
126
+ }
127
+ if (!description && ctx.interactive) {
128
+ description = await input({
129
+ message: 'Task description:',
130
+ validate: (v) => v.length > 0 || 'Description is required'
131
+ });
132
+ }
133
+ if (!taskType || !description) {
134
+ output.printError('Task type and description are required');
135
+ output.printInfo('Use --type and --description flags, or run in interactive mode');
136
+ return { success: false, exitCode: 1 };
137
+ }
138
+ if (!priority && ctx.interactive) {
139
+ priority = await select({
140
+ message: 'Select priority:',
141
+ options: TASK_PRIORITIES,
142
+ default: 'normal'
143
+ });
144
+ }
145
+ // Parse tags and dependencies
146
+ const tags = ctx.flags.tags ? ctx.flags.tags.split(',').map(t => t.trim()) : [];
147
+ const dependencies = ctx.flags.dependencies
148
+ ? ctx.flags.dependencies.split(',').map(d => d.trim())
149
+ : [];
150
+ output.writeln();
151
+ output.printInfo(`Creating ${taskType} task...`);
152
+ try {
153
+ const result = await callMCPTool('task/create', {
154
+ type: taskType,
155
+ description,
156
+ priority: priority || 'normal',
157
+ assignedTo: ctx.flags.assign ? [ctx.flags.assign] : undefined,
158
+ parentId: ctx.flags.parent,
159
+ dependencies,
160
+ tags,
161
+ timeout: ctx.flags.timeout,
162
+ metadata: {
163
+ source: 'cli',
164
+ createdBy: 'user'
165
+ }
166
+ });
167
+ output.writeln();
168
+ output.printSuccess(`Task created: ${result.taskId}`);
169
+ output.writeln();
170
+ output.printTable({
171
+ columns: [
172
+ { key: 'property', header: 'Property', width: 15 },
173
+ { key: 'value', header: 'Value', width: 40 }
174
+ ],
175
+ data: [
176
+ { property: 'ID', value: result.taskId },
177
+ { property: 'Type', value: result.type },
178
+ { property: 'Description', value: result.description },
179
+ { property: 'Priority', value: formatPriority(result.priority) },
180
+ { property: 'Status', value: formatStatus(result.status) },
181
+ { property: 'Assigned To', value: result.assignedTo?.join(', ') || 'Unassigned' },
182
+ { property: 'Tags', value: result.tags.join(', ') || 'None' },
183
+ { property: 'Created', value: new Date(result.createdAt).toLocaleString() }
184
+ ]
185
+ });
186
+ if (ctx.flags.format === 'json') {
187
+ output.printJson(result);
188
+ }
189
+ return { success: true, data: result };
190
+ }
191
+ catch (error) {
192
+ if (error instanceof MCPClientError) {
193
+ output.printError(`Failed to create task: ${error.message}`);
194
+ }
195
+ else {
196
+ output.printError(`Unexpected error: ${String(error)}`);
197
+ }
198
+ return { success: false, exitCode: 1 };
199
+ }
200
+ }
201
+ };
202
+ // List subcommand
203
+ const listCommand = {
204
+ name: 'list',
205
+ aliases: ['ls'],
206
+ description: 'List tasks',
207
+ options: [
208
+ {
209
+ name: 'status',
210
+ short: 's',
211
+ description: 'Filter by status',
212
+ type: 'string',
213
+ choices: ['pending', 'running', 'completed', 'failed', 'cancelled', 'all']
214
+ },
215
+ {
216
+ name: 'type',
217
+ short: 't',
218
+ description: 'Filter by task type',
219
+ type: 'string'
220
+ },
221
+ {
222
+ name: 'priority',
223
+ short: 'p',
224
+ description: 'Filter by priority',
225
+ type: 'string'
226
+ },
227
+ {
228
+ name: 'agent',
229
+ short: 'a',
230
+ description: 'Filter by assigned agent',
231
+ type: 'string'
232
+ },
233
+ {
234
+ name: 'limit',
235
+ short: 'l',
236
+ description: 'Maximum number of tasks to show',
237
+ type: 'number',
238
+ default: 20
239
+ },
240
+ {
241
+ name: 'all',
242
+ description: 'Show all tasks including completed',
243
+ type: 'boolean',
244
+ default: false
245
+ }
246
+ ],
247
+ action: async (ctx) => {
248
+ const status = ctx.flags.all ? 'all' : ctx.flags.status || 'pending,running';
249
+ const limit = ctx.flags.limit;
250
+ try {
251
+ const result = await callMCPTool('task/list', {
252
+ status,
253
+ type: ctx.flags.type,
254
+ priority: ctx.flags.priority,
255
+ agentId: ctx.flags.agent,
256
+ limit,
257
+ offset: 0
258
+ });
259
+ if (ctx.flags.format === 'json') {
260
+ output.printJson(result);
261
+ return { success: true, data: result };
262
+ }
263
+ output.writeln();
264
+ output.writeln(output.bold('Tasks'));
265
+ output.writeln();
266
+ if (result.tasks.length === 0) {
267
+ output.printInfo('No tasks found matching criteria');
268
+ return { success: true, data: result };
269
+ }
270
+ output.printTable({
271
+ columns: [
272
+ { key: 'id', header: 'ID', width: 15 },
273
+ { key: 'type', header: 'Type', width: 15 },
274
+ { key: 'description', header: 'Description', width: 30 },
275
+ { key: 'priority', header: 'Priority', width: 10 },
276
+ { key: 'status', header: 'Status', width: 12 },
277
+ { key: 'progress', header: 'Progress', width: 10 }
278
+ ],
279
+ data: result.tasks.map(t => ({
280
+ id: t.id,
281
+ type: t.type,
282
+ description: t.description.length > 27
283
+ ? t.description.slice(0, 27) + '...'
284
+ : t.description,
285
+ priority: formatPriority(t.priority),
286
+ status: formatStatus(t.status),
287
+ progress: `${t.progress}%`
288
+ }))
289
+ });
290
+ output.writeln();
291
+ output.printInfo(`Showing ${result.tasks.length} of ${result.total} tasks`);
292
+ return { success: true, data: result };
293
+ }
294
+ catch (error) {
295
+ if (error instanceof MCPClientError) {
296
+ output.printError(`Failed to list tasks: ${error.message}`);
297
+ }
298
+ else {
299
+ output.printError(`Unexpected error: ${String(error)}`);
300
+ }
301
+ return { success: false, exitCode: 1 };
302
+ }
303
+ }
304
+ };
305
+ // Status subcommand (get task details)
306
+ const statusCommand = {
307
+ name: 'status',
308
+ aliases: ['info', 'get'],
309
+ description: 'Get task status and details',
310
+ options: [
311
+ {
312
+ name: 'id',
313
+ description: 'Task ID',
314
+ type: 'string'
315
+ },
316
+ {
317
+ name: 'logs',
318
+ description: 'Include execution logs',
319
+ type: 'boolean',
320
+ default: false
321
+ }
322
+ ],
323
+ action: async (ctx) => {
324
+ let taskId = ctx.args[0] || ctx.flags.id;
325
+ if (!taskId && ctx.interactive) {
326
+ taskId = await input({
327
+ message: 'Enter task ID:',
328
+ validate: (v) => v.length > 0 || 'Task ID is required'
329
+ });
330
+ }
331
+ if (!taskId) {
332
+ output.printError('Task ID is required');
333
+ return { success: false, exitCode: 1 };
334
+ }
335
+ try {
336
+ const result = await callMCPTool('task/status', {
337
+ taskId,
338
+ includeLogs: ctx.flags.logs,
339
+ includeMetrics: true
340
+ });
341
+ if (ctx.flags.format === 'json') {
342
+ output.printJson(result);
343
+ return { success: true, data: result };
344
+ }
345
+ output.writeln();
346
+ output.printBox([
347
+ `Type: ${result.type}`,
348
+ `Status: ${formatStatus(result.status)}`,
349
+ `Priority: ${formatPriority(result.priority)}`,
350
+ `Progress: ${result.progress}%`,
351
+ '',
352
+ `Description: ${result.description}`
353
+ ].join('\n'), `Task: ${result.id}`);
354
+ // Assignment info
355
+ output.writeln();
356
+ output.writeln(output.bold('Assignment'));
357
+ output.printTable({
358
+ columns: [
359
+ { key: 'property', header: 'Property', width: 15 },
360
+ { key: 'value', header: 'Value', width: 40 }
361
+ ],
362
+ data: [
363
+ { property: 'Assigned To', value: result.assignedTo?.join(', ') || 'Unassigned' },
364
+ { property: 'Parent Task', value: result.parentId || 'None' },
365
+ { property: 'Dependencies', value: result.dependencies.join(', ') || 'None' },
366
+ { property: 'Dependents', value: result.dependents.join(', ') || 'None' },
367
+ { property: 'Tags', value: result.tags.join(', ') || 'None' }
368
+ ]
369
+ });
370
+ // Timeline
371
+ output.writeln();
372
+ output.writeln(output.bold('Timeline'));
373
+ output.printTable({
374
+ columns: [
375
+ { key: 'event', header: 'Event', width: 15 },
376
+ { key: 'time', header: 'Time', width: 30 }
377
+ ],
378
+ data: [
379
+ { event: 'Created', time: new Date(result.createdAt).toLocaleString() },
380
+ { event: 'Started', time: result.startedAt ? new Date(result.startedAt).toLocaleString() : '-' },
381
+ { event: 'Completed', time: result.completedAt ? new Date(result.completedAt).toLocaleString() : '-' }
382
+ ]
383
+ });
384
+ // Metrics
385
+ if (result.metrics) {
386
+ output.writeln();
387
+ output.writeln(output.bold('Metrics'));
388
+ output.printTable({
389
+ columns: [
390
+ { key: 'metric', header: 'Metric', width: 20 },
391
+ { key: 'value', header: 'Value', width: 20, align: 'right' }
392
+ ],
393
+ data: [
394
+ { metric: 'Execution Time', value: `${(result.metrics.executionTime / 1000).toFixed(2)}s` },
395
+ { metric: 'Retries', value: result.metrics.retries },
396
+ { metric: 'Tokens Used', value: result.metrics.tokensUsed.toLocaleString() }
397
+ ]
398
+ });
399
+ }
400
+ // Error if failed
401
+ if (result.status === 'failed' && result.error) {
402
+ output.writeln();
403
+ output.printError(`Error: ${result.error}`);
404
+ }
405
+ // Logs if requested
406
+ if (ctx.flags.logs && result.logs && result.logs.length > 0) {
407
+ output.writeln();
408
+ output.writeln(output.bold('Execution Logs'));
409
+ for (const log of result.logs.slice(-20)) {
410
+ const time = new Date(log.timestamp).toLocaleTimeString();
411
+ const level = log.level === 'error' ? output.error(`[${log.level}]`) :
412
+ log.level === 'warn' ? output.warning(`[${log.level}]`) :
413
+ output.dim(`[${log.level}]`);
414
+ output.writeln(` ${output.dim(time)} ${level} ${log.message}`);
415
+ }
416
+ }
417
+ return { success: true, data: result };
418
+ }
419
+ catch (error) {
420
+ if (error instanceof MCPClientError) {
421
+ output.printError(`Failed to get task status: ${error.message}`);
422
+ }
423
+ else {
424
+ output.printError(`Unexpected error: ${String(error)}`);
425
+ }
426
+ return { success: false, exitCode: 1 };
427
+ }
428
+ }
429
+ };
430
+ // Cancel subcommand
431
+ const cancelCommand = {
432
+ name: 'cancel',
433
+ aliases: ['abort', 'stop'],
434
+ description: 'Cancel a running task',
435
+ options: [
436
+ {
437
+ name: 'force',
438
+ short: 'f',
439
+ description: 'Force cancel without confirmation',
440
+ type: 'boolean',
441
+ default: false
442
+ },
443
+ {
444
+ name: 'reason',
445
+ short: 'r',
446
+ description: 'Cancellation reason',
447
+ type: 'string'
448
+ }
449
+ ],
450
+ action: async (ctx) => {
451
+ const taskId = ctx.args[0];
452
+ const force = ctx.flags.force;
453
+ const reason = ctx.flags.reason;
454
+ if (!taskId) {
455
+ output.printError('Task ID is required');
456
+ return { success: false, exitCode: 1 };
457
+ }
458
+ if (!force && ctx.interactive) {
459
+ const confirmed = await confirm({
460
+ message: `Are you sure you want to cancel task ${taskId}?`,
461
+ default: false
462
+ });
463
+ if (!confirmed) {
464
+ output.printInfo('Operation cancelled');
465
+ return { success: true };
466
+ }
467
+ }
468
+ try {
469
+ const result = await callMCPTool('task/cancel', {
470
+ taskId,
471
+ reason: reason || 'Cancelled by user via CLI'
472
+ });
473
+ output.writeln();
474
+ output.printSuccess(`Task ${taskId} cancelled`);
475
+ output.printInfo(`Previous status: ${result.previousStatus}`);
476
+ if (ctx.flags.format === 'json') {
477
+ output.printJson(result);
478
+ }
479
+ return { success: true, data: result };
480
+ }
481
+ catch (error) {
482
+ if (error instanceof MCPClientError) {
483
+ output.printError(`Failed to cancel task: ${error.message}`);
484
+ }
485
+ else {
486
+ output.printError(`Unexpected error: ${String(error)}`);
487
+ }
488
+ return { success: false, exitCode: 1 };
489
+ }
490
+ }
491
+ };
492
+ // Assign subcommand
493
+ const assignCommand = {
494
+ name: 'assign',
495
+ description: 'Assign a task to agent(s)',
496
+ options: [
497
+ {
498
+ name: 'agent',
499
+ short: 'a',
500
+ description: 'Agent ID(s) to assign (comma-separated)',
501
+ type: 'string'
502
+ },
503
+ {
504
+ name: 'unassign',
505
+ description: 'Remove current assignment',
506
+ type: 'boolean',
507
+ default: false
508
+ }
509
+ ],
510
+ action: async (ctx) => {
511
+ const taskId = ctx.args[0];
512
+ const agentIds = ctx.flags.agent;
513
+ const unassign = ctx.flags.unassign;
514
+ if (!taskId) {
515
+ output.printError('Task ID is required');
516
+ return { success: false, exitCode: 1 };
517
+ }
518
+ if (!agentIds && !unassign) {
519
+ // Interactive agent selection
520
+ if (ctx.interactive) {
521
+ try {
522
+ const agents = await callMCPTool('agent/list', { status: 'active,idle' });
523
+ if (agents.agents.length === 0) {
524
+ output.printWarning('No available agents');
525
+ return { success: false, exitCode: 1 };
526
+ }
527
+ const selectedAgents = await multiSelect({
528
+ message: 'Select agent(s) to assign:',
529
+ options: agents.agents.map(a => ({
530
+ value: a.id,
531
+ label: a.id,
532
+ hint: `${a.type} - ${a.status}`
533
+ })),
534
+ required: true
535
+ });
536
+ if (selectedAgents.length === 0) {
537
+ output.printInfo('No agents selected');
538
+ return { success: true };
539
+ }
540
+ // Continue with assignment
541
+ const result = await callMCPTool('task/assign', {
542
+ taskId,
543
+ agentIds: selectedAgents
544
+ });
545
+ output.writeln();
546
+ output.printSuccess(`Task ${taskId} assigned to ${result.assignedTo.join(', ')}`);
547
+ return { success: true, data: result };
548
+ }
549
+ catch (error) {
550
+ if (error instanceof Error && error.message === 'User cancelled') {
551
+ output.printInfo('Operation cancelled');
552
+ return { success: true };
553
+ }
554
+ throw error;
555
+ }
556
+ }
557
+ output.printError('Agent ID is required. Use --agent flag or run in interactive mode');
558
+ return { success: false, exitCode: 1 };
559
+ }
560
+ try {
561
+ const result = await callMCPTool('task/assign', {
562
+ taskId,
563
+ agentIds: unassign ? [] : agentIds.split(',').map(id => id.trim()),
564
+ unassign
565
+ });
566
+ output.writeln();
567
+ if (unassign) {
568
+ output.printSuccess(`Task ${taskId} unassigned`);
569
+ }
570
+ else {
571
+ output.printSuccess(`Task ${taskId} assigned to ${result.assignedTo.join(', ')}`);
572
+ }
573
+ if (ctx.flags.format === 'json') {
574
+ output.printJson(result);
575
+ }
576
+ return { success: true, data: result };
577
+ }
578
+ catch (error) {
579
+ if (error instanceof MCPClientError) {
580
+ output.printError(`Failed to assign task: ${error.message}`);
581
+ }
582
+ else {
583
+ output.printError(`Unexpected error: ${String(error)}`);
584
+ }
585
+ return { success: false, exitCode: 1 };
586
+ }
587
+ }
588
+ };
589
+ // Retry subcommand
590
+ const retryCommand = {
591
+ name: 'retry',
592
+ aliases: ['rerun'],
593
+ description: 'Retry a failed task',
594
+ options: [
595
+ {
596
+ name: 'reset-state',
597
+ description: 'Reset task state completely',
598
+ type: 'boolean',
599
+ default: false
600
+ }
601
+ ],
602
+ action: async (ctx) => {
603
+ const taskId = ctx.args[0];
604
+ const resetState = ctx.flags['reset-state'];
605
+ if (!taskId) {
606
+ output.printError('Task ID is required');
607
+ return { success: false, exitCode: 1 };
608
+ }
609
+ try {
610
+ const result = await callMCPTool('task/retry', {
611
+ taskId,
612
+ resetState
613
+ });
614
+ output.writeln();
615
+ output.printSuccess(`Task ${taskId} retried`);
616
+ output.printInfo(`New task ID: ${result.newTaskId}`);
617
+ output.printInfo(`Status: ${formatStatus(result.status)}`);
618
+ if (ctx.flags.format === 'json') {
619
+ output.printJson(result);
620
+ }
621
+ return { success: true, data: result };
622
+ }
623
+ catch (error) {
624
+ if (error instanceof MCPClientError) {
625
+ output.printError(`Failed to retry task: ${error.message}`);
626
+ }
627
+ else {
628
+ output.printError(`Unexpected error: ${String(error)}`);
629
+ }
630
+ return { success: false, exitCode: 1 };
631
+ }
632
+ }
633
+ };
634
+ // Main task command
635
+ export const taskCommand = {
636
+ name: 'task',
637
+ description: 'Task management commands',
638
+ subcommands: [createCommand, listCommand, statusCommand, cancelCommand, assignCommand, retryCommand],
639
+ options: [],
640
+ examples: [
641
+ { command: 'claude-flow task create -t implementation -d "Add user auth"', description: 'Create a task' },
642
+ { command: 'claude-flow task list', description: 'List pending/running tasks' },
643
+ { command: 'claude-flow task list --all', description: 'List all tasks' },
644
+ { command: 'claude-flow task status task-123', description: 'Get task details' },
645
+ { command: 'claude-flow task cancel task-123', description: 'Cancel a task' },
646
+ { command: 'claude-flow task assign task-123 --agent coder-1', description: 'Assign task to agent' },
647
+ { command: 'claude-flow task retry task-123', description: 'Retry a failed task' }
648
+ ],
649
+ action: async (ctx) => {
650
+ // Show help if no subcommand
651
+ output.writeln();
652
+ output.writeln(output.bold('Task Management Commands'));
653
+ output.writeln();
654
+ output.writeln('Usage: claude-flow task <subcommand> [options]');
655
+ output.writeln();
656
+ output.writeln('Subcommands:');
657
+ output.printList([
658
+ `${output.highlight('create')} - Create a new task`,
659
+ `${output.highlight('list')} - List tasks`,
660
+ `${output.highlight('status')} - Get task details`,
661
+ `${output.highlight('cancel')} - Cancel a running task`,
662
+ `${output.highlight('assign')} - Assign task to agent(s)`,
663
+ `${output.highlight('retry')} - Retry a failed task`
664
+ ]);
665
+ output.writeln();
666
+ output.writeln('Run "claude-flow task <subcommand> --help" for subcommand help');
667
+ return { success: true };
668
+ }
669
+ };
670
+ export default taskCommand;
671
+ //# sourceMappingURL=task.js.map