roku
Analysis
The Roku control purpose is plausible, but the artifacts include undocumented Telegram and background-control helpers with a bot token and unauthenticated local pipe, so this needs review before installation.
Findings (5)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Checks for instructions or behavior that redirect the agent, misuse tools, execute unexpected code, cascade across systems, exploit user trust, or continue outside the intended task.
Install specifications: node | package: roku-ts-cli | creates binaries: roku ... Code file presence: roku-daemon.py ... roku-telegram.py
The declared install path is an npm package, but the supplied artifact set includes Python helper scripts with different dependencies and behavior. That mismatch creates a provenance and review-scope concern.
PIPE_PATH = "/tmp/roku-control" ... if line.startswith("roku_"):
btn = line.replace("roku_", "")
if hasattr(r, btn):
getattr(r, btn)()A predictable local pipe can route string input into method calls on the Roku object, with no authentication or documented permission boundary in the artifact.
thread = threading.Thread(target=read_pipe, daemon=True)
thread.start()
# Keep main thread alive
try:
while True:
time.sleep(60)The helper runs a persistent background loop that listens for control commands. This is separate from the documented npm CLI and is not clearly disclosed as part of the skill behavior.
Checks whether tool use, credentials, dependencies, identity, account access, or inter-agent boundaries are broader than the stated purpose.
TOKEN = os.environ.get("TELEGRAM_TOKEN", "") ... url = f"https://api.telegram.org/bot{TOKEN}/getUpdates"The code requires and uses a Telegram bot token, but the registry metadata declares no environment variables or credentials, and SKILL.md does not disclose Telegram control.
Checks for exposed credentials, poisoned memory or context, unclear communication boundaries, or sensitive data that could leave the user's control.
if "callback_query" in update:
cb = update["callback_query"]["data"]
if cb.startswith("roku_"):
btn = cb.replace("roku_", "")
send_to_roku(btn)Telegram callback data is forwarded to the Roku control pipe based only on the `roku_` prefix; the artifact shows no chat, user, or origin allowlist.
