Allons-y — let's go! Contributions of all kinds are welcome: bug fixes, new features, documentation improvements, and test coverage. If you're unsure whether your idea fits the project, open an issue first and we'll figure it out together.
- Search existing issues before opening a new one — your bug or idea may already be in progress.
- Open an issue to discuss non-trivial changes before writing code. This saves everyone time and avoids PRs that can't be merged.
- Fork the repository and clone your fork locally:
git clone https://github.com/<your-username>/agent-skills.git cd agent-skills yarn install
Create a branch from main that describes your change:
git checkout -b fix/gh-notif-truncation
git checkout -b feat/new-useful-skillDesigning the skill: Before writing code, read How to architect a skill. It covers the decisions that make or break a skill — the triggering
description, progressive disclosure, instructions vs. scripts, and evals — and ends with a pre-PR checklist. The New Skill Proposal issue template walks through the same decisions.
Each skill lives in its own directory under skills/. A standard skill should include:
SKILL.md: Documentation following the required format (including YAML frontmatter withnameanddescription). Thenamefield must match the directory name exactly.package.json: Workspace manifest with"private": trueand askill.runtimedeclaration.scripts/: The Node.js implementation (ESM). Optional for reference-only skills — see below.tests/: Anode --testsuite.evals/evals.json: Eval prompts validating skill triggering behavior (see Evals below).
- Implementation skills ship runnable Node.js code under
scripts/(and optionallybin/,templates/). Example:gh-notification-summary. - Reference-only skills are pure prompt + reference material — the SKILL.md guides the agent through reading curated
references/*.mdfiles. Noscripts/directory is required. Tests should still validate that SKILL.md frontmatter is well-formed and that every linked reference file resolves. Example:design-system.
This repo is a Yarn workspaces monorepo — each skill under skills/ is a workspace member with its own package.json. To list all workspaces:
yarn workspaces listEach skill's package.json:
{
"name": "@allons-y/skill-<skill-name>",
"version": "0.0.0",
"private": true,
"description": "One-sentence description",
"type": "module",
"skill": {
"runtime": "node"
},
"scripts": {
"test": "node --test \"tests/**/*.test.js\"",
"coverage": "c8 yarn test",
"ci:test": "yarn coverage",
"lint": "eslint .",
"format": "prettier --write ."
}
}Run yarn install after adding a new skill so Yarn registers the new workspace.
Use yarn workspace to run a script inside a specific skill without cd-ing into it:
yarn workspace @allons-y/skill-gh-notification-summary test
yarn workspace @allons-y/skill-gh-notification-summary lintTo run a command across all workspaces at once:
yarn workspaces foreach -A run test
yarn workspaces foreach -A run lintThe root yarn test and yarn evals scripts continue to orchestrate everything — the workspace commands are useful when you want to target a single skill quickly.
yarn test # all skills, in parallel
yarn test <skill-name> # single skillSkills are tested with the built-in node --test runner. Coverage is collected via c8 when running yarn workspace <skill> coverage.
yarn workspace @allons-y/skill-<skill-name> lint
yarn workspace @allons-y/skill-<skill-name> formatOr, across the entire repo:
yarn lint
yarn formatEach skill must include an evals/evals.json file that validates the skill triggers (and doesn't trigger) on realistic prompts.
Running evals locally requires an Anthropic API key. The runner sends each prompt to Claude with the skill's SKILL.md as a system prompt and the skill's scripts registered as callable tools, then asserts that the correct tool was (or wasn't) called:
export ANTHROPIC_API_KEY=sk-ant-...
yarn evals # all skills
yarn evals gh-notification-summary # single skill
# Use a different model (default: claude-haiku-4-5)
ANTHROPIC_MODEL=claude-opus-4-5 yarn evalsEvals also run on demand in CI via the Evals workflow (Actions → Evals → Run workflow).
The format is:
{
"skill_name": "<skill-name>",
"evals": [
{
"id": 1,
"prompt": "natural-language prompt that should trigger this skill",
"expected_output": "description of what the agent should do",
"files": []
},
{
"id": 2,
"prompt": "prompt that should NOT trigger this skill",
"expected_output": "Does NOT trigger this skill. Reason why.",
"files": [],
"should_trigger": false
}
]
}Include at least two positive triggers and two negative (false-positive) cases. See skills/gh-notification-summary/evals/evals.json for a complete example.
This project uses Conventional Commits. The format is:
<type>(<optional scope>): <short description>
[optional body]
[optional footer(s)]Common types:
| Type | When to use |
|---|---|
feat |
A new feature (triggers a minor release) |
fix |
A bug fix (triggers a patch release) |
docs |
Documentation changes only |
test |
Adding or updating tests |
refactor |
Code restructuring without behaviour change |
chore |
Tooling, config, dependency updates |
- Keep PRs focused — one logical change per PR.
- Every new skill or changed behavior must include tests and evals.
- PR titles should follow Conventional Commits.
- Fill out the PR description — explain the "why", not just the "what".
agent-skills/ # Root workspace (publishes to npm)
├── package.json # Root — workspaces: ["skills/*"]
├── index.js # Exports getSkills()
├── bin/install.js # npx installer CLI
├── .claude-plugin/
│ ├── marketplace.json # Auto-generated Claude Code marketplace catalog
│ └── plugin.json # Auto-generated plugin manifest
├── scripts/ # Root orchestration scripts
│ ├── run-tests.js # Parallel Node test runner
│ ├── run-evals.js # LLM eval runner
│ └── generate-plugin-manifest.js # Generates .claude-plugin/\*.json
├── skills/ # Yarn workspace members
│ └── <skill-name>/ # Each skill is a workspace
│ ├── package.json # private: true; declares skill.runtime
│ ├── SKILL.md # Skill documentation and metadata
│ ├── scripts/ # Node.js implementation
│ ├── tests/ # node --test suite
│ └── evals/ # Eval prompts (evals.json)
└── .github/
└── workflows/ # CI automationWhen publishing to npm, a prepublishOnly hook regenerates .claude-plugin/marketplace.json and .claude-plugin/plugin.json from the current state of skills/. Semantic-release commits the regenerated files back to main.
This project follows the Contributor Covenant Code of Conduct. By participating you agree to uphold a welcoming and respectful environment for everyone.
If you experience or witness unacceptable behaviour, please report it by opening a private issue or emailing castastrophe@users.noreply.github.com.