← Home

@ifi/pi-extension-subagents

Full-featured subagent orchestration extension for pi, built on top of nicobailon/pi-subagents.

16
Versions
MIT
License
No
Install Scripts
Missing
Provenance

Supply chain provenance

Status for the latest visible version.

No SLSA provenance npm registry signatures No source commit

Without SLSA provenance there is no cryptographic link between this tarball and the public source — the axios compromise (March 2026) relied on exactly this gap.

Maintainers

ifiokjr

Keywords

chainsdelegationmulti-agentpipi-coding-agentpi-packagesubagents

Accepted risks

Findings the reviewer chose to accept rather than block on.

SourceRuleReasonAccepted byWhen
semgrep semgrep:silent-process-exec AI (semgrep): Detached spawn is intentional for async subagent orchestration; matches documented package purpose. ai
semgrep semgrep:silent-process-exec-var AI (semgrep): Same detached spawn pattern; stable false positive for this subagent orchestration package. ai
semgrep semgrep:env-spread AI (semgrep): Passing process.env to child agent processes is expected behavior for this orchestration package. ai
provenance no-provenance AI (provenance): No provenance is common; publisher track record and repo URL are consistent. ai

Versions (showing 16 of 16)

Version Deps Published
0.5.1 1 / 0
0.5.0 1 / 0
0.4.4 1 / 0
0.4.2 1 / 0
0.4.1 1 / 0
0.4.0 1 / 0
0.3.6 0 / 0
0.3.5 0 / 0
0.3.4 0 / 0
0.3.3 0 / 0
0.3.2 0 / 0
0.3.1 0 / 0
0.3.0 0 / 0
0.2.16 0 / 0
0.2.15 0 / 0
0.2.14 0 / 0

v0.3.6

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.3.5

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.3.4

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.3.3

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.3.2

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.3.1

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.3.0

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.2.16

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.2.15

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.

v0.2.14

5 findings
HIGH silent-process-exec: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH silent-process-exec-var: async-execution.ts:106 semgrep

Silent detached process — runs invisibly in the background (reverse shells, miners) 104 | const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts"); 105 | > 106 | const proc = spawn("node", [jitiCliPath, runner, cfgPath], { 107 | cwd, 108 | detached: true,

HIGH env-spread: execution.ts:185 semgrep

Spreading entire process.env into an object — may capture all secrets 183 | } 184 | > 185 | const spawnEnv = { ...process.env, ...getSubagentDepthEnv() }; 186 | const mcpDirect = agent.mcpDirectTools; 187 | if (mcpDirect?.length) {

HIGH env-spread: subagent-runner.ts:109 semgrep

Spreading entire process.env into an object — may capture all secrets 107 | return new Promise((resolve) => { 108 | const outputStream = fs.createWriteStream(outputFile, { flags: "w" }); > 109 | const spawnEnv = { ...process.env, ...(env ?? {}), ...getSubagentDepthEnv() }; 110 | const spawnSpec = getPiSpawnCommand(args, piPackageRoot ? { piPackageRoot } : undefined); 111 | const child = spawn(spawnSpec.command, spawnSpec.args, { cwd, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });

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.