Claude Code Plugins

Community-maintained marketplace

Feedback

cms-interaction

@boringdata/kurt-demo
1
0

Configure CMS connections and perform ad-hoc content searches (Sanity, Contentful, WordPress)

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name cms-interaction
description Configure CMS connections and perform ad-hoc content searches (Sanity, Contentful, WordPress)

CMS Interaction Skill

Purpose: Ad-hoc CMS configuration and operations Subskills: onboard, search, publish Supported CMSs: Sanity (full support), Contentful (coming soon), WordPress (coming soon)


Overview

This skill provides ad-hoc CMS operations using kurt cms CLI commands:

  1. Configuration: Set up CMS connections (first-time setup)
  2. Ad-hoc search: Quick content searches during project planning/research
  3. Publishing: Push completed drafts back to CMS

For systematic content mapping and fetching, use the unified core workflow:

  • kurt map cms --platform sanity --instance prod --cluster-urls (discovery + clustering)
  • kurt fetch --include "sanity/prod/*" (download + index)

This workflow integrates CMS content with web content using the same commands. See project-management-skill (gather-sources subskill) for full orchestration.


Architecture

Pattern: CLI-Wrapper

This skill is a thin orchestration layer over kurt CLI commands:

User Request → Skill (routing) → kurt cms command → CMS API

All CMS logic lives in kurt-core:

  • src/kurt/commands/cms.py - CLI commands
  • src/kurt/cms/sanity/adapter.py - Sanity implementation
  • src/kurt/cms/config.py - Configuration management

This skill focuses on:

  • Routing user requests to appropriate commands
  • Parsing parameters and options
  • Providing context-specific guidance
  • Following up after command execution

Usage

Configuration (First-Time Setup)

cms-interaction onboard

Routes to: kurt cms onboard --platform sanity

This guides you through:

  • Creating .kurt/cms-config.json
  • Entering credentials
  • Discovering content types
  • Mapping custom field names

Ad-Hoc Search (During Research)

Use during project planning to explore CMS content:

cms-interaction search --query "tutorial" --limit 10

Routes to: kurt cms search --query "tutorial" --limit 10

When to use:

  • Exploring what content exists
  • Quick research during project planning
  • Finding specific documents by keyword

For systematic ingestion, use kurt map cms instead (see project-management-skill).

Publishing Drafts

cms-interaction publish --file draft.md --id <document-id>

Routes to: kurt cms publish --file draft.md --id <document-id>

Pushes completed content back to CMS as draft (never auto-publishes).


Getting Started with Sanity

If you have an existing Sanity account, here's how to get started:

Step 1: Get Sanity Credentials

From your Sanity project dashboard:

  1. Project ID: Found in project settings or URL
  2. Dataset: Usually production
  3. Read Token: API → Tokens → Add New Token (Viewer role)
  4. Write Token (optional): Add New Token (Editor role)

Step 2: Create Initial Config

Create .kurt/cms-config.json:

{
  "sanity": {
    "prod": {
      "project_id": "your-project-id",
      "dataset": "production",
      "token": "sk...your-read-token",
      "write_token": "sk...your-write-token",
      "base_url": "https://yoursite.com"
    }
  }
}

Note:

  • The .kurt/ directory is already gitignored, so your credentials are safe.
  • You can configure multiple instances (prod, staging, etc.) per platform.

Step 3: Run Onboarding

From Claude Code:

cms-interaction onboard

This discovers your content types and maps your custom field names.

Step 4: Test Setup

cms-interaction search --limit 5

Routing Logic

Routes to subskills based on first argument:

  • onboard → subskills/onboard.md → kurt cms onboard
  • search → subskills/search.md → kurt cms search
  • publish → subskills/publish.md → kurt cms publish

Each subskill:

  1. Parses user parameters
  2. Constructs appropriate kurt cms command
  3. Executes command
  4. Provides follow-up guidance

Integration with Core Workflow

Ad-hoc use (this skill):

  • Quick searches during planning
  • Exploring CMS content
  • One-off document retrieval
  • Publishing completed drafts

Systematic ingestion (core workflow):

Use the unified map-then-fetch workflow orchestrated by project-management-skill:

# Discovery + clustering
kurt map cms --platform sanity --instance prod --cluster-urls

# Selective fetching
kurt fetch --include "sanity/prod/*"
kurt fetch --in-cluster "Tutorials"
kurt fetch --with-content-type article

Benefits:

  • Same workflow as web content
  • Cross-source clustering (web + CMS)
  • Selective fetching by cluster or content type
  • Integrated into project sources

See project-management-skill/subskills/gather-sources.md for full orchestration.


Available Commands

All commands route to kurt cms:

Configuration

cms-interaction onboard
→ kurt cms onboard --platform sanity

Search

cms-interaction search --query "tutorial" --limit 20
→ kurt cms search --query "tutorial" --limit 20 --platform sanity

Fetch (via CLI directly)

kurt cms fetch --id <document-id> --output-dir sources/cms/sanity/

Types (via CLI directly)

kurt cms types --platform sanity

Publish

cms-interaction publish --file draft.md --id <document-id>
→ kurt cms publish --file draft.md --id <document-id> --platform sanity

Import (via CLI directly)

kurt cms import --source-dir sources/cms/sanity/

Configuration Format

After onboarding, .kurt/cms-config.json contains:

{
  "sanity": {
    "prod": {
      "project_id": "abc123",
      "dataset": "production",
      "token": "sk...",
      "write_token": "sk...",
      "base_url": "https://yoursite.com",

      "content_type_mappings": {
        "article": {
          "enabled": true,
          "content_field": "content_body_portable",
          "title_field": "title",
          "slug_field": "slug.current",
          "description_field": "excerpt",
          "inferred_content_type": "article",
          "metadata_fields": {}
        },
        "universeItem": {
          "enabled": true,
          "content_field": "description",
          "title_field": "title",
          "slug_field": "slug.current",
          "description_field": "description",
          "inferred_content_type": "reference",
          "metadata_fields": {}
        }
      }
    }
  }
}

Key fields:

  • slug_field: Used in semantic URLs for clustering
  • description_field: Provides context for topic clustering
  • inferred_content_type: Auto-assigned from schema name, skips LLM classification

Relationship with Other Skills

project-management-skill

Orchestrates systematic CMS ingestion:

  • Calls kurt map cms --cluster-urls for discovery
  • Uses kurt fetch --include "sanity/*" for bulk download
  • Integrates CMS with web content in same workflow

content-writing-skill

Consumes CMS content:

  • References CMS documents in project sources
  • Creates drafts for CMS publishing
  • Uses cms-interaction publish to push back to CMS

research-skill

Complements CMS search:

  • research-skill: External research (Perplexity AI)
  • cms-interaction: Internal content search (CMS)

Troubleshooting

"Platform not configured"

cms-interaction onboard

"Connection failed"

  • Check credentials in .kurt/cms-config.json
  • Verify tokens in Sanity dashboard
  • Test connection: kurt cms types --platform sanity

"No results found"

  • Try broader search: cms-interaction search --limit 20
  • Check enabled content types: kurt cms types
  • Verify content types configured in onboarding

"Write permission denied"

  • Add write_token with Editor role to config
  • Regenerate token in Sanity dashboard

For detailed subskill documentation, see subskills/.md files.*