adapt-copy
Adapt post copy per platform: character limits, hashtags, tone and the right CTA mechanism. \"rewrite this caption for LinkedIn\"
Finalize the month: package approved content into the delivery folder with copy files and manifest. \"package the month for the client\"
Claude Code
$ npx -y skills add indranilbanerjee/socialforge --skill finalize-month --agent claude-code
Codex
$ npx skills add indranilbanerjee/socialforge --skill finalize-month -a codex -y
Cursor
$ npx skills add indranilbanerjee/socialforge --skill finalize-month -a cursor -y
Gemini CLI
$ npx skills add indranilbanerjee/socialforge --skill finalize-month -a gemini-cli -y
GitHub Copilot
$ npx skills add indranilbanerjee/socialforge --skill finalize-month -a github-copilot -y
OpenCode
$ npx skills add indranilbanerjee/socialforge --skill finalize-month -a opencode -y
Windsurf
$ npx skills add indranilbanerjee/socialforge --skill finalize-month -a windsurf -y
name: finalize-month description: "Finalize the month: package approved content into the delivery folder with copy files and manifest. \"package the month for the client\"" argument-hint: "[--brand <name>] [--force]" effort: high user-invocable: true disable-model-invocation: 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).
Package all approved posts into the organized delivery folder structure.
The user starts this skill: it is not model-invocable (`disable-model-invocation: true`), because it copies the delivery, can upload it and send a completion message, and offers the scheduler hand-off. An orchestrator that reaches this step tells the user to run `/socialforge:finalize` (or `/socialforge:finalize-month`) and stops.
Packaging copies and renames files, and steps 5-6 can upload to a Drive and send a completion message. After the Step 0 delivery audit passes, show an Execution Summary (posts packaged, any force-finalized posts, destination folder, whether a Drive upload and a notification will happen and to whom) and proceed only on an explicit `yes`; any other reply cancels with nothing written or sent. `--force` still needs the user to have typed it.
**Step 0 — run the delivery audit, before any packaging:**
python "${CLAUDE_PLUGIN_ROOT}/scripts/delivery_audit.py" --brand {brand} --month {YYYY-MM}It re-derives the month's claims from the ledger and the disk: every status in the vocabulary, revision history landing on the recorded status, no ghost posts the calendar never knew, no gate bypassed on the way to delivery (`force_finalized` is surfaced loudly, not left as a buried flag), every FINAL post's referenced file existing and non-empty, the failure log loadable, and cost totals honest about incompleteness. **Exit 1 means the delivery is claiming something the disk does not support — resolve the findings before packaging, never around them.** The verdict lands in `delivery-audit.json` beside the tracker.
Then:
**WARNING:** `--force` bypasses ALL approval gates. Use only in emergencies, and **only when the user has typed `--force` (or explicitly said to force-finalize) in this conversation** — never add it on your own initiative, including when this skill was invoked without the user typing its command (hosts such as Codex ignore `disable-model-invocation`). All force-finalized posts are logged with `force_finalized: true` in status-tracker.json for audit trail — and the delivery audit reports every one of them as a violation the client-facing record must acknowledge.
If any posts are not FINAL: "3 posts still pending approval. Finalize anyway with --force, or resolve pending items first."
FINAL/
├── 00-Calendar-Document/
│ └── {brand}-{month}-calendar.json # delivery manifest; DOCX conversion is a manual step
├── 01-Ready-to-Publish/
│ └── Week-{N}/
│ └── {date}-Post{id}-{title}/
│ └── {platform}/
│ ├── image-{WxH}.png
│ ├── copy.txt
│ └── preview.png
├── 02-Carousels/
├── 03-Video-Production-Kit/
├── 04-Stories-Shorts/
├── 05-Review-Gallery/
├── 06-Publishing-Schedule/
└── 07-Production-Checklist/1. Verify all approval gates 2. Organize files into folder structure 3. Generate publishing schedule (dates + times + platforms) 4. Generate production checklist (remaining manual tasks) 5. Upload to Google Drive (if connected) 6. Send completion notification via Slack/email 7. Remind the user: once the month has run, ingest its analytics export with `/socialforge:ingest-performance` — that is what lets next month's `/socialforge:ideate-month` compound measured wins instead of memory 8. Only if the user asks: the optional scheduler hand-off below
Finalizing is complete without this. Offer it only when the user asks and a scheduler connector (`~~scheduler`) is already connected; the catalog entry is `postiz` in `.mcp.json.connectors-reference`, and nothing connects by default. SocialForge never schedules or publishes on its own initiative.
1. **Preconditions.** The Step 0 delivery audit passed and every post to be handed off is FINAL. A post that was force-finalized is handed off only after the user re-confirms that post by id. 2. **Show the exact batch before any scheduler call**: per post, the id, the channel/account, the date and time, the copy exactly as it will post, the media file, and which posts used AI generation so the platform-native AI-content label is set where it applies (`references/content-credentials-by-platform.md`). 3. **Explicit approval for exactly that batch.** The approval names the posts and the times. Changing any post, channel or time is a new approval, and "the folder looks good" is not approval to schedule. 4. **Say which action you are asking for.** The Postiz MCP's scheduling tool can schedule, save a draft, or publish immediately ([docs.postiz.com/mcp/introduction](https://docs.postiz.com/mcp/introduction), checked 2026-10-04). Default to a draft or a scheduled post; publish immediately only for a post the user named and said to publish now. 5. **Record what the scheduler returned** (post ids, channel, time) next to `06-Publishing-Schedule/`. If a call fails, report the failure; never retry blind and never say "scheduled" for a post whose call did not return success.
Connector facts, checked 2026-10-04: Postiz is open source and self-hostable (AGPL-3.0, [github.com/gitroomhq/
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.
Adapt post copy per platform: character limits, hashtags, tone and the right CTA mechanism. \"rewrite this caption for LinkedIn\"
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\"
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…