kevinbadi/social-agents/agent-posts
Claude Code and agent skill by kevinbadi/social-agents
- community
Checking that the SKILL.md file is still in the repository.
Agent Posts. Hand Social Agents a finished vertical video and it transcribes it, pulls the "comment X" keyword, writes on-brand captions for every platform, builds a 9:16 cover, schedules the post to every connected social through CreatorOS, verifies it, and (with sign-off) arms the comment-to-DM funnel. Use when a user drops a video to post, asks to schedule agent posts, fix a cover or title, or publish now.
Install
npx vskill@latest install kevinbadi/social-agents/agent-postsSKILL.md
Agent Posts
Everything goes through your CreatorOS tools. There is no database, no desk app, and no hosted pipeline: CreatorOS holds the schedule (the user's post history page shows it), the workspace holds the brand, and two local scripts do the mechanical work (transcript, cover). You are the writer.
Before anything
node social-agents/skills/agent-posts/scripts/check-setup.mjs— key, connected socials, ffmpeg, whisper. Fix the ✗ items before continuing. On the first run, if it reports no key, tell the user to get acos_live_key at https://www.creatoros.ca/ (Settings, API keys) or runnpx @creatoros/cli init, then re-run.- Read
social-agents/BRAND.md(no brand pack yet -> run the brand-interview skill first),social-agents/PROFILES.md(which networks are connected; take theacc_ids from a freshlist_accounts, the saved ones can be re-issued),social-agents/social-agents.json(timezone). - Know the schedule-posts skill's timing schema cold. One mode per post: queue (
queuedFromProfile: true), exact (schedule_at+timezone), ordraft: true. None of them = publishes immediately.
The pipeline, one video
S=social-agents/skills/agent-posts/scripts/vertical-video-thumbnail/scripts
- Transcribe.
node $S/generate.mjs --video <mp4> --out <dir>/cover.png --caption-onlywrites<dir>/narration.json(the transcript) and a heuristic caption draft. If the video has no spoken CTA, add--no-cta. Treat the draft as raw material only. - Keyword. From the transcript, find the spoken "comment the word X". Whisper mishears brand words: read it back to the user and confirm the exact spelling. No spoken CTA -> ask whether they want one; if not, the post ships without a funnel.
- Write from the brand pack. Per platform, in the brand voice, CTA link from BRAND.md offers only:
- Instagram / TikTok / Facebook caption: first line is the comment CTA (
Comment "X" to get …), blank line, the spoken content cleaned into short paragraphs, hashtags per the hashtag policy on the last line. Strip the spoken "comment X, I'll DM you" outro; the first line already is the CTA. - Threads: the same, fitted under 500 characters.
- X: under 280, or a native thread via
threadItemsif the content earns it. - YouTube: title (<= 100 chars) + description. YouTube has no DMs, so the resource link goes IN the description and the CTA line becomes "link in the description".
- LinkedIn: no hashtag spam, professional framing of the same content.
- Two ALL-CAPS hook lines for the cover (kicker + payoff, ~4 words each). No em or en dashes anywhere in overlay or captions.
- DM text for the funnel (<= 640 chars, one link) and a short public comment reply.
- Confirm with the human before anything is built: keyword spelling, hook lines, DM copy, comment reply. This is a ground rule: the DM goes to strangers.
- Cover.
node $S/generate.mjs --video <mp4> --out <dir>/cover.png --transcript <dir>/narration.json --keyword X --line1 "…" --line2 "…". Default is a real frame from the video with the hook burned into the bottom plate. Generated scenes needFAL_KEY,FAL_ALLOW=video-thumbnail, and two or more photos of the creator insocial-agents/assets/identity/(optionalidentity.txtdescribing them). Look at the cover before posting: hook spelling, keyword, nothing cut off in the 3:4 grid window. - Upload.
upload_mediathe video, then the cover. Keep bothmed_ids. - TikTok constraints.
tiktok_creator_infofor each TikTok account. Privacy level and interaction settings go in the top-leveltiktokobject; CreatorOS sets the consent flags. - Post. One
create_postacross every shortform-capable account in PROFILES.md (TikTok, Instagram, YouTube, X, Threads, Facebook, LinkedIn as connected), advanced form so each network gets its own caption:targets: [{ platform, account_id, content: <that network's caption>, options }](YouTubeoptions: { title }),media: [<video med_ id>],cover: <cover med_ id>, rootcontent= the IG caption. Timing, in order of preference:queuedFromProfile: true(cadence lives in the user's CreatorOS queue: the posting frequency is theirs to set in the app, never compute slots yourself), an exactschedule_at+timezonewhen the user names a time, no timing at all only when they say "post it now". - Verify.
get_post: status must bescheduledorpublished, neverdraft; every network present underplatforms, no errors. Report the per-network result and the scheduled time. - Funnel (Instagram, Facebook). After confirmation in step 4,
create_funnelper IG/FB account:accountId,keywords: [X], the DM text, the comment reply,linkfrom BRAND.md, andplatformPostIdonceget_postshows the network's post id (published posts); before publish, scope account-wide and note it. Verify withlist_funnels. - Ledger. Append a line to
content-library/POSTED.md: date, file, post id, keyword, platforms.
The YouTube leg answers "comment X" comments with a public reply pointing at the description, through the respond-to-comments skill; there is no DM on YouTube.
Fixes after scheduling
- Retitle / redescribe YouTube:
update_youtube_metadata. - Caption or time change on a scheduled post:
update_post(content,scheduledFor+timezone). - New cover or new media:
update_postcan't change them. Regenerate with--line1/--line2(or--scene-grid <existing scene png>to re-burn text only),upload_media, thendelete_postandcreate_postagain with the newcover(confirm with the human: it is a delete). - Keyword fix touches three places: the captions (
update_post), the funnel (update_funnel), and your report. - Publish now: delete the scheduled post and
create_postagain with noschedule_at; verify withget_post.
Judgment rules
- Never invent an offer or a link; no link in BRAND.md means no CTA to it.
- Never a cover with a chin-rest, pointing-at-camera grin, or prayer-hands pose (the pose bank in generate.mjs is the only source of poses).
- Eyeball every cover's hook lines and keyword spelling before it goes out.
- One upload, one create_post, every network. Per-network captions ride on each target's
content, not separate calls. - The platform is CreatorOS. Never repeat internal vendor names to the user.
- Report like an operator: post id, platforms, scheduled time, funnel state, what still needs the human.
Layout
Optional env: WHISPER_MODEL (default base.en), FAL_KEY + FAL_ALLOW=video-thumbnail, AGENT_POSTS_IDENTITY_DIR.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingtemplates/skills/agent-posts/SKILL.md
Popularity
- Repository stars
- 55
- Repository forks
- 19
- 7-day trend score
- 25
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/kevinbadi/social-agents/agent-posts)