claude-flow 3.5.83 → 3.6.0
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-plugin/marketplace.json +97 -88
- package/README.md +126 -7474
- package/package.json +1 -1
- package/v3/@claude-flow/cli/README.md +126 -7474
- package/v3/@claude-flow/cli/dist/src/commands/daemon.js +5 -59
- package/v3/@claude-flow/cli/dist/src/commands/swarm.js +4 -101
- package/v3/@claude-flow/cli/dist/src/init/claudemd-generator.js +0 -21
- package/v3/@claude-flow/cli/dist/src/mcp-tools/agent-tools.js +0 -11
- package/v3/@claude-flow/cli/dist/src/mcp-tools/analyze-tools.js +6 -6
- package/v3/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +0 -12
- package/v3/@claude-flow/cli/dist/src/mcp-tools/swarm-tools.js +0 -10
- package/v3/@claude-flow/cli/dist/src/mcp-tools/task-tools.js +0 -8
- package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.d.ts +5 -0
- package/v3/@claude-flow/cli/dist/src/mcp-tools/validate-input.js +20 -0
- package/v3/@claude-flow/cli/dist/src/services/index.d.ts +0 -3
- package/v3/@claude-flow/cli/dist/src/services/index.js +0 -6
- package/v3/@claude-flow/cli/package.json +1 -1
|
@@ -64,15 +64,6 @@ const startCommand = {
|
|
|
64
64
|
config.resourceThresholds = thresholds;
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
// Detect Claude Code runtime — suggest native alternatives
|
|
68
|
-
if (!isDaemonProcess && (process.env.CLAUDE_CODE || !process.stdin.isTTY)) {
|
|
69
|
-
if (!quiet) {
|
|
70
|
-
output.printInfo('[NATIVE_AVAILABLE] Running inside Claude Code. Consider using:');
|
|
71
|
-
output.writeln(' /loop "Run workers" — for in-session periodic execution');
|
|
72
|
-
output.writeln(' CronCreate — for persistent background workers');
|
|
73
|
-
output.writeln(' Proceeding with daemon start as fallback...');
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
67
|
// Check if background daemon already running (skip if we ARE the daemon process)
|
|
77
68
|
if (!isDaemonProcess) {
|
|
78
69
|
const bgPid = getBackgroundDaemonPid(projectRoot);
|
|
@@ -637,49 +628,6 @@ const enableCommand = {
|
|
|
637
628
|
}
|
|
638
629
|
},
|
|
639
630
|
};
|
|
640
|
-
// Schedule subcommand - suggest native Claude Code alternatives for persistent scheduling
|
|
641
|
-
const scheduleCommand = {
|
|
642
|
-
name: 'schedule',
|
|
643
|
-
description: 'Schedule a worker for periodic execution (suggests native Claude Code primitives)',
|
|
644
|
-
options: [
|
|
645
|
-
{ name: 'worker', short: 'w', type: 'string', description: 'Worker type to schedule', required: true },
|
|
646
|
-
{ name: 'interval', short: 'i', type: 'string', description: 'Interval in minutes (e.g. 15)', required: true },
|
|
647
|
-
],
|
|
648
|
-
examples: [
|
|
649
|
-
{ command: 'claude-flow daemon schedule -w audit -i 30', description: 'Schedule audit worker every 30 minutes' },
|
|
650
|
-
{ command: 'claude-flow daemon schedule -w map -i 5', description: 'Schedule map worker every 5 minutes' },
|
|
651
|
-
],
|
|
652
|
-
action: async (ctx) => {
|
|
653
|
-
const worker = ctx.flags.worker;
|
|
654
|
-
const intervalStr = ctx.flags.interval;
|
|
655
|
-
if (!worker) {
|
|
656
|
-
output.printError('Worker type is required. Use --worker or -w flag.');
|
|
657
|
-
return { success: false, exitCode: 1 };
|
|
658
|
-
}
|
|
659
|
-
if (!intervalStr) {
|
|
660
|
-
output.printError('Interval is required. Use --interval or -i flag.');
|
|
661
|
-
return { success: false, exitCode: 1 };
|
|
662
|
-
}
|
|
663
|
-
const minutes = parseInt(intervalStr, 10);
|
|
664
|
-
if (isNaN(minutes) || minutes < 1 || minutes > 1440) {
|
|
665
|
-
output.printError('Interval must be a number between 1 and 1440 (minutes).');
|
|
666
|
-
return { success: false, exitCode: 1 };
|
|
667
|
-
}
|
|
668
|
-
// Convert minutes to cron expression
|
|
669
|
-
const cronExpr = minutes < 60
|
|
670
|
-
? `*/${minutes} * * * *`
|
|
671
|
-
: `0 */${Math.floor(minutes / 60)} * * *`;
|
|
672
|
-
output.writeln();
|
|
673
|
-
output.printBox([
|
|
674
|
-
`[CRON_SUGGESTION] To schedule this worker persistently:`,
|
|
675
|
-
`CronCreate("${worker}-worker", "${cronExpr}", "Run npx @claude-flow/cli hooks worker dispatch --trigger ${worker}")`,
|
|
676
|
-
``,
|
|
677
|
-
`For in-session periodic execution, use:`,
|
|
678
|
-
`/loop "Run ${worker} worker" (auto-paced with cache-aware delays)`,
|
|
679
|
-
].join('\n'), 'Schedule Worker');
|
|
680
|
-
return { success: true };
|
|
681
|
-
},
|
|
682
|
-
};
|
|
683
631
|
// Helper functions for time formatting
|
|
684
632
|
function formatTimeAgo(date) {
|
|
685
633
|
const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
|
|
@@ -713,7 +661,6 @@ export const daemonCommand = {
|
|
|
713
661
|
statusCommand,
|
|
714
662
|
triggerCommand,
|
|
715
663
|
enableCommand,
|
|
716
|
-
scheduleCommand,
|
|
717
664
|
],
|
|
718
665
|
options: [],
|
|
719
666
|
examples: [
|
|
@@ -752,12 +699,11 @@ export const daemonCommand = {
|
|
|
752
699
|
output.writeln();
|
|
753
700
|
output.writeln(output.bold('Subcommands'));
|
|
754
701
|
output.printList([
|
|
755
|
-
`${output.highlight('start')}
|
|
756
|
-
`${output.highlight('stop')}
|
|
757
|
-
`${output.highlight('status')}
|
|
758
|
-
`${output.highlight('trigger')}
|
|
759
|
-
`${output.highlight('enable')}
|
|
760
|
-
`${output.highlight('schedule')} - Schedule periodic worker execution`,
|
|
702
|
+
`${output.highlight('start')} - Start the daemon`,
|
|
703
|
+
`${output.highlight('stop')} - Stop the daemon`,
|
|
704
|
+
`${output.highlight('status')} - Show daemon status`,
|
|
705
|
+
`${output.highlight('trigger')} - Manually run a worker`,
|
|
706
|
+
`${output.highlight('enable')} - Enable/disable a worker`,
|
|
761
707
|
]);
|
|
762
708
|
output.writeln();
|
|
763
709
|
output.writeln('Run "claude-flow daemon <subcommand> --help" for details');
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
import { output } from '../output.js';
|
|
6
6
|
import { select, confirm } from '../prompt.js';
|
|
7
7
|
import { callMCPTool, MCPClientError } from '../mcp-client.js';
|
|
8
|
-
import { createRunId, emitEvent } from '../services/event-stream.js';
|
|
9
8
|
import * as fs from 'fs';
|
|
10
9
|
import * as path from 'path';
|
|
11
10
|
// Get dynamic swarm status from memory/session files
|
|
@@ -525,72 +524,14 @@ const startCommand = {
|
|
|
525
524
|
return { success: true, data: executionState };
|
|
526
525
|
}
|
|
527
526
|
};
|
|
528
|
-
// Shared polling loop used by `status --stream` and `watch`
|
|
529
|
-
function startStatusPoll(swarmId, runId, includeHealth) {
|
|
530
|
-
let prev = '';
|
|
531
|
-
const tick = () => {
|
|
532
|
-
const s = getSwarmStatus(swarmId);
|
|
533
|
-
const key = JSON.stringify(s);
|
|
534
|
-
if (key !== prev) {
|
|
535
|
-
prev = key;
|
|
536
|
-
emitEvent({
|
|
537
|
-
runId,
|
|
538
|
-
event: 'swarm_status',
|
|
539
|
-
agents: s.agents.total,
|
|
540
|
-
active: s.agents.active,
|
|
541
|
-
completed: s.tasks.completed,
|
|
542
|
-
pending: s.tasks.pending,
|
|
543
|
-
inProgress: s.tasks.inProgress,
|
|
544
|
-
progress: s.progress,
|
|
545
|
-
status: s.status,
|
|
546
|
-
});
|
|
547
|
-
}
|
|
548
|
-
if (includeHealth) {
|
|
549
|
-
emitEvent({
|
|
550
|
-
runId,
|
|
551
|
-
event: 'swarm_health',
|
|
552
|
-
memoryOk: s.hasActiveSwarm,
|
|
553
|
-
agentsTotal: s.agents.total,
|
|
554
|
-
agentsActive: s.agents.active,
|
|
555
|
-
successRate: s.metrics.successRate,
|
|
556
|
-
avgResponseTime: s.metrics.avgResponseTime,
|
|
557
|
-
elapsedTime: s.metrics.elapsedTime,
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
// Emit once immediately, then every 2 s
|
|
562
|
-
tick();
|
|
563
|
-
const timer = setInterval(tick, 2000);
|
|
564
|
-
const stop = () => { clearInterval(timer); };
|
|
565
|
-
return { stop };
|
|
566
|
-
}
|
|
567
527
|
// Swarm status
|
|
568
528
|
const statusCommand = {
|
|
569
529
|
name: 'status',
|
|
570
|
-
description: 'Show swarm status
|
|
571
|
-
options: [
|
|
572
|
-
{
|
|
573
|
-
name: 'stream',
|
|
574
|
-
description: 'Continuously emit NDJSON status events to stdout (use with Claude Code Monitor tool for live updates)',
|
|
575
|
-
type: 'boolean',
|
|
576
|
-
default: false
|
|
577
|
-
}
|
|
578
|
-
],
|
|
530
|
+
description: 'Show swarm status',
|
|
579
531
|
action: async (ctx) => {
|
|
580
532
|
const swarmId = ctx.args[0];
|
|
581
533
|
// Get dynamic status from actual swarm state files
|
|
582
534
|
const status = getSwarmStatus(swarmId);
|
|
583
|
-
// --stream: enter NDJSON polling mode instead of one-shot output
|
|
584
|
-
if (ctx.flags.stream) {
|
|
585
|
-
const runId = createRunId();
|
|
586
|
-
const { stop } = startStatusPoll(swarmId, runId, false);
|
|
587
|
-
await new Promise((resolve) => {
|
|
588
|
-
const onSig = () => { stop(); resolve(); };
|
|
589
|
-
process.once('SIGINT', onSig);
|
|
590
|
-
process.once('SIGTERM', onSig);
|
|
591
|
-
});
|
|
592
|
-
return { success: true };
|
|
593
|
-
}
|
|
594
535
|
if (ctx.flags.format === 'json') {
|
|
595
536
|
output.printJson(status);
|
|
596
537
|
return { success: true, data: status };
|
|
@@ -856,48 +797,11 @@ const coordinateCommand = {
|
|
|
856
797
|
return { success: true, data: { agents: v3Agents, count: agentCount } };
|
|
857
798
|
}
|
|
858
799
|
};
|
|
859
|
-
// Watch swarm (NDJSON event stream)
|
|
860
|
-
const watchCommand = {
|
|
861
|
-
name: 'watch',
|
|
862
|
-
description: 'Stream live swarm status as NDJSON events to stdout',
|
|
863
|
-
options: [
|
|
864
|
-
{
|
|
865
|
-
name: 'health',
|
|
866
|
-
description: 'Include periodic health-metric events',
|
|
867
|
-
type: 'boolean',
|
|
868
|
-
default: false
|
|
869
|
-
}
|
|
870
|
-
],
|
|
871
|
-
examples: [
|
|
872
|
-
{ command: 'claude-flow swarm watch', description: 'Stream NDJSON status events' },
|
|
873
|
-
{ command: 'claude-flow swarm watch --health', description: 'Include health metrics' }
|
|
874
|
-
],
|
|
875
|
-
action: async (ctx) => {
|
|
876
|
-
const swarmId = ctx.args[0];
|
|
877
|
-
const includeHealth = ctx.flags.health;
|
|
878
|
-
const runId = createRunId();
|
|
879
|
-
emitEvent({
|
|
880
|
-
runId,
|
|
881
|
-
event: 'watch_start',
|
|
882
|
-
swarmId: swarmId ?? null,
|
|
883
|
-
health: includeHealth,
|
|
884
|
-
});
|
|
885
|
-
const { stop } = startStatusPoll(swarmId, runId, includeHealth);
|
|
886
|
-
// Block until SIGINT / SIGTERM, then clean up
|
|
887
|
-
await new Promise((resolve) => {
|
|
888
|
-
const onSig = () => { stop(); resolve(); };
|
|
889
|
-
process.once('SIGINT', onSig);
|
|
890
|
-
process.once('SIGTERM', onSig);
|
|
891
|
-
});
|
|
892
|
-
emitEvent({ runId, event: 'watch_stop' });
|
|
893
|
-
return { success: true };
|
|
894
|
-
}
|
|
895
|
-
};
|
|
896
800
|
// Main swarm command
|
|
897
801
|
export const swarmCommand = {
|
|
898
802
|
name: 'swarm',
|
|
899
803
|
description: 'Swarm coordination commands',
|
|
900
|
-
subcommands: [initCommand, startCommand, statusCommand, stopCommand, scaleCommand, coordinateCommand
|
|
804
|
+
subcommands: [initCommand, startCommand, statusCommand, stopCommand, scaleCommand, coordinateCommand],
|
|
901
805
|
options: [],
|
|
902
806
|
examples: [
|
|
903
807
|
{ command: 'claude-flow swarm init --v3-mode', description: 'Initialize V3 swarm' },
|
|
@@ -914,11 +818,10 @@ export const swarmCommand = {
|
|
|
914
818
|
output.printList([
|
|
915
819
|
`${output.highlight('init')} - Initialize a new swarm`,
|
|
916
820
|
`${output.highlight('start')} - Start swarm execution`,
|
|
917
|
-
`${output.highlight('status')} - Show swarm status
|
|
821
|
+
`${output.highlight('status')} - Show swarm status`,
|
|
918
822
|
`${output.highlight('stop')} - Stop swarm execution`,
|
|
919
823
|
`${output.highlight('scale')} - Scale swarm agent count`,
|
|
920
|
-
`${output.highlight('coordinate')} - V3 15-agent coordination
|
|
921
|
-
`${output.highlight('watch')} - Stream live NDJSON status events`
|
|
824
|
+
`${output.highlight('coordinate')} - V3 15-agent coordination`
|
|
922
825
|
]);
|
|
923
826
|
return { success: true };
|
|
924
827
|
}
|
|
@@ -394,22 +394,6 @@ ToolSearch("hive consensus") → hive-mind_consensus, hive-mind_status
|
|
|
394
394
|
ToolSearch("+aidefence") → aidefence_scan, aidefence_is_safe, aidefence_has_pii
|
|
395
395
|
\`\`\``;
|
|
396
396
|
}
|
|
397
|
-
function nativeCapabilities() {
|
|
398
|
-
return `## Native Claude Code Capabilities (PREFER OVER MCP) — ADR-091
|
|
399
|
-
|
|
400
|
-
When running inside Claude Code, ALWAYS prefer native tools over MCP equivalents:
|
|
401
|
-
|
|
402
|
-
| Need | Use This | Not This |
|
|
403
|
-
|------|----------|----------|
|
|
404
|
-
| Periodic tasks | \`/loop\` with ScheduleWakeup (delay <270s for cache) | \`daemon start\` |
|
|
405
|
-
| Live monitoring | \`Monitor("npx @claude-flow/cli swarm watch --stream")\` | Polling \`swarm status\` |
|
|
406
|
-
| Background workers | \`CronCreate("audit", "*/15 * * * *", "...")\` | \`daemon start --background\` |
|
|
407
|
-
| Agent isolation | \`Task({ ..., isolation: "worktree" })\` | Shared worktree |
|
|
408
|
-
| Multi-agent comms | \`TeamCreate\` + \`SendMessage\` | Memory namespace coordination |
|
|
409
|
-
| Cross-session | \`PushNotification\` + \`RemoteTrigger\` | No equivalent |
|
|
410
|
-
|
|
411
|
-
MCP tool responses include hints: \`[LOOP_SUGGESTION]\`, \`[MONITOR_AVAILABLE]\`, \`[CRON_SUGGESTION]\`, \`[TEAM_SUGGESTION]\`, \`[WORKTREE_SUGGESTION]\` — follow them. In CI/headless, Ruflo falls back to daemon mode automatically.`;
|
|
412
|
-
}
|
|
413
397
|
function setupAndBoundary() {
|
|
414
398
|
return `## Quick Setup
|
|
415
399
|
|
|
@@ -438,7 +422,6 @@ npx @claude-flow/cli@latest doctor --fix
|
|
|
438
422
|
const TEMPLATE_SECTIONS = {
|
|
439
423
|
minimal: [
|
|
440
424
|
behavioralRules,
|
|
441
|
-
(_opts) => nativeCapabilities(),
|
|
442
425
|
fileOrganization,
|
|
443
426
|
projectArchitecture,
|
|
444
427
|
(_opts) => buildAndTest(),
|
|
@@ -451,7 +434,6 @@ const TEMPLATE_SECTIONS = {
|
|
|
451
434
|
],
|
|
452
435
|
standard: [
|
|
453
436
|
behavioralRules,
|
|
454
|
-
(_opts) => nativeCapabilities(),
|
|
455
437
|
fileOrganization,
|
|
456
438
|
projectArchitecture,
|
|
457
439
|
(_opts) => buildAndTest(),
|
|
@@ -468,7 +450,6 @@ const TEMPLATE_SECTIONS = {
|
|
|
468
450
|
],
|
|
469
451
|
full: [
|
|
470
452
|
behavioralRules,
|
|
471
|
-
(_opts) => nativeCapabilities(),
|
|
472
453
|
fileOrganization,
|
|
473
454
|
projectArchitecture,
|
|
474
455
|
(_opts) => buildAndTest(),
|
|
@@ -490,7 +471,6 @@ const TEMPLATE_SECTIONS = {
|
|
|
490
471
|
],
|
|
491
472
|
security: [
|
|
492
473
|
behavioralRules,
|
|
493
|
-
(_opts) => nativeCapabilities(),
|
|
494
474
|
fileOrganization,
|
|
495
475
|
projectArchitecture,
|
|
496
476
|
(_opts) => buildAndTest(),
|
|
@@ -506,7 +486,6 @@ const TEMPLATE_SECTIONS = {
|
|
|
506
486
|
],
|
|
507
487
|
performance: [
|
|
508
488
|
behavioralRules,
|
|
509
|
-
(_opts) => nativeCapabilities(),
|
|
510
489
|
fileOrganization,
|
|
511
490
|
projectArchitecture,
|
|
512
491
|
(_opts) => buildAndTest(),
|
|
@@ -211,13 +211,6 @@ export const agentTools = [
|
|
|
211
211
|
else if (routingResult.tier) {
|
|
212
212
|
response.tier = routingResult.tier;
|
|
213
213
|
}
|
|
214
|
-
// ADR-091 Phase 1: Native Claude Code capability suggestions
|
|
215
|
-
response.nativeIntegration = {
|
|
216
|
-
taskSuggestion: '[AGENT_NATIVE] For better isolation, spawn this agent via Claude Code Task tool: Task({ prompt: "...", subagent_type: "' + (input.agentType || 'coder') + '", isolation: "worktree" })',
|
|
217
|
-
isolationNote: agentType === 'coder' || agentType === 'reviewer'
|
|
218
|
-
? '[WORKTREE_SUGGESTION] This agent type modifies files. Use isolation: "worktree" to prevent conflicts.'
|
|
219
|
-
: undefined,
|
|
220
|
-
};
|
|
221
214
|
return response;
|
|
222
215
|
},
|
|
223
216
|
},
|
|
@@ -284,10 +277,6 @@ export const agentTools = [
|
|
|
284
277
|
createdAt: agent.createdAt,
|
|
285
278
|
domain: agent.domain,
|
|
286
279
|
lastResult: agent.lastResult || null,
|
|
287
|
-
// ADR-091 Phase 1: Native Claude Code capability suggestions
|
|
288
|
-
nativeIntegration: {
|
|
289
|
-
monitorSuggestion: '[MONITOR_AVAILABLE] For live agent updates: Monitor("npx @claude-flow/cli agent logs --stream")',
|
|
290
|
-
},
|
|
291
280
|
};
|
|
292
281
|
}
|
|
293
282
|
return {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Analyze MCP Tools
|
|
3
3
|
* Provides diff analysis and classification via MCP protocol
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { validateGitRef, validatePath } from './validate-input.js';
|
|
6
6
|
import { analyzeDiff, assessFileRisk, assessOverallRisk, classifyDiff, suggestReviewers, getGitDiffNumstat, } from '../ruvector/diff-classifier.js';
|
|
7
7
|
/**
|
|
8
8
|
* Diff Analysis Tool
|
|
@@ -40,7 +40,7 @@ export const analyzeDiffTool = {
|
|
|
40
40
|
},
|
|
41
41
|
handler: async (params) => {
|
|
42
42
|
if (params.ref) {
|
|
43
|
-
const vRef =
|
|
43
|
+
const vRef = validateGitRef(params.ref, 'ref');
|
|
44
44
|
if (!vRef.valid)
|
|
45
45
|
return { error: true, message: vRef.error, ref: params.ref };
|
|
46
46
|
}
|
|
@@ -100,7 +100,7 @@ export const diffRiskTool = {
|
|
|
100
100
|
},
|
|
101
101
|
handler: async (params) => {
|
|
102
102
|
if (params.ref) {
|
|
103
|
-
const vRef =
|
|
103
|
+
const vRef = validateGitRef(params.ref, 'ref');
|
|
104
104
|
if (!vRef.valid)
|
|
105
105
|
return { error: true, message: vRef.error, ref: params.ref };
|
|
106
106
|
}
|
|
@@ -145,7 +145,7 @@ export const diffClassifyTool = {
|
|
|
145
145
|
},
|
|
146
146
|
handler: async (params) => {
|
|
147
147
|
if (params.ref) {
|
|
148
|
-
const vRef =
|
|
148
|
+
const vRef = validateGitRef(params.ref, 'ref');
|
|
149
149
|
if (!vRef.valid)
|
|
150
150
|
return { error: true, message: vRef.error, ref: params.ref };
|
|
151
151
|
}
|
|
@@ -194,7 +194,7 @@ export const diffReviewersTool = {
|
|
|
194
194
|
},
|
|
195
195
|
handler: async (params) => {
|
|
196
196
|
if (params.ref) {
|
|
197
|
-
const vRef =
|
|
197
|
+
const vRef = validateGitRef(params.ref, 'ref');
|
|
198
198
|
if (!vRef.valid)
|
|
199
199
|
return { error: true, message: vRef.error, ref: params.ref };
|
|
200
200
|
}
|
|
@@ -295,7 +295,7 @@ export const diffStatsTool = {
|
|
|
295
295
|
},
|
|
296
296
|
handler: async (params) => {
|
|
297
297
|
if (params.ref) {
|
|
298
|
-
const vRef =
|
|
298
|
+
const vRef = validateGitRef(params.ref, 'ref');
|
|
299
299
|
if (!vRef.valid)
|
|
300
300
|
return { error: true, message: vRef.error, ref: params.ref };
|
|
301
301
|
}
|
|
@@ -1743,9 +1743,6 @@ export const hooksSessionStart = {
|
|
|
1743
1743
|
tasksRestored: sessionMemory?.restoredPatterns || 0,
|
|
1744
1744
|
memoryRestored: sessionMemory?.restoredPatterns || 0,
|
|
1745
1745
|
} : null,
|
|
1746
|
-
nativeCapabilities: {
|
|
1747
|
-
note: 'Claude Code native capabilities detected. Prefer /loop over daemon start, Monitor over polling, CronCreate over background processes.',
|
|
1748
|
-
},
|
|
1749
1746
|
};
|
|
1750
1747
|
},
|
|
1751
1748
|
};
|
|
@@ -3354,12 +3351,6 @@ export const hooksWorkerDispatch = {
|
|
|
3354
3351
|
background,
|
|
3355
3352
|
note: background ? 'Worker scheduled. Use hooks_worker-status to check progress. Start the daemon (daemon start) for real background execution.' : undefined,
|
|
3356
3353
|
timestamp: new Date().toISOString(),
|
|
3357
|
-
nativeIntegration: {
|
|
3358
|
-
loopSuggestion: `[LOOP_SUGGESTION] This worker would benefit from /loop for periodic execution.\nRecommended: /loop "${trigger} worker"\nInterval: 270s (stays within cache window)`,
|
|
3359
|
-
suggestedDelay: 270,
|
|
3360
|
-
loopPrompt: `Run ${trigger} worker and check results`,
|
|
3361
|
-
cronSuggestion: `[CRON_SUGGESTION] For persistent background execution: CronCreate("${trigger}-worker", "*/15 * * * *", "Run ${trigger} worker")`,
|
|
3362
|
-
},
|
|
3363
3354
|
};
|
|
3364
3355
|
},
|
|
3365
3356
|
};
|
|
@@ -3417,9 +3408,6 @@ export const hooksWorkerStatus = {
|
|
|
3417
3408
|
completed: workers.filter(w => w.status === 'completed').length,
|
|
3418
3409
|
failed: workers.filter(w => w.status === 'failed').length,
|
|
3419
3410
|
},
|
|
3420
|
-
nativeIntegration: {
|
|
3421
|
-
monitorSuggestion: '[MONITOR_AVAILABLE] For live worker updates: Monitor("npx @claude-flow/cli hooks worker list --stream")',
|
|
3422
|
-
},
|
|
3423
3411
|
};
|
|
3424
3412
|
},
|
|
3425
3413
|
};
|
|
@@ -109,10 +109,6 @@ export const swarmTools = [
|
|
|
109
109
|
initializedAt: now,
|
|
110
110
|
config: swarmState.config,
|
|
111
111
|
persisted: true,
|
|
112
|
-
nativeIntegration: {
|
|
113
|
-
teamSuggestion: '[TEAM_SUGGESTION] Create a Claude Code team for this swarm: TeamCreate({ team_name: "' + (input.name || 'swarm') + '", description: "Ruflo swarm coordination" })',
|
|
114
|
-
worktreeNote: '[WORKTREE_SUGGESTION] Spawn file-modifying agents with isolation: "worktree" to prevent conflicts',
|
|
115
|
-
},
|
|
116
112
|
};
|
|
117
113
|
},
|
|
118
114
|
},
|
|
@@ -172,9 +168,6 @@ export const swarmTools = [
|
|
|
172
168
|
createdAt: latest.createdAt,
|
|
173
169
|
updatedAt: latest.updatedAt,
|
|
174
170
|
totalSwarms: swarmIds.length,
|
|
175
|
-
nativeIntegration: {
|
|
176
|
-
monitorSuggestion: '[MONITOR_AVAILABLE] For live swarm updates: Monitor("npx @claude-flow/cli swarm watch --stream")',
|
|
177
|
-
},
|
|
178
171
|
};
|
|
179
172
|
},
|
|
180
173
|
},
|
|
@@ -319,9 +312,6 @@ export const swarmTools = [
|
|
|
319
312
|
agentCount: target.agents.length,
|
|
320
313
|
checks,
|
|
321
314
|
checkedAt: new Date().toISOString(),
|
|
322
|
-
nativeIntegration: {
|
|
323
|
-
monitorSuggestion: '[MONITOR_AVAILABLE] For continuous health monitoring: Monitor("npx @claude-flow/cli swarm watch --stream --health")',
|
|
324
|
-
},
|
|
325
315
|
};
|
|
326
316
|
},
|
|
327
317
|
},
|
|
@@ -90,10 +90,6 @@ export const taskTools = [
|
|
|
90
90
|
createdAt: task.createdAt,
|
|
91
91
|
assignedTo: task.assignedTo,
|
|
92
92
|
tags: task.tags,
|
|
93
|
-
// ADR-091 Phase 1: Native Claude Code capability suggestions
|
|
94
|
-
nativeIntegration: {
|
|
95
|
-
nativeTaskNote: '[TASK_NATIVE] Claude Code has a native task system. Consider TaskCreate({ subject: "...", description: "..." }) for shared visibility across agents.',
|
|
96
|
-
},
|
|
97
93
|
};
|
|
98
94
|
},
|
|
99
95
|
},
|
|
@@ -250,10 +246,6 @@ export const taskTools = [
|
|
|
250
246
|
status: task.status,
|
|
251
247
|
completedAt: task.completedAt,
|
|
252
248
|
result: task.result,
|
|
253
|
-
// ADR-091 Phase 1: Native Claude Code capability suggestions
|
|
254
|
-
nativeIntegration: {
|
|
255
|
-
notifySuggestion: '[NOTIFY_SUGGESTION] For tasks spanning sessions, use PushNotification to alert when complete.',
|
|
256
|
-
},
|
|
257
249
|
};
|
|
258
250
|
}
|
|
259
251
|
return {
|
|
@@ -16,6 +16,11 @@ export interface ValidationResult {
|
|
|
16
16
|
* Rejects shell metacharacters and path traversal.
|
|
17
17
|
*/
|
|
18
18
|
export declare function validateIdentifier(value: unknown, label: string): ValidationResult;
|
|
19
|
+
/**
|
|
20
|
+
* Validate a git ref (HEAD~1, main..feature, commit hashes, etc.).
|
|
21
|
+
* Allows ~, ^, and / which are standard git revision selectors.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateGitRef(value: unknown, label: string): ValidationResult;
|
|
19
24
|
/**
|
|
20
25
|
* Validate a file path (prevents traversal and shell injection).
|
|
21
26
|
*/
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
const SHELL_META = /[;&|`$(){}[\]<>!#\\]/;
|
|
11
11
|
const PATH_TRAVERSAL = /\.\.[/\\]/;
|
|
12
12
|
const IDENTIFIER_RE = /^[a-zA-Z0-9_][a-zA-Z0-9_\-.:]{0,127}$/;
|
|
13
|
+
const GIT_REF_RE = /^[a-zA-Z0-9_][a-zA-Z0-9_\-.:~^/]{0,255}$/;
|
|
13
14
|
/**
|
|
14
15
|
* Validate an identifier (agent ID, agent type, namespace, key, etc.)
|
|
15
16
|
* Rejects shell metacharacters and path traversal.
|
|
@@ -32,6 +33,25 @@ export function validateIdentifier(value, label) {
|
|
|
32
33
|
}
|
|
33
34
|
return { valid: true, sanitized: value };
|
|
34
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Validate a git ref (HEAD~1, main..feature, commit hashes, etc.).
|
|
38
|
+
* Allows ~, ^, and / which are standard git revision selectors.
|
|
39
|
+
*/
|
|
40
|
+
export function validateGitRef(value, label) {
|
|
41
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
42
|
+
return { valid: false, sanitized: '', error: `${label} must be a non-empty string` };
|
|
43
|
+
}
|
|
44
|
+
if (value.length > 256) {
|
|
45
|
+
return { valid: false, sanitized: '', error: `${label} exceeds 256 characters` };
|
|
46
|
+
}
|
|
47
|
+
if (SHELL_META.test(value)) {
|
|
48
|
+
return { valid: false, sanitized: '', error: `${label} contains disallowed characters` };
|
|
49
|
+
}
|
|
50
|
+
if (!GIT_REF_RE.test(value)) {
|
|
51
|
+
return { valid: false, sanitized: '', error: `${label} contains invalid characters (allowed: alphanumeric, _, -, ., :, ~, ^, /)` };
|
|
52
|
+
}
|
|
53
|
+
return { valid: true, sanitized: value };
|
|
54
|
+
}
|
|
35
55
|
/**
|
|
36
56
|
* Validate a file path (prevents traversal and shell injection).
|
|
37
57
|
*/
|
|
@@ -6,9 +6,6 @@ export { WorkerDaemon, getDaemon, startDaemon, stopDaemon, type WorkerType, } fr
|
|
|
6
6
|
export { HeadlessWorkerExecutor, HEADLESS_WORKER_TYPES, HEADLESS_WORKER_CONFIGS, LOCAL_WORKER_TYPES, LOCAL_WORKER_CONFIGS, ALL_WORKER_CONFIGS, isHeadlessWorker, isLocalWorker, getModelId, getWorkerConfig, type HeadlessWorkerType, type LocalWorkerType, type HeadlessWorkerConfig, type HeadlessExecutionResult, type HeadlessExecutorConfig, type HeadlessOptions, type PoolStatus, type SandboxMode, type ModelType, type OutputFormat, type ExecutionMode, type WorkerPriority, type WorkerConfig, } from './headless-worker-executor.js';
|
|
7
7
|
export { ContainerWorkerPool, type ContainerInfo, type ContainerPoolConfig, type ContainerExecutionOptions, type ContainerPoolStatus, type ContainerState, } from './container-worker-pool.js';
|
|
8
8
|
export { WorkerQueue, type QueueTask, type WorkerQueueConfig, type QueueStats, type WorkerRegistration, type TaskStatus, } from './worker-queue.js';
|
|
9
|
-
export { createRunId, emitEvent, createEventEmitter, type StreamEvent, } from './event-stream.js';
|
|
10
|
-
export { detectCapabilities, getRuntimeTier, getCacheWarmDelay, type RuntimeCapabilities, type RuntimeTier, } from './runtime-capabilities.js';
|
|
11
|
-
export { runLoopWorker, type LoopWorkerResult, } from './loop-worker-runner.js';
|
|
12
9
|
export type { default as WorkerDaemonType, DaemonConfig } from './worker-daemon.js';
|
|
13
10
|
export type { default as HeadlessWorkerExecutorType } from './headless-worker-executor.js';
|
|
14
11
|
export type { default as ContainerWorkerPoolType } from './container-worker-pool.js';
|
|
@@ -8,10 +8,4 @@ export { HeadlessWorkerExecutor, HEADLESS_WORKER_TYPES, HEADLESS_WORKER_CONFIGS,
|
|
|
8
8
|
export { ContainerWorkerPool, } from './container-worker-pool.js';
|
|
9
9
|
// Worker Queue (Phase 4)
|
|
10
10
|
export { WorkerQueue, } from './worker-queue.js';
|
|
11
|
-
// Event Stream (ADR-091)
|
|
12
|
-
export { createRunId, emitEvent, createEventEmitter, } from './event-stream.js';
|
|
13
|
-
// Runtime Capabilities (ADR-091)
|
|
14
|
-
export { detectCapabilities, getRuntimeTier, getCacheWarmDelay, } from './runtime-capabilities.js';
|
|
15
|
-
// Loop Worker Runner (ADR-091 Phase 2)
|
|
16
|
-
export { runLoopWorker, } from './loop-worker-runner.js';
|
|
17
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claude-flow/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Ruflo CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
|
|
6
6
|
"main": "dist/src/index.js",
|