This skill should be used when the user asks to 'create an editorial plan', 'update the calendar', 'schedule posts', 'plan content for March', 'convert calendar to briefs', 'sync calendar with WordPress', 'show editorial status', or otherwise mentions planning content over time. Orchestrates monthly editorial calendars that bridge signals intelligence to content publishing.
The editorial planner manages monthly content calendars as .state.md files stored in .content-state/. It reads site configuration for publishing cadence, optionally consumes the signals feed generated by wp-analytics for data-driven topic ideas, and produces structured briefs that flow into the content pipeline for WordPress publishing. The workflow follows four sequential steps: PLAN (create or update the monthly calendar), BRIEF (convert planned entries into pipeline brief files), SCHEDULE (create WordPress future posts from ready briefs), and SYNC (synchronize WordPress publish status back to the calendar). Each step is idempotent and can be run independently.
CONTEXT --> PLAN --> BRIEF --> SCHEDULE --> SYNC
What it does: Provides editorial context before the main workflow begins. This is an informational step -- it never blocks the workflow.
Trigger: Automatic -- run this step at every skill invocation, before Step 1.
Procedure:
site_id from user context (explicit mention, active site, or ask the user).content-state/{site_id}.config.md -- extract site_url from frontmatter.content-state/*-editorial.state.md file -- parse the editorial table and count entries by status (planned, draft, ready, scheduled, published). Extract goals.posts_target from frontmatter── Editorial Context ──────────────────────
{site_url} | {calendar period}
Pipeline: {draft_count} draft → {ready_count} ready → {scheduled_count} scheduled
Next: {date} — "{title truncated to 40 chars}..."
Posts: {published_count}/{posts_target} pubblicati
───────────────────────────────────────────
If files are missing:
When to run: User asks to create a new plan or update an existing one.
Procedure:
Read site configuration from .content-state/{site_id}.config.md:
cadence.posts_per_week -- calculate goals.posts_target as posts_per_week * weeks_in_monthcadence.preferred_days -- determine which weekdays to assign calendar entriescadence.publish_time -- note for the SCHEDULE stepdefaults.categories, defaults.content_type -- pre-fill the entry Tipo columnRead signals feed from .content-state/signals-feed.md if it exists:
[da assegnare] entriesOptional strategic planning: If the user wants a higher-level content strategy, suggest invoking GenMarketing for content calendar strategy development before populating individual entries.
Generate or update .content-state/{YYYY-MM}-editorial.state.md:
calendar_id, site_id, period, goalspreferred_day[da assegnare]status: plannedPresent the calendar to the user for review before writing to disk.
Safety rules:
status: draft or higher -- never reset them to plannedWhen to run: User asks to "create briefs from calendar" or "convert planned entries to briefs".
Procedure:
Read the current editorial calendar .state.md file.
For each entry with status: planned AND a defined title (not [da assegnare]):
a. Generate a new brief_id as BRF-YYYY-NNN (sequential; scan existing briefs in both pipeline-active/ and pipeline-archive/ to determine the next number)
b. Read .content-state/{site_id}.config.md for site defaults
c. Create .content-state/pipeline-active/{brief_id}.brief.md with:
source.skill: wp-editorial-plannersource.domain: editorial-calendartarget.site_id: from calendar site_idtarget.content_type: from entry Tipo columntarget.scheduled_date: from entry Data column (convert to ISO 8601)target.categories: from site config defaultsdistribution.channels: from entry Canali column (parse comma-separated)content.title: from entry Titolo columnstatus: draft (brief starts as draft; user fills content)
d. Update the calendar entry: status: planned becomes draft, set the Brief ID columnFor entries with an existing Brief ID (already has a brief): skip creation, just verify the brief file exists in pipeline-active/. If the file is missing, report it.
Write the updated calendar back to the .state.md file.
Report to user:
N brief creati in pipeline-active/. Compila il contenuto e imposta status: ready.
Safety rules:
[da assegnare] title -- report them as needing titles firstWhen to run: User asks to "schedule ready posts" or "schedula i post pronti".
Procedure:
Read the current editorial calendar .state.md file.
For each entry with status: ready:
a. Read the corresponding brief file from pipeline-active/{brief_id}.brief.md
b. Verify the brief has status: ready (consistency check between calendar and brief)
c. Create the WordPress post using MCP tool:
create_content:
content_type: {entry.Tipo}
title: {brief.content.title}
content: {brief body markdown}
excerpt: {brief.content.excerpt}
status: "future"
date: {entry.Data as ISO 8601 datetime with site config publish_time}
slug: {auto-generated from title}
d. Assign taxonomy terms using MCP tool:
assign_terms_to_content:
content_type: {entry.Tipo}
id: {post_id}
categories: {brief.target.categories}
tags: {brief.target.tags}
e. Update the calendar entry: status: ready becomes scheduled, set Post ID column
f. Update the brief file: add post_id and post_url to frontmatter
If the entry has distribution.channels (from the Canali column):
scheduled_at using the entry date + config.cadence.publish_time + distribution.schedule_offset_hoursbuf_create_update with the computed scheduled_at
buf_create_update:
profile_ids: [{config.channels.buffer.profile_id}]
text: {adapted content}
media:
photo: {featured image URL if available}
scheduled_at: {ISO 8601 UTC timestamp}
Write the updated calendar back to the .state.md file.
Report to user:
N post schedulati su WordPress. Verranno pubblicati automaticamente alla data prevista.
Safety rules:
status: future (never directly publish)create_content fails for any entry, stop processing that entry, report the error, and keep the entry as readycreate_content -- if the date is in the past, report to user and skipWhen to run: User asks to "sync calendar" or "aggiorna stato calendario".
Procedure:
Read the current editorial calendar .state.md file.
For each entry with a Post ID (status: scheduled or published):
a. Call list_content with the content type and filter by post ID:
list_content:
content_type: {entry.Tipo}
search: {post_id}
per_page: 1
b. Check the returned post status and update the calendar accordingly:
publish and calendar status = scheduled --> update to publishedfuture --> keep as scheduleddraft --> note: post was reverted, update calendar to drafttrash --> note: post was deleted, report to userRecalculate goals.posts_published = count of entries with status: published.
Write the updated calendar back to the .state.md file.
Report to user:
Sync calendario {calendar_id}:
- Post pubblicati: {posts_published}/{posts_target}
- Post schedulati: {scheduled_count}
- Post in lavorazione: {draft_count + ready_count}
- Slot da assegnare: {planned_count}
Safety rules:
When the user wants to create a calendar without running the full PLAN step:
references/editorial-schema.mdsite_id, dates for each entry, and known titlesstatus: planned for all entries.content-state/{YYYY-MM}-editorial.state.mdstatus: future (never publish directly)The AIWU MCP server (mcp__claude_ai_AIWU) does not support the post_date field in wp_create_post or wp_update_post. This means post_status: "future" cannot be achieved through AIWU — WordPress auto-publishes the post when no future date is provided.
E2E test results (2026-03-02):
wp_create_post with post_status: "future" → auto-published (no post_date parameter available)wp_update_post with post_date + post_status: "future" from draft → auto-published (post_date not passed through)wp_update_post on already-published post → post_date updated but status cannot revert from publish to futureWorkaround: Use the wp-rest-bridge MCP server's create_content tool, which natively supports the date parameter for scheduling future posts. AIWU can still be used for SYNC (read-only) and for content management tasks that don't require future scheduling.
references/editorial-schema.md -- complete schema for editorial calendar .state.md files../wp-content-pipeline/references/content-brief-schema.md -- brief file format and frontmatter fields../wp-content-pipeline/references/site-config-schema.md -- site configuration defaults and cadence settings../wp-analytics/references/signals-feed-schema.md -- signals feed format for topic suggestionswp-content-pipeline -- publishes briefs created by the BRIEF step through the full pipeline workflowwp-analytics -- generates the signals feed consumed by the PLAN step for data-driven topic ideaswp-content -- content creation and management (provides create_content, list_content MCP tools)wp-social-email -- distribution channel scheduling (Buffer via buf_create_update, Mailchimp campaigns)wp-content-repurposing -- multi-format adaptation for social distribution channelsnpx skills add morrealev/wp-编辑规划器下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Generate or edit images via Gemini 3 Pro Image (Nano Banana Pro).
Batch-generate images via OpenAI Images API. Random prompt sampler + `index.html` gallery.
Generate spectrograms and feature-panel visualizations from audio with the songsee CLI.
Extract frames or short clips from videos using ffmpeg.
Search GIF providers with CLI/TUI, download results, and extract stills/sheets.
Category:media-generate