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,431 @@
|
|
|
1
|
+
# Site Configuration Schema
|
|
2
|
+
|
|
3
|
+
Schema reference for `.config.md` files -- per-site configuration that the `wp-content-pipeline` skill reads when processing briefs.
|
|
4
|
+
|
|
5
|
+
Config files live in `.content-state/` with the naming pattern `{site_id}.config.md`. They are gitignored because they contain site-specific values (profile IDs, audience IDs) that vary per environment.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## File Format
|
|
10
|
+
|
|
11
|
+
Each `.config.md` file consists of:
|
|
12
|
+
|
|
13
|
+
1. **YAML frontmatter** between `---` delimiters (structured configuration)
|
|
14
|
+
2. **Markdown body** after the closing `---` (free-form notes for Claude context)
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
---
|
|
18
|
+
site_id: mysite
|
|
19
|
+
site_url: https://mysite.example.com
|
|
20
|
+
last_updated: 2026-03-02
|
|
21
|
+
# ... other fields ...
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Notes
|
|
25
|
+
|
|
26
|
+
Free-form context that Claude uses when generating or adapting content for this site...
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Frontmatter Fields
|
|
32
|
+
|
|
33
|
+
### `site_id`
|
|
34
|
+
|
|
35
|
+
| Property | Value |
|
|
36
|
+
|----------|-------|
|
|
37
|
+
| Type | `string` |
|
|
38
|
+
| Required | **Yes** |
|
|
39
|
+
| Format | Lowercase alphanumeric with hyphens |
|
|
40
|
+
| Example | `mysite` |
|
|
41
|
+
|
|
42
|
+
Unique identifier for the site. **Must match** the `id` field in the `WP_SITES_CONFIG` environment variable JSON array. This is how the pipeline resolves WordPress credentials (URL, username, app password) for API calls.
|
|
43
|
+
|
|
44
|
+
### `site_url`
|
|
45
|
+
|
|
46
|
+
| Property | Value |
|
|
47
|
+
|----------|-------|
|
|
48
|
+
| Type | `string` (URL) |
|
|
49
|
+
| Required | **Yes** |
|
|
50
|
+
| Format | `https://example.com` (no trailing slash) |
|
|
51
|
+
| Example | `https://mysite.example.com` |
|
|
52
|
+
|
|
53
|
+
The public-facing URL of the WordPress site. Used for constructing internal links and verifying published content. Should match the `url` field in `WP_SITES_CONFIG`.
|
|
54
|
+
|
|
55
|
+
### `last_updated`
|
|
56
|
+
|
|
57
|
+
| Property | Value |
|
|
58
|
+
|----------|-------|
|
|
59
|
+
| Type | `string` (ISO 8601 date) |
|
|
60
|
+
| Required | No |
|
|
61
|
+
| Default | Date of file creation |
|
|
62
|
+
| Example | `2026-03-02` |
|
|
63
|
+
|
|
64
|
+
Date when this config was last reviewed or modified. Helps track staleness -- configs older than 90 days should be reviewed for accuracy.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### `brand` block
|
|
69
|
+
|
|
70
|
+
Defines the brand voice and editorial identity for the site. These values provide Claude with the context needed to generate on-brand content.
|
|
71
|
+
|
|
72
|
+
When `GenBrand` produces brand analysis output, those results map directly into this block. See [Integration Notes](#integration-notes) for the mapping.
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
brand:
|
|
76
|
+
tone: professional, accessible, sustainability-focused
|
|
77
|
+
language: it
|
|
78
|
+
style_notes: |
|
|
79
|
+
Voice: warm but authoritative. Avoid corporate jargon.
|
|
80
|
+
Always emphasize the Mediterranean heritage and natural ingredients.
|
|
81
|
+
Use "noi" (we) when referring to the company.
|
|
82
|
+
Sustainability is a core value, not a marketing angle.
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
| Field | Type | Required | Default | Description |
|
|
86
|
+
|-------|------|----------|---------|-------------|
|
|
87
|
+
| `tone` | `string` | **Yes** | -- | Comma-separated tone descriptors. Used by Claude to calibrate writing style. Examples: `professional, warm`, `casual, witty`, `technical, precise` |
|
|
88
|
+
| `language` | `string` | **Yes** | -- | ISO 639-1 language code for the site's primary content language. Affects content generation, SEO, and readability scoring |
|
|
89
|
+
| `style_notes` | `string` (multi-line) | No | `null` | Free-form editorial guidelines in YAML literal block scalar (`|`) format. Can include voice rules, banned words, preferred terminology, formatting conventions. No length limit |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
### `defaults` block
|
|
94
|
+
|
|
95
|
+
Default values applied to briefs when the brief does not specify them explicitly. Brief-level values always override these defaults.
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
defaults:
|
|
99
|
+
content_type: post
|
|
100
|
+
status: draft
|
|
101
|
+
categories:
|
|
102
|
+
- blog
|
|
103
|
+
author: editorial-team
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
| Field | Type | Required | Default | Description |
|
|
107
|
+
|-------|------|----------|---------|-------------|
|
|
108
|
+
| `content_type` | `string` | No | `post` | Default WordPress content type: `post`, `page`, or any registered custom post type |
|
|
109
|
+
| `status` | `string` | No | `draft` | Default WordPress post status: `draft`, `pending`, `publish`, `future`, `private` |
|
|
110
|
+
| `categories` | `string[]` | No | `[]` | Default category slugs applied when a brief omits categories |
|
|
111
|
+
| `author` | `string` | No | `null` | Default WordPress username or slug for post attribution. If `null`, uses the authenticated user from `WP_SITES_CONFIG` |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### `channels` block
|
|
116
|
+
|
|
117
|
+
Configures external distribution channels for the site. Each sub-key is a channel name with its own configuration. The pipeline reads this block to determine which channels are available and their credentials.
|
|
118
|
+
|
|
119
|
+
```yaml
|
|
120
|
+
channels:
|
|
121
|
+
linkedin:
|
|
122
|
+
enabled: true
|
|
123
|
+
profile_id: "urn:li:person:AbCdEf123"
|
|
124
|
+
format: professional
|
|
125
|
+
twitter:
|
|
126
|
+
enabled: true
|
|
127
|
+
format: concise
|
|
128
|
+
buffer:
|
|
129
|
+
enabled: false
|
|
130
|
+
profile_id: "buf_profile_abc123"
|
|
131
|
+
format: casual
|
|
132
|
+
mailchimp:
|
|
133
|
+
enabled: true
|
|
134
|
+
audience_id: "mc_aud_xyz789"
|
|
135
|
+
segment: newsletter-subscribers
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### Channel: `linkedin`
|
|
139
|
+
|
|
140
|
+
| Field | Type | Required | Default | Description |
|
|
141
|
+
|-------|------|----------|---------|-------------|
|
|
142
|
+
| `enabled` | `boolean` | **Yes** | -- | Whether LinkedIn distribution is active for this site |
|
|
143
|
+
| `profile_id` | `string` | Yes (if enabled) | -- | LinkedIn profile URN. Required by `li_create_post` MCP tool. Format: `urn:li:person:XXXXX` or `urn:li:organization:XXXXX` |
|
|
144
|
+
| `format` | `string` | No | `professional` | Content adaptation style: `professional`, `thought-leadership`, `casual` |
|
|
145
|
+
|
|
146
|
+
#### Channel: `twitter`
|
|
147
|
+
|
|
148
|
+
| Field | Type | Required | Default | Description |
|
|
149
|
+
|-------|------|----------|---------|-------------|
|
|
150
|
+
| `enabled` | `boolean` | **Yes** | -- | Whether Twitter/X distribution is active for this site |
|
|
151
|
+
| `format` | `string` | No | `concise` | Content adaptation style: `concise`, `thread`, `conversational` |
|
|
152
|
+
|
|
153
|
+
**Note:** Twitter tools (`tw_create_tweet`, `tw_create_thread`) authenticate via the MCP server configuration, so no `profile_id` is needed here.
|
|
154
|
+
|
|
155
|
+
#### Channel: `buffer`
|
|
156
|
+
|
|
157
|
+
| Field | Type | Required | Default | Description |
|
|
158
|
+
|-------|------|----------|---------|-------------|
|
|
159
|
+
| `enabled` | `boolean` | **Yes** | -- | Whether Buffer distribution is active for this site |
|
|
160
|
+
| `profile_id` | `string` | Yes (if enabled) | -- | Buffer profile ID. Required by `buf_create_update` MCP tool |
|
|
161
|
+
| `format` | `string` | No | `casual` | Content adaptation style: `professional`, `casual`, `promotional` |
|
|
162
|
+
|
|
163
|
+
#### Channel: `mailchimp`
|
|
164
|
+
|
|
165
|
+
| Field | Type | Required | Default | Description |
|
|
166
|
+
|-------|------|----------|---------|-------------|
|
|
167
|
+
| `enabled` | `boolean` | **Yes** | -- | Whether Mailchimp distribution is active for this site |
|
|
168
|
+
| `audience_id` | `string` | Yes (if enabled) | -- | Mailchimp audience/list ID. Required by `mc_create_campaign` MCP tool |
|
|
169
|
+
| `segment` | `string` | No | `null` | Mailchimp segment or tag to target within the audience. If `null`, sends to the full audience |
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### `seo` block
|
|
174
|
+
|
|
175
|
+
Site-level SEO defaults. These apply when a brief does not specify its own SEO parameters. Brief-level `seo` values always override these.
|
|
176
|
+
|
|
177
|
+
```yaml
|
|
178
|
+
seo:
|
|
179
|
+
default_schema: Article
|
|
180
|
+
min_score: 70
|
|
181
|
+
auto_internal_links: true
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
| Field | Type | Required | Default | Description |
|
|
185
|
+
|-------|------|----------|---------|-------------|
|
|
186
|
+
| `default_schema` | `string` | No | `Article` | Default JSON-LD schema type for content: `Article`, `BlogPosting`, `HowTo`, `FAQPage`, `Product`, `Recipe`, `NewsArticle` |
|
|
187
|
+
| `min_score` | `integer` (0-100) | No | `70` | Default value for `brief.gates.seo_score_min` when the brief omits that field. Does not enforce a gate directly -- the gate is enforced at the brief level |
|
|
188
|
+
| `auto_internal_links` | `boolean` | No | `true` | Automatically discover and suggest internal links based on existing site content. When `true`, the pipeline scans the site's published posts to find relevant linking opportunities |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### `cadence` block
|
|
193
|
+
|
|
194
|
+
Editorial calendar configuration. Used by Phase 3 planning features. In Phase 1, the pipeline reads `publish_time` as default when `target.scheduled_date` is set without an explicit time.
|
|
195
|
+
|
|
196
|
+
```yaml
|
|
197
|
+
cadence:
|
|
198
|
+
posts_per_week: 3
|
|
199
|
+
preferred_days:
|
|
200
|
+
- monday
|
|
201
|
+
- wednesday
|
|
202
|
+
- friday
|
|
203
|
+
publish_time: "09:00"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
| Field | Type | Required | Default | Description |
|
|
207
|
+
|-------|------|----------|---------|-------------|
|
|
208
|
+
| `posts_per_week` | `integer` | No | `2` | Target number of posts per week. Informs editorial planning and capacity alerts |
|
|
209
|
+
| `preferred_days` | `string[]` | No | `["monday", "thursday"]` | Preferred days of the week for publishing. Lowercase English day names |
|
|
210
|
+
| `publish_time` | `string` | No | `"09:00"` | Default publish time in `HH:MM` format (24-hour, site's local timezone). Applied when scheduling future posts without an explicit time |
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Body Section
|
|
215
|
+
|
|
216
|
+
The body section (after the closing `---`) is free-form Markdown that provides Claude with additional context about the site. This content is read by Claude when generating or adapting content but is not parsed as structured data.
|
|
217
|
+
|
|
218
|
+
Recommended content for the body section:
|
|
219
|
+
|
|
220
|
+
- **Brand story** -- brief narrative that Claude can reference for tone consistency
|
|
221
|
+
- **Product line** -- key products/services and how to reference them
|
|
222
|
+
- **Competitor notes** -- what to avoid saying, differentiation points
|
|
223
|
+
- **Seasonal considerations** -- recurring themes, campaigns, events
|
|
224
|
+
- **Terminology** -- preferred terms, abbreviations, translations
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Validation Rules
|
|
229
|
+
|
|
230
|
+
### Required Fields
|
|
231
|
+
|
|
232
|
+
These fields **must** be present for a config file to be valid:
|
|
233
|
+
|
|
234
|
+
| Field | Reason |
|
|
235
|
+
|-------|--------|
|
|
236
|
+
| `site_id` | Links config to `WP_SITES_CONFIG` credentials |
|
|
237
|
+
| `site_url` | Required for link construction and verification |
|
|
238
|
+
| `brand.tone` | Minimum brand voice definition |
|
|
239
|
+
| `brand.language` | Content language for generation and SEO |
|
|
240
|
+
|
|
241
|
+
### Channel Validation
|
|
242
|
+
|
|
243
|
+
For each channel where `enabled: true`:
|
|
244
|
+
|
|
245
|
+
| Channel | Required Field | MCP Tool |
|
|
246
|
+
|---------|---------------|----------|
|
|
247
|
+
| `linkedin` | `profile_id` | `li_create_post` |
|
|
248
|
+
| `buffer` | `profile_id` | `buf_create_update` |
|
|
249
|
+
| `mailchimp` | `audience_id` | `mc_create_campaign` |
|
|
250
|
+
| `twitter` | *(none)* | `tw_create_tweet`, `tw_create_thread` |
|
|
251
|
+
|
|
252
|
+
### Override Hierarchy
|
|
253
|
+
|
|
254
|
+
Brief-level values always take precedence over site config defaults:
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
Brief value > Site config default > System default
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Specific overrides:
|
|
261
|
+
- `brief.target.content_type` > `config.defaults.content_type`
|
|
262
|
+
- `brief.target.status` > `config.defaults.status`
|
|
263
|
+
- `brief.target.categories` > `config.defaults.categories`
|
|
264
|
+
- `brief.content.author` > `config.defaults.author`
|
|
265
|
+
- `brief.seo.schema_type` > `config.seo.default_schema`
|
|
266
|
+
- `brief.gates.seo_score_min` > `config.seo.min_score`
|
|
267
|
+
- `brief.distribution.channels` -- selects which enabled channels to use; cannot activate a channel the config has `enabled: false`
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Integration Notes
|
|
272
|
+
|
|
273
|
+
### GenBrand Output Mapping
|
|
274
|
+
|
|
275
|
+
The `GenBrand` skill produces brand analysis that maps to the `brand` block:
|
|
276
|
+
|
|
277
|
+
| GenBrand Output | Config Field | Notes |
|
|
278
|
+
|-----------------|-------------|-------|
|
|
279
|
+
| Voice/tone descriptors | `brand.tone` | Comma-separated list of tone attributes |
|
|
280
|
+
| Primary language | `brand.language` | ISO 639-1 code |
|
|
281
|
+
| Editorial guidelines | `brand.style_notes` | Multi-line YAML block scalar. Include voice rules, banned words, preferred terminology |
|
|
282
|
+
| Brand narrative | Body section | Free-form context for Claude |
|
|
283
|
+
|
|
284
|
+
After running `GenBrand`, update the config file with the output. The `brand` block captures the structured attributes; the body section captures the narrative context.
|
|
285
|
+
|
|
286
|
+
### WP_SITES_CONFIG Mapping
|
|
287
|
+
|
|
288
|
+
The `WP_SITES_CONFIG` environment variable is a JSON array of site credentials:
|
|
289
|
+
|
|
290
|
+
```json
|
|
291
|
+
[
|
|
292
|
+
{
|
|
293
|
+
"id": "mysite",
|
|
294
|
+
"url": "https://mysite.example.com",
|
|
295
|
+
"username": "api-user",
|
|
296
|
+
"app_password": "xxxx xxxx xxxx xxxx"
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
The mapping between `WP_SITES_CONFIG` and the config file:
|
|
302
|
+
|
|
303
|
+
| WP_SITES_CONFIG Field | Config Field | Relationship |
|
|
304
|
+
|----------------------|-------------|--------------|
|
|
305
|
+
| `id` | `site_id` | **Must match exactly** -- this is the join key |
|
|
306
|
+
| `url` | `site_url` | Should match; config value used for public-facing links |
|
|
307
|
+
| `username` | `defaults.author` | Can differ; config author is for attribution, WP_SITES_CONFIG username is for API authentication |
|
|
308
|
+
| `app_password` | *(none)* | Credentials are never stored in config files |
|
|
309
|
+
|
|
310
|
+
**Important:** The config file never contains authentication credentials. All sensitive values remain in the `WP_SITES_CONFIG` environment variable.
|
|
311
|
+
|
|
312
|
+
### Brief Cross-Reference
|
|
313
|
+
|
|
314
|
+
When the pipeline processes a brief, it resolves the site config via `brief.target.site_id`:
|
|
315
|
+
|
|
316
|
+
1. Read `brief.target.site_id` (e.g., `mysite`)
|
|
317
|
+
2. Load `.content-state/mysite.config.md`
|
|
318
|
+
3. Apply config defaults for any fields the brief omits
|
|
319
|
+
4. Use `brand` block for content adaptation/generation
|
|
320
|
+
5. Use `channels` block for distribution routing
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Example Config
|
|
325
|
+
|
|
326
|
+
A complete `.config.md` for the mysite site:
|
|
327
|
+
|
|
328
|
+
```markdown
|
|
329
|
+
---
|
|
330
|
+
site_id: mysite
|
|
331
|
+
site_url: https://mysite.example.com
|
|
332
|
+
last_updated: 2026-03-02
|
|
333
|
+
|
|
334
|
+
brand:
|
|
335
|
+
tone: professional, accessible, sustainability-focused
|
|
336
|
+
language: it
|
|
337
|
+
style_notes: |
|
|
338
|
+
Voice: warm but authoritative. Avoid corporate jargon.
|
|
339
|
+
Always emphasize the Mediterranean heritage and natural ingredients.
|
|
340
|
+
Use "noi" (we) when referring to the company.
|
|
341
|
+
Sustainability is a core value, not a marketing angle -- weave it naturally.
|
|
342
|
+
Product names are always capitalized: Light Blend, Dolce, Bold Blend.
|
|
343
|
+
Refer to the product using its brand name, not generic terms in marketing content.
|
|
344
|
+
Scientific claims must cite specific compounds (betalaine, polifenoli).
|
|
345
|
+
|
|
346
|
+
defaults:
|
|
347
|
+
content_type: post
|
|
348
|
+
status: draft
|
|
349
|
+
categories:
|
|
350
|
+
- blog
|
|
351
|
+
author: editorial-team
|
|
352
|
+
|
|
353
|
+
channels:
|
|
354
|
+
linkedin:
|
|
355
|
+
enabled: true
|
|
356
|
+
profile_id: "urn:li:organization:mysite"
|
|
357
|
+
format: professional
|
|
358
|
+
twitter:
|
|
359
|
+
enabled: true
|
|
360
|
+
format: concise
|
|
361
|
+
buffer:
|
|
362
|
+
enabled: false
|
|
363
|
+
profile_id: ""
|
|
364
|
+
format: casual
|
|
365
|
+
mailchimp:
|
|
366
|
+
enabled: true
|
|
367
|
+
audience_id: "mc_aud_mysite_main"
|
|
368
|
+
segment: newsletter-subscribers
|
|
369
|
+
|
|
370
|
+
seo:
|
|
371
|
+
default_schema: Article
|
|
372
|
+
min_score: 75
|
|
373
|
+
auto_internal_links: true
|
|
374
|
+
|
|
375
|
+
cadence:
|
|
376
|
+
posts_per_week: 3
|
|
377
|
+
preferred_days:
|
|
378
|
+
- monday
|
|
379
|
+
- wednesday
|
|
380
|
+
- friday
|
|
381
|
+
publish_time: "09:00"
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Brand Context
|
|
385
|
+
|
|
386
|
+
MySite is the digital home of AcmeBrand, an Italian zero-calorie beverage brand based on premium sparkling water (acqua premium). The brand sits at the intersection of traditional Mediterranean agriculture and modern wellness.
|
|
387
|
+
|
|
388
|
+
### Product Line
|
|
389
|
+
|
|
390
|
+
- **Light Blend** -- Light sweetness, subtle premium flavor. Entry-level product.
|
|
391
|
+
- **Dolce** -- Medium sweetness, balanced flavor profile. The core product.
|
|
392
|
+
- **Bold Blend** -- Full sweetness, rich premium flavor. For those who prefer bolder taste.
|
|
393
|
+
|
|
394
|
+
All variants are zero-calorie, naturally flavored, with no artificial sweeteners.
|
|
395
|
+
|
|
396
|
+
### Key Differentiators
|
|
397
|
+
|
|
398
|
+
- Only sparkling water brand with full regional supply chain
|
|
399
|
+
- Zero calorie without artificial sweeteners (uses natural premium compounds)
|
|
400
|
+
- 85% lower water footprint than conventional beverages
|
|
401
|
+
- Rich in betalains and polyphenols (natural antioxidants)
|
|
402
|
+
|
|
403
|
+
### Content Themes
|
|
404
|
+
|
|
405
|
+
- Sustainability and environmental responsibility
|
|
406
|
+
- Mediterranean heritage and terroir
|
|
407
|
+
- Health and wellness (zero-calorie, natural ingredients)
|
|
408
|
+
- Innovation in food technology
|
|
409
|
+
- Community and local farmers
|
|
410
|
+
|
|
411
|
+
### Competitor Positioning
|
|
412
|
+
|
|
413
|
+
Avoid direct competitor mentions. Focus on AcmeBrand's unique attributes rather than comparison. Never claim "best" or "only" without substantiation.
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## File Naming Convention
|
|
419
|
+
|
|
420
|
+
Config files follow this naming pattern:
|
|
421
|
+
|
|
422
|
+
```
|
|
423
|
+
{site_id}.config.md
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
Examples:
|
|
427
|
+
- `mysite.config.md`
|
|
428
|
+
- `my-blog.config.md`
|
|
429
|
+
- `corporate-site.config.md`
|
|
430
|
+
|
|
431
|
+
Files are stored in `.content-state/` and are gitignored (site-specific configuration).
|
|
@@ -110,7 +110,7 @@ CTA: Get the complete guide / Shop related products
|
|
|
110
110
|
| Formula | Example |
|
|
111
111
|
|---------|---------|
|
|
112
112
|
| Number + Benefit | "5 ways to reduce sugar intake" |
|
|
113
|
-
| Question | "Is
|
|
113
|
+
| Question | "Is sparkling water the healthiest option?" |
|
|
114
114
|
| How-to | "How to save 200 calories a day" |
|
|
115
115
|
| Curiosity gap | "The drink we didn't expect to love" |
|
|
116
116
|
| Urgency | "Last chance: 20% off ends tonight" |
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
### Hashtag Mix Strategy
|
|
43
43
|
|
|
44
44
|
- **30% broad** (high volume): #marketing, #business, #health
|
|
45
|
-
- **40% niche** (medium volume): #
|
|
46
|
-
- **30% branded** (low volume): #
|
|
45
|
+
- **40% niche** (medium volume): #sparklingwater, #zerocalorie, #healthydrinks
|
|
46
|
+
- **30% branded** (low volume): #AcmeBrand, #PremiumWater
|
|
47
47
|
|
|
48
48
|
## Link Handling
|
|
49
49
|
|
|
@@ -27,24 +27,24 @@ Ready-to-use templates for converting WordPress content into platform-specific f
|
|
|
27
27
|
|
|
28
28
|
**Example input:**
|
|
29
29
|
```
|
|
30
|
-
Title: "5 Benefits of
|
|
31
|
-
Excerpt: "
|
|
30
|
+
Title: "5 Benefits of Sparkling Water for Summer Hydration"
|
|
31
|
+
Excerpt: "Sparkling water from Mediterranean prickly pear is packed with electrolytes,
|
|
32
32
|
antioxidants, and has zero calories. Here's why it's the perfect summer drink."
|
|
33
|
-
Tags: ["
|
|
33
|
+
Tags: ["sparkling water", "hydration", "zero calorie"]
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
**Example output:**
|
|
37
37
|
```
|
|
38
|
-
Zero calories, packed with electrolytes —
|
|
38
|
+
Zero calories, packed with electrolytes — sparkling water is the summer drink
|
|
39
39
|
you didn't know you needed 🌵
|
|
40
40
|
|
|
41
|
-
https://
|
|
41
|
+
https://acmebrand.example.com/sparkling-water-benefits
|
|
42
42
|
|
|
43
|
-
#
|
|
43
|
+
#sparklingwater #hydration #zerocalorie
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
**Hashtag generation logic:**
|
|
47
|
-
1. Take post tags, lowercase, remove spaces → `#
|
|
47
|
+
1. Take post tags, lowercase, remove spaces → `#sparklingwater`
|
|
48
48
|
2. Add 1-2 category-based hashtags → `#healthydrinks`
|
|
49
49
|
3. Cap at 3 hashtags for Twitter (engagement drops with more)
|
|
50
50
|
|
|
@@ -87,7 +87,7 @@ If you found this useful, check out the full article:
|
|
|
87
87
|
|
|
88
88
|
**Example input:**
|
|
89
89
|
```
|
|
90
|
-
Title: "5 Benefits of
|
|
90
|
+
Title: "5 Benefits of Sparkling Water for Summer Hydration"
|
|
91
91
|
H2s: ["Rich in Electrolytes", "Zero Calories", "Antioxidant Power",
|
|
92
92
|
"Sustainable Sourcing", "Naturally Refreshing"]
|
|
93
93
|
```
|
|
@@ -95,20 +95,20 @@ H2s: ["Rich in Electrolytes", "Zero Calories", "Antioxidant Power",
|
|
|
95
95
|
**Example output:**
|
|
96
96
|
```
|
|
97
97
|
Tweet 1:
|
|
98
|
-
5 reasons
|
|
98
|
+
5 reasons sparkling water is the smartest hydration choice this summer
|
|
99
99
|
|
|
100
100
|
A thread 🧵👇
|
|
101
101
|
|
|
102
102
|
Tweet 2:
|
|
103
103
|
1/ Rich in Electrolytes
|
|
104
104
|
|
|
105
|
-
Prickly pear
|
|
105
|
+
Prickly pear premium naturally contains potassium, magnesium, and calcium —
|
|
106
106
|
the same electrolytes you'd find in sports drinks, without the sugar.
|
|
107
107
|
|
|
108
108
|
Tweet 3:
|
|
109
109
|
2/ Zero Calories
|
|
110
110
|
|
|
111
|
-
Unlike coconut water (45 cal) or fruit juice (110+ cal),
|
|
111
|
+
Unlike coconut water (45 cal) or fruit juice (110+ cal), sparkling water
|
|
112
112
|
delivers hydration at exactly 0 calories per serving.
|
|
113
113
|
|
|
114
114
|
...
|
|
@@ -116,9 +116,9 @@ delivers hydration at exactly 0 calories per serving.
|
|
|
116
116
|
Tweet 6:
|
|
117
117
|
Found this useful? Read the full breakdown:
|
|
118
118
|
|
|
119
|
-
https://
|
|
119
|
+
https://acmebrand.example.com/sparkling-water-benefits
|
|
120
120
|
|
|
121
|
-
#
|
|
121
|
+
#sparklingwater #hydration #zerocalorie
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
---
|
|
@@ -151,7 +151,7 @@ https://dolcezero.com/cactus-water-benefits
|
|
|
151
151
|
```
|
|
152
152
|
Title: "How We Reduced Sugar Content to Zero Without Losing Taste"
|
|
153
153
|
Excerpt: "Our R&D team spent 18 months developing a proprietary process
|
|
154
|
-
that uses
|
|
154
|
+
that uses Mediterranean prickly pear as a natural sweetness base..."
|
|
155
155
|
Tags: ["food technology", "zero sugar", "innovation"]
|
|
156
156
|
```
|
|
157
157
|
|
|
@@ -162,7 +162,7 @@ literally zero sugar?
|
|
|
162
162
|
|
|
163
163
|
The answer surprised even our food scientists.
|
|
164
164
|
|
|
165
|
-
|
|
165
|
+
Mediterranean fruit plant has a naturally sweet flavor profile.
|
|
166
166
|
By extracting and concentrating its essence, we created a beverage base
|
|
167
167
|
that delivers sweetness perception without any added sugars or
|
|
168
168
|
artificial sweeteners.
|
|
@@ -173,7 +173,7 @@ traditional sweetened beverages.
|
|
|
173
173
|
Key insight: consumers don't want "less sugar." They want full flavor
|
|
174
174
|
with zero compromise. That's what drove our entire product philosophy.
|
|
175
175
|
|
|
176
|
-
Full story on our process → https://
|
|
176
|
+
Full story on our process → https://acmebrand.example.com/zero-sugar-innovation
|
|
177
177
|
|
|
178
178
|
#FoodTechnology #ZeroSugar #BeverageInnovation #ProductDevelopment
|
|
179
179
|
```
|
|
@@ -250,35 +250,35 @@ Preview: {first_line_preview_text}
|
|
|
250
250
|
```
|
|
251
251
|
|
|
252
252
|
**Subject line formulas:**
|
|
253
|
-
1. **Number + benefit**: "5 ways
|
|
254
|
-
2. **Question**: "Is
|
|
253
|
+
1. **Number + benefit**: "5 ways sparkling water improves your hydration"
|
|
254
|
+
2. **Question**: "Is sparkling water the next coconut water?"
|
|
255
255
|
3. **How-to**: "How we made zero-calorie taste amazing"
|
|
256
|
-
4. **Curiosity gap**: "The
|
|
256
|
+
4. **Curiosity gap**: "The Mediterranean secret behind our water"
|
|
257
257
|
|
|
258
258
|
**Example input:**
|
|
259
259
|
```
|
|
260
|
-
Title: "5 Benefits of
|
|
261
|
-
Excerpt: "
|
|
262
|
-
URL: "https://
|
|
260
|
+
Title: "5 Benefits of Sparkling Water for Summer Hydration"
|
|
261
|
+
Excerpt: "Sparkling water from Mediterranean prickly pear is packed with electrolytes..."
|
|
262
|
+
URL: "https://acmebrand.example.com/sparkling-water-benefits"
|
|
263
263
|
```
|
|
264
264
|
|
|
265
265
|
**Example output:**
|
|
266
266
|
```
|
|
267
|
-
Subject: 5 reasons
|
|
267
|
+
Subject: 5 reasons sparkling water beats coconut water this summer
|
|
268
268
|
Preview: Zero calories, natural electrolytes, and a taste you won't believe
|
|
269
269
|
|
|
270
270
|
---
|
|
271
271
|
|
|
272
|
-
5 Benefits of
|
|
272
|
+
5 Benefits of Sparkling Water for Summer Hydration
|
|
273
273
|
|
|
274
|
-
|
|
274
|
+
Sparkling water from Mediterranean prickly pear is packed with electrolytes,
|
|
275
275
|
antioxidants, and has zero calories. It's everything you want from a
|
|
276
276
|
hydration drink — without the sugar.
|
|
277
277
|
|
|
278
|
-
Key finding: In our tests,
|
|
278
|
+
Key finding: In our tests, sparkling water delivered 40% more potassium
|
|
279
279
|
per serving than leading coconut water brands.
|
|
280
280
|
|
|
281
|
-
[Read the full article →](https://
|
|
281
|
+
[Read the full article →](https://acmebrand.example.com/sparkling-water-benefits)
|
|
282
282
|
```
|
|
283
283
|
|
|
284
284
|
---
|