Configure CMS connections and perform ad-hoc content searches (Sanity, Contentful, WordPress)
Purpose: Ad-hoc CMS configuration and operations Subskills: onboard, search, publish Supported CMSs: Sanity (full support), Contentful (coming soon), WordPress (coming soon)
This skill provides ad-hoc CMS operations using kurt cms CLI commands:
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.
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 commandssrc/kurt/cms/sanity/adapter.py - Sanity implementationsrc/kurt/cms/config.py - Configuration managementThis skill focuses on:
cms-interaction onboard
Routes to: kurt cms onboard --platform sanity
This guides you through:
.kurt/cms-config.jsonUse 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:
For systematic ingestion, use kurt map cms instead (see project-management-skill).
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).
If you have an existing Sanity account, here's how to get started:
From your Sanity project dashboard:
productionCreate .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:
.kurt/ directory is already gitignored, so your credentials are safe.From Claude Code:
cms-interaction onboard
This discovers your content types and maps your custom field names.
cms-interaction search --limit 5
Routes to subskills based on first argument:
onboard ā subskills/onboard.md ā kurt cms onboardsearch ā subskills/search.md ā kurt cms searchpublish ā subskills/publish.md ā kurt cms publishEach subskill:
kurt cms commandUse 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:
See project-management-skill/subskills/gather-sources.md for full orchestration.
All commands route to kurt cms:
cms-interaction onboard
ā kurt cms onboard --platform sanity
cms-interaction search --query "tutorial" --limit 20
ā kurt cms search --query "tutorial" --limit 20 --platform sanity
kurt cms fetch --id <document-id> --output-dir sources/cms/sanity/
kurt cms types --platform sanity
cms-interaction publish --file draft.md --id <document-id>
ā kurt cms publish --file draft.md --id <document-id> --platform sanity
kurt cms import --source-dir sources/cms/sanity/
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 clusteringdescription_field: Provides context for topic clusteringinferred_content_type: Auto-assigned from schema name, skips LLM classificationOrchestrates systematic CMS ingestion:
kurt map cms --cluster-urls for discoverykurt fetch --include "sanity/*" for bulk downloadConsumes CMS content:
cms-interaction publish to push back to CMSComplements CMS search:
cms-interaction onboard
.kurt/cms-config.jsonkurt cms types --platform sanitycms-interaction search --limit 20kurt cms typeswrite_token with Editor role to configFor detailed subskill documentation, see subskills/.md files.*