ai-clipping-skill@1.0.0
CAUTION· install onlyPublisher claims: "AI clipping for Whop and Content Rewards clipping campaigns, from the user's AI agent: turns a paid clipping campaign brief into a checked, numbered checklist (rates per platform, minimum payout, cap, required hashtags, @mentions, links, watermark or logo, bio, length, footage and its recency, audience and engagement rules, proof), flags brief text that asks to hide the ad and never follows it, cuts a distinct vertical clip per account with captions, a hook and the paid-partnership disclosure on screen (facecam-over-gameplay layout for streams), checks every clip against the brief and the platforms in code, shows one plan page with expected earnings, posts to the user's TikTok, Instagram Reels and YouTube Shorts accounts through WoopSocial after one yes, prints a submission sheet with each post's 30-minute deadline, and keeps one ledger and a proof log for payout claims. Use when someone says "clip this campaign", "I joined a clipping campaign", "make clips for this Whop campaign", "Content Rewards clips", "clip my stream for this campaign", "automate my clipping", "post my clips to all my accounts", "track my clip submissions" or "how much will my clips earn". Also for creators clipping their own content onto their own accounts. Standalone." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-15 and scored it 75/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Privileged sudo command; HTML comment carrying imperative instructions to the agent; HTML comment carrying imperative instructions to the agent. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
"Linux: sudo apt install ffmpeg.")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.the proof log next to it (`~/.ai-clipping/proof.csv`, one row per post and day, each naming itsFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.written by plan.py; it replaces this file on every runFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.written by plan.py; it replaces this file on every runFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent."Linux: sudo apt install ffmpeg (or your distro's package).")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."new terminal). Linux: sudo apt install ffmpeg")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."new terminal). Linux: sudo apt install ffmpeg")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…with my sponsor.", "expected": "Same flow with the user's own brief; campaign.json with the sponsor as brand and the disclosure on; plan, yes, post, submission sheet only if a campaign needs links; never promises reach." }, …Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.…r.", "expected": "Re-cuts clip-01, then plan.py --media refuses the old media.json entry because the file's fingerprint changed; uploads the new file, updates media.json with the new mediaId and sha256, and shows the plan for a new yes bef…Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.3. `posts_create`, then at once `plan.py clipjob.json --posted requests/<name>.json <postId>`.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.out = subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of",Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.python3 scripts/plan.py clipjob.json --status status.json [<postId>]Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.r = subprocess.run(["ffmpeg", "-hide_banner", f"-{kind}"], capture_output=True, text=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.python3 scripts/plan.py clipjob.json --media media.json # fill in the uploaded mediaIds:Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.session.json is the JSON returned by `media_uploads_create_session`, saved as it came back. ItFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.return json.loads(subprocess.run(cmd, capture_output=True, text=True, check=True).stdout)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.r = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="replace")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.print("next: write clipjob.json (one post per account) and run check_clips.py on it")Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.python3 scripts/plan.py clipjob.json --failed <job post id>Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.python3 scripts/plan.py clipjob.json --posted-by-hand <job post id> <post url> [--at TIME]Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.python3 scripts/check_clips.py clipjob.json # one line per post, then every problemFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.out = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True).stdout.split("\n")[0]Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""ledger.json: {"posts": {"<postId>|<account>": {...}}, "submissions": [{...}], "campaigns":Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.`plan.py clipjob.json --failed <job post id> --checked`, plan again, new yes. A post stillFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.subprocess.run(["curl", "-sfL", FONT_URL + FONT_FILES[0], "-o", path], check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(ledger.json); no moment posted again on the same account.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.`plan.py clipjob.json --media media.json`. A clip cut again after its upload is refused: uploadFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.written by plan.py; it replaces this file on every runFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.`plan.py clipjob.json --status status.json <postId>`. This prints and saves `submit.md`: per postFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.r = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="replace")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.r = subprocess.run(["ffprobe", "-v", "error", "-show_streams", "-show_format", "-of", "json", path],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.python3 scripts/plan.py clipjob.json --posted requests/<name>.json <postId>Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.r = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="replace", **kw)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.r = subprocess.run(cmd, capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
5 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim social-media-skills: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Hidden instructions≈ +6 on the totalRemove HTML comments, zero-width characters and white-on-white text that carry instructions. Everything the agent is meant to read should be visible to the person reading the file.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.