thomast1906/skill-creator
Create, update, review, and validate GitHub Copilot agent skills (SKILL.md files). Use this skill whenever someone wants to create a new skill, build a skill from scratch, package domain knowledge into a reusable agent skill, turn a workflow into a skill, or asks "how do I teach Copilot to do X consistently". Also use when updating or improving an existing SKILL.md, writing the description field for better triggering, or designing the folder structure and bundled resources for a skill. Do NOT use for general coding questions, runtime debugging, or MCP server configuration.
npx skills add https://github.com/thomast1906/github-copilot-agent-skills --skill skill-creator
Create high-quality GitHub Copilot agent skills (SKILL.md) that transform the general-purpose agent into a specialized expert.
A skill is a modular, self-contained knowledge package stored in .github/skills/<skill-name>/SKILL.md. It provides:
Skills load in three levels (progressive disclosure):
name + description) — Always in context (~100 words). This is the trigger mechanism.skill-name/
├── SKILL.md (required)
│ ├── YAML frontmatter name + description (required)
│ └── Markdown instructions
└── Bundled Resources (optional)
├── scripts/ Executable code for deterministic/repetitive tasks
├── references/ Docs loaded into context as needed
└── assets/ Output files (templates, icons, boilerplate)
Do NOT include: setup guides, changelogs, or user-facing documentation — skills are instructions for the agent, not onboarding docs for humans.
Not every workflow needs a skill. Before creating one, choose the right tool:
| Situation | Use instead |
|---|---|
| A rule that applies to ALL Copilot interactions in this repo | copilot-instructions.md entry |
| A rule scoped to specific file types (e.g., always use kebab-case for Bicep variable names) | .github/instructions/*.instructions.md with applyTo glob |
| A one-off prompt you run occasionally | .github/prompts/*.prompt.md |
| A multi-step workflow with domain knowledge that benefits from on-demand loading | Skill |
| A complex workflow with a dedicated agent persona | .github/agents/*.agent.md |
A skill is the right choice when: the workflow is too detailed for copilot-instructions.md, it should only load for relevant requests (not every conversation), and it encapsulates reusable domain knowledge or a repeatable process.
If the user's need is better served by a simpler vehicle, say so and use that instead. Not everything needs to be a skill.
Understand the problem before writing a single line. Ask conversationally:
Collect 2–3 concrete use cases. For each, capture:
Trigger: What the user says/does
Steps: Sequence of actions
Tools: Built-in or MCP tools needed
Result: What success looks like (specific output)
Exit criteria: 2–3 use cases defined, success criteria agreed, tools/dependencies identified.
Make structural decisions before writing:
scripts/, references/, or assets/ when there is a clear reason:scripts/references/assets/Exit criteria: Pattern selected, folder structure planned, description drafted, content mapped.
Write SKILL.md with precision.
Frontmatter rules:
---
name: kebab-case-name
description: [What + When + optional Not-when — single line, under 200 words]
---
name: kebab-case only, matches the folder name exactlydescription: primary trigger mechanism — include trigger phrases, what it does, what it does NOT doBody writing guidelines:
.github/skills/. Never assume it is the only skill in context. Avoid generic section headings like "## Overview" that could conflict, and don't claim to handle tasks that belong to another skill in this repo.Read references/output-patterns.md for patterns on specifying output format (Template, Examples, Scope Communication, Validation Gate) — load it when deciding how to structure the skill's output expectations or examples.
Run the automated validator first:
python .github/skills/skill-creator/scripts/quick_validate.py .github/skills/<skill-name>
Then work through the full references/quality-checklist.md for description quality scoring, instruction quality scoring, trigger testing, and final sign-off.
Quick structure checks (also caught by the script):
name and description, correct YAML delimiters (---)name field< >Trigger checks — propose 3–5 test phrases and verify mentally:
Quality checks:
If starting a new skill from scratch, scaffold the folder first:
python .github/skills/skill-creator/scripts/init_skill.py <skill-name>
This creates the folder and a template SKILL.md with TODO placeholders. Then fill in the skill content and run the validator before presenting to the user.
Place the completed skill at .github/skills/<skill-name>/SKILL.md.
Present a brief summary:
The description field is the primary mechanism that determines whether Copilot invokes the skill. A well-written description is specific, includes trigger phrases, and leans slightly "pushy" — agents tend to undertrigger.
Structure: [What it does] + [When to use it — include actual phrases users would say] + [What NOT to use it for if overlap risk exists]
Good example:
Analyze Azure architectures for cost optimization opportunities and provide savings recommendations. Use when reviewing Azure spending, asked to reduce costs, optimize resources, right-size VMs, or find savings across subscriptions. Do NOT use for general architecture design (use architecture-design skill instead).
Bad example:
Helps with Azure cost analysis.
Rules:
Do NOT use for...) when overlap with other skills is likelyKeep core workflow in SKILL.md; move detailed docs to references/. For each reference file, state exactly when the agent should load it — e.g. "read when the user asks about X" or "read when diagnosing Y".
Organize by domain to avoid loading irrelevant context. When a skill spans multiple environments or tool variants, keep only the selection logic in SKILL.md and move per-variant detail into separate files:
iac-generator/
├── SKILL.md (format selection + shared standards)
└── references/
├── bicep.md (read when user chooses Bicep)
├── terraform.md (read when user chooses Terraform)
├── arm.md (read when user chooses ARM templates)
└── pulumi.md (read when user chooses Pulumi)
Another example — an APIM skill covering multiple environments:
apim-deployment/
├── SKILL.md (shared pipeline and APIOps steps)
└── references/
├── github-actions.md (read when deploying via GitHub Actions)
└── azure-devops.md (read when deploying via Azure DevOps)
Show core content in SKILL.md and load a reference file only when an advanced scenario is triggered. State the load condition inline next to the link.
Key rule: Keep reference links one level deep from SKILL.md. For files over 100 lines, add a table of contents at the top.
Use when the same code is written repeatedly across invocations, or when deterministic reliability is critical.
scripts/init_skill.py (scaffold a new skill folder from template) and scripts/quick_validate.py (validate structure, frontmatter, and body against this repo's conventions)Use for domain knowledge, API specs, schemas, or detailed guides that exceed what fits cleanly in SKILL.md.
references/workflows.md (workflow pattern templates — read during Phase 2), references/output-patterns.md (output formatting patterns — read during Phase 3), and references/quality-checklist.md (pre-delivery quality checks — read during Phase 4)Use for files that appear in the output Claude produces (not loaded into context, but used in final output).
assets/template.docx, assets/logo.png, assets/hello-world/| Anti-pattern | Why it hurts |
|---|---|
| Vague description ("helps with X") | Undertriggering — Copilot won't invoke the skill |
| "When to use" in the body | Body only loads AFTER triggering — too late |
| Wall-of-text instructions | Agent skims and misses critical steps |
| No examples | Agents need concrete input/output pairs |
| README.md inside skill folder | Clutter — agents don't need meta-docs |
| Hardcoded credentials in scripts | Security risk |
| Deeply nested references | Increases cognitive load; keep one level deep |
| SKILL.md over 500 lines | Context bloat on every invocation |
| Overly rigid MUST/NEVER rules | Explain the WHY instead; agents respond better |
When the user says "turn this into a skill" or "capture what we just did", the conversation history is the primary source — mine it before asking a single question.
Step 1 — Mine the history first. Read back through the conversation and extract:
Step 2 — Identify what's missing. After mining, you'll have gaps. Common ones:
Step 3 — Ask only targeted gap-filling questions. Don't dump a full Discovery interview on the user — they just finished the work and want it captured. Ask one or two focused questions maximum, with a suggested default for each: "I'm going to use X as the trigger phrase — does that sound right, or would you phrase it differently?"
Step 4 — Confirm before writing. Present a concise summary of what you're going to encode: the workflow steps, the trigger phrases, the success criteria, any bundled resources you plan to create. Get a yes before writing the SKILL.md.
Step 5 — Generalise, don't transcribe. The biggest risk here is writing a skill that only works for the exact example in the conversation. Before writing each instruction, ask: "If a different user gives a slightly different input, does this still hold?" Strip out specifics (file names, literal values, one-off workarounds) unless they're universally needed. Encode the pattern, not the instance.
Step 6 — Proceed through Phases 2–5 — architecture, craft, validate, deliver as normal.
When improving rather than creating:
name field and folder name — do not renameDrawn from AI coding agent best practices:
DefaultAzureCredential so credentials are never hardcoded" beats "ALWAYS use DefaultAzureCredential"Take thomast1906/skill-creator from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.