Skip to content

Contributing a skill

Skills are short instruction files that guide an AI agent through a specific geospatial or climate-data workflow. When a skill is installed, the agent reads it automatically and follows its staged workflow instead of improvising. Skills are agent-agnostic — the same skill works across any compatible runtime (Claude Code, Antigravity, OpenAI Codex, and others).

A skill is worth submitting when it encapsulates a repeatable, multi-step workflow that benefits from structured guidance — data download pipelines, format conversions, metadata authoring, spatial processing chains. One-shot tasks (e.g. “convert a single file”) don’t need a skill.

Before you start, check whether an existing skill can be extended rather than replaced.


Every skill lives in its own directory under .agents/skills/:

.agents/skills/<skill-name>/
├── SKILL.md required — instructions the agent follows
├── evals/
│ └── evals.json required — at least 2 test prompts
└── references/ optional — docs, templates, vocab files
└── *.md

Must begin with YAML frontmatter:

---
name: skill-name # must match the directory name exactly
description: >
One paragraph. What the skill does and when an agent should invoke it.
Include trigger phrases users are likely to type.
---

The body is plain Markdown. Keep it under 500 lines. If you need large reference material, put it in references/ and link to it from the body.

{
"skill_name": "skill-name",
"evals": [
{
"id": 1,
"prompt": "A realistic user prompt that should trigger this skill",
"expected_output": "Plain-language description of what a correct response looks like"
},
{
"id": 2,
"prompt": "A second realistic prompt, different scenario or file type"
}
]
}

Prompts should read like something a real user would type — casual language, actual file paths or variable names, enough context to be unambiguous. Avoid toy examples.


Terminal window
git checkout -b skill/my-skill-name
.agents/skills/my-skill-name/
├── SKILL.md
└── evals/evals.json

Run the validator to catch structural issues before pushing:

Terminal window
python scripts/validate_skill.py .agents/skills/my-skill-name

Test the skill manually at least once with a real dataset and your agent of choice before opening a PR.

Push your branch and open a PR against main. The PR template will appear automatically — fill it in. GitHub Actions runs the validator and posts a report as a comment within about 30 seconds.

If the check fails, fix the errors listed in the PR comment and push again. The comment updates automatically on each push.

Once checks pass, a CDH maintainer reviews:

  • Does the skill solve a real, recurring workflow?
  • Are the instructions clear, agent-agnostic, and safe to follow?
  • Do the evals represent realistic usage?
  • Are there portability issues (local paths, hardcoded credentials, agent-specific syntax)?

After approval the PR is merged and the skill becomes available to all users and agents connected to this repository.


Skills must work regardless of which agent runtime executes them:

DoDon’t
Write instructions in the imperative: “inspect the file”, “ask the user”, “write the output to…”Reference a specific agent by name (e.g. “ask Claude to…”)
Use standard tool verbs any runtime can implement: read a file, run a script, write a file, ask a questionRely on agent-specific features, tools, or APIs inside SKILL.md

The following checks run on every PR that touches .agents/skills/:

CheckBlocks merge?
SKILL.md existsyes
Frontmatter has name and descriptionyes
name matches directory nameyes
All files referenced in SKILL.md existyes
evals/evals.json is valid JSON with ≥ 1 prompt per evalyes
evals.json has at least 2 evalswarning only
SKILL.md is under 500 lineswarning only
No local filesystem paths in skill bodywarning only

Errors block the merge. Warnings are shown in the PR comment but do not prevent approval.


Open a PR that modifies files inside the existing skill directory. The same validation and review process applies. In the PR description, explain what changed and why.


Open a GitHub Discussion or reach one of the maintainers directly:

GitHubRole
@anaguilararReviewer
@bjybergReviewer
@peetmateReviewer
@dagudelo30Reviewer