moflo 4.10.22 → 4.10.24
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/.claude/guidance/shipped/moflo-skills-reference.md +1 -1
- package/.claude/helpers/gate.cjs +2 -2
- package/.claude/skills/distill/SKILL.md +10 -0
- package/README.md +1 -1
- package/bin/gate.cjs +2 -2
- package/dist/src/cli/commands/agent.js +14 -14
- package/dist/src/cli/commands/analyze.js +52 -52
- package/dist/src/cli/commands/benchmark.js +14 -14
- package/dist/src/cli/commands/claims.js +15 -15
- package/dist/src/cli/commands/completions.js +40 -40
- package/dist/src/cli/commands/config.js +8 -8
- package/dist/src/cli/commands/daemon.js +24 -24
- package/dist/src/cli/commands/deployment.js +15 -15
- package/dist/src/cli/commands/doctor-checks-config.js +6 -6
- package/dist/src/cli/commands/doctor.js +10 -10
- package/dist/src/cli/commands/embeddings.js +49 -49
- package/dist/src/cli/commands/guidance.js +22 -22
- package/dist/src/cli/commands/hive-mind.js +21 -21
- package/dist/src/cli/commands/hooks.js +95 -95
- package/dist/src/cli/commands/init.js +17 -17
- package/dist/src/cli/commands/issues.js +6 -6
- package/dist/src/cli/commands/mcp.js +10 -10
- package/dist/src/cli/commands/memory.js +56 -47
- package/dist/src/cli/commands/migrate.js +5 -5
- package/dist/src/cli/commands/neural.js +31 -31
- package/dist/src/cli/commands/performance.js +13 -13
- package/dist/src/cli/commands/plugins.js +26 -26
- package/dist/src/cli/commands/process.js +32 -32
- package/dist/src/cli/commands/progress.js +5 -5
- package/dist/src/cli/commands/providers.js +13 -13
- package/dist/src/cli/commands/route.js +26 -26
- package/dist/src/cli/commands/security.js +19 -19
- package/dist/src/cli/commands/session.js +13 -13
- package/dist/src/cli/commands/start.js +11 -11
- package/dist/src/cli/commands/status.js +8 -8
- package/dist/src/cli/commands/swarm.js +7 -7
- package/dist/src/cli/commands/task.js +9 -9
- package/dist/src/cli/commands/transfer-store.js +16 -16
- package/dist/src/cli/commands/update.js +2 -2
- package/dist/src/cli/hooks/statusline/index.js +3 -3
- package/dist/src/cli/init/executor.js +7 -6
- package/dist/src/cli/init/helpers-generator.js +6 -6
- package/dist/src/cli/mcp-tools/hooks-tools.js +1 -1
- package/dist/src/cli/memory/auto-memory-bridge.js +1 -1
- package/dist/src/cli/memory/memory-initializer.js +1 -1
- package/dist/src/cli/plugins/tests/demo-plugin-store.js +6 -6
- package/dist/src/cli/version.js +1 -1
- package/package.json +2 -2
|
@@ -78,10 +78,10 @@ const daemonCommand = {
|
|
|
78
78
|
},
|
|
79
79
|
],
|
|
80
80
|
examples: [
|
|
81
|
-
{ command: '
|
|
82
|
-
{ command: '
|
|
83
|
-
{ command: '
|
|
84
|
-
{ command: '
|
|
81
|
+
{ command: 'flo process daemon --action start', description: 'Start the daemon' },
|
|
82
|
+
{ command: 'flo process daemon --action stop', description: 'Stop the daemon' },
|
|
83
|
+
{ command: 'flo process daemon --action restart --port 3850', description: 'Restart on different port' },
|
|
84
|
+
{ command: 'flo process daemon --action status', description: 'Check daemon status' },
|
|
85
85
|
],
|
|
86
86
|
action: async (ctx) => {
|
|
87
87
|
const action = ctx.flags?.action || 'status';
|
|
@@ -107,7 +107,7 @@ const daemonCommand = {
|
|
|
107
107
|
console.log(` ⏱️ Started: ${existingDaemon.startedAt}`);
|
|
108
108
|
break;
|
|
109
109
|
}
|
|
110
|
-
console.log('\n🚀 Starting
|
|
110
|
+
console.log('\n🚀 Starting moflo daemon...\n');
|
|
111
111
|
const newPid = process.pid; // Use actual process PID
|
|
112
112
|
daemonState.status = 'running';
|
|
113
113
|
daemonState.pid = newPid;
|
|
@@ -133,7 +133,7 @@ const daemonCommand = {
|
|
|
133
133
|
console.log('\n⚠️ No daemon running\n');
|
|
134
134
|
break;
|
|
135
135
|
}
|
|
136
|
-
console.log('\n🛑 Stopping
|
|
136
|
+
console.log('\n🛑 Stopping moflo daemon...\n');
|
|
137
137
|
console.log(` 📍 Stopping PID ${existingDaemon.pid}...`);
|
|
138
138
|
// Remove PID file
|
|
139
139
|
removePidFile(pidFile);
|
|
@@ -144,7 +144,7 @@ const daemonCommand = {
|
|
|
144
144
|
console.log(' 🧹 Resources cleaned up');
|
|
145
145
|
break;
|
|
146
146
|
case 'restart':
|
|
147
|
-
console.log('\n🔄 Restarting
|
|
147
|
+
console.log('\n🔄 Restarting moflo daemon...\n');
|
|
148
148
|
if (existingDaemon) {
|
|
149
149
|
console.log(` 🛑 Stopping PID ${existingDaemon.pid}...`);
|
|
150
150
|
removePidFile(pidFile);
|
|
@@ -162,7 +162,7 @@ const daemonCommand = {
|
|
|
162
162
|
case 'status':
|
|
163
163
|
console.log('\n📊 Daemon Status\n');
|
|
164
164
|
console.log(' ┌─────────────────────────────────────────┐');
|
|
165
|
-
console.log(' │
|
|
165
|
+
console.log(' │ moflo daemon' + ' '.repeat(28) + '│');
|
|
166
166
|
console.log(' ├─────────────────────────────────────────┤');
|
|
167
167
|
if (existingDaemon) {
|
|
168
168
|
const uptime = Math.floor((Date.now() - new Date(existingDaemon.startedAt).getTime()) / 1000);
|
|
@@ -180,7 +180,7 @@ const daemonCommand = {
|
|
|
180
180
|
}
|
|
181
181
|
console.log(' └─────────────────────────────────────────┘');
|
|
182
182
|
if (!existingDaemon) {
|
|
183
|
-
console.log('\n To start:
|
|
183
|
+
console.log('\n To start: flo process daemon --action start');
|
|
184
184
|
}
|
|
185
185
|
break;
|
|
186
186
|
}
|
|
@@ -227,10 +227,10 @@ const monitorCommand = {
|
|
|
227
227
|
},
|
|
228
228
|
],
|
|
229
229
|
examples: [
|
|
230
|
-
{ command: '
|
|
231
|
-
{ command: '
|
|
232
|
-
{ command: '
|
|
233
|
-
{ command: '
|
|
230
|
+
{ command: 'flo process monitor', description: 'Show process dashboard' },
|
|
231
|
+
{ command: 'flo process monitor --watch --interval 5', description: 'Watch mode' },
|
|
232
|
+
{ command: 'flo process monitor --components agents,memory,tasks', description: 'Monitor specific components' },
|
|
233
|
+
{ command: 'flo process monitor --format json', description: 'JSON output' },
|
|
234
234
|
],
|
|
235
235
|
action: async (ctx) => {
|
|
236
236
|
const interval = ctx.flags?.interval || 2;
|
|
@@ -369,10 +369,10 @@ const workersCommand = {
|
|
|
369
369
|
},
|
|
370
370
|
],
|
|
371
371
|
examples: [
|
|
372
|
-
{ command: '
|
|
373
|
-
{ command: '
|
|
374
|
-
{ command: '
|
|
375
|
-
{ command: '
|
|
372
|
+
{ command: 'flo process workers --action list', description: 'List all workers' },
|
|
373
|
+
{ command: 'flo process workers --action spawn --type task --count 3', description: 'Spawn task workers' },
|
|
374
|
+
{ command: 'flo process workers --action kill --id worker-123', description: 'Kill specific worker' },
|
|
375
|
+
{ command: 'flo process workers --action scale --type memory --count 5', description: 'Scale memory workers' },
|
|
376
376
|
],
|
|
377
377
|
action: async (ctx) => {
|
|
378
378
|
const action = ctx.flags?.action || 'list';
|
|
@@ -470,9 +470,9 @@ const signalsCommand = {
|
|
|
470
470
|
},
|
|
471
471
|
],
|
|
472
472
|
examples: [
|
|
473
|
-
{ command: '
|
|
474
|
-
{ command: '
|
|
475
|
-
{ command: '
|
|
473
|
+
{ command: 'flo process signals --target daemon --signal graceful-shutdown', description: 'Graceful shutdown' },
|
|
474
|
+
{ command: 'flo process signals --target workers --signal pause', description: 'Pause workers' },
|
|
475
|
+
{ command: 'flo process signals --target all --signal reload-config', description: 'Reload all configs' },
|
|
476
476
|
],
|
|
477
477
|
action: async (ctx) => {
|
|
478
478
|
const target = ctx.flags?.target;
|
|
@@ -543,10 +543,10 @@ const logsCommand = {
|
|
|
543
543
|
},
|
|
544
544
|
],
|
|
545
545
|
examples: [
|
|
546
|
-
{ command: '
|
|
547
|
-
{ command: '
|
|
548
|
-
{ command: '
|
|
549
|
-
{ command: '
|
|
546
|
+
{ command: 'flo process logs', description: 'Show recent logs' },
|
|
547
|
+
{ command: 'flo process logs --source daemon --tail 100', description: 'Daemon logs' },
|
|
548
|
+
{ command: 'flo process logs --follow --level error', description: 'Follow error logs' },
|
|
549
|
+
{ command: 'flo process logs --since 1h --grep "error"', description: 'Search logs' },
|
|
550
550
|
],
|
|
551
551
|
action: async (ctx) => {
|
|
552
552
|
const source = ctx.flags?.source || 'all';
|
|
@@ -615,10 +615,10 @@ export const processCommand = {
|
|
|
615
615
|
},
|
|
616
616
|
],
|
|
617
617
|
examples: [
|
|
618
|
-
{ command: '
|
|
619
|
-
{ command: '
|
|
620
|
-
{ command: '
|
|
621
|
-
{ command: '
|
|
618
|
+
{ command: 'flo process daemon --action start', description: 'Start daemon' },
|
|
619
|
+
{ command: 'flo process monitor --watch', description: 'Watch processes' },
|
|
620
|
+
{ command: 'flo process workers --action list', description: 'List workers' },
|
|
621
|
+
{ command: 'flo process logs --follow', description: 'Follow logs' },
|
|
622
622
|
],
|
|
623
623
|
action: async (_ctx) => {
|
|
624
624
|
// Show help if no subcommand
|
|
@@ -631,10 +631,10 @@ export const processCommand = {
|
|
|
631
631
|
console.log(' signals - Send signals to processes');
|
|
632
632
|
console.log(' logs - View and manage process logs');
|
|
633
633
|
console.log('\nExamples:');
|
|
634
|
-
console.log('
|
|
635
|
-
console.log('
|
|
636
|
-
console.log('
|
|
637
|
-
console.log('
|
|
634
|
+
console.log(' flo process daemon --action start');
|
|
635
|
+
console.log(' flo process monitor --watch');
|
|
636
|
+
console.log(' flo process workers --action spawn --type task --count 3');
|
|
637
|
+
console.log(' flo process logs --follow --level error');
|
|
638
638
|
return { success: true, data: { help: true } };
|
|
639
639
|
},
|
|
640
640
|
};
|
|
@@ -223,23 +223,23 @@ export const progressCommand = {
|
|
|
223
223
|
],
|
|
224
224
|
examples: [
|
|
225
225
|
{
|
|
226
|
-
command: '
|
|
226
|
+
command: 'flo progress',
|
|
227
227
|
description: 'Check current progress',
|
|
228
228
|
},
|
|
229
229
|
{
|
|
230
|
-
command: '
|
|
230
|
+
command: 'flo progress --detailed',
|
|
231
231
|
description: 'Show detailed breakdown',
|
|
232
232
|
},
|
|
233
233
|
{
|
|
234
|
-
command: '
|
|
234
|
+
command: 'flo progress sync',
|
|
235
235
|
description: 'Sync and persist progress',
|
|
236
236
|
},
|
|
237
237
|
{
|
|
238
|
-
command: '
|
|
238
|
+
command: 'flo progress watch',
|
|
239
239
|
description: 'Watch for changes',
|
|
240
240
|
},
|
|
241
241
|
{
|
|
242
|
-
command: '
|
|
242
|
+
command: 'flo progress --json',
|
|
243
243
|
description: 'Output as JSON',
|
|
244
244
|
},
|
|
245
245
|
],
|
|
@@ -14,8 +14,8 @@ const listCommand = {
|
|
|
14
14
|
{ name: 'active', short: 'a', type: 'boolean', description: 'Show only active providers' },
|
|
15
15
|
],
|
|
16
16
|
examples: [
|
|
17
|
-
{ command: '
|
|
18
|
-
{ command: '
|
|
17
|
+
{ command: 'flo providers list', description: 'List all providers' },
|
|
18
|
+
{ command: 'flo providers list -t embedding', description: 'List embedding providers' },
|
|
19
19
|
],
|
|
20
20
|
action: async (ctx) => {
|
|
21
21
|
const type = ctx.flags.type || 'all';
|
|
@@ -52,8 +52,8 @@ const configureCommand = {
|
|
|
52
52
|
{ name: 'endpoint', short: 'e', type: 'string', description: 'Custom endpoint URL' },
|
|
53
53
|
],
|
|
54
54
|
examples: [
|
|
55
|
-
{ command: '
|
|
56
|
-
{ command: '
|
|
55
|
+
{ command: 'flo providers configure -p openai -k sk-...', description: 'Set OpenAI key' },
|
|
56
|
+
{ command: 'flo providers configure -p anthropic -m claude-3.5-sonnet', description: 'Set default model' },
|
|
57
57
|
],
|
|
58
58
|
action: async (ctx) => {
|
|
59
59
|
const provider = ctx.flags.provider;
|
|
@@ -89,8 +89,8 @@ const testCommand = {
|
|
|
89
89
|
{ name: 'all', short: 'a', type: 'boolean', description: 'Test all configured providers' },
|
|
90
90
|
],
|
|
91
91
|
examples: [
|
|
92
|
-
{ command: '
|
|
93
|
-
{ command: '
|
|
92
|
+
{ command: 'flo providers test -p openai', description: 'Test OpenAI connection' },
|
|
93
|
+
{ command: 'flo providers test --all', description: 'Test all providers' },
|
|
94
94
|
],
|
|
95
95
|
action: async (ctx) => {
|
|
96
96
|
const provider = ctx.flags.provider;
|
|
@@ -121,8 +121,8 @@ const modelsCommand = {
|
|
|
121
121
|
{ name: 'capability', short: 'c', type: 'string', description: 'Filter by capability: chat, completion, embedding' },
|
|
122
122
|
],
|
|
123
123
|
examples: [
|
|
124
|
-
{ command: '
|
|
125
|
-
{ command: '
|
|
124
|
+
{ command: 'flo providers models', description: 'List all models' },
|
|
125
|
+
{ command: 'flo providers models -p anthropic', description: 'List Anthropic models' },
|
|
126
126
|
],
|
|
127
127
|
action: async (ctx) => {
|
|
128
128
|
output.writeln();
|
|
@@ -158,8 +158,8 @@ const usageCommand = {
|
|
|
158
158
|
{ name: 'timeframe', short: 't', type: 'string', description: 'Timeframe: 24h, 7d, 30d', default: '7d' },
|
|
159
159
|
],
|
|
160
160
|
examples: [
|
|
161
|
-
{ command: '
|
|
162
|
-
{ command: '
|
|
161
|
+
{ command: 'flo providers usage', description: 'View all usage' },
|
|
162
|
+
{ command: 'flo providers usage -t 30d', description: 'View 30-day usage' },
|
|
163
163
|
],
|
|
164
164
|
action: async (ctx) => {
|
|
165
165
|
const timeframe = ctx.flags.timeframe || '7d';
|
|
@@ -198,9 +198,9 @@ export const providersCommand = {
|
|
|
198
198
|
description: 'Manage AI providers, models, and configurations',
|
|
199
199
|
subcommands: [listCommand, configureCommand, testCommand, modelsCommand, usageCommand],
|
|
200
200
|
examples: [
|
|
201
|
-
{ command: '
|
|
202
|
-
{ command: '
|
|
203
|
-
{ command: '
|
|
201
|
+
{ command: 'flo providers list', description: 'List all providers' },
|
|
202
|
+
{ command: 'flo providers configure -p openai', description: 'Configure OpenAI' },
|
|
203
|
+
{ command: 'flo providers test --all', description: 'Test all providers' },
|
|
204
204
|
],
|
|
205
205
|
action: async () => {
|
|
206
206
|
output.writeln();
|
|
@@ -86,9 +86,9 @@ const routeTaskCommand = {
|
|
|
86
86
|
},
|
|
87
87
|
],
|
|
88
88
|
examples: [
|
|
89
|
-
{ command: '
|
|
90
|
-
{ command: '
|
|
91
|
-
{ command: '
|
|
89
|
+
{ command: 'flo route task "implement authentication"', description: 'Route task to best agent' },
|
|
90
|
+
{ command: 'flo route task "write unit tests" --q-learning', description: 'Use Q-Learning routing' },
|
|
91
|
+
{ command: 'flo route task "review code" --agent reviewer', description: 'Force specific agent' },
|
|
92
92
|
],
|
|
93
93
|
action: async (ctx) => {
|
|
94
94
|
const taskDescription = ctx.args[0];
|
|
@@ -97,7 +97,7 @@ const routeTaskCommand = {
|
|
|
97
97
|
const jsonOutput = ctx.flags.json;
|
|
98
98
|
if (!taskDescription) {
|
|
99
99
|
output.printError('Task description is required');
|
|
100
|
-
output.writeln(output.dim('Usage:
|
|
100
|
+
output.writeln(output.dim('Usage: flo route task "task description"'));
|
|
101
101
|
return { success: false, exitCode: 1 };
|
|
102
102
|
}
|
|
103
103
|
const spinner = output.createSpinner({ text: 'Analyzing task...', spinner: 'dots' });
|
|
@@ -220,8 +220,8 @@ const listAgentsCommand = {
|
|
|
220
220
|
},
|
|
221
221
|
],
|
|
222
222
|
examples: [
|
|
223
|
-
{ command: '
|
|
224
|
-
{ command: '
|
|
223
|
+
{ command: 'flo route list-agents', description: 'List all agents' },
|
|
224
|
+
{ command: 'flo route agents --json', description: 'List agents as JSON' },
|
|
225
225
|
],
|
|
226
226
|
action: async (ctx) => {
|
|
227
227
|
const jsonOutput = ctx.flags.json;
|
|
@@ -275,7 +275,7 @@ const statsCommand = {
|
|
|
275
275
|
},
|
|
276
276
|
],
|
|
277
277
|
examples: [
|
|
278
|
-
{ command: '
|
|
278
|
+
{ command: 'flo route stats', description: 'Show routing statistics' },
|
|
279
279
|
],
|
|
280
280
|
action: async (ctx) => {
|
|
281
281
|
const jsonOutput = ctx.flags.json;
|
|
@@ -361,8 +361,8 @@ const feedbackCommand = {
|
|
|
361
361
|
},
|
|
362
362
|
],
|
|
363
363
|
examples: [
|
|
364
|
-
{ command: '
|
|
365
|
-
{ command: '
|
|
364
|
+
{ command: 'flo route feedback -t "implement auth" -a coder -r 0.9', description: 'Positive feedback' },
|
|
365
|
+
{ command: 'flo route feedback -t "write tests" -a tester -r -0.5', description: 'Negative feedback' },
|
|
366
366
|
],
|
|
367
367
|
action: async (ctx) => {
|
|
368
368
|
const taskDescription = ctx.flags.task;
|
|
@@ -418,8 +418,8 @@ const resetCommand = {
|
|
|
418
418
|
},
|
|
419
419
|
],
|
|
420
420
|
examples: [
|
|
421
|
-
{ command: '
|
|
422
|
-
{ command: '
|
|
421
|
+
{ command: 'flo route reset', description: 'Reset router state' },
|
|
422
|
+
{ command: 'flo route reset --force', description: 'Force reset' },
|
|
423
423
|
],
|
|
424
424
|
action: async (ctx) => {
|
|
425
425
|
const force = ctx.flags.force;
|
|
@@ -455,8 +455,8 @@ const exportCommand = {
|
|
|
455
455
|
},
|
|
456
456
|
],
|
|
457
457
|
examples: [
|
|
458
|
-
{ command: '
|
|
459
|
-
{ command: '
|
|
458
|
+
{ command: 'flo route export', description: 'Export Q-table to stdout' },
|
|
459
|
+
{ command: 'flo route export -f qtable.json', description: 'Export to file' },
|
|
460
460
|
],
|
|
461
461
|
action: async (ctx) => {
|
|
462
462
|
const filePath = ctx.flags.file;
|
|
@@ -492,7 +492,7 @@ const importCommand = {
|
|
|
492
492
|
},
|
|
493
493
|
],
|
|
494
494
|
examples: [
|
|
495
|
-
{ command: '
|
|
495
|
+
{ command: 'flo route import -f qtable.json', description: 'Import Q-table from file' },
|
|
496
496
|
],
|
|
497
497
|
action: async (ctx) => {
|
|
498
498
|
const filePath = ctx.flags.file;
|
|
@@ -560,10 +560,10 @@ const coverageRouteCommand = {
|
|
|
560
560
|
},
|
|
561
561
|
],
|
|
562
562
|
examples: [
|
|
563
|
-
{ command: '
|
|
564
|
-
{ command: '
|
|
565
|
-
{ command: '
|
|
566
|
-
{ command: '
|
|
563
|
+
{ command: 'flo route coverage', description: 'Analyze coverage and suggest routing' },
|
|
564
|
+
{ command: 'flo route coverage --suggest', description: 'Get improvement suggestions' },
|
|
565
|
+
{ command: 'flo route coverage --gaps', description: 'List coverage gaps by agent' },
|
|
566
|
+
{ command: 'flo route coverage -p src/auth -t 90', description: 'Analyze specific path with threshold' },
|
|
567
567
|
],
|
|
568
568
|
action: async (ctx) => {
|
|
569
569
|
const path = ctx.flags.path || '';
|
|
@@ -757,11 +757,11 @@ export const routeCommand = {
|
|
|
757
757
|
},
|
|
758
758
|
],
|
|
759
759
|
examples: [
|
|
760
|
-
{ command: '
|
|
761
|
-
{ command: '
|
|
762
|
-
{ command: '
|
|
763
|
-
{ command: '
|
|
764
|
-
{ command: '
|
|
760
|
+
{ command: 'flo route "implement feature"', description: 'Route task to best agent' },
|
|
761
|
+
{ command: 'flo route "write tests" --q-learning', description: 'Use Q-Learning routing' },
|
|
762
|
+
{ command: 'flo route --agent coder "fix bug"', description: 'Force specific agent' },
|
|
763
|
+
{ command: 'flo route list-agents', description: 'List available agents' },
|
|
764
|
+
{ command: 'flo route stats', description: 'Show routing statistics' },
|
|
765
765
|
],
|
|
766
766
|
action: async (ctx) => {
|
|
767
767
|
// If task description provided directly, route it
|
|
@@ -776,8 +776,8 @@ export const routeCommand = {
|
|
|
776
776
|
output.writeln(output.bold('Q-Learning Agent Router'));
|
|
777
777
|
output.writeln(output.dim('Intelligent task-to-agent routing using reinforcement learning'));
|
|
778
778
|
output.writeln();
|
|
779
|
-
output.writeln('Usage:
|
|
780
|
-
output.writeln('
|
|
779
|
+
output.writeln('Usage: flo route <task> [options]');
|
|
780
|
+
output.writeln(' flo route <subcommand>');
|
|
781
781
|
output.writeln();
|
|
782
782
|
output.writeln(output.bold('Subcommands:'));
|
|
783
783
|
output.printList([
|
|
@@ -806,7 +806,7 @@ export const routeCommand = {
|
|
|
806
806
|
`Backend: ${movectorAvailable ? 'native' : 'JavaScript fallback'}`,
|
|
807
807
|
]);
|
|
808
808
|
output.writeln();
|
|
809
|
-
output.writeln(output.dim('Run "
|
|
809
|
+
output.writeln(output.dim('Run "flo route <subcommand> --help" for more info'));
|
|
810
810
|
return { success: true };
|
|
811
811
|
},
|
|
812
812
|
};
|
|
@@ -17,8 +17,8 @@ const scanCommand = {
|
|
|
17
17
|
{ name: 'fix', short: 'f', type: 'boolean', description: 'Auto-fix vulnerabilities where possible' },
|
|
18
18
|
],
|
|
19
19
|
examples: [
|
|
20
|
-
{ command: '
|
|
21
|
-
{ command: '
|
|
20
|
+
{ command: 'flo security scan -t ./src', description: 'Scan source directory' },
|
|
21
|
+
{ command: 'flo security scan --depth deep --fix', description: 'Deep scan with auto-fix' },
|
|
22
22
|
],
|
|
23
23
|
action: async (ctx) => {
|
|
24
24
|
const target = ctx.flags.target || '.';
|
|
@@ -244,8 +244,8 @@ const cveCommand = {
|
|
|
244
244
|
{ name: 'severity', short: 's', type: 'string', description: 'Filter by severity: critical, high, medium, low' },
|
|
245
245
|
],
|
|
246
246
|
examples: [
|
|
247
|
-
{ command: '
|
|
248
|
-
{ command: '
|
|
247
|
+
{ command: 'flo security cve --list', description: 'List all CVEs' },
|
|
248
|
+
{ command: 'flo security cve -c CVE-2024-1234', description: 'Check specific CVE' },
|
|
249
249
|
],
|
|
250
250
|
action: async (ctx) => {
|
|
251
251
|
const checkCve = ctx.flags.check;
|
|
@@ -269,7 +269,7 @@ const cveCommand = {
|
|
|
269
269
|
}
|
|
270
270
|
else {
|
|
271
271
|
output.writeln(output.warning('⚠ No real CVE database configured. Showing example data.'));
|
|
272
|
-
output.writeln(output.dim('Run "npm audit" or "
|
|
272
|
+
output.writeln(output.dim('Run "npm audit" or "flo security scan" for real vulnerability detection.'));
|
|
273
273
|
output.writeln();
|
|
274
274
|
output.printTable({
|
|
275
275
|
columns: [
|
|
@@ -298,8 +298,8 @@ const threatsCommand = {
|
|
|
298
298
|
{ name: 'export', short: 'e', type: 'string', description: 'Export format: json, md, html' },
|
|
299
299
|
],
|
|
300
300
|
examples: [
|
|
301
|
-
{ command: '
|
|
302
|
-
{ command: '
|
|
301
|
+
{ command: 'flo security threats --model stride', description: 'Run STRIDE analysis' },
|
|
302
|
+
{ command: 'flo security threats -e md', description: 'Export as markdown' },
|
|
303
303
|
],
|
|
304
304
|
action: async (ctx) => {
|
|
305
305
|
const model = ctx.flags.model || 'stride';
|
|
@@ -335,8 +335,8 @@ const auditCommand = {
|
|
|
335
335
|
{ name: 'filter', short: 'f', type: 'string', description: 'Filter by event type' },
|
|
336
336
|
],
|
|
337
337
|
examples: [
|
|
338
|
-
{ command: '
|
|
339
|
-
{ command: '
|
|
338
|
+
{ command: 'flo security audit --action list', description: 'List audit logs' },
|
|
339
|
+
{ command: 'flo security audit -a export', description: 'Export audit trail' },
|
|
340
340
|
],
|
|
341
341
|
action: async (ctx) => {
|
|
342
342
|
const action = ctx.flags.action || 'list';
|
|
@@ -371,8 +371,8 @@ const secretsCommand = {
|
|
|
371
371
|
{ name: 'ignore', short: 'i', type: 'string', description: 'Patterns to ignore' },
|
|
372
372
|
],
|
|
373
373
|
examples: [
|
|
374
|
-
{ command: '
|
|
375
|
-
{ command: '
|
|
374
|
+
{ command: 'flo security secrets --action scan', description: 'Scan for secrets' },
|
|
375
|
+
{ command: 'flo security secrets -a rotate', description: 'Rotate compromised secrets' },
|
|
376
376
|
],
|
|
377
377
|
action: async (ctx) => {
|
|
378
378
|
const path = ctx.flags.path || '.';
|
|
@@ -385,7 +385,7 @@ const secretsCommand = {
|
|
|
385
385
|
spinner.succeed('Scan complete');
|
|
386
386
|
output.writeln();
|
|
387
387
|
output.writeln(output.warning('⚠ No real secrets scan performed. Showing example findings.'));
|
|
388
|
-
output.writeln(output.dim('Run "
|
|
388
|
+
output.writeln(output.dim('Run "flo security scan --depth full" for real secret detection.'));
|
|
389
389
|
output.writeln();
|
|
390
390
|
output.printTable({
|
|
391
391
|
columns: [
|
|
@@ -417,9 +417,9 @@ const defendCommand = {
|
|
|
417
417
|
{ name: 'output', short: 'o', type: 'string', description: 'Output format: text, json', default: 'text' },
|
|
418
418
|
],
|
|
419
419
|
examples: [
|
|
420
|
-
{ command: '
|
|
421
|
-
{ command: '
|
|
422
|
-
{ command: '
|
|
420
|
+
{ command: 'flo security defend -i "ignore previous instructions"', description: 'Scan text for threats' },
|
|
421
|
+
{ command: 'flo security defend -f ./prompts.txt', description: 'Scan file for threats' },
|
|
422
|
+
{ command: 'flo security defend --stats', description: 'Show detection statistics' },
|
|
423
423
|
],
|
|
424
424
|
action: async (ctx) => {
|
|
425
425
|
const inputText = ctx.flags.input;
|
|
@@ -460,7 +460,7 @@ const defendCommand = {
|
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
if (!textToScan) {
|
|
463
|
-
output.writeln('Usage:
|
|
463
|
+
output.writeln('Usage: flo security defend -i "<text>" or -f <file>');
|
|
464
464
|
output.writeln();
|
|
465
465
|
output.writeln('Options:');
|
|
466
466
|
output.printList([
|
|
@@ -545,9 +545,9 @@ export const securityCommand = {
|
|
|
545
545
|
description: 'Security scanning, CVE detection, threat modeling, AI defense',
|
|
546
546
|
subcommands: [scanCommand, cveCommand, threatsCommand, auditCommand, secretsCommand, defendCommand],
|
|
547
547
|
examples: [
|
|
548
|
-
{ command: '
|
|
549
|
-
{ command: '
|
|
550
|
-
{ command: '
|
|
548
|
+
{ command: 'flo security scan', description: 'Run security scan' },
|
|
549
|
+
{ command: 'flo security cve --list', description: 'List known CVEs' },
|
|
550
|
+
{ command: 'flo security threats', description: 'Run threat analysis' },
|
|
551
551
|
],
|
|
552
552
|
action: async () => {
|
|
553
553
|
output.writeln();
|
|
@@ -70,7 +70,7 @@ const listCommand = {
|
|
|
70
70
|
output.writeln();
|
|
71
71
|
if (result.sessions.length === 0) {
|
|
72
72
|
output.printInfo('No sessions found');
|
|
73
|
-
output.printInfo('Run "
|
|
73
|
+
output.printInfo('Run "flo session save" to create a session');
|
|
74
74
|
return { success: true, data: result };
|
|
75
75
|
}
|
|
76
76
|
output.printTable({
|
|
@@ -190,7 +190,7 @@ const saveCommand = {
|
|
|
190
190
|
});
|
|
191
191
|
output.writeln();
|
|
192
192
|
output.printSuccess(`Session saved: ${result.sessionId}`);
|
|
193
|
-
output.printInfo(`Restore with:
|
|
193
|
+
output.printInfo(`Restore with: flo session restore ${result.sessionId}`);
|
|
194
194
|
if (ctx.flags.format === 'json') {
|
|
195
195
|
output.printJson(result);
|
|
196
196
|
}
|
|
@@ -572,7 +572,7 @@ const importCommand = {
|
|
|
572
572
|
output.writeln();
|
|
573
573
|
output.printSuccess(`Session imported: ${result.sessionId}`);
|
|
574
574
|
if (!result.activated) {
|
|
575
|
-
output.printInfo(`Restore with:
|
|
575
|
+
output.printInfo(`Restore with: flo session restore ${result.sessionId}`);
|
|
576
576
|
}
|
|
577
577
|
if (ctx.flags.format === 'json') {
|
|
578
578
|
output.printJson(result);
|
|
@@ -629,7 +629,7 @@ const currentCommand = {
|
|
|
629
629
|
catch (error) {
|
|
630
630
|
if (error instanceof MCPClientError) {
|
|
631
631
|
output.printWarning('No active session');
|
|
632
|
-
output.printInfo('Start a session with "
|
|
632
|
+
output.printInfo('Start a session with "flo start"');
|
|
633
633
|
return { success: true, data: { active: false } };
|
|
634
634
|
}
|
|
635
635
|
output.printError(`Unexpected error: ${String(error)}`);
|
|
@@ -704,20 +704,20 @@ export const sessionCommand = {
|
|
|
704
704
|
],
|
|
705
705
|
options: [],
|
|
706
706
|
examples: [
|
|
707
|
-
{ command: '
|
|
708
|
-
{ command: '
|
|
709
|
-
{ command: '
|
|
710
|
-
{ command: '
|
|
711
|
-
{ command: '
|
|
712
|
-
{ command: '
|
|
713
|
-
{ command: '
|
|
707
|
+
{ command: 'flo session list', description: 'List all sessions' },
|
|
708
|
+
{ command: 'flo session save -n "checkpoint-1"', description: 'Save current session' },
|
|
709
|
+
{ command: 'flo session restore session-123', description: 'Restore a session' },
|
|
710
|
+
{ command: 'flo session delete session-123', description: 'Delete a session' },
|
|
711
|
+
{ command: 'flo session export -o backup.json', description: 'Export session to file' },
|
|
712
|
+
{ command: 'flo session import backup.json', description: 'Import session from file' },
|
|
713
|
+
{ command: 'flo session current', description: 'Show current session' }
|
|
714
714
|
],
|
|
715
715
|
action: async (ctx) => {
|
|
716
716
|
// Show help if no subcommand
|
|
717
717
|
output.writeln();
|
|
718
718
|
output.writeln(output.bold('Session Management Commands'));
|
|
719
719
|
output.writeln();
|
|
720
|
-
output.writeln('Usage:
|
|
720
|
+
output.writeln('Usage: flo session <subcommand> [options]');
|
|
721
721
|
output.writeln();
|
|
722
722
|
output.writeln('Subcommands:');
|
|
723
723
|
output.printList([
|
|
@@ -730,7 +730,7 @@ export const sessionCommand = {
|
|
|
730
730
|
`${output.highlight('current')} - Show current active session`
|
|
731
731
|
]);
|
|
732
732
|
output.writeln();
|
|
733
|
-
output.writeln('Run "
|
|
733
|
+
output.writeln('Run "flo session <subcommand> --help" for subcommand help');
|
|
734
734
|
return { success: true };
|
|
735
735
|
}
|
|
736
736
|
};
|
|
@@ -149,15 +149,15 @@ const startAction = async (ctx) => {
|
|
|
149
149
|
output.writeln();
|
|
150
150
|
output.writeln(output.bold('Quick Commands:'));
|
|
151
151
|
output.printList([
|
|
152
|
-
`${output.highlight('
|
|
153
|
-
`${output.highlight('
|
|
154
|
-
`${output.highlight('
|
|
155
|
-
`${output.highlight('
|
|
152
|
+
`${output.highlight('flo status')} - View system status`,
|
|
153
|
+
`${output.highlight('flo agent spawn -t coder')} - Spawn an agent`,
|
|
154
|
+
`${output.highlight('flo swarm status')} - View swarm details`,
|
|
155
|
+
`${output.highlight('flo stop')} - Stop the system`
|
|
156
156
|
]);
|
|
157
157
|
// Daemon mode
|
|
158
158
|
if (daemon) {
|
|
159
159
|
output.writeln();
|
|
160
|
-
output.printInfo('Running in daemon mode. Use "
|
|
160
|
+
output.printInfo('Running in daemon mode. Use "flo stop" to stop.');
|
|
161
161
|
// Store PID for daemon management
|
|
162
162
|
const daemonPidPath = path.join(cwd, '.moflo', 'daemon.pid');
|
|
163
163
|
fs.writeFileSync(daemonPidPath, String(process.pid));
|
|
@@ -412,12 +412,12 @@ export const startCommand = {
|
|
|
412
412
|
}
|
|
413
413
|
],
|
|
414
414
|
examples: [
|
|
415
|
-
{ command: '
|
|
416
|
-
{ command: '
|
|
417
|
-
{ command: '
|
|
418
|
-
{ command: '
|
|
419
|
-
{ command: '
|
|
420
|
-
{ command: '
|
|
415
|
+
{ command: 'flo start', description: 'Start with configuration defaults' },
|
|
416
|
+
{ command: 'flo start --daemon', description: 'Start as background daemon' },
|
|
417
|
+
{ command: 'flo start --topology mesh', description: 'Start with mesh topology' },
|
|
418
|
+
{ command: 'flo start --skip-mcp', description: 'Start without MCP server' },
|
|
419
|
+
{ command: 'flo start quick', description: 'Quick start with defaults' },
|
|
420
|
+
{ command: 'flo start stop', description: 'Stop the running system' }
|
|
421
421
|
],
|
|
422
422
|
action: startAction
|
|
423
423
|
};
|
|
@@ -569,14 +569,14 @@ export const statusCommand = {
|
|
|
569
569
|
}
|
|
570
570
|
],
|
|
571
571
|
examples: [
|
|
572
|
-
{ command: '
|
|
573
|
-
{ command: '
|
|
574
|
-
{ command: '
|
|
575
|
-
{ command: '
|
|
576
|
-
{ command: '
|
|
577
|
-
{ command: '
|
|
578
|
-
{ command: '
|
|
579
|
-
{ command: '
|
|
572
|
+
{ command: 'flo status', description: 'Show current system status' },
|
|
573
|
+
{ command: 'flo status --watch', description: 'Watch mode with live updates' },
|
|
574
|
+
{ command: 'flo status --watch -i 5', description: 'Watch mode updating every 5 seconds' },
|
|
575
|
+
{ command: 'flo status --health-check', description: 'Run health checks' },
|
|
576
|
+
{ command: 'flo status --json', description: 'Output status as JSON' },
|
|
577
|
+
{ command: 'flo status agents', description: 'Show detailed agent status' },
|
|
578
|
+
{ command: 'flo status tasks', description: 'Show detailed task status' },
|
|
579
|
+
{ command: 'flo status memory', description: 'Show detailed memory status' }
|
|
580
580
|
],
|
|
581
581
|
action: statusAction
|
|
582
582
|
};
|