A shared, reusable catalogue of BC Government agent skill profiles. Write a good pattern once, and every team across BC Gov can build on it.
Every skill is validated against a common spec on every pull request. Once it
merges to main, it is immediately installable into any compatible agent with
one npx skills add command — no registry, no auth, no version pinning.
Browse the live catalogue at https://bcgov.github.io/agent-skills/.
| I want to… | Go to |
|---|---|
| Understand why skills look the way they do | Why this structure? |
| Find my way around the repo | Repository layout |
| Install a skill into my agent | Consume a skill |
| Write and submit a new skill | Add a skill |
| See how a merge reaches consumers | How distribution works |
| Run the validator and tooling locally | Local development |
New here? Start with
CONTRIBUTING.mdfor access and branch rules, thenspec/SKILL_SPEC.mdfor the full manifest contract.
A skill is, at its core, just instructions for an agent. Left to a free-form body, those instructions drift. One skill buries the trigger inside a paragraph; another forgets the failure path; a third never says what not to do. The agent ends up inferring intent from prose, which is exactly where it starts to guess.
The seven required sections turn open-ended prose into a fixed contract. Each one answers a question the agent actually asks at runtime:
| Section | The question it answers for the agent |
|---|---|
| Use When | Should I fire for this request? |
| Don't Use When | Is a different skill the better fit? |
| Workflow | What concrete steps and tools do I run? |
| Rules | What must I always / never do, and why? |
| Examples | What does a real invocation look like? |
| Edge Cases | What do I do when the happy path doesn't hold? |
| References | Where's the heavy detail I can pull on demand? |
Because every skill answers the same questions in the same order, the agent loads a plan it can actually act on: when to engage, which sibling skill to defer to, the exact steps, and the fallback when a lookup comes back empty.
Because every skill has the same shape, a reviewer can diff one against the spec and the validator can check it automatically. An agent can load dozens of them without relearning the layout each time, which is what lets many teams contribute skills that still behave like one coherent system.
Two roots for skills, plus the tooling that keeps them honest:
agent-skills/
├── README.md # you are here
├── CONTRIBUTING.md # access, branch rules, PR flow
├── pyproject.toml / uv.lock # validator + test deps (managed with uv)
├── Makefile # make format / lint / test / validate
├── .yamllint # workflow YAML style
│
├── spec/
│ └── SKILL_SPEC.md # authoritative manifest spec
│
├── skills/ # contributed skills — the shared catalogue
│ └── <skill>/ # one folder per skill (browse the live site)
│
├── scripts/
│ └── validate_skill.py # the spec validator (CI + local)
├── tests/
│ └── test_validate_skill.py
│
├── docs/ # static site published to GitHub Pages
│
└── .github/
├── CODEOWNERS # add ownership rules to gate review (see CONTRIBUTING.md)
├── dependabot.yml # cadence + grouping + Conventional-Commit prefixes
├── pull_request_template.md
├── skills/ # the repo's own meta-skills (validated, not part of the public catalogue)
│ └── <meta-skill>/
└── workflows/ # PR validation, docs deploy, Dependabot auto-merge, etc.
Worth flagging about the layout above:
skills/is the public catalogue. Each folder there is what consumers install withnpx skills add. Browse the live catalogue for the current set; theskills/directory is the authoritative source..github/skills/is internal. The meta-skills in that directory follow the same spec, but they exist to help contributors. They're validated by the same PR check but are not part of the public catalogue.docs/is the public catalogue site. Pushes tomainthat touchdocs/**rebuild and deploy the site through the Pages workflow under.github/workflows/.
Skills install with the skills CLI (from
vercel-labs/skills). It clones this
repo, finds every SKILL.md, and copies the matching skill folders — plus
their scripts/, references/, and assets/ — into the right location for
your agent.
You need npx on your PATH. npx is a command-line tool that ships with Node.js. It runs JavaScript packages directly without requiring a global install.
Check if you have it:
npx --versionIf that prints a version number, you're ready. If you see command not found or
'npx' is not recognized, install Node.js:
- Windows: Download from nodejs.org (pick LTS) or run
winget install OpenJS.NodeJS.LTS - macOS: Run
brew install nodeor download from nodejs.org - Linux: Use your package manager:
apt install nodejs npm,dnf install nodejs npm,pacman -S nodejs npm, etc.
After install, close and reopen your terminal, then verify: npx --version
# Interactive: pick the target agent (Copilot, Claude Code, Cursor, etc.) and
# choose which of the bcgov/agent-skills skills to install.
npx skills add bcgov/agent-skills
# Install just one skill, non-interactively, into GitHub Copilot for this project.
npx skills add bcgov/agent-skills --skill azure-networking --agent github-copilot --yes
# Install one skill globally for an agent (available across all that agent's projects).
npx skills add bcgov/agent-skills --skill azure-networking --agent claude-code --global
# List the skills available in this catalogue without installing anything.
npx skills add bcgov/agent-skills --listThe CLI handles everything: no .npmrc, no GitHub token, no registry config.
Re-run any time to pick up newer versions — the CLI re-copies the latest
main. Pin to a specific commit by using a GitHub URL:
npx skills add https://github.com/bcgov/agent-skills/tree/<SHA>.
If you can't use npx or prefer manual control, every skill is a self-
contained folder under skills/ — clone the repo and copy the skill folder into whichever location your agent scans for skills:
git clone https://github.com/bcgov/agent-skills.git
cp -r agent-skills/skills/azure-networking .github/skills/azure-networkingThe folder name must match the manifest's name field exactly.
Once you have access set up, the loop looks like this:
- Create your skill folder and copy an existing
SKILL.mdas a starting point:Then rewrite the frontmatter and body for your skill. Seemkdir -p skills/<your-skill>/references cp skills/azure-networking/SKILL.md skills/<your-skill>/SKILL.md
spec/SKILL_SPEC.mdfor the required structure. - Fill in the
SKILL.mdfrontmatter and all seven sections. - Validate locally:
uv run python scripts/validate_skill.py skills/<your-skill>/SKILL.md
- Open a PR from a branch in this repo (forks are blocked by the
fork-gatejob). The PR check validates your changed skill automatically.
Heads-up: check an upstream catalogue (Microsoft Agent Skills, Anthropic
anthropics/skills, awesome-copilot) before adding a new skill. If your use case is already covered, point consumers at the upstream skill instead of duplicating it here. Full guidance inCONTRIBUTING.md.
There is no publish step. Skills ship the moment a PR merges to main:
npx skills addreads the repo directly. It clonesbcgov/agent-skillsatmain(or whatever ref the consumer pins to), walks theskills/tree forSKILL.mdfiles, and copies the entire containing folder — manifest,scripts/,references/,assets/, everything — into the agent‑specific destination it picks for you. No registry, no auth, no version pinning metadata to maintain.- The PR check is the only gate. Every change runs the validator on the
skills it touches; merge-to-
mainrequires theresultsaggregator to be green. Once a PR merges, the nextnpx skills addrun sees the new content. - Dependabot keeps the tooling current. Grouped, Conventional-Commit‑
prefixed PRs (cadence and ecosystems in
.github/dependabot.yml). Green Dependabot PRs auto-squash-merge themselves; red ones stay red until a human fixes them.
This project uses uv. No requirements.txt,
no manual virtualenv. uv reads pyproject.toml and builds the environment on
demand, so these all work on a fresh checkout:
make setup # pre-warm the uv-managed virtualenv (optional)
make format # auto-format Python (2-space indent, double quotes)
make lint # lint Python (ruff) AND workflow YAML (yamllint)
make test # run the validator unit tests
make validate # validate every skill against the spec
make validate-one SKILL=skills/<name>/SKILL.md # validate a single skillPython style is enforced by ruff (2-space
indent, double quotes, docstring on every function; see pyproject.toml).
Workflow YAML under .github/workflows/ is linted by
yamllint using .yamllint at the repo root.
The meta-skills under .github/skills/ are part of the
normal workflow. They take care of scaffolding new skills and running the
validator on your behalf. Use them the same way you'd use any other skill in
your agent — they're the fastest path from idea to a merged skill.