Project Structure
The repository follows a clear organizational pattern with manifest-driven configuration:Data Flow
The repository uses a sophisticated sync system wheremanifest.json serves as the central source of truth:
The sync script preserves global fields in manifest.json while updating the skills array from discovered SKILL.md files.
What Lives Where
Understanding the source of truth for each piece of data is crucial:| Data | Source of truth | Flows to |
|---|---|---|
| Plugin name, description, author, homepage, repo, license | manifest.json (global fields) | Both plugin.json files, marketplace.json |
| Plugin keywords | manifest.json → keywords | Both plugin.json files, marketplace.json |
| Logo | manifest.json → logo | .cursor-plugin/plugin.json only |
| Author, repository | manifest.json (global fields) | SKILL.md → metadata.author, metadata.repository |
| Skill name, description, version, license | SKILL.md frontmatter | manifest.json → skills[], skills/index.json |
| Skill keywords | SKILL.md → metadata.keywords | manifest.json → skills[].keywords |
| Skill file listing | Filesystem (skill directory contents) | skills/index.json → skills[].files |
| Plugin version | manifest.json → version | Both plugin.json files, marketplace.json |
| Skill version | SKILL.md → metadata.version | manifest.json → skills[].version |
CI/CD Pipeline
The repository uses GitHub Actions for automated validation and synchronization. Workflow:.github/workflows/validate-and-sync.yml
Triggers: Changes to **/SKILL.md, manifest.json, .claude-plugin/**, .cursor-plugin/** on main or PRs to main.
Detect changes
The workflow first identifies which files have changed to determine what validation is needed.
Validate skills
Uses a matrix strategy to validate each changed skill using
Flash-Brew-Digital/validate-skill@v1.The sync job uses
always() && !failure() && !cancelled() so that skipped validation jobs (e.g., no plugin files changed) don’t block it.Scripts Overview
Two key scripts power the repository’s automation:sync-skills.js
Purpose: Discover skills fromskills/*/SKILL.md, update manifest and generated files
Reads:
SKILL.mdfrontmatter from all skill directoriesmanifest.jsonglobal configuration
manifest.json(updates skills array).claude-plugin/plugin.json.claude-plugin/marketplace.json.cursor-plugin/plugin.jsonskills/index.jsonREADME.md(updates skills table)
discoverSkills()- Scans skills directory and parses SKILL.md frontmatterupdateManifest()- Syncs skill metadata to manifest.jsonupdatePlugin()- Generates platform-specific plugin.json filesupdateMarketplace()- Updates Claude marketplace listingupdateIndex()- Creates agent-skills-discovery RFC indexupdateReadme()- Regenerates skills table in READMEupdateSkillFrontmatter()- Propagates author/repository to SKILL.md files
add-skill.js
Purpose: Scaffold a new skill directory with proper structure Reads:manifest.jsonfor author and license defaults
skills/<name>/SKILL.mdwith template frontmatter- Then calls
sync-skills.jsto register the new skill
normalizeName()- Converts input to lowercase-with-hyphens formatgenerateSkillMd()- Creates SKILL.md template with frontmatterrunSyncScript()- Spawns sync-skills.js to complete registration
Platform Differences
Claude Code and Cursor have different feature support:| Field | Claude Code | Cursor |
|---|---|---|
logo | ❌ Not supported | ✅ Supported |
rules | ❌ Not supported | ✅ Supported |
lspServers | ✅ Supported | ❌ Not documented |
outputStyles | ✅ Supported | ❌ Not documented |
Both platforms support:
name, description, version, author, homepage, repository, license, keywords, skills, commands, agents, hooks, mcpServers.Project Identification
- Project: Webflow Agent Skills
- Repository: https://github.com/224-industries/webflow-skills
- Maintainer: Ben Sabic at 224 Industries
- License: MIT
- Last Updated: 2026-02-23