@mrpatronz/nexusflow 0.2.13 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/dependabot.yml +52 -52
- package/.github/workflows/dependabot-merge.yml +53 -0
- package/.github/workflows/release.yml +112 -100
- package/.vscode/launch.json +17 -17
- package/.vscode/tasks.json +17 -17
- package/GETTING_STARTED.md +114 -109
- package/README.md +336 -311
- package/desktop/build-installer.js +228 -0
- package/desktop/build.js +118 -0
- package/desktop/installer/nexusflow.iss +35 -0
- package/desktop/neutralino.config.json +39 -0
- package/desktop/package-lock.json +1060 -0
- package/desktop/package.json +14 -0
- package/dist/commands/desktop.d.ts +12 -0
- package/dist/commands/desktop.d.ts.map +1 -0
- package/dist/commands/desktop.js +119 -0
- package/dist/commands/desktop.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +1 -3
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/tui.d.ts +8 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +386 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/ui.d.ts +3 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +76 -19
- package/dist/commands/ui.js.map +1 -1
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/base.js +78 -66
- package/dist/generators/base.js.map +1 -1
- package/dist/generators/codex.js +11 -11
- package/dist/generators/copilot.js +17 -17
- package/dist/generators/cursor.js +5 -5
- package/dist/generators/index.js +50 -50
- package/dist/generators/map-generator.js +14 -14
- package/dist/generators/skills-generator.js +28 -28
- package/dist/gui/app_logo.png +0 -0
- package/dist/gui/assets/index-Ct3qq-X4.js +25 -0
- package/dist/gui/assets/index-P_ZrgHXg.css +1 -0
- package/dist/gui/icons.svg +24 -24
- package/dist/gui/index.html +18 -18
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +182 -1
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +78 -0
- package/dist/server.test.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/git.d.ts +16 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +52 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/multi-git.d.ts +2 -0
- package/dist/utils/multi-git.d.ts.map +1 -1
- package/dist/utils/multi-git.js +5 -2
- package/dist/utils/multi-git.js.map +1 -1
- package/dist/utils/update-check.d.ts +3 -1
- package/dist/utils/update-check.d.ts.map +1 -1
- package/dist/utils/update-check.js +23 -6
- package/dist/utils/update-check.js.map +1 -1
- package/dist/utils/workflows.d.ts +11 -0
- package/dist/utils/workflows.d.ts.map +1 -0
- package/dist/utils/workflows.js +156 -0
- package/dist/utils/workflows.js.map +1 -0
- package/dist/utils/workflows.test.d.ts +2 -0
- package/dist/utils/workflows.test.d.ts.map +1 -0
- package/dist/utils/workflows.test.js +86 -0
- package/dist/utils/workflows.test.js.map +1 -0
- package/extension/media/icon.svg +1 -0
- package/extension/package-lock.json +2673 -2811
- package/extension/package.json +108 -70
- package/extension/src/extension.ts +631 -204
- package/extension/tsconfig.json +21 -19
- package/gui/README.md +73 -73
- package/gui/e2e/wizard.spec.ts +346 -327
- package/gui/eslint.config.js +26 -26
- package/gui/index.html +17 -17
- package/gui/package-lock.json +3079 -3118
- package/gui/package.json +36 -36
- package/gui/playwright.config.ts +41 -41
- package/gui/public/app_logo.png +0 -0
- package/gui/public/icons.svg +24 -24
- package/gui/src/App.css +1 -1
- package/gui/src/App.tsx +3407 -2722
- package/gui/src/assets/vite.svg +1 -1
- package/gui/src/features/changes/ChangesViewer.tsx +388 -388
- package/gui/src/features/knowledge/KnowledgeBase.tsx +84 -84
- package/gui/src/features/onboarding/OnboardingWizard.tsx +230 -230
- package/gui/src/features/plan/ImplementationPlan.tsx +32 -32
- package/gui/src/features/services/ServiceConsole.tsx +250 -250
- package/gui/src/features/sessions/SessionHistory.tsx +195 -195
- package/gui/src/features/workspace/WorkspaceList.tsx +666 -666
- package/gui/src/index.css +152 -110
- package/gui/src/main.tsx +94 -10
- package/gui/src/types.ts +62 -62
- package/gui/tsconfig.app.json +25 -25
- package/gui/tsconfig.json +7 -7
- package/gui/tsconfig.node.json +24 -24
- package/gui/vite.config.ts +12 -12
- package/package.json +56 -56
- package/resources/workflows/plan-implement-review.md +8 -0
- package/resources/workflows/research-verify.md +6 -0
- package/resources/workflows/solo-developer.md +3 -0
- package/scripts/simulate-workspaces.ts +55 -55
- package/src/analyzers/detect-apis.ts +290 -290
- package/src/analyzers/detect-deps.ts +315 -315
- package/src/analyzers/detect-existing.ts +74 -74
- package/src/analyzers/detect-ports.ts +110 -110
- package/src/analyzers/index.ts +97 -97
- package/src/analyzers/messaging-analyzer.ts +254 -254
- package/src/analyzers/readme-summarizer.ts +102 -102
- package/src/analyzers/run-analyzer.ts +269 -269
- package/src/analyzers/tech-stack.ts +283 -283
- package/src/commands/add-repo.ts +157 -157
- package/src/commands/commands.test.ts +155 -155
- package/src/commands/commit.ts +131 -131
- package/src/commands/create.ts +207 -207
- package/src/commands/desktop.ts +128 -0
- package/src/commands/diff.ts +125 -125
- package/src/commands/doctor.ts +357 -357
- package/src/commands/handoff.ts +266 -266
- package/src/commands/init.ts +134 -134
- package/src/commands/list.ts +46 -46
- package/src/commands/logs.ts +63 -63
- package/src/commands/mcp.ts +92 -92
- package/src/commands/open.ts +129 -129
- package/src/commands/pack.ts +73 -73
- package/src/commands/refresh.ts +147 -147
- package/src/commands/remove.ts +98 -98
- package/src/commands/start.ts +117 -117
- package/src/commands/status.ts +54 -54
- package/src/commands/stop.ts +55 -55
- package/src/commands/sync.ts +151 -153
- package/src/commands/tui.ts +424 -0
- package/src/commands/ui.ts +111 -47
- package/src/core/config.test.ts +96 -96
- package/src/core/config.ts +115 -115
- package/src/core/graph.ts +344 -344
- package/src/core/packer.test.ts +99 -99
- package/src/core/packer.ts +107 -107
- package/src/core/scanner.test.ts +61 -61
- package/src/core/scanner.ts +91 -91
- package/src/core/workspace.ts +380 -380
- package/src/core/worktree.ts +120 -120
- package/src/generators/antigravity.ts +32 -32
- package/src/generators/base.ts +240 -227
- package/src/generators/claude.ts +34 -34
- package/src/generators/codex.ts +48 -48
- package/src/generators/copilot.ts +56 -56
- package/src/generators/cursor.ts +44 -44
- package/src/generators/index.ts +250 -250
- package/src/generators/map-generator.test.ts +159 -159
- package/src/generators/map-generator.ts +542 -542
- package/src/generators/plan-generator.ts +481 -481
- package/src/generators/skills-generator.ts +259 -259
- package/src/index.ts +426 -382
- package/src/mcp/server.ts +294 -294
- package/src/orchestration/detect.ts +313 -313
- package/src/orchestration/index.ts +7 -7
- package/src/orchestration/runner.ts +283 -283
- package/src/server.test.ts +555 -464
- package/src/server.ts +1308 -1104
- package/src/types.ts +408 -403
- package/src/utils/detect-ai.test.ts +44 -44
- package/src/utils/detect-ai.ts +84 -84
- package/src/utils/detect-editors.test.ts +48 -48
- package/src/utils/detect-editors.ts +57 -57
- package/src/utils/git.test.ts +74 -74
- package/src/utils/git.ts +117 -61
- package/src/utils/local-ai.test.ts +130 -130
- package/src/utils/local-ai.ts +111 -111
- package/src/utils/multi-git.ts +313 -306
- package/src/utils/prompts.ts +209 -209
- package/src/utils/session-finder.ts +483 -483
- package/src/utils/system-scanner.test.ts +89 -89
- package/src/utils/system-scanner.ts +96 -96
- package/src/utils/update-check.ts +309 -275
- package/src/utils/workflows.test.ts +114 -0
- package/src/utils/workflows.ts +178 -0
- package/tsconfig.json +19 -19
- package/vitest.config.ts +14 -14
- package/dist/gui/assets/index-CFWwqFux.js +0 -23
- package/dist/gui/assets/index-Dvc9QMvl.css +0 -2
package/src/index.ts
CHANGED
|
@@ -1,382 +1,426 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @module index
|
|
5
|
-
* NexusFlow CLI entry point.
|
|
6
|
-
*
|
|
7
|
-
* Combines multiple repositories into a workspace with rich AI assistant
|
|
8
|
-
* context files so tools like Claude, Codex, Copilot, and Cursor understand
|
|
9
|
-
* your entire project.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { Command } from 'commander';
|
|
13
|
-
|
|
14
|
-
import { createCommand } from './commands/create.js';
|
|
15
|
-
import { listCommand } from './commands/list.js';
|
|
16
|
-
import { openCommand } from './commands/open.js';
|
|
17
|
-
import { initCommand } from './commands/init.js';
|
|
18
|
-
import { startCommand } from './commands/start.js';
|
|
19
|
-
import { stopCommand } from './commands/stop.js';
|
|
20
|
-
import { logsCommand } from './commands/logs.js';
|
|
21
|
-
import { statusCommand } from './commands/status.js';
|
|
22
|
-
import { uiCommand } from './commands/ui.js';
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
program
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.
|
|
66
|
-
.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
.
|
|
111
|
-
.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
.
|
|
128
|
-
.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
.
|
|
145
|
-
.
|
|
146
|
-
.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
.
|
|
163
|
-
.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
.
|
|
180
|
-
.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
.
|
|
210
|
-
.
|
|
211
|
-
.
|
|
212
|
-
.
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
.
|
|
245
|
-
.
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
.
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
.
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
console.error(error);
|
|
307
|
-
process.exit(1);
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
program
|
|
312
|
-
.command('
|
|
313
|
-
.
|
|
314
|
-
.
|
|
315
|
-
.
|
|
316
|
-
.
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
.
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @module index
|
|
5
|
+
* NexusFlow CLI entry point.
|
|
6
|
+
*
|
|
7
|
+
* Combines multiple repositories into a workspace with rich AI assistant
|
|
8
|
+
* context files so tools like Claude, Codex, Copilot, and Cursor understand
|
|
9
|
+
* your entire project.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
|
|
14
|
+
import { createCommand } from './commands/create.js';
|
|
15
|
+
import { listCommand } from './commands/list.js';
|
|
16
|
+
import { openCommand } from './commands/open.js';
|
|
17
|
+
import { initCommand } from './commands/init.js';
|
|
18
|
+
import { startCommand } from './commands/start.js';
|
|
19
|
+
import { stopCommand } from './commands/stop.js';
|
|
20
|
+
import { logsCommand } from './commands/logs.js';
|
|
21
|
+
import { statusCommand } from './commands/status.js';
|
|
22
|
+
import { uiCommand } from './commands/ui.js';
|
|
23
|
+
import { tuiCommand } from './commands/tui.js';
|
|
24
|
+
import { syncCommand } from './commands/sync.js';
|
|
25
|
+
import { commitCommand } from './commands/commit.js';
|
|
26
|
+
import { diffCommand } from './commands/diff.js';
|
|
27
|
+
import { packCommand } from './commands/pack.js';
|
|
28
|
+
import { removeCommand } from './commands/remove.js';
|
|
29
|
+
import { addRepoCommand } from './commands/add-repo.js';
|
|
30
|
+
import { mcpRunCommand, mcpSetupCommand } from './commands/mcp.js';
|
|
31
|
+
import { handoffCommand } from './commands/handoff.js';
|
|
32
|
+
import { refreshCommand } from './commands/refresh.js';
|
|
33
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
34
|
+
import { desktopCommand } from './commands/desktop.js';
|
|
35
|
+
import { getCurrentVersion, checkForUpdates, printUpdateBanner } from './utils/update-check.js';
|
|
36
|
+
|
|
37
|
+
const program = new Command();
|
|
38
|
+
|
|
39
|
+
program
|
|
40
|
+
.name('nexusflow')
|
|
41
|
+
.description(
|
|
42
|
+
'Combine multiple repos into a workspace with rich AI assistant context',
|
|
43
|
+
)
|
|
44
|
+
.version(getCurrentVersion());
|
|
45
|
+
|
|
46
|
+
program
|
|
47
|
+
.command('create')
|
|
48
|
+
.description(
|
|
49
|
+
'Create a new feature workspace — pick repos, pick AI assistants, generate context',
|
|
50
|
+
)
|
|
51
|
+
.action(async () => {
|
|
52
|
+
try {
|
|
53
|
+
await createCommand();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
56
|
+
console.log('\nCancelled.');
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
console.error(error);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
program
|
|
65
|
+
.command('list')
|
|
66
|
+
.alias('ls')
|
|
67
|
+
.description('List all existing workspaces')
|
|
68
|
+
.action(async () => {
|
|
69
|
+
try {
|
|
70
|
+
await listCommand();
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error(error);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
program
|
|
78
|
+
.command('open')
|
|
79
|
+
.description('Re-open an existing workspace in an editor')
|
|
80
|
+
.action(async () => {
|
|
81
|
+
try {
|
|
82
|
+
await openCommand();
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
85
|
+
console.log('\nCancelled.');
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
console.error(error);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
program
|
|
94
|
+
.command('init')
|
|
95
|
+
.description('Initialize NexusFlow configuration')
|
|
96
|
+
.action(async () => {
|
|
97
|
+
try {
|
|
98
|
+
await initCommand();
|
|
99
|
+
} catch (error) {
|
|
100
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
101
|
+
console.log('\nCancelled.');
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
console.error(error);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
program
|
|
110
|
+
.command('start')
|
|
111
|
+
.description('Start all services in a workspace')
|
|
112
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
113
|
+
.action(async (workspace?: string) => {
|
|
114
|
+
try {
|
|
115
|
+
await startCommand(workspace);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
118
|
+
console.log('\nCancelled.');
|
|
119
|
+
process.exit(0);
|
|
120
|
+
}
|
|
121
|
+
console.error(error);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
program
|
|
127
|
+
.command('stop')
|
|
128
|
+
.description('Stop all running services in a workspace')
|
|
129
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
130
|
+
.action(async (workspace?: string) => {
|
|
131
|
+
try {
|
|
132
|
+
await stopCommand(workspace);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
135
|
+
console.log('\nCancelled.');
|
|
136
|
+
process.exit(0);
|
|
137
|
+
}
|
|
138
|
+
console.error(error);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
program
|
|
144
|
+
.command('logs')
|
|
145
|
+
.description('Show logs from running services')
|
|
146
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
147
|
+
.option('-n, --lines <number>', 'Number of lines per service', '30')
|
|
148
|
+
.action(async (workspace: string | undefined, options: { lines: string }) => {
|
|
149
|
+
try {
|
|
150
|
+
await logsCommand(workspace, parseInt(options.lines, 10));
|
|
151
|
+
} catch (error) {
|
|
152
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
153
|
+
console.log('\nCancelled.');
|
|
154
|
+
process.exit(0);
|
|
155
|
+
}
|
|
156
|
+
console.error(error);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
program
|
|
162
|
+
.command('status')
|
|
163
|
+
.description('Show status of running services')
|
|
164
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
165
|
+
.action(async (workspace?: string) => {
|
|
166
|
+
try {
|
|
167
|
+
await statusCommand(workspace);
|
|
168
|
+
} catch (error) {
|
|
169
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
170
|
+
console.log('\nCancelled.');
|
|
171
|
+
process.exit(0);
|
|
172
|
+
}
|
|
173
|
+
console.error(error);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
program
|
|
179
|
+
.command('ui')
|
|
180
|
+
.description('Open the web GUI dashboard for NexusFlow')
|
|
181
|
+
.option('-p, --port <number>', 'Port to run the dashboard server on', '3000')
|
|
182
|
+
.option('-d, --daemon', 'Run the dashboard server in the background (daemon mode)')
|
|
183
|
+
.option('--server-only', 'Start the dashboard server without opening the browser')
|
|
184
|
+
.action(async (options: { port?: string; daemon?: boolean; serverOnly?: boolean }) => {
|
|
185
|
+
try {
|
|
186
|
+
await uiCommand(options);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
console.error(error);
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
program
|
|
194
|
+
.command('dashboard')
|
|
195
|
+
.alias('dash')
|
|
196
|
+
.description('Instantly open the web GUI dashboard in your default browser')
|
|
197
|
+
.option('-p, --port <number>', 'Port to run the dashboard server on', '3000')
|
|
198
|
+
.action(async (options: { port?: string }) => {
|
|
199
|
+
try {
|
|
200
|
+
await uiCommand({ ...options, daemon: true });
|
|
201
|
+
} catch (error) {
|
|
202
|
+
console.error(error);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
program
|
|
209
|
+
.command('tui')
|
|
210
|
+
.description('Open the interactive terminal GUI (TUI) dashboard')
|
|
211
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
212
|
+
.action(async (workspace?: string) => {
|
|
213
|
+
try {
|
|
214
|
+
await tuiCommand({ workspace });
|
|
215
|
+
} catch (error) {
|
|
216
|
+
console.error(error);
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
program
|
|
222
|
+
.command('sync')
|
|
223
|
+
.description('Sync all repositories in a workspace')
|
|
224
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
225
|
+
.action(async (workspace?: string) => {
|
|
226
|
+
try {
|
|
227
|
+
await syncCommand(workspace);
|
|
228
|
+
} catch (error) {
|
|
229
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
230
|
+
console.log('\nCancelled.');
|
|
231
|
+
process.exit(0);
|
|
232
|
+
}
|
|
233
|
+
console.error(error);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
program
|
|
239
|
+
.command('commit')
|
|
240
|
+
.description('Commit changes across all repositories in a workspace')
|
|
241
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
242
|
+
.requiredOption('-m, --message <msg>', 'Commit message')
|
|
243
|
+
.option('--no-push', 'Stage and commit changes without pushing to remote')
|
|
244
|
+
.option('--dry-run', 'Preview changes without committing')
|
|
245
|
+
.action(async (workspace: string | undefined, options: { message: string; noPush?: boolean; dryRun?: boolean }) => {
|
|
246
|
+
try {
|
|
247
|
+
await commitCommand(options.message, workspace, options);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
250
|
+
console.log('\nCancelled.');
|
|
251
|
+
process.exit(0);
|
|
252
|
+
}
|
|
253
|
+
console.error(error);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
program
|
|
259
|
+
.command('diff')
|
|
260
|
+
.description('Display a unified summary of changes across all repositories')
|
|
261
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
262
|
+
.action(async (workspace?: string) => {
|
|
263
|
+
try {
|
|
264
|
+
await diffCommand(workspace);
|
|
265
|
+
} catch (error) {
|
|
266
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
267
|
+
console.log('\nCancelled.');
|
|
268
|
+
process.exit(0);
|
|
269
|
+
}
|
|
270
|
+
console.error(error);
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
program
|
|
276
|
+
.command('pack')
|
|
277
|
+
.description('Pack the workspace codebase into a single token-efficient XML file for AI consumption')
|
|
278
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
279
|
+
.option('--no-compress', 'Do not compress files (strip comments, empty lines)')
|
|
280
|
+
.action(async (workspace: string | undefined, options: { compress?: boolean }) => {
|
|
281
|
+
try {
|
|
282
|
+
await packCommand(workspace, options);
|
|
283
|
+
} catch (error) {
|
|
284
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
285
|
+
console.log('\nCancelled.');
|
|
286
|
+
process.exit(0);
|
|
287
|
+
}
|
|
288
|
+
console.error(error);
|
|
289
|
+
process.exit(1);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
program
|
|
294
|
+
.command('remove')
|
|
295
|
+
.alias('rm')
|
|
296
|
+
.description('Delete a workspace and cleanly prune/remove its git worktrees')
|
|
297
|
+
.argument('[workspace]', 'Workspace name or path')
|
|
298
|
+
.action(async (workspace?: string) => {
|
|
299
|
+
try {
|
|
300
|
+
await removeCommand(workspace);
|
|
301
|
+
} catch (error) {
|
|
302
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
303
|
+
console.log('\nCancelled.');
|
|
304
|
+
process.exit(0);
|
|
305
|
+
}
|
|
306
|
+
console.error(error);
|
|
307
|
+
process.exit(1);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
program
|
|
312
|
+
.command('add-repo')
|
|
313
|
+
.alias('add')
|
|
314
|
+
.description('Add a repository to an existing workspace and update configurations')
|
|
315
|
+
.argument('[repo-path]', 'Path to the repository to add')
|
|
316
|
+
.argument('[workspace]', 'Workspace name or path')
|
|
317
|
+
.action(async (repoPath?: string, workspace?: string) => {
|
|
318
|
+
try {
|
|
319
|
+
await addRepoCommand(repoPath, workspace);
|
|
320
|
+
} catch (error) {
|
|
321
|
+
if (error instanceof Error && error.message.includes('User force closed')) {
|
|
322
|
+
console.log('\nCancelled.');
|
|
323
|
+
process.exit(0);
|
|
324
|
+
}
|
|
325
|
+
console.error(error);
|
|
326
|
+
process.exit(1);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
program
|
|
331
|
+
.command('handoff')
|
|
332
|
+
.description('Generate a compact handoff bundle (nexusflow-handoff.md) for session resumption')
|
|
333
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
334
|
+
.action(async (workspace?: string) => {
|
|
335
|
+
try {
|
|
336
|
+
await handoffCommand(workspace);
|
|
337
|
+
} catch (error) {
|
|
338
|
+
console.error(error);
|
|
339
|
+
process.exit(1);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
program
|
|
344
|
+
.command('refresh')
|
|
345
|
+
.description('Refresh workspace context, maps, plans and handoff files')
|
|
346
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
347
|
+
.option('-r, --repo <repo>', 'Only refresh the map for a specific repository')
|
|
348
|
+
.action(async (workspace: string | undefined, options: { repo?: string }) => {
|
|
349
|
+
try {
|
|
350
|
+
await refreshCommand(options, workspace);
|
|
351
|
+
} catch (error) {
|
|
352
|
+
console.error(error);
|
|
353
|
+
process.exit(1);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
program
|
|
358
|
+
.command('doctor')
|
|
359
|
+
.description('Run diagnostics to verify workspace health and check for local loop issues')
|
|
360
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
361
|
+
.action(async (workspace?: string) => {
|
|
362
|
+
try {
|
|
363
|
+
await doctorCommand(workspace);
|
|
364
|
+
} catch (error) {
|
|
365
|
+
console.error(error);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
program
|
|
371
|
+
.command('desktop')
|
|
372
|
+
.description('Launch the NexusFlow desktop application')
|
|
373
|
+
.action(async () => {
|
|
374
|
+
try {
|
|
375
|
+
await desktopCommand();
|
|
376
|
+
} catch (error) {
|
|
377
|
+
console.error(error);
|
|
378
|
+
process.exit(1);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
const mcp = program.command('mcp').description('Manage the NexusFlow MCP Server for AI assistants');
|
|
383
|
+
|
|
384
|
+
mcp
|
|
385
|
+
.command('run')
|
|
386
|
+
.description('Start the NexusFlow MCP Server (typically called automatically by AI assistants)')
|
|
387
|
+
.argument('[workspace]', 'Path to workspace (auto-detects from CWD)')
|
|
388
|
+
.action(async (workspace?: string) => {
|
|
389
|
+
try {
|
|
390
|
+
await mcpRunCommand(workspace);
|
|
391
|
+
} catch (error) {
|
|
392
|
+
console.error(error);
|
|
393
|
+
process.exit(1);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
mcp
|
|
398
|
+
.command('setup')
|
|
399
|
+
.description('Automatically configure your AI environments (Claude Desktop, Cursor, VS Code) to use the NexusFlow MCP Server')
|
|
400
|
+
.action(async () => {
|
|
401
|
+
try {
|
|
402
|
+
await mcpSetupCommand();
|
|
403
|
+
} catch (error) {
|
|
404
|
+
console.error(error);
|
|
405
|
+
process.exit(1);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
program.hook('postAction', async (thisCommand, actionCommand) => {
|
|
410
|
+
// Skip update check for MCP run to prevent contaminating stdout stream
|
|
411
|
+
if (actionCommand.name() === 'run' && actionCommand.parent?.name() === 'mcp') {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
try {
|
|
416
|
+
const status = await checkForUpdates();
|
|
417
|
+
if (status) {
|
|
418
|
+
printUpdateBanner(status);
|
|
419
|
+
}
|
|
420
|
+
} catch {
|
|
421
|
+
// Silently ignore to prevent crashing CLI
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
program.parse();
|
|
426
|
+
|