AgentSkillsCN

Cms Schema Generator

CMS 模式生成器

SKILL.md

CMS Schema Generator

Purpose

Automatically generate Webflow CMS collection schemas from mock data files.

Input Analysis

1. Read Mock Data Structure

javascript
// Example input: mockBlogData.js
export const blogPost = {
  title: "My First Post",
  slug: "my-first-post",
  author: {
    name: "John Doe",
    avatar: "/john.jpg"
  },
  categories: ["Tech", "Webflow"],
  body: "<p>Content here...</p>",
  publishedDate: "2026-01-15",
  featured: true,
  viewCount: 1234
};

2. Infer Structure

yaml
collections:
  - name: Blog Posts
    fields:
      - title (PlainText)
      - slug (PlainText, unique)
      - body (RichText)  # HTML detected
      - publishedDate (Date)  # Date format detected
      - featured (Bool)
      - viewCount (Number)
      - author (Reference → Authors)
      - categories (MultiReference → Categories)

Type Inference Rules

Strings

javascript
"Short text" → PlainText (< 100 chars, no HTML)
"<p>HTML content</p>" → RichText (contains HTML tags)
"/path/to/page" → Link (starts with / or http)
"/image.jpg" → Image (ends with image extension)
"2026-01-15" → Date (matches YYYY-MM-DD)
"Long text exceeding one hundred characters..." → RichText

Numbers

javascript
42 → Number
3.14 → Number (Webflow supports decimals)

Booleans

javascript
true/false → Bool

Arrays

javascript
["string1", "string2"] → MultiReference to new collection
[{object1}, {object2}] → MultiReference to new collection (create from objects)

Objects

javascript
{ nested: "object" } → Reference to new collection

Collection Naming

From Variable Names

javascript
// Input
const blogPost = {...};

// Output
Collection: "Blog Posts" (pluralize, add space)
Singular: "Blog Post"
Slug: "blog-posts"

From Arrays

javascript
// Input
const posts = [{...}, {...}];

// Output
Collection: "Posts"
Singular: "Post"

Field Naming

From Object Keys

javascript
// Input
{
  title: "...",
  publishedDate: "...",
  authorName: "..."
}

// Output
Fields:
- Title (camelCase → Title Case)
- Published Date (split camelCase)
- Author Name

Required Field Detection

Mark as required if:

  • Named: title, name, slug
  • Used as identifier
  • Always present in all sample data

Default Value Detection

javascript
{
  status: "draft",  // If same in all samples → default: "draft"
  published: false  // If same → default: false
}

Validation Rules

Unique Fields

  • slug → Always unique
  • Fields ending in Id → Unique

Max Length

javascript
title: "Short title" → maxLength: 100
description: "Longer description..." → maxLength: 500

Output Format

yaml
# Auto-generated CMS Schema
# Source: prototype/src/data/mockBlogData.js
# Generated: 2026-01-17

collections:
  - name: Blog Posts
    slug: blog-posts
    singularName: Blog Post
    
    fields:
      - name: Title
        slug: title
        type: PlainText
        required: true
        validation:
          maxLength: 100
      
      - name: Slug
        slug: slug
        type: PlainText
        required: true
        unique: true
        helpText: "URL-friendly version of title"
      
      - name: Body
        slug: body
        type: RichText
        required: true
      
      - name: Published Date
        slug: published-date
        type: Date
        required: false
        default: "current_date"
      
      - name: Featured
        slug: featured
        type: Bool
        required: false
        default: false
      
      - name: View Count
        slug: view-count
        type: Number
        required: false
        default: 0
      
      - name: Author
        slug: author
        type: Reference
        collection: authors
        required: true
      
      - name: Categories
        slug: categories
        type: MultiReference
        collection: categories
        required: false

  # Referenced collections
  - name: Authors
    slug: authors
    singularName: Author
    fields:
      - name: Name
        slug: name
        type: PlainText
        required: true
      - name: Avatar
        slug: avatar
        type: Image

  - name: Categories
    slug: categories
    singularName: Category
    fields:
      - name: Name
        slug: name
        type: PlainText
        required: true