Skip to content
Back to skills

Cf Publish

ASecurity

Execute CMS publishing: push a finished, reviewed piece (Phase 8 complete, quality score >=7.0) to Webflow or WordPress via MCP connectors as draft, scheduled, or live — always showing a full publish preview and waiting for your explicit yes/no/edit confirmation before anything is pushed. Runs the EU AI Act Article 50 disclosure check, verifies the live URL, meta tags, and images post-publish, and falls back to a standalone HTML export when no CMS connector is configured. Triggers on \"/conte...

  • 30 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added June 9, 2026
ai-agentsgorailsgitapi

Works with

  • claude code
  • api
  • mcp

Security analysis

A100/100

Scanned October 4, 2026

npx -y skills add indranilbanerjee/contentforge --skill cf-publish --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Cf Publish?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Cf Publish
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/indranilbanerjee-cf-publish/badge)](https://www.skillsdirectory.com/skills/indranilbanerjee-cf-publish)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: cf-publish
description: "Execute CMS publishing: push a finished, reviewed piece (Phase 8 complete, quality score >=7.0) to Webflow or WordPress via MCP connectors as draft, scheduled, or live — always showing a full publish preview and waiting for your explicit yes/no/edit confirmation before anything is pushed. Runs the EU AI Act Article 50 disclosure check, verifies the live URL, meta tags, and images post-publish, and falls back to a standalone HTML export when no CMS connector is configured. Triggers on \"/contentforge:cf-publish\", \"publish this article to WordPress\", \"push this to Webflow\", \"schedule this post for next week\", \"export the article as HTML\". Refuses unreviewed content; pairs with /contentforge:cf-social-adapt for post-publish promotion."
disable-model-invocation: true
argument-hint: "[platform]"
effort: low
---

# Publish Content — ContentForge CMS Publishing

Push publication-ready content from the ContentForge pipeline directly to your CMS (Webflow or WordPress) via MCP connectors. Preview before publishing, verify post-publish, and fall back to HTML export when no connector is available.

## When to Use

Use `/contentforge:cf-publish` when:
- You have a **finished, reviewed content piece** (Phase 8 complete, score >=7.0)
- You want to **publish directly** to Webflow or WordPress without copy-pasting
- You need to **schedule content** for a future publish date
- You want **post-publish verification** (URL live, meta tags correct, images loaded)
- You want an **HTML export** for manual upload when no CMS connector is configured

**Do NOT use for:**
- Content still in pipeline (must be Phase 8 complete)
- Content that did not reach APPROVED (anything below 7.0 — a 5.0-6.9 piece is `review_required`, not publishable)
- Platforms other than Webflow/WordPress (use `/contentforge:cf-social-adapt` for social media)

## What This Command Does

1. **Verify Connector** -- Check if Webflow or WordPress MCP connector is active
2. **Load Content** -- Pull finished content from Google Drive or local output
3. **Format for Platform** -- Convert markdown/docx to platform-specific HTML/blocks
4. **Preview** -- Show rendered preview with meta tags, slug, featured image
5. **AI Disclosure & Provenance** -- EU AI Act Article 50 check (applicable from 2 Aug 2026)
6. **Publish/Schedule** -- Push to CMS as draft, published, or scheduled
7. **Post-Publish Verification** -- Confirm URL is live, meta tags are correct, content renders properly
8. **Fallback** -- If no connector, generate standalone HTML file for manual upload

## Required Inputs

**Minimum Required:**
- **Content Source** -- Google Drive URL, local file path, or requirement ID (e.g., `REQ-001`)
- **Platform** -- `webflow` or `wordpress`
- **Status** -- `draft`, `publish`, or `schedule`

**Optional:**
- **Schedule Date** -- ISO date/time for scheduled publishing (required if status=schedule)
- **Collection/Category** -- Webflow collection slug or WordPress category
- **Featured Image** -- URL or local path to hero image
- **Author** -- Override the byline author (default: the author applied in Phase 3 from the brand's `author_profiles`; falls back to authorless if none configured)
- **Tags** -- Comma-separated list of tags
- **Slug Override** -- Custom URL slug (defaults to SEO-optimized slug from Phase 6)

## How to Use

### Interactive Mode
```
/contentforge:cf-publish
```
**Prompts you for:**
1. Content source (Drive URL, file path, or requirement ID)
2. Platform (Webflow / WordPress)
3. Publish status (draft / publish / schedule)
4. Preview confirmation before pushing

### Quick Mode
```
/contentforge:cf-publish REQ-001 --platform=webflow --status=publish
```

### Schedule for Later
```
/contentforge:cf-publish REQ-001 --platform=wordpress --status=schedule --date="2026-09-01T09:00:00"
```

### Publish from Google Drive
```
/contentforge:cf-publish https://drive.google.com/file/d/ABC123 --platform=webflow --status=draft
```

## What Happens

### Step 1: Connector Verification (5-10 seconds)

Before attempting any CMS operation, verify the target connector is available.

**Check MCP connector status:**
```
Platform: webflow
Connector: Webflow MCP (https://mcp.webflow.com/sse)
Status: CHECKING...
```

**Case A: Connector Active**
```
Webflow MCP: CONNECTED
Site: acme-corp.webflow.io
Collections available: blog-posts, case-studies, resources
Proceeding with direct publish...
```

**Case B: Connector Not Found**
```
Webflow MCP: NOT CONNECTED

No Webflow connector detected in .mcp.json.
Falling back to HTML export mode.

To enable direct publishing, add the Webflow connector:
  /contentforge:cf-connect webflow

Generating standalone HTML file for manual upload...
```

### Step 2: Load and Validate Content (10-15 seconds)

**Load content from source:**
- Read .docx or markdown from Google Drive or local output directory
- Extract metadata: title, meta description, slug, keywords, author, featured image
- Validate quality score >= 7.0 (refuse to publish unreviewed content)

**Validation checks:**
```
Content Validation
---------------------------------------------------
Title: "AI in Healthcare: 2026 Trends"        OK
Quality Score: 9.2/10                          OK
Status: Approved (Phase 8 Complete)            OK
Word Count: 1,947                              OK
Meta Title: 58 chars                           OK
Meta Description: 152 chars                    OK
SEO Slug: ai-in-healthcare-2026-trends         OK
Featured Image: hero-ai-healthcare.jpg         OK
---------------------------------------------------
All checks passed. Ready to format for Webflow.
```

**Rejection cases:**
- Quality score < 7.0: "Content has not passed quality review. Score: 4.8/10. Run the full pipeline first."
- No Phase 8 completion: "Content pipeline incomplete. Phase 8 (Output Manager) has not run."
- Missing meta tags: "Meta title and description are required. Run Phase 6 (SEO Optimizer) first."

### Step 3: Format for Target Platform (10-20 seconds)

Convert ContentForge output into platform-native format.

**Webflow Formatting:**
- Convert markdown headings to Webflow rich text blocks
- Map H1 to `name` field, body to `post-body` rich text field
- Set `slug`, `meta-title`, `meta-description` fields
- Upload featured image to Webflow assets, link to `main-image` field
- Map tags to Webflow multi-reference field
- Preserve inline links, bold, italic, lists, blockquotes

**WordPress Formatting:**
- Convert markdown to WordPress Gutenberg blocks (paragraph, heading, list, quote, image)
- Set `title`, `content`, `excerpt`, `slug`, `meta` fields
- Upload featured image via media endpoint, set as `featured_media`
- Map categories and tags to taxonomy terms
- Preserve shortcodes if present in original content
- Add Yoast/RankMath SEO meta if plugin detected

**Shared formatting rules:**
- Strip .docx formatting artifacts (extra whitespace, page breaks)
- Ensure all internal links use relative paths where possible
- Validate all image URLs are accessible (no broken images)
- Preserve citation formatting (footnotes or inline links based on platform preference)

### Step 4: Preview Before Publish

Show the user exactly what will be published before pushing.

```
PUBLISH PREVIEW
===================================================

Platform: Webflow (acme-corp.webflow.io)
Collection: blog-posts
Status: PUBLISH (goes live immediately)

---------------------------------------------------
URL: https://acme-corp.webflow.io/blog/ai-in-healthcare-2026-trends

Meta Title: AI in Healthcare: 2026 Trends and Predictions
Meta Description: Explore how AI is transforming healthcare in 2026,
  from diagnostic tools to patient care. Data-driven analysis with
  14 verified sources.

Featured Image: hero-ai-healthcare.jpg (1200x630, 245KB)
Author: Jane Doe, Head of Content (from brand author_profiles; 'ContentForge' only if the brand is deliberately authorless)
Tags: AI, Healthcare, Technology Trends, 2026
Word Count: 1,947
---------------------------------------------------

Content Preview (first 300 characters):
"Multi-agent AI systems are changing how healthcare organizations
approach diagnostics, patient care, and operational efficiency. The
approach? Deploy specialized AI agents -- one for imaging analysis,
another for patient history, a third for treatment recommendations..."

===================================================

Proceed with publish? (yes / no / edit)
```

**User options:**
- `yes` -- Push to CMS
- `no` -- Cancel, return to command line
- `edit` -- Open content for last-minute edits before publish

### Step 4.5: AI Disclosure & Provenance (EU AI Act Article 50 — applicable from 2 Aug 2026)

Before pushing, check whether AI-generation disclosure applies:

**Does it apply?** Yes if the brand targets EU audiences (check the brand profile's markets/regions or ask the user once and record the answer), OR if the brand profile's guardrails require AI-content disclosure regardless of region.

**If it applies:**

1. **For .docx deliverables** — note that C2PA content provenance signing is available via `--c2pa-sign` (with `--c2pa-signing-cert` and `--c2pa-signing-key`) on `scripts/generate-docx.py` (see `docs/c2pa-production-cert.md` for certificate setup). If the piece was produced without signing and the user needs it, offer to regenerate the .docx with signing enabled.
2. **For CMS publishes (Webflow/WordPress)** — offer to add a disclosure label to the article, e.g.:
   > "This article was produced with AI assistance and reviewed by [brand]'s editorial team."
   **Place it at the top — in the byline area or directly under the title — never only in the footer.** The European Commission's labelling rule is that the label must be "clearly perceivable and distinguishable at the latest at the time of first exposure" of a reader to the text, and must stay visible when the content is reshared or downloaded (so it belongs in the article body the CMS syndicates, not a site-template footer). Record the user's choice in the tracking notes.
   **Which EU icon (optional to use; the label itself is not):** the Commission publishes three — **Basic** (AI was involved), **Fully AI-Generated** (no human-created elements or human editorial control), **Partially AI-Modified** (pre-existing human-made content partially modified with AI). Choose from this run's records: a `phase-6.5-authorship.json` with `may_claim_authored: true` → **Partially AI-Modified**; no source draft and no editorial review → **Fully AI-Generated**; anything unclear → **Basic**. Uncertainty never skips the label. Source: [EU icons for labelling AI-generated content](https://digital-strategy.ec.europa.eu/en/policies/eu-icons-labelling-ai-generated-content) (updated 24 Sep 2026).
3. **For downstream social promotion** — remind the user that major platforms (LinkedIn, Meta, TikTok, YouTube) have AI-content labeling options/requirements; `/contentforge:cf-social-adapt` surfaces these per platform.

**If it does not apply** (no EU targeting, no guardrail requirement): skip with a one-line note in the output — "AI-disclosure check: not required (no EU targeting configured)" — so the decision is auditable.

### Step 5: Publish / Schedule / Draft (5-15 seconds)

**Publish (immediate):**
```
Publishing to Webflow...
API call: POST /collections/blog-posts/items
Status: 201 Created
Item ID: 6432a1b2c3d4e5f6
Live URL: https://acme-corp.webflow.io/blog/ai-in-healthcare-2026-trends
```

**Schedule (future date):**
```
Scheduling for 2026-09-01 09:00 UTC...
API call: POST /collections/blog-posts/items (draft=true, scheduled_at=2026-09-01T09:00:00Z)
Status: 201 Created
Scheduled Publish: September 1, 2026 at 9:00 AM UTC
Draft URL: https://acme-corp.webflow.io/blog/ai-in-healthcare-2026-trends (not live yet)
```

**Draft (no publish):**
```
Saving as draft...
API call: POST /collections/blog-posts/items (draft=true)
Status: 201 Created
Draft URL: https://acme-corp.webflow.io/blog/ai-in-healthcare-2026-trends (draft, not live)
Edit in Webflow: https://webflow.com/dashboard/sites/acme-corp/editor
```

### Step 6: Post-Publish Verification (10-20 seconds)

After publishing, verify the content is live and correct.

**Verification checks:**
```
Post-Publish Verification
===================================================
URL Accessible: GET https://acme-corp.webflow.io/blog/ai-in-healthcare-2026-trends
  Status Code: 200 OK                                  PASS
  Response Time: 340ms                                  PASS

Meta Tags:
  <title>: "AI in Healthcare: 2026 Trends..."          PASS
  <meta name="description">: Present, 152 chars         PASS
  <meta property="og:title">: Present                   PASS
  <meta property="og:image">: Present                   PASS
  <link rel="canonical">: Present                       PASS

Content Integrity:
  H1 present: "AI in Healthcare: 2026 Trends"           PASS
  Word count matches: 1,947 (expected 1,947)            PASS
  Images loaded: 3/3                                    PASS
  Internal links valid: 5/5                             PASS

SEO Elements:
  URL slug correct: ai-in-healthcare-2026-trends        PASS
  Schema markup: Article (JSON-LD)                      PASS
  Robots meta: index, follow                            PASS

===================================================
All 14 checks passed. Content is live and verified.
```

**If verification fails:**
```
VERIFICATION WARNING
===================================================
URL Accessible: 200 OK                                  PASS
Meta Description: MISSING                               FAIL
  Expected: "Explore how AI is transforming..."
  Found: (empty)

Action: Meta description did not save correctly.
  Attempting fix via API PATCH...
  Fixed: Meta description updated.
  Re-verification: PASS
===================================================
```

### Step 7: Update Tracking Sheet

After successful publish:
```
Tracking Sheet Updated:
  Row: 5
  Status: "Published"
  Published URL: https://acme-corp.webflow.io/blog/ai-in-healthcare-2026-trends
  Published At: 2026-07-25 14:30:00
  Platform: Webflow
  Verification: All 14 checks passed
```

## Fallback: HTML Export Mode

When no CMS connector is available, generate a standalone HTML file.

### What Gets Generated

```
Output: ~/.claude-marketing/{brand-slug}/output/publish-exports/ai-in-healthcare-2026-trends.html

HTML Export includes:
- Full article content in clean, semantic HTML5
- Inline CSS for typography (portable, no external dependencies)
- Meta tags in <head> (title, description, OG tags, Twitter cards)
- Schema.org Article markup (JSON-LD)
- Featured image with alt text
- Responsive formatting (mobile-friendly)
- Copy-paste ready for any CMS
```

### HTML Export File Structure

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>AI in Healthcare: 2026 Trends and Predictions</title>
  <meta name="description" content="Explore how AI is transforming...">
  <meta property="og:title" content="AI in Healthcare: 2026 Trends...">
  <meta property="og:description" content="Explore how AI is transforming...">
  <meta property="og:image" content="hero-ai-healthcare.jpg">
  <script type="application/ld+json">
    { "@context": "https://schema.org", "@type": "Article", ... }
  </script>
</head>
<body>
  <article>
    <h1>AI in Healthcare: 2026 Trends and Predictions</h1>
    <!-- Full formatted article content -->
  </article>
</body>
</html>
```

### Manual Upload Instructions

```
HTML Export Complete
===================================================
File: ~/.claude-marketing/{brand-slug}/output/publish-exports/ai-in-healthcare-2026-trends.html
Size: 48 KB

Manual Upload Instructions:
1. Open your CMS dashboard
2. Create a new blog post / article
3. Switch to HTML/code view
4. Copy the contents of the <article> tag
5. Paste into the content editor
6. Copy meta title and description from the <head> section
7. Upload featured image separately
8. Set URL slug to: ai-in-healthcare-2026-trends
9. Preview and publish

Alternatively, connect your CMS for direct publishing:
  /contentforge:cf-connect webflow
  /contentforge:cf-connect wordpress
===================================================
```

## Output Example

**SYNTHETIC EXAMPLE — fabricated for illustration. Successful publish:**
```
CONTENTFORGE PUBLISH COMPLETE
===================================================

Content: AI in Healthcare: 2026 Trends
Platform: Webflow
Status: Published (LIVE)
URL: https://acme-corp.webflow.io/blog/ai-in-healthcare-2026-trends

Quality Score: 9.2/10
Word Count: 1,947
Meta Tags: All present and verified
Images: 3 loaded
Verification: 14/14 checks passed

Tracking Sheet: Updated (Row 5)
Published At: 2026-07-25 14:30:00

===================================================
Content is live and verified. No further action required.
```

## Error Handling

### CMS API Rate Limit
```
Error: 429 Too Many Requests
Action: Wait 60 seconds, retry (max 3 attempts)
If persistent: Save as draft, notify user to publish manually
```

### Authentication Expired
```
Error: 401 Unauthorized
Action: Prompt user to re-authenticate
  Webflow: Re-authorize at https://webflow.com/oauth/authorize
  WordPress: Refresh application password
```

### Content Too Large
```
Error: 413 Payload Too Large (WordPress limit: 2MB per post)
Action: Split content into parts or compress images
Fallback: Generate HTML export, notify user
```

### Duplicate Slug
```
Error: Slug "ai-in-healthcare-2026-trends" already exists
Action: Check if this is an update (v1.1 refresh) or duplicate
  If update: PATCH existing post (preserve URL, update content)
  If duplicate: Append "-2" to slug, warn user
```

### Image Upload Failure
```
Error: Featured image upload failed (timeout)
Action: Retry image upload (3 attempts)
Fallback: Publish without featured image, flag for manual fix
  "Published successfully but featured image failed to upload.
   Please upload hero-ai-healthcare.jpg manually in your CMS."
```

## Platform-Specific Notes

### Webflow
- Uses Collection Items API for blog posts
- Rich text field supports HTML content directly
- Images must be uploaded to Webflow Assets first, then referenced
- Publish requires site publish after item creation (API call to publish site)
- CMS items are draft by default; explicit publish step needed
- Rate limit: 60 requests per minute

### WordPress
- Uses REST API v2 (`/wp-json/wp/v2/posts`)
- Gutenberg blocks preferred over classic editor HTML
- Featured image uploaded via `/wp-json/wp/v2/media`, then linked by ID
- Categories and tags are taxonomy term IDs (lookup by name first)
- Supports `date` field for scheduling
- Application Passwords or OAuth for authentication
- Rate limit: Varies by host (typically 100-500 requests/minute)

## Requirements

### MCP Integrations (Optional but Recommended)
- **Webflow MCP** (`https://mcp.webflow.com/sse`) -- For direct Webflow publishing
- **WordPress** -- Via REST API (no MCP endpoint; uses HTTP connector or direct API)

### Environment
- Claude Code or Cowork (latest version)
- Content must have completed Phase 8 (Output Manager)
- Quality score >= 7.0

## Integration with Other Skills

**Before Publishing:**
- `/contentforge:create-content` -- Generate the content piece
- `/contentforge:batch-process` -- Generate multiple pieces for bulk publishing
- `/contentforge:content-refresh` -- Update old content before republishing

**After Publishing:**
- `/contentforge:cf-social-adapt` -- Generate social media posts to promote the published article
- `/contentforge:content-refresh` -- Schedule future refresh for evergreen content

## Related Skills

- **[/contentforge:create-content](../../commands/create-content.md)** -- Full content production pipeline
- **[/contentforge:batch-process](../batch-process/SKILL.md)** -- Sequential, checkpointed batch production
- **[/contentforge:content-refresh](../content-refresh/SKILL.md)** -- Update existing content
- **[/contentforge:cf-social-adapt](../cf-social-adapt/SKILL.md)** -- Social media adaptation

---

**Agent:** Output Manager (Phase 8) + CMS Publisher reference (`utilities/cms-publisher.md`, prose reference doc)
**Platforms:** Webflow, WordPress
**Fallback:** HTML export for manual upload

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…