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.
Files changed (62) hide show
  1. package/.claude-plugin/plugin.json +8 -3
  2. package/CHANGELOG.md +94 -2
  3. package/agents/wp-accessibility-auditor.md +1 -1
  4. package/agents/wp-content-strategist.md +2 -2
  5. package/agents/wp-deployment-engineer.md +1 -1
  6. package/agents/wp-distribution-manager.md +1 -1
  7. package/agents/wp-monitoring-agent.md +1 -1
  8. package/agents/wp-performance-optimizer.md +1 -1
  9. package/agents/wp-security-auditor.md +1 -1
  10. package/agents/wp-site-manager.md +3 -3
  11. package/commands/wp-setup.md +2 -2
  12. package/docs/GUIDE.md +260 -21
  13. package/docs/VALIDATION.md +341 -0
  14. package/docs/guides/wp-ecommerce.md +4 -4
  15. package/docs/plans/2026-03-01-tier3-wcop-implementation.md +1 -1
  16. package/docs/plans/2026-03-01-tier4-5-implementation.md +1 -1
  17. package/docs/plans/2026-03-02-content-framework-architecture.md +612 -0
  18. package/docs/plans/2026-03-02-content-framework-strategic-reflections.md +228 -0
  19. package/docs/plans/2026-03-02-content-intelligence-phase2.md +560 -0
  20. package/docs/plans/2026-03-02-content-pipeline-phase1.md +456 -0
  21. package/docs/plans/2026-03-02-dashboard-kanban-design.md +761 -0
  22. package/docs/plans/2026-03-02-dashboard-kanban-implementation.md +598 -0
  23. package/docs/plans/2026-03-02-dashboard-strategy.md +363 -0
  24. package/docs/plans/2026-03-02-editorial-calendar-phase3.md +490 -0
  25. package/docs/validation/.gitkeep +0 -0
  26. package/docs/validation/dashboard.html +286 -0
  27. package/docs/validation/results.json +1705 -0
  28. package/package.json +16 -3
  29. package/scripts/context-scanner.mjs +446 -0
  30. package/scripts/dashboard-renderer.mjs +553 -0
  31. package/scripts/run-validation.mjs +1132 -0
  32. package/servers/wp-rest-bridge/build/server.js +17 -6
  33. package/servers/wp-rest-bridge/build/tools/index.js +0 -9
  34. package/servers/wp-rest-bridge/build/tools/plugin-repository.js +23 -31
  35. package/servers/wp-rest-bridge/build/tools/schema.js +10 -2
  36. package/servers/wp-rest-bridge/build/tools/unified-content.js +10 -2
  37. package/servers/wp-rest-bridge/build/wordpress.d.ts +0 -3
  38. package/servers/wp-rest-bridge/build/wordpress.js +16 -98
  39. package/servers/wp-rest-bridge/package.json +1 -0
  40. package/skills/wp-analytics/SKILL.md +153 -0
  41. package/skills/wp-analytics/references/signals-feed-schema.md +417 -0
  42. package/skills/wp-content/references/content-templates.md +1 -1
  43. package/skills/wp-content/references/seo-optimization.md +8 -8
  44. package/skills/wp-content-attribution/references/roi-calculation.md +1 -1
  45. package/skills/wp-content-attribution/references/utm-tracking-setup.md +5 -5
  46. package/skills/wp-content-generation/references/generation-workflow.md +2 -2
  47. package/skills/wp-content-pipeline/SKILL.md +461 -0
  48. package/skills/wp-content-pipeline/references/content-brief-schema.md +377 -0
  49. package/skills/wp-content-pipeline/references/site-config-schema.md +431 -0
  50. package/skills/wp-content-repurposing/references/auto-transform-pipeline.md +1 -1
  51. package/skills/wp-content-repurposing/references/email-newsletter.md +1 -1
  52. package/skills/wp-content-repurposing/references/platform-specs.md +2 -2
  53. package/skills/wp-content-repurposing/references/transform-templates.md +27 -27
  54. package/skills/wp-dashboard/SKILL.md +121 -0
  55. package/skills/wp-deploy/references/ssh-deploy.md +2 -2
  56. package/skills/wp-editorial-planner/SKILL.md +262 -0
  57. package/skills/wp-editorial-planner/references/editorial-schema.md +268 -0
  58. package/skills/wp-multilang-network/references/content-sync.md +3 -3
  59. package/skills/wp-multilang-network/references/network-architecture.md +1 -1
  60. package/skills/wp-multilang-network/references/seo-international.md +7 -7
  61. package/skills/wp-structured-data/references/schema-types.md +4 -4
  62. 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).
