Every skill is a directory containing a single SKILL.md. Two shapes are valid,
and a category may mix them freely.
skills/<category>/<skill>/SKILL.md flat
skills/<category>/<group>/<skill>/SKILL.md grouped
Use a group whenever a category has an axis that will keep growing — cloud providers, container runtimes, compliance frameworks. It keeps a broad category browsable without inflating the top-level category list.
skills/
cloud-security/
aws/ aws-security-review/SKILL.md
azure/ <- add a provider by adding a folder
gcp/
container-security/
docker/ container-image-hardening/SKILL.md
kubernetes/ kubernetes-security-audit/SKILL.md
recon/
attack-surface-recon/SKILL.md <- flat is fine when there is no axis
Adding a provider is exactly mkdir skills/cloud-security/azure and dropping a
skill directory inside it. Nothing is registered anywhere else: the site walks
the tree at build time, and the group becomes a filter automatically.
Nesting stops two levels below a category. A directory containing SKILL.md is
a skill and is never descended into, so reference material can live beside it.
Category directories must match an id in CATEGORIES (src/lib/skills.ts).
Anything else still loads but is flagged and will not appear in the filter.
pentest · bug-bounty · web-appsec · cloud-security · container-security
network-security · recon · forensics · malware-analysis · compliance
secure-code-review · threat-modeling
---
name: aws-security-review
description: Audit AWS environments for IAM privilege escalation, exposed
resources, logging gaps, and misconfigurations. Use when reviewing an AWS account.
phase: harden # optional — recon | exploit | harden | respond | attest
author: Jane Doe # optional attribution, shown on the skill page
company: Acme Security
contact: https://linkedin.com/in/janedoe
---
# AWS Security Review
Markdown instructions for the agent…name and description are required strings. Everything else is optional.
Omit phase and it is derived from the category (see src/lib/phases.ts).
The description is what an agent matches a task against, so write it as
when to use this, not as a summary of the contents.
The directory name is the slug — .../aws/aws-security-review/ is served at
/skill/aws-security-review and installs into <agent>/skills/aws-security-review/.
Keep directory names globally unique; if two collide the loader qualifies one
with its group and warns, but that changes a public URL, so it is worth avoiding.
Name skills for what they do, including the provider where it matters
(aws-security-review, not security-review).
node .github/scripts/local-scan.mjs .Runs the same content scan CI runs — invisible characters, embedded credentials, exfiltration-capable destinations, instruction-override phrasing and human-checkpoint bypasses. It needs no token and makes no network call, so it works on a fork.
Findings come in two grades. Errors (invisible characters, credentials) fail the build: a document meant to be read has no legitimate reason to contain them. Warnings report but never block — half this catalog legitimately describes the attacks these patterns look for, so a warning on an offensive skill is usually the skill doing its job.
Structural validation — frontmatter, phase values, category names and slug uniqueness — runs in the site repository's build, which consumes this catalog as a submodule.
Skills here describe methodology for authorized testing. Every submission needs scope and rules-of-engagement framing. Submissions without it are not merged.