← Home

@claude-flow/cli

Ruflo CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code

14
Versions
MIT
License
Yes
Install Scripts
Missing
Provenance

Supply chain provenance

Status for the latest visible version.

No SLSA provenance npm registry signatures gitHead linked

Without SLSA provenance there is no cryptographic link between this tarball and the public source, so a manually published version cannot be tied back to a reviewed commit.

Maintainers

ruvnet

Keywords

claudeclaude-codeanthropicai-agentsmulti-agentswarmmcpmodel-context-protocolllmcliorchestrationautomationdeveloper-toolscoding-assistantvector-databaseembeddingsself-learningenterprise

Accepted risks

Findings the reviewer chose to accept rather than block on.

SourceRuleReasonAccepted byWhen
dependencies unvetted-dep:@claude-flow/embeddings AI (dependencies): Same-org @claude-flow scope, part of monorepo. ai
dependencies unvetted-dep:@claude-flow/security AI (dependencies): Same-org @claude-flow scope, part of monorepo. ai
install-scripts install-script:preinstall AI (install-scripts): Preinstall is a documented no-op stub, not functional code execution. ai
dependencies unvetted-dep:@claude-flow/aidefence AI (dependencies): First-party monorepo package. ai
dependencies unvetted-dep:@claude-flow/guidance AI (dependencies): First-party monorepo package. ai
dependencies unvetted-dep:agentic-flow AI (dependencies): Same-org companion package, expected dependency. ai
semgrep semgrep:silent-process-exec-var AI (semgrep): Same self-referential spawn as silent-process-exec finding. ai
publish-pattern new-deps-added AI (publish-pattern): sql.js is a well-known, established WASM SQLite package. ai
semgrep semgrep:silent-process-exec AI (semgrep): Detached spawn re-invokes the package's own CLI/npx for hook refresh, not an external payload. ai
semgrep semgrep:hex-decode AI (semgrep): ed25519 key decoding in publish tooling, not a runtime payload obfuscation. ai
semgrep semgrep:env-spread AI (semgrep): env spread into child process opts, standard pattern for CLI subprocess spawning ai
dependencies unvetted-dep:@claude-flow/cli-core AI (dependencies): first-party monorepo sibling package ai
dependencies unvetted-dep:@claude-flow/shared AI (dependencies): first-party monorepo sibling package ai
dependencies unvetted-dep:@claude-flow/neural AI (dependencies): first-party monorepo sibling package ai
dependencies unvetted-dep:@claude-flow/mcp AI (dependencies): first-party monorepo sibling package ai
typosquat typosquat.levenshtein:joi AI (typosquat): Scoped package @claude-flow/cli; levenshtein match to 'joi' is a false positive with no impersonation intent. ai
semgrep semgrep:child-process-import AI (semgrep): child_process in statusline.cjs is expected for a CLI tool displaying system status information. ai
semgrep semgrep:dynamic-require AI (semgrep): Dynamic require in hook-handler.cjs is a module-loader helper; consistent with CLI plugin/hook architecture. ai
install-scripts install-script:postinstall AI (install-scripts): Postinstall only copies agentdb dist subdirectory to fix path mismatch; no network access or arbitrary code execution. ai

Versions (showing 14 of 14)

Version Deps Published
3.30.5 9 / 2
3.29.0 9 / 2
3.27.2 8 / 2
3.27.1 8 / 2
3.25.4 8 / 2
3.21.1 8 / 2
3.10.44 8 / 2
3.7.0 11 / 2
3.6.29 5 / 2
3.6.10 5 / 2
3.6.9 5 / 2
3.5.50 4 / 2
3.5.1 4 / 2
3.5.0 7 / 2

v3.30.5

1 finding
LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.29.0

3 findings
HIGH silent-process-exec: .claude/helpers/hook-handler.cjs:88 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) Source: https://github.com/ruvnet/claude-flow/blob/0052b1b06da62a76f822eb9b09aea53f4731e263/.claude/helpers/hook-handler.cjs#L88 86 | ? [process.execPath, [cliBin, 'hooks', subcommand, '--quiet']] 87 | : [cmd, ['--prefer-offline', '@claude-flow/cli', 'hooks', subcommand, '--quiet']]; > 88 | const child = spawn(spawnArgs[0], spawnArgs[1], { 89 | detached: true, 90 | stdio: 'ignore',

HIGH silent-process-exec-var: .claude/helpers/hook-handler.cjs:88 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) Source: https://github.com/ruvnet/claude-flow/blob/0052b1b06da62a76f822eb9b09aea53f4731e263/.claude/helpers/hook-handler.cjs#L88 86 | ? [process.execPath, [cliBin, 'hooks', subcommand, '--quiet']] 87 | : [cmd, ['--prefer-offline', '@claude-flow/cli', 'hooks', subcommand, '--quiet']]; > 88 | const child = spawn(spawnArgs[0], spawnArgs[1], { 89 | detached: true, 90 | stdio: 'ignore',

LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.27.2

1 finding
LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.27.1

1 finding
LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.25.4

