/socialforge:parse-calendar — Calendar Parser
Parse a monthly social media content calendar into structured JSON that drives the entire production pipeline.
Context efficiency
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.
Supported Formats
| Format |
How It Works |
| DOCX |
Read tables and structured text from Word documents |
| XLSX |
Read rows from Excel spreadsheets (one row per post) |
| Notion |
Read from Notion database via MCP (requires Notion connector) |
| Structured text |
Parse markdown or plain text with consistent formatting |
Required Fields Per Post
Every post in the calendar must have (or the system will ask for missing ones):
| Field |
Required |
Description |
| post_id |
Auto-generated |
Unique identifier (e.g., P01, P02) |
| date |
Yes |
Publishing date (YYYY-MM-DD) |
| platform |
Yes |
Target platform(s) — linkedin, instagram, x, facebook, etc. |
| content_type |
Yes |
static, carousel, video, story, reel, text_only |
| tier |
Yes |
HERO, HUB, or HYGIENE |
| topic |
Yes |
What the post is about |
| caption_brief |
Yes |
Brief description of the copy direction |
| visual_brief |
Recommended |
What the image should show |
| hashtags |
Optional |
Post-specific hashtags (brand hashtags added automatically) |
| cta |
Optional |
Call-to-action text or link |
| campaign |
Optional |
Campaign this post belongs to |
| notes |
Optional |
Special instructions |
Process
- Detect format — Check file extension or URL pattern
- Extract posts — Parse each post entry from the source
- Validate fields — Check required fields present. For missing fields, ask the user.
- Normalize — Standardize dates, platform names, content types to schema format
- Assign post IDs — Sequential (P01, P02, ...) if not already present
- Cross-reference platforms — Check all platforms exist in brand's platform-config.json
- Flag issues — Duplicate dates, missing briefs, unsupported content types
- Save — Write calendar-data.json to
${CLAUDE_PLUGIN_DATA}/socialforge/output/{brand}/{YYYY-MM}/ (falls back to ~/socialforge-workspace/output/... when ${CLAUDE_PLUGIN_DATA} is unset)
Output
Calendar parsed: 28 posts for April 2026
LinkedIn: 12 posts (4 carousels, 6 static, 2 video)
Instagram: 10 posts (3 carousels, 4 reels, 3 static)
X: 6 posts (all text+image)
Issues found: 2
- P14: Missing visual_brief (will need manual input during asset matching)
- P22: Date falls on Sunday — confirm intentional weekend post?
Calendar saved: ${CLAUDE_PLUGIN_DATA}/socialforge/output/acme-corp/2026-04/calendar-data.json
After Parsing
Ask: "Would you like to:
- Match assets to posts? (
/socialforge:match-assets)
- Review the parsed calendar first? (I'll show the full post list)
- Fix issues? (I'll walk through each flagged item)"
Timeout & Fallback
- DOCX/XLSX parsing: 30-second timeout. If file is too large, suggest splitting by week.
- Notion: 60-second timeout per database query. If Notion is slow, offer to export and parse locally.
- If format is unrecognized: Ask user to describe the structure, then parse adaptively.
1---2name: parse-calendar3description: Parse a monthly content calendar from DOCX, XLSX, Notion, or pasted text into structured calendar-data.json — the source of truth every downstream skill reads. Triggers on "/parse-calendar", "parse the calendar", "import this calendar", "here is the month", "load the content plan", "calendar to JSON", or whenever a client calendar arrives in any format. No calendar yet? /socialforge:ideate-month drafts one in this exact shape.4---56# /socialforge:parse-calendar — Calendar Parser78Parse a monthly social media content calendar into structured JSON that drives the entire production pipeline.910## Context efficiency1112Asset-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.1314## Supported Formats1516| Format | How It Works |17|--------|-------------|18| DOCX | Read tables and structured text from Word documents |19| XLSX | Read rows from Excel spreadsheets (one row per post) |20| Notion | Read from Notion database via MCP (requires Notion connector) |21| Structured text | Parse markdown or plain text with consistent formatting |2223## Required Fields Per Post2425Every post in the calendar must have (or the system will ask for missing ones):2627| Field | Required | Description |28|-------|----------|-------------|29| post_id | Auto-generated | Unique identifier (e.g., P01, P02) |30| date | Yes | Publishing date (YYYY-MM-DD) |31| platform | Yes | Target platform(s) — linkedin, instagram, x, facebook, etc. |32| content_type | Yes | static, carousel, video, story, reel, text_only |33| tier | Yes | HERO, HUB, or HYGIENE |34| topic | Yes | What the post is about |35| caption_brief | Yes | Brief description of the copy direction |36| visual_brief | Recommended | What the image should show |37| hashtags | Optional | Post-specific hashtags (brand hashtags added automatically) |38| cta | Optional | Call-to-action text or link |39| campaign | Optional | Campaign this post belongs to |40| notes | Optional | Special instructions |4142## Process43441. **Detect format** — Check file extension or URL pattern452. **Extract posts** — Parse each post entry from the source463. **Validate fields** — Check required fields present. For missing fields, ask the user.474. **Normalize** — Standardize dates, platform names, content types to schema format485. **Assign post IDs** — Sequential (P01, P02, ...) if not already present496. **Cross-reference platforms** — Check all platforms exist in brand's platform-config.json507. **Flag issues** — Duplicate dates, missing briefs, unsupported content types518. **Save** — Write calendar-data.json to `${CLAUDE_PLUGIN_DATA}/socialforge/output/{brand}/{YYYY-MM}/` (falls back to `~/socialforge-workspace/output/...` when `${CLAUDE_PLUGIN_DATA}` is unset)5253## Output5455```56Calendar parsed: 28 posts for April 202657 LinkedIn: 12 posts (4 carousels, 6 static, 2 video)58 Instagram: 10 posts (3 carousels, 4 reels, 3 static)59 X: 6 posts (all text+image)6061Issues found: 262 - P14: Missing visual_brief (will need manual input during asset matching)63 - P22: Date falls on Sunday — confirm intentional weekend post?6465Calendar saved: ${CLAUDE_PLUGIN_DATA}/socialforge/output/acme-corp/2026-04/calendar-data.json66```6768## After Parsing6970Ask: "Would you like to:71- Match assets to posts? (`/socialforge:match-assets`)72- Review the parsed calendar first? (I'll show the full post list)73- Fix issues? (I'll walk through each flagged item)"7475## Timeout & Fallback7677- DOCX/XLSX parsing: 30-second timeout. If file is too large, suggest splitting by week.78- Notion: 60-second timeout per database query. If Notion is slow, offer to export and parse locally.79- If format is unrecognized: Ask user to describe the structure, then parse adaptively.