Merge remote-tracking branch 'origin/main' into development
This commit is contained in:
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: Agent Skills Specification
|
||||||
|
url: https://agentskills.io/specification.md
|
||||||
|
about: Learn the skill format before creating or requesting a skill
|
||||||
|
- name: Contributing Guide
|
||||||
|
url: https://github.com/coreyhaines31/marketingskills/blob/main/CONTRIBUTING.md
|
||||||
|
about: How to contribute a new skill to this repository
|
||||||
74
.github/ISSUE_TEMPLATE/skill-request.yml
vendored
Normal file
74
.github/ISSUE_TEMPLATE/skill-request.yml
vendored
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
name: Skill Request
|
||||||
|
description: Request a new marketing skill
|
||||||
|
title: "Skill Request: [skill-name]"
|
||||||
|
labels: ["enhancement"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for suggesting a new skill! Please fill out the details below.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: skill-name
|
||||||
|
attributes:
|
||||||
|
label: Suggested skill name
|
||||||
|
description: Lowercase, hyphens only (e.g., "landing-page-audit")
|
||||||
|
placeholder: "my-skill-name"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: What should this skill do?
|
||||||
|
description: Describe the skill's purpose and capabilities
|
||||||
|
placeholder: "This skill should help with..."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: triggers
|
||||||
|
attributes:
|
||||||
|
label: When should it be used?
|
||||||
|
description: What trigger phrases or scenarios should activate this skill?
|
||||||
|
placeholder: |
|
||||||
|
- When the user says "..."
|
||||||
|
- When working on...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: examples
|
||||||
|
attributes:
|
||||||
|
label: Example use cases
|
||||||
|
description: Provide 1-3 specific examples of how you'd use this skill
|
||||||
|
placeholder: |
|
||||||
|
1. I want to...
|
||||||
|
2. Help me...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: Category
|
||||||
|
description: Which category does this skill fit into?
|
||||||
|
options:
|
||||||
|
- CRO (Conversion Rate Optimization)
|
||||||
|
- Copywriting
|
||||||
|
- SEO
|
||||||
|
- Paid Ads
|
||||||
|
- Growth / Strategy
|
||||||
|
- Analytics
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: related-skills
|
||||||
|
attributes:
|
||||||
|
label: Related existing skills
|
||||||
|
description: Are there existing skills this relates to or differs from?
|
||||||
|
placeholder: "Similar to page-cro but focused on..."
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
15
.github/PULL_REQUEST_TEMPLATE/documentation.md
vendored
Normal file
15
.github/PULL_REQUEST_TEMPLATE/documentation.md
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
## Documentation
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
<!-- What documentation changes are you making? -->
|
||||||
|
|
||||||
|
## Files changed
|
||||||
|
|
||||||
|
<!-- List the files you're updating -->
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] Links are valid
|
||||||
|
- [ ] Formatting is consistent with existing docs
|
||||||
|
- [ ] No sensitive data or credentials
|
||||||
16
.github/PULL_REQUEST_TEMPLATE/new-skill.md
vendored
Normal file
16
.github/PULL_REQUEST_TEMPLATE/new-skill.md
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
## New Skill
|
||||||
|
|
||||||
|
**Skill name:** `skills/SKILL-NAME`
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
<!-- What does this skill do and when should it be used? -->
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] `name` matches directory name exactly
|
||||||
|
- [ ] `name` follows naming rules (lowercase, hyphens, no `--`)
|
||||||
|
- [ ] `description` is 1-1024 chars with trigger phrases
|
||||||
|
- [ ] `SKILL.md` is under 500 lines
|
||||||
|
- [ ] No sensitive data or credentials
|
||||||
|
- [ ] Tested locally with AI agent
|
||||||
21
.github/PULL_REQUEST_TEMPLATE/skill-update.md
vendored
Normal file
21
.github/PULL_REQUEST_TEMPLATE/skill-update.md
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
## Skill Update
|
||||||
|
|
||||||
|
**Skill:** `skills/SKILL-NAME`
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
<!-- What changes are you making and why? -->
|
||||||
|
|
||||||
|
## Type of update
|
||||||
|
|
||||||
|
- [ ] Bug fix
|
||||||
|
- [ ] Improved instructions
|
||||||
|
- [ ] Added references/scripts
|
||||||
|
- [ ] Other
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] Changes are focused and minimal
|
||||||
|
- [ ] `SKILL.md` is still under 500 lines
|
||||||
|
- [ ] No sensitive data or credentials
|
||||||
|
- [ ] Tested locally with AI agent
|
||||||
184
.github/scripts/sync-skills.js
vendored
Normal file
184
.github/scripts/sync-skills.js
vendored
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
/**
|
||||||
|
* Sync marketplace.json and README.md with skills directory.
|
||||||
|
*
|
||||||
|
* Scans the skills/ directory for valid skills (directories containing SKILL.md)
|
||||||
|
* and updates marketplace.json and the README skills table to match.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
const SKILLS_DIR = "skills";
|
||||||
|
const MARKETPLACE_FILE = ".claude-plugin/marketplace.json";
|
||||||
|
const README_FILE = "README.md";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse YAML frontmatter from a SKILL.md file
|
||||||
|
*/
|
||||||
|
function parseFrontmatter(content) {
|
||||||
|
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
||||||
|
if (!match) return {};
|
||||||
|
|
||||||
|
const frontmatter = {};
|
||||||
|
const lines = match[1].split("\n");
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
const colonIndex = line.indexOf(":");
|
||||||
|
if (colonIndex === -1) continue;
|
||||||
|
|
||||||
|
const key = line.slice(0, colonIndex).trim();
|
||||||
|
let value = line.slice(colonIndex + 1).trim();
|
||||||
|
|
||||||
|
// Remove quotes if present
|
||||||
|
if ((value.startsWith('"') && value.endsWith('"')) ||
|
||||||
|
(value.startsWith("'") && value.endsWith("'"))) {
|
||||||
|
value = value.slice(1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
frontmatter[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return frontmatter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all skills with their metadata
|
||||||
|
*/
|
||||||
|
function getSkillsWithMetadata() {
|
||||||
|
if (!fs.existsSync(SKILLS_DIR)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return fs
|
||||||
|
.readdirSync(SKILLS_DIR, { withFileTypes: true })
|
||||||
|
.filter((entry) => {
|
||||||
|
if (!entry.isDirectory()) return false;
|
||||||
|
const skillFile = path.join(SKILLS_DIR, entry.name, "SKILL.md");
|
||||||
|
return fs.existsSync(skillFile);
|
||||||
|
})
|
||||||
|
.map((entry) => {
|
||||||
|
const skillFile = path.join(SKILLS_DIR, entry.name, "SKILL.md");
|
||||||
|
const content = fs.readFileSync(skillFile, "utf8");
|
||||||
|
const frontmatter = parseFrontmatter(content);
|
||||||
|
|
||||||
|
return {
|
||||||
|
dir: entry.name,
|
||||||
|
path: `./${SKILLS_DIR}/${entry.name}`,
|
||||||
|
name: frontmatter.name || entry.name,
|
||||||
|
description: frontmatter.description || "",
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((a, b) => a.name.localeCompare(b.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update skill count in description
|
||||||
|
*/
|
||||||
|
function updateSkillCount(description, count) {
|
||||||
|
return description.replace(/\d+ marketing skills/, `${count} marketing skills`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate description to a maximum length
|
||||||
|
*/
|
||||||
|
function truncateDescription(description, maxLength = 120) {
|
||||||
|
if (description.length <= maxLength) return description;
|
||||||
|
|
||||||
|
// Find last space before maxLength to avoid cutting words
|
||||||
|
const truncated = description.slice(0, maxLength);
|
||||||
|
const lastSpace = truncated.lastIndexOf(" ");
|
||||||
|
|
||||||
|
return truncated.slice(0, lastSpace) + "...";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the skills table for README
|
||||||
|
*/
|
||||||
|
function generateSkillsTable(skills) {
|
||||||
|
const header = "| Skill | Description |\n|-------|-------------|";
|
||||||
|
const rows = skills.map((skill) => {
|
||||||
|
const link = `[${skill.name}](skills/${skill.dir}/)`;
|
||||||
|
const description = truncateDescription(skill.description);
|
||||||
|
return `| ${link} | ${description} |`;
|
||||||
|
});
|
||||||
|
|
||||||
|
return [header, ...rows].join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update README.md with new skills table
|
||||||
|
*/
|
||||||
|
function updateReadme(skills) {
|
||||||
|
const content = fs.readFileSync(README_FILE, "utf8");
|
||||||
|
|
||||||
|
// Match content between skill list markers
|
||||||
|
const tableRegex = /(<!-- SKILLS:START -->\n)[\s\S]*?(\n<!-- SKILLS:END -->)/;
|
||||||
|
const newTable = generateSkillsTable(skills);
|
||||||
|
|
||||||
|
if (!tableRegex.test(content)) {
|
||||||
|
console.log("WARNING: Could not find skill markers in README.md");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const newContent = content.replace(tableRegex, `$1${newTable}$2`);
|
||||||
|
|
||||||
|
if (newContent === content) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(README_FILE, newContent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update marketplace.json with skills list
|
||||||
|
*/
|
||||||
|
function updateMarketplace(skills) {
|
||||||
|
const marketplace = JSON.parse(fs.readFileSync(MARKETPLACE_FILE, "utf8"));
|
||||||
|
const plugin = marketplace.plugins[0];
|
||||||
|
const existingSkills = plugin.skills || [];
|
||||||
|
const currentSkills = skills.map((s) => s.path);
|
||||||
|
|
||||||
|
if (JSON.stringify(currentSkills) === JSON.stringify(existingSkills)) {
|
||||||
|
return { updated: false };
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.skills = currentSkills;
|
||||||
|
plugin.description = updateSkillCount(plugin.description, currentSkills.length);
|
||||||
|
|
||||||
|
fs.writeFileSync(MARKETPLACE_FILE, JSON.stringify(marketplace, null, 2) + "\n");
|
||||||
|
|
||||||
|
const added = currentSkills.filter((s) => !existingSkills.includes(s));
|
||||||
|
const removed = existingSkills.filter((s) => !currentSkills.includes(s));
|
||||||
|
|
||||||
|
return { updated: true, added, removed };
|
||||||
|
}
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
const skills = getSkillsWithMetadata();
|
||||||
|
|
||||||
|
const marketplaceResult = updateMarketplace(skills);
|
||||||
|
const readmeUpdated = updateReadme(skills);
|
||||||
|
|
||||||
|
if (!marketplaceResult.updated && !readmeUpdated) {
|
||||||
|
console.log("Everything is already in sync");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (marketplaceResult.updated) {
|
||||||
|
if (marketplaceResult.added.length) {
|
||||||
|
console.log(`Added: ${marketplaceResult.added.join(", ")}`);
|
||||||
|
}
|
||||||
|
if (marketplaceResult.removed.length) {
|
||||||
|
console.log(`Removed: ${marketplaceResult.removed.join(", ")}`);
|
||||||
|
}
|
||||||
|
console.log(`Updated marketplace.json (${skills.length} skills)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (readmeUpdated) {
|
||||||
|
console.log("Updated README.md skills table");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
30
.github/workflows/sync-skills.yml
vendored
Normal file
30
.github/workflows/sync-skills.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
name: Sync Skills
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
paths:
|
||||||
|
- 'skills/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync:
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
persist-credentials: true
|
||||||
|
|
||||||
|
- name: Sync skills
|
||||||
|
run: node .github/scripts/sync-skills.js
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v7
|
||||||
|
with:
|
||||||
|
commit_user_name: Coreybot
|
||||||
|
commit_user_email: coreybot+github-actions[bot]@users.noreply.github.com
|
||||||
|
commit_message: "chore: sync skills with marketplace.json and README"
|
||||||
|
file_pattern: ".claude-plugin/marketplace.json README.md"
|
||||||
65
.github/workflows/validate-skill.yml
vendored
Normal file
65
.github/workflows/validate-skill.yml
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
name: Validate Agent Skill
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
paths:
|
||||||
|
- "**/SKILL.md"
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
paths:
|
||||||
|
- "**/SKILL.md"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: validate-skill-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
detect-changes:
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
if: github.event.pull_request.draft != true && github.actor != 'dependabot[bot]'
|
||||||
|
outputs:
|
||||||
|
skills: ${{ steps.changed-skills.outputs.skills }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Get changed skills
|
||||||
|
id: changed-skills
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.event_name }}" = "pull_request" ]; then
|
||||||
|
BASE=${{ github.event.pull_request.base.sha }}
|
||||||
|
HEAD=${{ github.event.pull_request.head.sha }}
|
||||||
|
else
|
||||||
|
BASE=${{ github.event.before }}
|
||||||
|
HEAD=${{ github.event.after }}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find changed SKILL.md files and extract skill directories
|
||||||
|
SKILLS=$(git diff --name-only $BASE $HEAD | \
|
||||||
|
grep 'SKILL.md$' | \
|
||||||
|
xargs -I {} dirname {} | \
|
||||||
|
sort -u | \
|
||||||
|
jq -R -s -c 'split("\n") | map(select(length > 0))')
|
||||||
|
|
||||||
|
echo "skills=$SKILLS" >> $GITHUB_OUTPUT
|
||||||
|
echo "Changed skills: $SKILLS"
|
||||||
|
|
||||||
|
validate:
|
||||||
|
needs: detect-changes
|
||||||
|
if: needs.detect-changes.outputs.skills != '[]'
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
skill: ${{ fromJson(needs.detect-changes.outputs.skills) }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Validate ${{ matrix.skill }}
|
||||||
|
uses: Flash-Brew-Digital/validate-skill@v1
|
||||||
|
with:
|
||||||
|
path: ${{ matrix.skill }}
|
||||||
157
AGENTS.md
Normal file
157
AGENTS.md
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
# AGENTS.md
|
||||||
|
|
||||||
|
Guidelines for AI agents working in this repository.
|
||||||
|
|
||||||
|
## Repository Overview
|
||||||
|
|
||||||
|
This repository contains **Agent Skills** for AI agents following the [Agent Skills specification](https://agentskills.io/specification.md). It also serves as a **Claude Code plugin marketplace** via `.claude-plugin/marketplace.json`.
|
||||||
|
|
||||||
|
- **Name**: Marketing Skills
|
||||||
|
- **GitHub**: [coreyhaines31/marketingskills](https://github.com/coreyhaines31/marketingskills)
|
||||||
|
- **Creator**: Corey Haines
|
||||||
|
- **License**: MIT
|
||||||
|
|
||||||
|
## Repository Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
marketingskills/
|
||||||
|
├── .claude-plugin/
|
||||||
|
│ └── marketplace.json # Claude Code plugin marketplace manifest
|
||||||
|
├── skills/ # Agent Skills
|
||||||
|
│ └── skill-name/
|
||||||
|
│ └── SKILL.md # Required skill file
|
||||||
|
├── CONTRIBUTING.md
|
||||||
|
├── LICENSE
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build / Lint / Test Commands
|
||||||
|
|
||||||
|
**Not applicable** - This is a content-only repository with no executable code.
|
||||||
|
|
||||||
|
Verify manually:
|
||||||
|
- YAML frontmatter is valid
|
||||||
|
- `name` field matches directory name exactly
|
||||||
|
- `name` is 1-64 chars, lowercase alphanumeric and hyphens only
|
||||||
|
- `description` is 1-1024 characters
|
||||||
|
|
||||||
|
## Agent Skills Specification
|
||||||
|
|
||||||
|
Skills follow the [Agent Skills spec](https://agentskills.io/specification.md).
|
||||||
|
|
||||||
|
### Required Frontmatter
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
name: skill-name
|
||||||
|
description: What this skill does and when to use it. Include trigger phrases.
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontmatter Field Constraints
|
||||||
|
|
||||||
|
| Field | Required | Constraints |
|
||||||
|
|---------------|----------|------------------------------------------------------------------|
|
||||||
|
| `name` | Yes | 1-64 chars, lowercase `a-z`, numbers, hyphens. Must match dir. |
|
||||||
|
| `description` | Yes | 1-1024 chars. Describe what it does and when to use it. |
|
||||||
|
| `license` | No | License name (default: MIT) |
|
||||||
|
| `metadata` | No | Key-value pairs (author, version, etc.) |
|
||||||
|
|
||||||
|
### Name Field Rules
|
||||||
|
|
||||||
|
- Lowercase letters, numbers, and hyphens only
|
||||||
|
- Cannot start or end with hyphen
|
||||||
|
- No consecutive hyphens (`--`)
|
||||||
|
- Must match parent directory name exactly
|
||||||
|
|
||||||
|
**Valid**: `page-cro`, `email-sequence`, `ab-test-setup`
|
||||||
|
**Invalid**: `Page-CRO`, `-page`, `page--cro`
|
||||||
|
|
||||||
|
### Optional Skill Directories
|
||||||
|
|
||||||
|
```
|
||||||
|
skills/skill-name/
|
||||||
|
├── SKILL.md # Required - main instructions (<500 lines)
|
||||||
|
├── references/ # Optional - detailed docs loaded on demand
|
||||||
|
├── scripts/ # Optional - executable code
|
||||||
|
└── assets/ # Optional - templates, data files
|
||||||
|
```
|
||||||
|
|
||||||
|
## Writing Style Guidelines
|
||||||
|
|
||||||
|
### Structure
|
||||||
|
|
||||||
|
- Keep `SKILL.md` under 500 lines (move details to `references/`)
|
||||||
|
- Use H2 (`##`) for main sections, H3 (`###`) for subsections
|
||||||
|
- Use bullet points and numbered lists liberally
|
||||||
|
- Short paragraphs (2-4 sentences max)
|
||||||
|
|
||||||
|
### Tone
|
||||||
|
|
||||||
|
- Direct and instructional
|
||||||
|
- Second person ("You are a conversion rate optimization expert")
|
||||||
|
- Professional but approachable
|
||||||
|
|
||||||
|
### Formatting
|
||||||
|
|
||||||
|
- Bold (`**text**`) for key terms
|
||||||
|
- Code blocks for examples and templates
|
||||||
|
- Tables for reference data
|
||||||
|
- No excessive emojis
|
||||||
|
|
||||||
|
### Clarity Principles
|
||||||
|
|
||||||
|
- Clarity over cleverness
|
||||||
|
- Specific over vague
|
||||||
|
- Active voice over passive
|
||||||
|
- One idea per section
|
||||||
|
|
||||||
|
### Description Field Best Practices
|
||||||
|
|
||||||
|
The `description` is critical for skill discovery. Include:
|
||||||
|
1. What the skill does
|
||||||
|
2. When to use it (trigger phrases)
|
||||||
|
3. Related skills for scope boundaries
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
description: When the user wants to optimize conversions on any marketing page. Use when the user says "CRO," "conversion rate optimization," "this page isn't converting." For signup flows, see signup-flow-cro.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Claude Code Plugin
|
||||||
|
|
||||||
|
This repo also serves as a plugin marketplace. The manifest at `.claude-plugin/marketplace.json` lists all skills for installation via:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/plugin marketplace add coreyhaines31/marketingskills
|
||||||
|
/plugin install marketing-skills
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Claude Code plugins documentation](https://code.claude.com/docs/en/plugins.md) for details.
|
||||||
|
|
||||||
|
## Git Workflow
|
||||||
|
|
||||||
|
### Branch Naming
|
||||||
|
|
||||||
|
- New skills: `feat/skill-name`
|
||||||
|
- Improvements: `fix/skill-name-description`
|
||||||
|
- Documentation: `docs/description`
|
||||||
|
|
||||||
|
### Commit Messages
|
||||||
|
|
||||||
|
Follow the [Conventional Commits](https://www.conventionalcommits.org/) specification:
|
||||||
|
|
||||||
|
- `feat: add skill-name skill`
|
||||||
|
- `fix: improve clarity in page-cro`
|
||||||
|
- `docs: update README`
|
||||||
|
|
||||||
|
### Pull Request Checklist
|
||||||
|
|
||||||
|
- [ ] `name` matches directory name exactly
|
||||||
|
- [ ] `name` follows naming rules (lowercase, hyphens, no `--`)
|
||||||
|
- [ ] `description` is 1-1024 chars with trigger phrases
|
||||||
|
- [ ] `SKILL.md` is under 500 lines
|
||||||
|
- [ ] No sensitive data or credentials
|
||||||
|
|
||||||
|
## Skill Categories
|
||||||
|
|
||||||
|
See `README.md` for the current list of skills organized by category. When adding new skills, follow the naming patterns of existing skills in that category.
|
||||||
91
CONTRIBUTING.md
Normal file
91
CONTRIBUTING.md
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Thanks for your interest in contributing to Marketing Skills! This guide will help you add new skills or improve existing ones.
|
||||||
|
|
||||||
|
## Requesting a Skill
|
||||||
|
|
||||||
|
You can also suggest new skills by [opening a skill request](https://github.com/coreyhaines31/marketingskills/issues/new?template=skill-request.yml).
|
||||||
|
|
||||||
|
## Adding a New Skill
|
||||||
|
|
||||||
|
### 1. Create the skill directory
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p skills/your-skill-name
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Create the SKILL.md file
|
||||||
|
|
||||||
|
Every skill needs a `SKILL.md` file with YAML frontmatter:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
name: your-skill-name
|
||||||
|
description: When to use this skill. Include trigger phrases and keywords that help agents identify relevant tasks.
|
||||||
|
license: MIT
|
||||||
|
metadata:
|
||||||
|
author: "[Your Name](https://your-website.com)"
|
||||||
|
version: "1.0.0"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Your Skill Name
|
||||||
|
|
||||||
|
Instructions for the agent go here...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Follow the naming conventions
|
||||||
|
|
||||||
|
- **Directory name**: lowercase, hyphens only (e.g., `email-sequence`)
|
||||||
|
- **Name field**: must match directory name exactly
|
||||||
|
- **Description**: 1-1024 characters, include trigger phrases
|
||||||
|
|
||||||
|
### 4. Structure your skill
|
||||||
|
|
||||||
|
```
|
||||||
|
skills/your-skill-name/
|
||||||
|
├── SKILL.md # Required - main instructions
|
||||||
|
├── references/ # Optional - additional documentation
|
||||||
|
│ └── guide.md
|
||||||
|
├── scripts/ # Optional - executable code
|
||||||
|
│ └── helper.py
|
||||||
|
└── assets/ # Optional - templates, images, data
|
||||||
|
└── template.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Write effective instructions
|
||||||
|
|
||||||
|
- Keep `SKILL.md` under 500 lines
|
||||||
|
- Move detailed reference material to `references/`
|
||||||
|
- Include step-by-step instructions
|
||||||
|
- Add examples of inputs and outputs
|
||||||
|
- Cover common edge cases
|
||||||
|
|
||||||
|
## Improving Existing Skills
|
||||||
|
|
||||||
|
1. Read the existing skill thoroughly
|
||||||
|
2. Test your changes locally
|
||||||
|
3. Keep changes focused and minimal
|
||||||
|
4. Update the version in metadata if making significant changes
|
||||||
|
|
||||||
|
## Submitting Your Contribution
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Create a feature branch (`git checkout -b feat/new-skill-name`)
|
||||||
|
3. Make your changes
|
||||||
|
4. Test locally with an AI agent
|
||||||
|
5. Submit a pull request using the appropriate template:
|
||||||
|
- [New Skill](?template=new-skill.md)
|
||||||
|
- [Skill Update](?template=skill-update.md)
|
||||||
|
- [Documentation](?template=documentation.md)
|
||||||
|
|
||||||
|
## Skill Quality Checklist
|
||||||
|
|
||||||
|
- [ ] `name` matches directory name
|
||||||
|
- [ ] `description` clearly explains when to use the skill
|
||||||
|
- [ ] Instructions are clear and actionable
|
||||||
|
- [ ] No sensitive data or credentials
|
||||||
|
- [ ] Follows existing skill patterns in the repo
|
||||||
|
|
||||||
|
## Questions?
|
||||||
|
|
||||||
|
Open an issue if you have questions or need help with your contribution.
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 Corey Haines
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
89
README.md
89
README.md
@@ -14,31 +14,33 @@ Skills are markdown files that give AI agents specialized knowledge and workflow
|
|||||||
|
|
||||||
## Available Skills
|
## Available Skills
|
||||||
|
|
||||||
| Skill | Description | Triggers |
|
<!-- SKILLS:START -->
|
||||||
|-------|-------------|----------|
|
| Skill | Description |
|
||||||
| [ab-test-setup](skills/ab-test-setup/) | Plan and implement A/B tests | "A/B test," "split test," "experiment" |
|
|-------|-------------|
|
||||||
| [analytics-tracking](skills/analytics-tracking/) | Set up tracking and measurement | "tracking," "GA4," "GTM," "events" |
|
| [ab-test-setup](skills/ab-test-setup/) | When the user wants to plan, design, or implement an A/B test or experiment. Also use when the user mentions "A/B... |
|
||||||
| [competitor-alternatives](skills/competitor-alternatives/) | Competitor comparison and alternative pages | "vs page," "alternative page," "[X] vs [Y]" |
|
| [analytics-tracking](skills/analytics-tracking/) | When the user wants to set up, improve, or audit analytics tracking and measurement. Also use when the user mentions... |
|
||||||
| [copy-editing](skills/copy-editing/) | Edit and polish existing copy | "edit this copy," "review my copy," "copy sweep" |
|
| [competitor-alternatives](skills/competitor-alternatives/) | When the user wants to create competitor comparison or alternative pages for SEO and sales enablement. Also use when... |
|
||||||
| [copywriting](skills/copywriting/) | Write or improve marketing copy | "write copy," "rewrite," "headlines," "CTA copy" |
|
| [copy-editing](skills/copy-editing/) | When the user wants to edit, review, or improve existing marketing copy. Also use when the user mentions 'edit this... |
|
||||||
| [email-sequence](skills/email-sequence/) | Build email sequences and drip campaigns | "email sequence," "drip campaign," "nurture" |
|
| [copywriting](skills/copywriting/) | When the user wants to write, rewrite, or improve marketing copy for any page — including homepage, landing pages,... |
|
||||||
| [form-cro](skills/form-cro/) | Optimize lead capture and contact forms | "form optimization," "lead form," "contact form" |
|
| [email-sequence](skills/email-sequence/) | When the user wants to create or optimize an email sequence, drip campaign, automated email flow, or lifecycle email... |
|
||||||
| [free-tool-strategy](skills/free-tool-strategy/) | Plan engineering-as-marketing tools | "free tool," "calculator," "lead gen tool" |
|
| [form-cro](skills/form-cro/) | When the user wants to optimize any form that is NOT signup/registration — including lead capture forms, contact forms,... |
|
||||||
| [launch-strategy](skills/launch-strategy/) | Product launches and feature announcements | "launch," "Product Hunt," "feature release" |
|
| [free-tool-strategy](skills/free-tool-strategy/) | When the user wants to plan, evaluate, or build a free tool for marketing purposes — lead generation, SEO value, or... |
|
||||||
| [marketing-ideas](skills/marketing-ideas/) | 140 SaaS marketing ideas and strategies | "marketing ideas," "growth ideas," "how to market" |
|
| [launch-strategy](skills/launch-strategy/) | When the user wants to plan a product launch, feature announcement, or release strategy. Also use when the user... |
|
||||||
| [marketing-psychology](skills/marketing-psychology/) | 70+ mental models for marketing | "psychology," "mental models," "cognitive bias" |
|
| [marketing-ideas](skills/marketing-ideas/) | When the user needs marketing ideas, inspiration, or strategies for their SaaS or software product. Also use when the... |
|
||||||
| [onboarding-cro](skills/onboarding-cro/) | Improve user activation and onboarding | "onboarding," "activation," "first-run experience" |
|
| [marketing-psychology](skills/marketing-psychology/) | When the user wants to apply psychological principles, mental models, or behavioral science to marketing. Also use when... |
|
||||||
| [page-cro](skills/page-cro/) | Conversion optimization for any marketing page | "optimize [page]," "CRO," "page isn't converting" |
|
| [onboarding-cro](skills/onboarding-cro/) | When the user wants to optimize post-signup onboarding, user activation, first-run experience, or time-to-value. Also... |
|
||||||
| [paid-ads](skills/paid-ads/) | Create and optimize paid ad campaigns | "PPC," "Google Ads," "Meta ads," "paid media" |
|
| [page-cro](skills/page-cro/) | When the user wants to optimize, improve, or increase conversions on any marketing page — including homepage, landing... |
|
||||||
| [paywall-upgrade-cro](skills/paywall-upgrade-cro/) | In-app paywalls and upgrade screens | "paywall," "upgrade screen," "feature gate" |
|
| [paid-ads](skills/paid-ads/) | When the user wants help with paid advertising campaigns on Google Ads, Meta (Facebook/Instagram), LinkedIn, Twitter/X,... |
|
||||||
| [popup-cro](skills/popup-cro/) | Create/optimize popups and modals | "popup," "modal," "exit intent" |
|
| [paywall-upgrade-cro](skills/paywall-upgrade-cro/) | When the user wants to create or optimize in-app paywalls, upgrade screens, upsell modals, or feature gates. Also use... |
|
||||||
| [pricing-strategy](skills/pricing-strategy/) | Design pricing, packaging, and monetization | "pricing," "tiers," "freemium," "willingness to pay" |
|
| [popup-cro](skills/popup-cro/) | When the user wants to create or optimize popups, modals, overlays, slide-ins, or banners for conversion purposes. Also... |
|
||||||
| [programmatic-seo](skills/programmatic-seo/) | Build SEO pages at scale | "programmatic SEO," "template pages," "pages at scale" |
|
| [pricing-strategy](skills/pricing-strategy/) | When the user wants help with pricing decisions, packaging, or monetization strategy. Also use when the user mentions... |
|
||||||
| [referral-program](skills/referral-program/) | Design referral and affiliate programs | "referral," "affiliate," "word of mouth," "viral" |
|
| [programmatic-seo](skills/programmatic-seo/) | When the user wants to create SEO-driven pages at scale using templates and data. Also use when the user mentions... |
|
||||||
| [schema-markup](skills/schema-markup/) | Add structured data and rich snippets | "schema," "JSON-LD," "structured data" |
|
| [referral-program](skills/referral-program/) | When the user wants to create, optimize, or analyze a referral program, affiliate program, or word-of-mouth strategy.... |
|
||||||
| [seo-audit](skills/seo-audit/) | Audit technical and on-page SEO | "SEO audit," "technical SEO," "not ranking" |
|
| [schema-markup](skills/schema-markup/) | When the user wants to add, fix, or optimize schema markup and structured data on their site. Also use when the user... |
|
||||||
| [signup-flow-cro](skills/signup-flow-cro/) | Optimize signup and registration flows | "signup optimization," "registration form" |
|
| [seo-audit](skills/seo-audit/) | When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO... |
|
||||||
| [social-content](skills/social-content/) | Create and schedule social media content | "LinkedIn post," "Twitter thread," "social media" |
|
| [signup-flow-cro](skills/signup-flow-cro/) | When the user wants to optimize signup, registration, account creation, or trial activation flows. Also use when the... |
|
||||||
|
| [social-content](skills/social-content/) | When the user wants help creating, scheduling, or optimizing social media content for LinkedIn, Twitter/X, Instagram,... |
|
||||||
|
<!-- SKILLS:END -->
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -166,41 +168,8 @@ You can also invoke skills directly:
|
|||||||
|
|
||||||
Found a way to improve a skill? Have a new skill to suggest? PRs and issues welcome!
|
Found a way to improve a skill? Have a new skill to suggest? PRs and issues welcome!
|
||||||
|
|
||||||
**Ideas for contributions:**
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on adding or improving skills.
|
||||||
- Improve existing skill instructions or frameworks
|
|
||||||
- Add new experiment ideas or best practices
|
|
||||||
- Fix typos or clarify confusing sections
|
|
||||||
- Suggest new skills (open an issue first to discuss)
|
|
||||||
- Add examples or case studies
|
|
||||||
|
|
||||||
**How to contribute:**
|
|
||||||
1. Fork the repo
|
|
||||||
2. Edit the skill file(s)
|
|
||||||
3. Submit a PR with a clear description of what you improved
|
|
||||||
|
|
||||||
### Skill File Structure
|
|
||||||
|
|
||||||
Each skill is a directory containing a `SKILL.md` file:
|
|
||||||
|
|
||||||
```
|
|
||||||
skills/
|
|
||||||
skill-name/
|
|
||||||
SKILL.md
|
|
||||||
```
|
|
||||||
|
|
||||||
The `SKILL.md` file follows this format:
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
---
|
|
||||||
name: skill-name
|
|
||||||
description: One-line description for skill selection
|
|
||||||
---
|
|
||||||
|
|
||||||
# Skill Name
|
|
||||||
|
|
||||||
[Full instructions for the AI agent]
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT - Use these however you want.
|
[MIT](LICENSE) - Use these however you want.
|
||||||
|
|||||||
Reference in New Issue
Block a user