@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
Supply chain provenance
Status for the latest visible version.
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
Keywords
Accepted risks
Findings the reviewer chose to accept rather than block on.
| Source | Rule | Reason | Accepted by | When |
|---|---|---|---|---|
| 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 findingPackage was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.29.0
3 findingsSilent 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',
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',
Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.27.2
1 findingPackage was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.27.1
1 findingPackage was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.25.4
9 findingsSpreading 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 | });
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 | });
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 | });
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 | });
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 | });
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,
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 || '' };
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 || '' };
Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.21.1
9 findingsSpreading 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 | });
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 | });
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 | });
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 | });
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 | });
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,
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 || '' };
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 || '' };
Package was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.7.0
1 findingPackage was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.6.29
1 findingPackage was published without Sigstore provenance. Consider requesting the maintainer enable provenance via CI/CD.
v3.5.1
2 findingsScript: node bin/preinstall.cjs || true
Package was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.
v3.5.0
2 findingsScript: node bin/preinstall.cjs || true
Package was published without Sigstore provenance. Only ~12% of npm packages have provenance, so this is common but not ideal.