claude-plugin-wordpress-manager 2.12.2 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +8 -3
- package/CHANGELOG.md +94 -2
- package/agents/wp-accessibility-auditor.md +1 -1
- package/agents/wp-content-strategist.md +2 -2
- package/agents/wp-deployment-engineer.md +1 -1
- package/agents/wp-distribution-manager.md +1 -1
- package/agents/wp-monitoring-agent.md +1 -1
- package/agents/wp-performance-optimizer.md +1 -1
- package/agents/wp-security-auditor.md +1 -1
- package/agents/wp-site-manager.md +3 -3
- package/commands/wp-setup.md +2 -2
- package/docs/GUIDE.md +260 -21
- package/docs/VALIDATION.md +341 -0
- package/docs/guides/wp-ecommerce.md +4 -4
- package/docs/plans/2026-03-01-tier3-wcop-implementation.md +1 -1
- package/docs/plans/2026-03-01-tier4-5-implementation.md +1 -1
- package/docs/plans/2026-03-02-content-framework-architecture.md +612 -0
- package/docs/plans/2026-03-02-content-framework-strategic-reflections.md +228 -0
- package/docs/plans/2026-03-02-content-intelligence-phase2.md +560 -0
- package/docs/plans/2026-03-02-content-pipeline-phase1.md +456 -0
- package/docs/plans/2026-03-02-dashboard-kanban-design.md +761 -0
- package/docs/plans/2026-03-02-dashboard-kanban-implementation.md +598 -0
- package/docs/plans/2026-03-02-dashboard-strategy.md +363 -0
- package/docs/plans/2026-03-02-editorial-calendar-phase3.md +490 -0
- package/docs/validation/.gitkeep +0 -0
- package/docs/validation/dashboard.html +286 -0
- package/docs/validation/results.json +1705 -0
- package/package.json +16 -3
- package/scripts/context-scanner.mjs +446 -0
- package/scripts/dashboard-renderer.mjs +553 -0
- package/scripts/run-validation.mjs +1132 -0
- package/servers/wp-rest-bridge/build/server.js +17 -6
- package/servers/wp-rest-bridge/build/tools/index.js +0 -9
- package/servers/wp-rest-bridge/build/tools/plugin-repository.js +23 -31
- package/servers/wp-rest-bridge/build/tools/schema.js +10 -2
- package/servers/wp-rest-bridge/build/tools/unified-content.js +10 -2
- package/servers/wp-rest-bridge/build/wordpress.d.ts +0 -3
- package/servers/wp-rest-bridge/build/wordpress.js +16 -98
- package/servers/wp-rest-bridge/package.json +1 -0
- package/skills/wp-analytics/SKILL.md +153 -0
- package/skills/wp-analytics/references/signals-feed-schema.md +417 -0
- package/skills/wp-content/references/content-templates.md +1 -1
- package/skills/wp-content/references/seo-optimization.md +8 -8
- package/skills/wp-content-attribution/references/roi-calculation.md +1 -1
- package/skills/wp-content-attribution/references/utm-tracking-setup.md +5 -5
- package/skills/wp-content-generation/references/generation-workflow.md +2 -2
- package/skills/wp-content-pipeline/SKILL.md +461 -0
- package/skills/wp-content-pipeline/references/content-brief-schema.md +377 -0
- package/skills/wp-content-pipeline/references/site-config-schema.md +431 -0
- package/skills/wp-content-repurposing/references/auto-transform-pipeline.md +1 -1
- package/skills/wp-content-repurposing/references/email-newsletter.md +1 -1
- package/skills/wp-content-repurposing/references/platform-specs.md +2 -2
- package/skills/wp-content-repurposing/references/transform-templates.md +27 -27
- package/skills/wp-dashboard/SKILL.md +121 -0
- package/skills/wp-deploy/references/ssh-deploy.md +2 -2
- package/skills/wp-editorial-planner/SKILL.md +262 -0
- package/skills/wp-editorial-planner/references/editorial-schema.md +268 -0
- package/skills/wp-multilang-network/references/content-sync.md +3 -3
- package/skills/wp-multilang-network/references/network-architecture.md +1 -1
- package/skills/wp-multilang-network/references/seo-international.md +7 -7
- package/skills/wp-structured-data/references/schema-types.md +4 -4
- package/skills/wp-webhooks/references/payload-formats.md +3 -3
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
# Editorial Calendar & Content Planner (Phase 3) — Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
|
4
|
+
|
|
5
|
+
**Goal:** Enable strategic content planning over time with a monthly editorial calendar file that integrates with Phase 1 (content pipeline) and Phase 2 (signals intelligence) to convert planned entries into scheduled WordPress posts.
|
|
6
|
+
|
|
7
|
+
**Architecture:** A new `wp-editorial-planner` skill reads `.content-state/{YYYY-MM}-editorial.state.md` files and orchestrates a 4-step workflow: PLAN → BRIEF → SCHEDULE → SYNC. The calendar file uses Markdown tables (one per week) with YAML frontmatter for monthly goals and SEO targets. Calendar entries flow into `wp-content-pipeline` (Phase 1) as briefs and can be informed by `signals-feed.md` (Phase 2) for topic suggestions. Zero new TypeScript — all orchestration lives in skill prompts and MD schemas.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Markdown + YAML frontmatter, Claude Code skill system, existing MCP tools (`create_content`, `list_content`, `buf_create_update`, `mc_create_campaign`)
|
|
10
|
+
|
|
11
|
+
**Reference Docs:**
|
|
12
|
+
- Architecture: `docs/plans/2026-03-02-content-framework-architecture.md` (Sections 3.1–3.4)
|
|
13
|
+
- Phase 1 skill: `skills/wp-content-pipeline/SKILL.md` (brief format, publishing workflow)
|
|
14
|
+
- Phase 1 schemas: `skills/wp-content-pipeline/references/content-brief-schema.md`, `skills/wp-content-pipeline/references/site-config-schema.md`
|
|
15
|
+
- Phase 2 schema: `skills/wp-analytics/references/signals-feed-schema.md` (anomalies → topic suggestions)
|
|
16
|
+
- Existing skill pattern: `skills/wp-analytics/SKILL.md` (for SKILL.md structure reference)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
### Task 1: Create Editorial Calendar Schema Reference
|
|
21
|
+
|
|
22
|
+
**Files:**
|
|
23
|
+
- Create: `skills/wp-editorial-planner/references/editorial-schema.md`
|
|
24
|
+
|
|
25
|
+
**Step 1: Create the skill directory**
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
mkdir -p skills/wp-editorial-planner/references
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Step 2: Write the editorial calendar schema**
|
|
32
|
+
|
|
33
|
+
Create `skills/wp-editorial-planner/references/editorial-schema.md` with complete schema documentation. This file defines the YAML frontmatter and Markdown table structure for `{YYYY-MM}-editorial.state.md` files.
|
|
34
|
+
|
|
35
|
+
The schema must include these sections:
|
|
36
|
+
|
|
37
|
+
**A. Overview** — One paragraph: the editorial calendar is a monthly Markdown file with YAML frontmatter for goals/metadata and weekly Markdown tables for content planning. Each table row represents a content entry that progresses through statuses and bridges to Phase 1 briefs and Phase 2 signals.
|
|
38
|
+
|
|
39
|
+
**B. Frontmatter fields** with types, required/optional, and defaults:
|
|
40
|
+
|
|
41
|
+
| Field | Type | Required | Default | Description |
|
|
42
|
+
|-------|------|----------|---------|-------------|
|
|
43
|
+
| `calendar_id` | string | Yes | — | Format: `CAL-YYYY-MM` |
|
|
44
|
+
| `site_id` | string | Yes | — | Must match `.content-state/{site_id}.config.md` |
|
|
45
|
+
| `period` | string | Yes | — | Format: `YYYY-MM-DD..YYYY-MM-DD` (month boundaries) |
|
|
46
|
+
| `created` | ISO 8601 date | Yes | — | Date the calendar was first created |
|
|
47
|
+
| `last_updated` | ISO 8601 date | Yes | — | Auto-updated on each modification |
|
|
48
|
+
| `status` | enum | No | active | `active \| archived` |
|
|
49
|
+
| `goals.posts_target` | integer | Yes | — | Total posts planned for the month |
|
|
50
|
+
| `goals.posts_published` | integer | No | 0 | Counter updated by SYNC step |
|
|
51
|
+
| `goals.focus_topics` | string[] | No | [] | Topic clusters to prioritize |
|
|
52
|
+
| `goals.seo_targets` | object[] | No | [] | Each: `{keyword, target_position}` |
|
|
53
|
+
|
|
54
|
+
**C. Weekly table structure** — The body contains one `## Settimana N (date range)` section per week, each with a Markdown table:
|
|
55
|
+
|
|
56
|
+
| Column | Type | Description |
|
|
57
|
+
|--------|------|-------------|
|
|
58
|
+
| Data | date | Planned publication date (format: `Mon DD`) |
|
|
59
|
+
| Titolo | string | Content title, or `[da assegnare]` if not yet defined |
|
|
60
|
+
| Tipo | enum | `post \| page \| custom_type` |
|
|
61
|
+
| Status | enum | `planned \| draft \| ready \| scheduled \| published` |
|
|
62
|
+
| Brief ID | string | Reference to `.brief.md` file (format: `BRF-YYYY-NNN`), or `—` |
|
|
63
|
+
| Post ID | integer | WordPress post ID after creation, or `—` |
|
|
64
|
+
| Canali | string | Comma-separated distribution channels, or `—` |
|
|
65
|
+
|
|
66
|
+
**D. Entry status lifecycle:**
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
planned → draft → ready → scheduled → published
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- `planned`: Slot reserved, title may be `[da assegnare]`
|
|
73
|
+
- `draft`: Title assigned, brief created in `pipeline-active/` with `status: draft`
|
|
74
|
+
- `ready`: Brief content finalized, `status: ready` in brief file
|
|
75
|
+
- `scheduled`: WordPress post created with `status: future` and scheduled date
|
|
76
|
+
- `published`: WordPress post is live (confirmed by SYNC step)
|
|
77
|
+
|
|
78
|
+
**E. Integration with Phase 1 (Content Pipeline):**
|
|
79
|
+
- Each calendar entry with a Brief ID references a file in `.content-state/pipeline-active/BRF-YYYY-NNN.brief.md`
|
|
80
|
+
- When BRIEF step creates a new brief, it uses the site config defaults from `.content-state/{site_id}.config.md`
|
|
81
|
+
- The brief's `target.scheduled_date` is set from the calendar entry's Data column
|
|
82
|
+
- The brief's `distribution.channels` is set from the calendar entry's Canali column
|
|
83
|
+
- When `wp-content-pipeline` archives a brief (status: published), the SYNC step updates the calendar entry accordingly
|
|
84
|
+
|
|
85
|
+
**F. Integration with Phase 2 (Signals Intelligence):**
|
|
86
|
+
- The PLAN step can read `.content-state/signals-feed.md` to suggest topics for `[da assegnare]` entries
|
|
87
|
+
- Anomalies from the signals feed with action "Investigate: content cluster opportunity" are prime candidates for planned entries
|
|
88
|
+
- The `goals.focus_topics` field can be informed by high-scoring signal patterns
|
|
89
|
+
|
|
90
|
+
**G. Notes section:**
|
|
91
|
+
- The body may end with a `# Note` section containing free-form editorial notes
|
|
92
|
+
- Common uses: newsletter aggregation rules, distribution timing preferences, topic dependencies on signals data
|
|
93
|
+
|
|
94
|
+
**H. File naming convention:**
|
|
95
|
+
- Format: `.content-state/{YYYY-MM}-editorial.state.md`
|
|
96
|
+
- One file per month per site (the `site_id` is in the frontmatter, not the filename)
|
|
97
|
+
- Previous months' calendars remain in `.content-state/` with `status: archived`
|
|
98
|
+
- Files are gitignored (site-specific instance data)
|
|
99
|
+
|
|
100
|
+
**I. Example calendar** — A complete, realistic example for mysite March 2026 with:
|
|
101
|
+
- Frontmatter: calendar_id CAL-2026-03, 8 posts target, 2 published, focus topics, 2 SEO targets
|
|
102
|
+
- 4 weekly tables with mixed statuses (published, ready, draft, planned)
|
|
103
|
+
- `[da assegnare]` entries for weeks 3-4
|
|
104
|
+
- Notes section referencing signals-feed.md and newsletter/LinkedIn timing
|
|
105
|
+
|
|
106
|
+
Use the exact example from the architecture doc (section 3.2).
|
|
107
|
+
|
|
108
|
+
**J. Validation rules:**
|
|
109
|
+
- `calendar_id` must follow `CAL-YYYY-MM` format
|
|
110
|
+
- `site_id` must match an existing `.content-state/{site_id}.config.md`
|
|
111
|
+
- `period` must span exactly one calendar month
|
|
112
|
+
- Each table must have all 7 columns
|
|
113
|
+
- `Status` must be one of the 5 valid values
|
|
114
|
+
- `Brief ID` must follow `BRF-YYYY-NNN` format when present
|
|
115
|
+
- `Post ID` must be a positive integer when present
|
|
116
|
+
- `goals.posts_published` must not exceed `goals.posts_target`
|
|
117
|
+
- Entries with `status: scheduled` or `status: published` must have a Post ID
|
|
118
|
+
|
|
119
|
+
**Step 3: Verify file exists**
|
|
120
|
+
|
|
121
|
+
Run: `head -5 skills/wp-editorial-planner/references/editorial-schema.md`
|
|
122
|
+
|
|
123
|
+
Expected: `# Editorial Calendar Schema` header.
|
|
124
|
+
|
|
125
|
+
**Step 4: Commit**
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
git add skills/wp-editorial-planner/
|
|
129
|
+
git commit -m "feat(editorial-calendar): add editorial calendar schema reference
|
|
130
|
+
|
|
131
|
+
Defines {YYYY-MM}-editorial.state.md structure with monthly goals,
|
|
132
|
+
weekly Markdown tables, 5-status lifecycle (planned → published),
|
|
133
|
+
and integration with Phase 1 briefs and Phase 2 signals feed."
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
### Task 2: Create `wp-editorial-planner` SKILL.md
|
|
139
|
+
|
|
140
|
+
**Files:**
|
|
141
|
+
- Create: `skills/wp-editorial-planner/SKILL.md`
|
|
142
|
+
|
|
143
|
+
**Step 1: Write the skill definition**
|
|
144
|
+
|
|
145
|
+
Create `skills/wp-editorial-planner/SKILL.md` following the established pattern from `skills/wp-content-pipeline/SKILL.md` and `skills/wp-analytics/SKILL.md`.
|
|
146
|
+
|
|
147
|
+
**Header (frontmatter):**
|
|
148
|
+
```yaml
|
|
149
|
+
---
|
|
150
|
+
name: wp-editorial-planner
|
|
151
|
+
description: This skill should be used when the user asks to "create an editorial
|
|
152
|
+
plan", "update the calendar", "schedule posts", "plan content for March",
|
|
153
|
+
"convert calendar to briefs", "sync calendar with WordPress", "show editorial
|
|
154
|
+
status", or mentions planning content over time. Orchestrates monthly editorial
|
|
155
|
+
calendars that bridge signals intelligence to content publishing.
|
|
156
|
+
version: 1.0.0
|
|
157
|
+
---
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Sections to include:**
|
|
161
|
+
|
|
162
|
+
1. **Overview** — One paragraph: the editorial planner manages monthly content calendars as `.state.md` files. It reads site config for cadence, optionally consumes signals feed for topic ideas, and produces briefs that flow into the content pipeline. Four-step workflow: PLAN → BRIEF → SCHEDULE → SYNC.
|
|
163
|
+
|
|
164
|
+
2. **When to Use** — Bullet list:
|
|
165
|
+
- User wants to create a new monthly editorial plan
|
|
166
|
+
- User asks to update or view the current calendar
|
|
167
|
+
- User wants to convert planned entries into content briefs
|
|
168
|
+
- User asks to schedule ready briefs as WordPress future posts
|
|
169
|
+
- User wants to sync WordPress publish status back to the calendar
|
|
170
|
+
- User mentions "piano editoriale", "calendario", "schedula"
|
|
171
|
+
|
|
172
|
+
3. **Workflow Overview:**
|
|
173
|
+
```
|
|
174
|
+
PLAN → BRIEF → SCHEDULE → SYNC
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
4. **Step 1: PLAN — Create or update editorial calendar**
|
|
178
|
+
|
|
179
|
+
**When to run**: User asks to create a new plan or update existing one.
|
|
180
|
+
|
|
181
|
+
**Procedure:**
|
|
182
|
+
1. Read `.content-state/{site_id}.config.md` for:
|
|
183
|
+
- `cadence.posts_per_week` → calculate `goals.posts_target` (posts_per_week × weeks in month)
|
|
184
|
+
- `cadence.preferred_days` → determine which days to assign entries
|
|
185
|
+
- `cadence.publish_time` → note for scheduling step
|
|
186
|
+
- `defaults.categories`, `defaults.content_type` → pre-fill entry Tipo
|
|
187
|
+
2. Read `.content-state/signals-feed.md` if it exists:
|
|
188
|
+
- Extract anomalies with action containing "content cluster" or "Investigate"
|
|
189
|
+
- Suggest these as topics for `[da assegnare]` entries
|
|
190
|
+
- Present suggestions to user for approval
|
|
191
|
+
3. Optionally: if user wants strategic planning, suggest invoking GenMarketing for content calendar strategy
|
|
192
|
+
4. Generate or update `.content-state/{YYYY-MM}-editorial.state.md`:
|
|
193
|
+
- Create YAML frontmatter with calendar_id, site_id, period, goals
|
|
194
|
+
- Create weekly tables with one row per preferred_day
|
|
195
|
+
- Fill known titles, leave others as `[da assegnare]`
|
|
196
|
+
- Set all new entries as `status: planned`
|
|
197
|
+
5. Present the calendar to user for review
|
|
198
|
+
|
|
199
|
+
**Safety rules:**
|
|
200
|
+
- ALWAYS show the generated calendar to user before writing
|
|
201
|
+
- If a calendar for the month already exists, show diff and ask before overwriting
|
|
202
|
+
- Preserve existing entries that have `status: draft` or higher (don't reset them to planned)
|
|
203
|
+
|
|
204
|
+
5. **Step 2: BRIEF — Convert calendar entries to brief files**
|
|
205
|
+
|
|
206
|
+
**When to run**: User asks to "create briefs from calendar" or "convert planned entries to briefs".
|
|
207
|
+
|
|
208
|
+
**Procedure:**
|
|
209
|
+
1. Read the current editorial calendar `.state.md`
|
|
210
|
+
2. For each entry with `status: planned` AND a defined title (not `[da assegnare]`):
|
|
211
|
+
a. Generate a new `brief_id` as `BRF-YYYY-NNN` (sequential, check existing briefs)
|
|
212
|
+
b. Read `.content-state/{site_id}.config.md` for defaults
|
|
213
|
+
c. Create `.content-state/pipeline-active/{brief_id}.brief.md` with:
|
|
214
|
+
- `source.skill: wp-editorial-planner`
|
|
215
|
+
- `source.domain: editorial-calendar`
|
|
216
|
+
- `target.site_id`: from calendar
|
|
217
|
+
- `target.content_type`: from entry Tipo column
|
|
218
|
+
- `target.scheduled_date`: from entry Data column (convert to ISO 8601)
|
|
219
|
+
- `target.categories`: from site config defaults
|
|
220
|
+
- `distribution.channels`: from entry Canali column (parse comma-separated)
|
|
221
|
+
- `content.title`: from entry Titolo column
|
|
222
|
+
- `status: draft` (brief starts as draft, user fills content)
|
|
223
|
+
d. Update calendar entry: `status: planned → draft`, set Brief ID
|
|
224
|
+
3. For entries with existing Brief ID (already has a brief): skip creation, just verify brief file exists
|
|
225
|
+
4. Write updated calendar back to `.state.md`
|
|
226
|
+
5. Report: "N brief creati in pipeline-active/. Compila il contenuto e imposta status: ready."
|
|
227
|
+
|
|
228
|
+
**Safety rules:**
|
|
229
|
+
- NEVER create briefs for entries with `[da assegnare]` title — report them as needing titles first
|
|
230
|
+
- NEVER overwrite existing brief files — if Brief ID already exists, skip and report
|
|
231
|
+
- Show summary of briefs to be created and ask user confirmation before writing
|
|
232
|
+
|
|
233
|
+
6. **Step 3: SCHEDULE — Convert ready briefs to WordPress scheduled posts**
|
|
234
|
+
|
|
235
|
+
**When to run**: User asks to "schedule ready posts" or "schedula i post pronti".
|
|
236
|
+
|
|
237
|
+
**Procedure:**
|
|
238
|
+
1. Read the current editorial calendar `.state.md`
|
|
239
|
+
2. For each entry with `status: ready`:
|
|
240
|
+
a. Read the corresponding brief file from `pipeline-active/{brief_id}.brief.md`
|
|
241
|
+
b. Verify brief has `status: ready` (consistency check)
|
|
242
|
+
c. Create WordPress post:
|
|
243
|
+
```
|
|
244
|
+
create_content:
|
|
245
|
+
content_type: {entry.Tipo}
|
|
246
|
+
title: {brief.content.title}
|
|
247
|
+
content: {brief body markdown}
|
|
248
|
+
excerpt: {brief.content.excerpt}
|
|
249
|
+
status: "future"
|
|
250
|
+
date: {entry.Data as ISO 8601 datetime with site config publish_time}
|
|
251
|
+
slug: {auto-generated from title}
|
|
252
|
+
```
|
|
253
|
+
d. Assign taxonomy terms:
|
|
254
|
+
```
|
|
255
|
+
assign_terms_to_content:
|
|
256
|
+
content_type: {entry.Tipo}
|
|
257
|
+
id: {post_id}
|
|
258
|
+
categories: {brief.target.categories}
|
|
259
|
+
tags: {brief.target.tags}
|
|
260
|
+
```
|
|
261
|
+
e. Update calendar entry: `status: ready → scheduled`, set Post ID
|
|
262
|
+
f. Update brief: add `post_id` and `post_url` to frontmatter
|
|
263
|
+
3. If entry has `distribution.channels` (from Canali column):
|
|
264
|
+
- Compute `scheduled_at` using the entry date + `config.cadence.publish_time` + `distribution.schedule_offset_hours`
|
|
265
|
+
- For Buffer: `buf_create_update` with `scheduled_at`
|
|
266
|
+
- For Mailchimp: note for manual campaign creation (not auto-scheduled)
|
|
267
|
+
4. Write updated calendar back to `.state.md`
|
|
268
|
+
5. Report: "N post schedulati su WordPress. Verranno pubblicati automaticamente alla data prevista."
|
|
269
|
+
|
|
270
|
+
**Safety rules:**
|
|
271
|
+
- ALWAYS create WP post as `status: future` (never directly `publish`)
|
|
272
|
+
- ALWAYS confirm with user before scheduling, showing the list of posts and dates
|
|
273
|
+
- If `create_content` fails → stop, report error, keep entry as `ready`
|
|
274
|
+
- Verify the scheduled date is in the future before calling `create_content`
|
|
275
|
+
|
|
276
|
+
7. **Step 4: SYNC — Synchronize WordPress status back to calendar**
|
|
277
|
+
|
|
278
|
+
**When to run**: User asks to "sync calendar" or "aggiorna stato calendario".
|
|
279
|
+
|
|
280
|
+
**Procedure:**
|
|
281
|
+
1. Read the current editorial calendar `.state.md`
|
|
282
|
+
2. For each entry with a Post ID (status: scheduled or published):
|
|
283
|
+
a. Call `list_content` with content_type and filter by post ID:
|
|
284
|
+
```
|
|
285
|
+
list_content:
|
|
286
|
+
content_type: {entry.Tipo}
|
|
287
|
+
search: {post_id}
|
|
288
|
+
per_page: 1
|
|
289
|
+
```
|
|
290
|
+
b. Check the returned post status:
|
|
291
|
+
- If WP status = `publish` and calendar status = `scheduled` → update to `published`
|
|
292
|
+
- If WP status = `future` → keep as `scheduled`
|
|
293
|
+
- If WP status = `draft` → note: post was reverted, update calendar to `draft`
|
|
294
|
+
- If WP status = `trash` → note: post was deleted, report to user
|
|
295
|
+
3. Recalculate `goals.posts_published` = count of entries with `status: published`
|
|
296
|
+
4. Write updated calendar back to `.state.md`
|
|
297
|
+
5. Report:
|
|
298
|
+
```
|
|
299
|
+
Sync calendario {calendar_id}:
|
|
300
|
+
- Post pubblicati: {posts_published}/{posts_target}
|
|
301
|
+
- Post schedulati: {scheduled_count}
|
|
302
|
+
- Post in lavorazione: {draft_count + ready_count}
|
|
303
|
+
- Slot da assegnare: {planned_count}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**Safety rules:**
|
|
307
|
+
- NEVER modify WordPress post status during sync — sync is read-only from WP
|
|
308
|
+
- If a post was deleted/trashed, report to user but don't remove the calendar entry (mark with a note)
|
|
309
|
+
|
|
310
|
+
8. **Creating a Calendar Manually** — Quick procedure for users:
|
|
311
|
+
- Copy structure from schema reference example
|
|
312
|
+
- Fill in site_id, dates, and known titles
|
|
313
|
+
- Set `status: planned` for all entries
|
|
314
|
+
- Then run BRIEF step to generate brief files
|
|
315
|
+
|
|
316
|
+
9. **Safety Rules Summary:**
|
|
317
|
+
- ALWAYS show calendar/briefs to user before writing
|
|
318
|
+
- ALWAYS create WP posts as `status: future` (never `publish` directly)
|
|
319
|
+
- NEVER overwrite existing briefs or calendar entries with higher status
|
|
320
|
+
- NEVER modify WP posts during SYNC (read-only)
|
|
321
|
+
- ALWAYS confirm before scheduling posts
|
|
322
|
+
- LOG all scheduling actions in the calendar
|
|
323
|
+
|
|
324
|
+
10. **Reference Files:**
|
|
325
|
+
- `references/editorial-schema.md`
|
|
326
|
+
- `../wp-content-pipeline/references/content-brief-schema.md` (brief format)
|
|
327
|
+
- `../wp-content-pipeline/references/site-config-schema.md` (site defaults)
|
|
328
|
+
- `../wp-analytics/references/signals-feed-schema.md` (topic suggestions)
|
|
329
|
+
|
|
330
|
+
11. **Related Skills:**
|
|
331
|
+
- `wp-content-pipeline` — publishes briefs created by the BRIEF step
|
|
332
|
+
- `wp-analytics` — generates signals feed consumed by the PLAN step
|
|
333
|
+
- `wp-content` — content creation and management (provides `create_content`, `list_content`)
|
|
334
|
+
- `wp-social-email` — distribution channel scheduling (Buffer, Mailchimp)
|
|
335
|
+
- `wp-content-repurposing` — multi-format adaptation for social distribution
|
|
336
|
+
|
|
337
|
+
**Step 2: Verify SKILL.md follows plugin conventions**
|
|
338
|
+
|
|
339
|
+
Run: `head -10 skills/wp-editorial-planner/SKILL.md`
|
|
340
|
+
|
|
341
|
+
Expected: YAML frontmatter with `name: wp-editorial-planner`.
|
|
342
|
+
|
|
343
|
+
**Step 3: Commit**
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
git add skills/wp-editorial-planner/SKILL.md
|
|
347
|
+
git commit -m "feat(editorial-calendar): add wp-editorial-planner skill
|
|
348
|
+
|
|
349
|
+
Orchestrates monthly editorial calendars with 4-step workflow:
|
|
350
|
+
PLAN (create calendar from config + signals) → BRIEF (convert entries
|
|
351
|
+
to pipeline briefs) → SCHEDULE (create WP future posts) → SYNC
|
|
352
|
+
(bidirectional status update from WordPress)."
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
### Task 3: Create Example Editorial Calendar Instance
|
|
358
|
+
|
|
359
|
+
**Files:**
|
|
360
|
+
- Create: `.content-state/2026-03-editorial.state.md`
|
|
361
|
+
|
|
362
|
+
**Step 1: Write a realistic test calendar**
|
|
363
|
+
|
|
364
|
+
Create `.content-state/2026-03-editorial.state.md` with the exact example from the architecture doc (section 3.2):
|
|
365
|
+
|
|
366
|
+
- Frontmatter: calendar_id CAL-2026-03, site_id mysite, period 2026-03-01..2026-03-31, 8 posts target, 2 published, focus topics, 2 SEO targets
|
|
367
|
+
- 4 weekly tables with realistic mysite content:
|
|
368
|
+
- Week 1: 2 published entries with brief IDs and post IDs
|
|
369
|
+
- Week 2: 1 ready + 1 draft entry with brief IDs
|
|
370
|
+
- Week 3: 2 planned entries with `[da assegnare]`
|
|
371
|
+
- Week 4: 2 planned entries with `[da assegnare]`
|
|
372
|
+
- Notes section: signals-feed reference for weeks 3-4, newsletter timing, LinkedIn timing
|
|
373
|
+
|
|
374
|
+
**Step 2: Verify calendar structure**
|
|
375
|
+
|
|
376
|
+
Run: `head -15 .content-state/2026-03-editorial.state.md`
|
|
377
|
+
|
|
378
|
+
Expected: YAML frontmatter with `calendar_id: "CAL-2026-03"` and `status: active`.
|
|
379
|
+
|
|
380
|
+
**Step 3: No commit** — this file is gitignored (instance data).
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### Task 4: Update Architecture Doc Status
|
|
385
|
+
|
|
386
|
+
**Files:**
|
|
387
|
+
- Modify: `docs/plans/2026-03-02-content-framework-architecture.md`
|
|
388
|
+
|
|
389
|
+
**Step 1: Update status and checklist**
|
|
390
|
+
|
|
391
|
+
- Change `**Stato**: Fase 2 Implementata` to `**Stato**: Fase 3 Implementata`
|
|
392
|
+
- Check off Phase 3 acceptance criteria:
|
|
393
|
+
```markdown
|
|
394
|
+
### Fase 3: Editorial Calendar
|
|
395
|
+
|
|
396
|
+
- [x] `editorial.schema.md` definito con tabelle settimanali
|
|
397
|
+
- [x] `wp-editorial-planner` skill creata con 4 workflow steps
|
|
398
|
+
- [x] Conversione calendar entry → brief automatica
|
|
399
|
+
- [x] Scheduling WP post con status=future funzionante
|
|
400
|
+
- [ ] Sync bidirezionale: WP publish status → calendar update
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
Note: "Sync bidirezionale" left unchecked — requires a live WP test with actual scheduled/published posts, same as previous phases' e2e tests.
|
|
404
|
+
|
|
405
|
+
**Step 2: Commit**
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
git add docs/plans/2026-03-02-content-framework-architecture.md
|
|
409
|
+
git commit -m "docs: update architecture status — Phase 3 implemented
|
|
410
|
+
|
|
411
|
+
Editorial calendar schema, wp-editorial-planner skill with 4-step
|
|
412
|
+
workflow (PLAN → BRIEF → SCHEDULE → SYNC) in place. Live sync test
|
|
413
|
+
pending."
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
### Task 5: Update GUIDE.md with Phase 3 Documentation
|
|
419
|
+
|
|
420
|
+
**Files:**
|
|
421
|
+
- Modify: `docs/GUIDE.md`
|
|
422
|
+
|
|
423
|
+
**Step 1: Read current Content Framework section**
|
|
424
|
+
|
|
425
|
+
Find the last subsection in the Content Framework section (should be 17.5 from Phase 2).
|
|
426
|
+
|
|
427
|
+
**Step 2: Add Editorial Calendar subsection**
|
|
428
|
+
|
|
429
|
+
After the Phase 2 subsection, add:
|
|
430
|
+
|
|
431
|
+
```markdown
|
|
432
|
+
### 17.6 Editorial Calendar (Phase 3)
|
|
433
|
+
|
|
434
|
+
**Skill**: `wp-editorial-planner`
|
|
435
|
+
|
|
436
|
+
The editorial planner manages monthly content calendars as `.state.md` files, bridging strategic planning to tactical execution.
|
|
437
|
+
|
|
438
|
+
**Workflow**: `PLAN → BRIEF → SCHEDULE → SYNC`
|
|
439
|
+
|
|
440
|
+
| Step | Action | Input | Output |
|
|
441
|
+
|------|--------|-------|--------|
|
|
442
|
+
| PLAN | Create monthly calendar | site config + signals feed | `{YYYY-MM}-editorial.state.md` |
|
|
443
|
+
| BRIEF | Convert entries to briefs | calendar entries | `pipeline-active/BRF-*.brief.md` |
|
|
444
|
+
| SCHEDULE | Create WP future posts | ready briefs | WordPress posts with `status: future` |
|
|
445
|
+
| SYNC | Update calendar from WP | WordPress post status | Updated calendar entries |
|
|
446
|
+
|
|
447
|
+
**Calendar structure**:
|
|
448
|
+
- One `.content-state/{YYYY-MM}-editorial.state.md` per month
|
|
449
|
+
- YAML frontmatter: monthly goals, posts target, focus topics, SEO targets
|
|
450
|
+
- Markdown tables: one per week with columns Data, Titolo, Tipo, Status, Brief ID, Post ID, Canali
|
|
451
|
+
|
|
452
|
+
**Entry lifecycle**: `planned → draft → ready → scheduled → published`
|
|
453
|
+
|
|
454
|
+
**Cross-phase integration**:
|
|
455
|
+
- Phase 2 signals → topic suggestions for `[da assegnare]` entries
|
|
456
|
+
- Calendar entries → Phase 1 briefs → WordPress publishing pipeline
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
**Step 3: Commit**
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
git add docs/GUIDE.md
|
|
463
|
+
git commit -m "docs: add Editorial Calendar (Phase 3) section to GUIDE.md
|
|
464
|
+
|
|
465
|
+
Documents the 4-step editorial planning workflow, calendar structure,
|
|
466
|
+
entry lifecycle, and cross-phase integration with signals and pipeline."
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## Summary
|
|
472
|
+
|
|
473
|
+
| Task | Deliverable | Type |
|
|
474
|
+
|------|-------------|------|
|
|
475
|
+
| 1 | `editorial-schema.md` | Schema reference |
|
|
476
|
+
| 2 | `wp-editorial-planner/SKILL.md` | Core skill (new) |
|
|
477
|
+
| 3 | `2026-03-editorial.state.md` | Test artifact (gitignored) |
|
|
478
|
+
| 4 | Architecture doc status update | Documentation |
|
|
479
|
+
| 5 | GUIDE.md Editorial Calendar section | Documentation |
|
|
480
|
+
|
|
481
|
+
**Total new files**: 2 tracked + 1 gitignored instance
|
|
482
|
+
**Total modified files**: 2 (architecture doc, GUIDE.md)
|
|
483
|
+
**New TypeScript**: 0
|
|
484
|
+
|
|
485
|
+
**Acceptance Criteria (from architecture doc):**
|
|
486
|
+
- [x] `editorial.schema.md` defined with weekly tables → Task 1
|
|
487
|
+
- [x] `wp-editorial-planner` skill with 4 workflow steps → Task 2
|
|
488
|
+
- [x] Calendar entry → brief automatic conversion → Task 2 (Step 2: BRIEF)
|
|
489
|
+
- [x] WP scheduling with status=future → Task 2 (Step 3: SCHEDULE)
|
|
490
|
+
- [ ] Bidirectional sync: WP publish status → calendar update → Manual test (post-implementation)
|
|
File without changes
|