9 findings
HIGH env-spread: plugins/ruflo-metaharness/scripts/_darwin.mjs:85 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/_darwin.mjs#L85 83 | timeout: timeoutMs, 84 | cwd: opts.cwd, > 85 | env: { ...process.env, ...(opts.env || {}) }, 86 | shell: process.platform === 'win32', 87 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_darwin.mjs:128 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/_darwin.mjs#L128 126 | stdio: ['ignore', 'pipe', 'pipe'], 127 | cwd: opts.cwd, > 128 | env: { ...process.env, ...(opts.env || {}) }, 129 | shell: process.platform === 'win32', 130 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_harness.mjs:142 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/_harness.mjs#L142 140 | stdio: ['ignore', 'pipe', 'pipe'], 141 | cwd: opts.cwd, > 142 | env: { ...process.env, ...(opts.env || {}) }, 143 | shell: false, 144 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_harness.mjs:197 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/_harness.mjs#L197 195 | timeout: timeoutMs, 196 | cwd: opts.cwd, // iter 27 — let callers redirect $CWD (mint.mjs needs this) > 197 | env: { ...process.env, ...(opts.env || {}) }, 198 | shell: false, 199 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_redblue.mjs:109 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/_redblue.mjs#L109 107 | timeout: timeoutMs, 108 | cwd: opts.cwd, > 109 | env: { ...process.env, ...(opts.env || {}) }, 110 | shell: process.platform === 'win32', 111 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs:70 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs#L70 68 | function runWithUnreachableRegistry(scriptName, extraArgs) { 69 | const r = spawnSync('node', [join(SCRIPTS_DIR, scriptName), ...extraArgs], { > 70 | env: { 71 | ...process.env, 72 | npm_config_registry: UNREACHABLE_REGISTRY,

HIGH env-spread: plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs:112 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs#L112 110 | stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8', 111 | timeout: opts.timeoutMs ?? 60_000, > 112 | env: { ...process.env, ...opts.env }, 113 | }); 114 | return { exitCode: r.status ?? 1, stdout: r.stdout || '', stderr: r.stderr || '' };

HIGH env-spread: plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs:122 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/defd71f30108c1f2cba101b7e39f59c8abd9bf79/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs#L122 120 | timeout: opts.timeoutMs ?? 120_000, 121 | cwd: opts.cwd, // metaharness new writes to cwd/<name>; --target is ignored > 122 | env: { ...process.env, ...opts.env }, 123 | }); 124 | return { exitCode: r.status ?? 1, stdout: r.stdout || '', stderr: r.stderr || '' };

LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.21.1

9 findings
HIGH env-spread: plugins/ruflo-metaharness/scripts/_darwin.mjs:85 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/_darwin.mjs#L85 83 | timeout: timeoutMs, 84 | cwd: opts.cwd, > 85 | env: { ...process.env, ...(opts.env || {}) }, 86 | shell: process.platform === 'win32', 87 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_darwin.mjs:128 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/_darwin.mjs#L128 126 | stdio: ['ignore', 'pipe', 'pipe'], 127 | cwd: opts.cwd, > 128 | env: { ...process.env, ...(opts.env || {}) }, 129 | shell: process.platform === 'win32', 130 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_harness.mjs:142 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/_harness.mjs#L142 140 | stdio: ['ignore', 'pipe', 'pipe'], 141 | cwd: opts.cwd, > 142 | env: { ...process.env, ...(opts.env || {}) }, 143 | shell: false, 144 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_harness.mjs:197 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/_harness.mjs#L197 195 | timeout: timeoutMs, 196 | cwd: opts.cwd, // iter 27 — let callers redirect $CWD (mint.mjs needs this) > 197 | env: { ...process.env, ...(opts.env || {}) }, 198 | shell: false, 199 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/_redblue.mjs:109 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/_redblue.mjs#L109 107 | timeout: timeoutMs, 108 | cwd: opts.cwd, > 109 | env: { ...process.env, ...(opts.env || {}) }, 110 | shell: process.platform === 'win32', 111 | });

HIGH env-spread: plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs:70 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs#L70 68 | function runWithUnreachableRegistry(scriptName, extraArgs) { 69 | const r = spawnSync('node', [join(SCRIPTS_DIR, scriptName), ...extraArgs], { > 70 | env: { 71 | ...process.env, 72 | npm_config_registry: UNREACHABLE_REGISTRY,

HIGH env-spread: plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs:112 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs#L112 110 | stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8', 111 | timeout: opts.timeoutMs ?? 60_000, > 112 | env: { ...process.env, ...opts.env }, 113 | }); 114 | return { exitCode: r.status ?? 1, stdout: r.stdout || '', stderr: r.stderr || '' };

HIGH env-spread: plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs:122 semgrep

Spreading entire process.env into an object — may capture all secrets Source: https://github.com/ruvnet/claude-flow/blob/51085bf68d7afabd9cd9307764ed6162b38774a6/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs#L122 120 | timeout: opts.timeoutMs ?? 120_000, 121 | cwd: opts.cwd, // metaharness new writes to cwd/<name>; --target is ignored > 122 | env: { ...process.env, ...opts.env }, 123 | }); 124 | return { exitCode: r.status ?? 1, stdout: r.stdout || '', stderr: r.stderr || '' };

LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.7.0

1 finding
LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.6.29

1 finding
LOW No provenance attestation provenance

Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.

v3.5.1

2 findings
HIGH Package has 'preinstall' script install-scripts

Script: node bin/preinstall.cjs || true

LOW No provenance attestation provenance

Package was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.

v3.5.0

2 findings
HIGH Package has 'preinstall' script install-scripts

Script: node bin/preinstall.cjs || true

LOW No provenance attestation provenance

Package was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.