Skills in this repo come in two flavours:
- Externally-authored — the skill is authored in another Checkly repo and mirrored here automatically. Listed in
skills.config.ts. Do not edit these files in this repo — the entireskills/<name>/directory is wiped and rewritten on every sync, so your changes will be overwritten. Open a PR against the source repo instead. - Plugin-native — the skill is authored here directly. Anything under
skills/<name>/that is not listed inskills.config.tsfalls into this bucket.
For example, the checkly skill is externally-authored; it lives at checkly/checkly-cli.
Heads up: in
checkly-cli, theskills/directory at the repo root is itself generated at prepare time frompackages/cli/dist/ai-context/public-skills/. The package source is the ultimate source of truth, but the committedskills/<name>/directory is what we pull from — that's what end users see.
- Add an entry to the
skillsarray inskills.config.ts:The sync mirrors the entire{ name: "<skill-name>", source: { repo: "<owner>/<repo>", path: "<path/to/skill/dir>", ref: "<tag-branch-or-sha>", }, }
source.pathdirectory — every file under it, including nested directories likereferences/. There is no per-file list to maintain; files added or removed upstream flow through on the next sync.refis required: point it at a branch (e.g.main) to track the latest, or a tag/SHA to pin a fixed version. - Run
npm run syncto pull the files locally. - Commit
skills.config.tsandskills/<skill-name>/together.
- Create
skills/<skill-name>/SKILL.mdwith valid frontmatter (at minimumnameanddescription). - Add any references it needs in the same directory.
- Commit. No
skills.config.tsentry needed.
These are listed explicitly in .claude-plugin/plugin.json (Claude Code requires file arrays). Cursor and the generic plugin discover them by convention from agents/ and commands/ at the repo root.
To add one:
- Drop the file under
agents/<name>.mdorcommands/<name>.md. - Add the path to the corresponding array in
.claude-plugin/plugin.json.
scripts/sync.ts reads skills.config.ts and, for each skill, lists every file under source.path at source.ref via the GitHub git-trees API, then fetches each file from raw.githubusercontent.com. It wipes and rewrites skills/<name>/ so files removed upstream are removed here too. There is no transform — what's upstream lands here verbatim. If the git tree comes back truncated (a very large repo), the sync fails loudly rather than mirror an incomplete skill.
Set GITHUB_TOKEN in the environment to authenticate the git-trees calls and avoid the low anonymous rate limit. CI passes the Actions token automatically; locally it is only needed if you hit the limit.
To change the ref a synced skill tracks, edit its source.ref in skills.config.ts and run:
npm run syncThe sync also runs in CI via .github/workflows/sync.yml, on a daily schedule plus manual workflow_dispatch. The workflow runs npm run sync against whatever refs are pinned in skills.config.ts and commits any changes directly to main. CI does not change the refs — that's a manual edit to skills.config.ts.
simple-git-hooks installs two hooks, wired up automatically by the postinstall script the first time you run npm install:
pre-commitrunsnpm run lint,npm run format:check, andnpm run typecheck.commit-msgrunscommitlintagainst the Conventional Commits spec (header capped at 100 chars). Seecommitlint.config.js.
If the pre-commit hook fails on format:check, run npm run format and re-stage. To bypass the hooks for a single commit (rarely needed), set SKIP_SIMPLE_GIT_HOOKS=1.
Each of the three plugin manifests carries its own version field:
.claude-plugin/plugin.json.cursor-plugin/plugin.json.plugin/plugin.json
Keep them in sync with the version in package.json when cutting a release.