assemble-document
Assemble the month-end delivery manifest: approved posts, copy, files and metadata as one JSON. \"build the delivery manifest\"
Adapt post copy per platform: character limits, hashtags, tone and the right CTA mechanism. \"rewrite this caption for LinkedIn\"
Claude Code
$ npx -y skills add indranilbanerjee/socialforge --skill adapt-copy --agent claude-code
Codex
$ npx skills add indranilbanerjee/socialforge --skill adapt-copy -a codex -y
Cursor
$ npx skills add indranilbanerjee/socialforge --skill adapt-copy -a cursor -y
Gemini CLI
$ npx skills add indranilbanerjee/socialforge --skill adapt-copy -a gemini-cli -y
GitHub Copilot
$ npx skills add indranilbanerjee/socialforge --skill adapt-copy -a github-copilot -y
OpenCode
$ npx skills add indranilbanerjee/socialforge --skill adapt-copy -a opencode -y
Windsurf
$ npx skills add indranilbanerjee/socialforge --skill adapt-copy -a windsurf -y
name: adapt-copy description: "Adapt post copy per platform: character limits, hashtags, tone and the right CTA mechanism. \"rewrite this caption for LinkedIn\"" argument-hint: "[--post <id>] [--all] [--platform <name>]" effort: medium user-invocable: true
> **Script location.** If your host does not set `${CLAUDE_PLUGIN_ROOT}`, the scripts are in this plugin's `scripts/` folder, next to `skills/`. Run them with Python 3.10 or newer: `python`, or `python3` where `python` is not found (macOS, many Linux systems).
Transform a single caption brief into platform-optimized copy for each target platform.
Asset-heavy skill. **Grep before Read** the asset catalog (`${CLAUDE_PLUGIN_DATA}/socialforge/brands/<brand>/asset-index.json`) — never list the asset directory. Reference generated images / videos by path, not by loading metadata. Brand profile loads once per session.
1. Load post brief (topic, caption_brief, CTA, hashtags, campaign) 2. Load brand-config.json (tone, hashtags, language settings) 3. Load compliance-rules.json (banned phrases, disclaimers) 4. For X/Twitter posts with live-source context, read the optional [X/Twitter research intake](../../references/x-twitter-research-intake.md) note and use only reviewed evidence 5. Write platform-specific copy (tone and structure per platform, within these limits):
| Platform | Tone | Limit | Hashtags: aim / script cap | Link | |----------|------|-------|----------------------------|------| | LinkedIn | Professional | 3,000 chars (140 before fold) | 3-5 / 5 | Direct URL | | Instagram | Conversational | 2,200 chars | 3-5 / 5 (first comment) | Link in bio | | X/Twitter | Punchy, concise | 280, counted by weight (emoji and CJK 2, any URL 23) | 1-2 / 2 | Direct URL | | Facebook | Casual | 500 chars optimal (63,206 hard limit) | 1-3 / 3 | Direct URL | | YouTube | Description format | 5,000 chars | 3-5 / 5 | Direct URLs | | TikTok | Casual, trend-aware | 2,200 chars | 3-5 / 10 (trending + branded) | Link in bio | | Pinterest | Search-friendly description | 800 chars | 5-10 / 20 | Direct URL | | Threads | Conversational | 500 chars | 1 / 1 | Direct URL | | Bluesky | Concise, community-first | 300 chars | 1-2 / 2 (via tag facets) | Direct URL |
**The limits are data, and not all of them are confirmed.** `scripts/platform_limits.json` records every number with its source URL, the date it was checked and a status: confirmed (a primary platform page says it), differs, or unsourced (SocialForge's working value, no readable primary page). On 2026-10-04 the character limits for Instagram, Facebook and TikTok were unsourced (third-party pages report 4,000 for TikTok; unconfirmed, so 2,200 stays as the safe cap), as is every fold position. Run `python "${CLAUDE_PLUGIN_ROOT}/scripts/adapt_copy.py" --sources` before telling anyone a limit is official; platforms change limits without notice. "Aim" is a working range from SocialForge's platform notes, not a platform rule. The script cap is how many hashtags `adapt_copy.py` keeps.
6. Measure and fit every variant with `adapt_copy.py` (see "Run the adapter" below) 7. Apply brand hashtags (always_include + campaign-specific), up to each platform's cap, and tell the user which ones the cap dropped 8. Run compliance check - flag banned phrases, add disclaimers 9. Handle bilingual posts if configured 10. Save to `production/copy/post-{id}-{platform}-copy.txt`
**No significance markers.** Never write a line whose only job is to announce that the next line matters: "here's the thing", "the thing is,", "here's the kicker", "here's where it gets interesting", "that's the part that got me", "let that sink in", "read that again". They read as machine-written, and on a 280-character platform they spend budget the point needs. Lead with the specific instead — "Approvals went from 14 days to 31" beats "Here's the thing about approval timelines". Same for stacked soft adverbs (honestly / genuinely / truly / literally / actually / basically): at most one per caption, never two in a sentence.
This is a writing rule enforced by the copy-adapter agent, not a scan. SocialForge ships no AI-tell scanner on purpose — caption-length copy has no document structure to measure, and per-1000-word metrics are noise at 280 characters.
When the post's CTA is a conversation (a keyword that opens a DM, a WhatsApp or Messenger thread), read [conversational-commerce.md](../../references/conversational-commerce.md): opt-in and 24-hour-window rules, and playbooks for the post, the first reply, the handoff, and templates.
Write each variant **without** the CTA and without hashtags, then measure and fit it:
python "${CLAUDE_PLUGIN_ROOT}/scripts/adapt_copy.py" --text "<the variant>" --platform x --brand <slug> --cta "<CTA wording and URL>" --campaign-hashtags "#Tag1" "#Tag2"Read these fields of the JSON it prints:
Your client wants 30 days of social content across six platforms with brand-faithful imagery, AI-generated video, and provenance signed for EU markets. You have five days.
Assemble the month-end delivery manifest: approved posts, copy, files and metadata as one JSON. \"build the delivery manifest\"
Set up or update a brand profile: colors, fonts, logo, voice, platforms, compliance rules. \"update our brand colors\"
Build the shareable HTML review gallery of every generated post for team or client. \"make me a gallery page\"
Embed C2PA content credentials and an AI-disclosure record in AI-generated assets. \"sign these images for AI disclosure\"
Compose just the creative (image or video) for a calendar post, in four modes. \"make the visual for this post\"
Create a preview card per platform: post copy, image and badge, to check copy and crop. \"show how this will look\"
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use…
Comprehensive SEO analysis for any website or business type. Full site audits, single-page analysis, technical SEO (crawlability,…
Turn the current project website into a short, polished, shareable launch video using Hyperframes. Use when someone says "/brag",…
Full website GEO+SEO audit with parallel subagent delegation. Orchestrates a comprehensive Generative Engine Optimization audit…