@@ -50,7 +50,7 @@ Parse the raw content into atomic elements for templating.
50
50
  **Tag-to-hashtag conversion:**
51
51
  ```
52
52
  "Zero Calorie" → #zerocalorie
53
- "Cactus Water" → #cactuswater
53
+ "Sparkling Water" → #sparklingwater
54
54
  "Health Tips" → #healthtips
55
55
  ```
56
56
 
@@ -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 cactus water the healthiest option?" |
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): #cactuswater, #zerocalorie, #healthydrinks
46
- - **30% branded** (low volume): #DolceZero, #SicilianWater
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 Cactus Water for Summer Hydration"
31
- Excerpt: "Cactus water from Sicilian prickly pear is packed with electrolytes,
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: ["cactus water", "hydration", "zero calorie"]
33
+ Tags: ["sparkling water", "hydration", "zero calorie"]
34
34
  ```
35
35
 
36
36
  **Example output:**
37
37
  ```
38
- Zero calories, packed with electrolytes — cactus water is the summer drink
38
+ Zero calories, packed with electrolytes — sparkling water is the summer drink
39
39
  you didn't know you needed 🌵
40
40
 
41
- https://dolcezero.com/cactus-water-benefits
41
+ https://acmebrand.example.com/sparkling-water-benefits
42
42
 
43
- #cactuswater #hydration #zerocalorie
43
+ #sparklingwater #hydration #zerocalorie
44
44
  ```
45
45
 
46
46
  **Hashtag generation logic:**
47
- 1. Take post tags, lowercase, remove spaces → `#cactuswater`
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 Cactus Water for Summer Hydration"
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 cactus water is the smartest hydration choice this summer
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 cactus naturally contains potassium, magnesium, and calcium —
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), cactus water
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://dolcezero.com/cactus-water-benefits
119
+ https://acmebrand.example.com/sparkling-water-benefits
120
120
 
121
- #cactuswater #hydration #zerocalorie
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 Sicilian prickly pear as a natural sweetness base..."
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
- Sicilian prickly pear cactus has a naturally sweet flavor profile.
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://dolcezero.com/zero-sugar-innovation
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 cactus water improves your hydration"
254
- 2. **Question**: "Is cactus water the next coconut water?"
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 Sicilian secret behind our water"
256
+ 4. **Curiosity gap**: "The Mediterranean secret behind our water"
257
257
 
258
258
  **Example input:**
259
259
  ```
260
- Title: "5 Benefits of Cactus Water for Summer Hydration"
261
- Excerpt: "Cactus water from Sicilian prickly pear is packed with electrolytes..."
262
- URL: "https://dolcezero.com/cactus-water-benefits"
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 cactus water beats coconut water this summer
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 Cactus Water for Summer Hydration
272
+ 5 Benefits of Sparkling Water for Summer Hydration
273
273
 
274
- Cactus water from Sicilian prickly pear is packed with electrolytes,
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, cactus water delivered 40% more potassium
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://dolcezero.com/cactus-water-benefits)
281
+ [Read the full article →](https://acmebrand.example.com/sparkling-water-benefits)
282
282
  ```
283
283
 
284
284
  ---