Back to skill

Security audit

Dub YouTube with Voice.ai

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its YouTube dubbing purpose, but verified code has review-worthy security issues around where it sends API credentials/content and how it generates helper scripts.

Review before installing. Use the skill only with scripts you are comfortable sending to Voice.ai, keep the API key scoped/rotatable, do not set VOICEAI_API_BASE unless it points to a trusted HTTPS Voice.ai endpoint, and inspect any generated ffmpeg helper scripts before running them, especially when paths or media files came from someone else.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
voiceai-vo.cjs:3972
Finding

Arbitrary API Base URL Can Exfiltrate the Voice.ai API Key and Script Content

Content
View full analysis
""); throw new Error(`Voice.ai API error ${res.status}: ${body}`); } const json = await res.json(); const rawVoices = Array.isArray(json) ? json : json.voices ?? []; const voices = rawVoices.map((v) => ({ id: String(v.voice_id ?? v.id ?? ""), name: String(v.name ?? "Unnamed"), language: String(v.language ?? "en"), visibility: String(v.visibility ?? ""), status: String(v.status ?? "") })); const data = { voices, total: voices.length }; voiceCache.entry = { data, expiresAt: Date.now() + CACHE_TTL_MS }; return this.filterVoices(data, options); } async callTtsEndpoint(text, opts) { const body = { text, audio_format: opts.audio_format, language: opts.language, ...[truncated 2974 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
voiceai-vo.cjs:3758
Finding

Command Injection in Generated Bash and PowerShell FFmpeg Helper Scripts

Content
View full analysis
a.includes(" ") ? `"${a}"` : a).join(" ")}`; const bash = `#!/usr/bin/env bash # Replace Audio — generated by voiceai-creator-voiceover-pipeline # Sync policy: ${syncPolicy} # # Prerequisites: Install ffmpeg (https://ffmpeg.org/download.html) # macOS: brew install ffmpeg # Ubuntu: sudo apt install ffmpeg # Windows: choco install ffmpeg OR download from https://ffmpeg.org # # Usage: bash replace-audio.sh set -euo pipefail VIDEO_INPUT="${videoPath}" AUDIO_INPUT="${audioPath}" OUTPUT="${outputPath}" echo "🎬 Muxing audio into video…" echo " Video: $VIDEO_INPUT" echo " Audio: $AUDIO_INPUT" echo " Sync: ${syncPolicy}" echo "" ${cmdString} echo "" echo "✅ Done → $OUTPUT" `; const ps1 = `# Replace Audio — generated by voiceai-creator-voiceover-pipeline # Sync policy: ${syncPolicy} # # Prerequisites: Install ffmpeg (https://ffmpeg.org/download.html) # Windows: choco install ffmpeg OR winget install ffmpeg # # Usage: .\\replace-audio.ps1 $ErrorActionPreference = "Stop" $VideoInput = "${videoPath.replace(/\\/g, "\\\\")}" $AudioInput = "${audioPath.replace(/\\/g, "\\\\")}" $Output = "${outputPath.replace(/\\/g, "\\\\")}" Write-Host "🎬 Muxing audio into video…" Write-Host " Video: $VideoInput" Write-Host " Audio: $AudioInput" Write-Host " Sync: ${syncPolicy}" Write-Host "" ${cmdString} Write-Host "" Write-Host "✅ Done → $Output" `; await writeOutputFile((0, import_node_path2.join)(ffmpegDir, "replace-audio.sh"), ...[truncated 2950 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
Findings (21)

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · references/TROUBLESHOOTING.md (reported line 18)May include surrounding context.

md
brew install ffmpeg

# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/TROUBLESHOOTING.md (reported line 119)May include surrounding context.

To clear cache manually:

bash
rm out/my-project/segments/.cache.json

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4659)May include surrounding context.

js
const apiKey = getApiKey();
  if (!isMock && !apiKey) {
    console.error(
      source_default.red("\u2717 VOICE_AI_API_KEY not set.\n") + source_default.yellow("  Set it in .env or your environment, or use --mock for testing.\n") + source_default.gray("  Get your key at https://voice.ai/dashboard")
    );
    process.exit(1);
  }

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4867)May include surrounding context.

js
const apiKey = getApiKey();
  if (!isMock && !apiKey) {
    console.error(
      source_default.red("\u2717 VOICE_AI_API_KEY not set.\n") + source_default.yellow("  Set it in .env or your environment, or use --mock for testing.\n") + source_default.gray("  Get your key at https://voice.ai/dashboard")
    );
    process.exit(1);
  }

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill explicitly requires an API key and describes making outbound requests to Voice.ai, but it does not declare any tool scope such as permissions or allowed-tools. That mismatch weakens least-privilege controls and can cause an agent platform or reviewer to underestimate the skill's access to environment secrets and network egress.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

This manifest instructs users to export a bearer API key into an environment variable, which is a sensitive credential handling operation. Under the code/markdown warning rule, there is no accompanying caution about protecting the key, avoiding shell history exposure, or limiting where it is used.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · references/TROUBLESHOOTING.md (reported line 18)May include surrounding context.

md
brew install ffmpeg

# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 3768)May include surrounding context.

js
brew install ffmpeg

# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documented POST /api/v1/tts/speech and streaming endpoints send arbitrary user-provided text to an external third-party service, but the reference does not warn users that their scripts, captions, or potentially sensitive content leave the local environment. In a dubbing workflow, users may submit unpublished content, private transcripts, or regulated data, so the lack of an explicit privacy/transmission disclosure creates a real risk of unintended data exposure and compliance violations.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 308)May include surrounding context.

js
*/
      subcommandTerm(cmd) {
        const args = cmd.registeredArguments.map((arg) => humanReadableArgName(arg)).join(" ");
        return cmd._name + (cmd._aliases[0] ? "|" + cmd._aliases[0] : "") + (cmd.options.length ? " [options]" : "") + // simplistic check for non-help option
        (args ? " " + args : "");
      }
      /**

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill sends arbitrary script text to a remote Voice.ai TTS endpoint via fetch, which can expose sensitive or proprietary content if users process confidential scripts. In this skill context, remote transmission is core functionality, but the lack of an explicit consent/privacy warning at the point of use increases the risk of unintentional data disclosure.

Content

No source excerpt is available for this finding.

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4675)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4677)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4779)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4781)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4821)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4823)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4874)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · voiceai-vo.cjs (reported line 4876)May include surrounding context.

js
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This markdown file explains that running the skill produces multiple files under an output directory, including media and text artifacts, but it does not explicitly warn the user that the command will create and populate local files and directories. For a skill that affects user data on disk, the description should disclose that behavior so users understand the filesystem impact before running it.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The code accesses process.env.VOICE_AI_API_KEY, which is a sensitive credential source. While later error messages mention setting the key, there is no explicit warning in this code path about handling the credential securely or that the skill reads credentials from the environment.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
voiceai-vo.cjs:1569

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
voiceai-vo.cjs:3900