No-write payload and mapping preview
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
GHOST_ADMIN_URL='<ghost-admin-url>' \
GHOST_ADMIN_API_KEY='<ghost-admin-api-key>' \
GHOST_API_VERSION='<ghost-api-version>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
npx --yes @wotaso/seo-blog-admin-cli publish-cms --cms ghost --site-slug '<slug>' --site-origin '<origin>' --dry-run
For a currently due approved post, --dry-run builds the destination payload without writing to the provider. It does not contact the provider or prove credentials, remote schema compatibility, deployment, or a live page; when no post is due, provider inputs are not exercised.
Scheduled runner health heartbeat
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
GHOST_ADMIN_URL='<ghost-admin-url>' \
GHOST_ADMIN_API_KEY='<ghost-admin-api-key>' \
GHOST_API_VERSION='<ghost-api-version>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
SEO_BLOG_SCHEDULED='true' \
npx --yes @wotaso/seo-blog-admin-cli health --config seo-blog.config.json --mode cms --site-slug '<slug>' --site-origin '<origin>'
Run this from the real scheduled runner after seo-blog.config.json contains the selected connector configuration and the listed secrets are loaded. It reports configuration readiness, not a live article. The dashboard expires readiness at the returned deadline, with a 36-hour fallback when no deadline is available.
Fields and data model
- HTML is submitted through Ghost's source=html flow
- Meta title, meta description, tags, and feature image are mapped
- Existing posts include updated_at for safe revision updates
Canonical and route
Ghost and the active theme own the post route, canonical tag, sitemap, structured data, rendering, and public URL. The adapter records the URL returned by Ghost after saving.
Known limits
- The Admin API key must be the id:secret value, not a Content API key.
- Custom theme fields outside the post model need a tenant-specific extension.
- Ghost API version changes should be tested before changing the configured Accept-Version.
Recovery
- Use draft mode and inspect the Ghost preview before first publication.
- For authentication failures, verify key format, server time, Admin URL, and API version.
- On revision conflicts, refetch the post so the next update carries its latest updated_at value.