A Yarn workspaces monorepo of agent skills. Each skill under skills/ is a workspace member with its own package.json (private: true), SKILL.md, implementation scripts, and test suite. All skills are Node.js (node --test, ESLint/Prettier). The package is consumable by any agent harness that supports SKILL.md directories; Claude Code installs natively via .claude-plugin/marketplace.json, and other agents can vendor skills via the npx installer.
package.json # Root workspace — workspaces: ["skills/*"]
index.js # Node.js entry point — exports getSkills()
bin/install.js # npx installer CLI
scripts/
run-tests.js # Runs each skill's `yarn workspace … test` (node --test + c8)
run-evals.js # LLM eval runner (Anthropic API)
generate-plugin-manifest.js # Regenerates .claude-plugin/marketplace.json + plugin.json
skills/ # Yarn workspace members
<skill-name>/
package.json # private: true — skill-level scripts (test, lint, etc.); declares `skill.runtime`
SKILL.md # YAML frontmatter (name, description) + usage docs
scripts/ # Implementation (Node.js)
tests/ # `node --test` suite
evals/ # Eval prompts (evals.json)
.claude-plugin/
marketplace.json # Auto-generated marketplace manifest (do not edit by hand)
plugin.json # Auto-generated plugin manifest (do not edit by hand)yarn test # Run all skill test suites (parallel)
yarn test <skill-name> # Run tests for a single skill
yarn evals # Run LLM evals for all skills
yarn generate:marketplace # Regenerate .claude-plugin/marketplace.json and plugin.json
yarn release # Cut a release via semantic-releaseTarget a single skill without cd-ing into it:
yarn workspace @allons-y/skill-gh-notification-summary test
yarn workspace @allons-y/skill-gh-notification-summary lintRun across all workspaces:
yarn workspaces foreach -A run test
yarn workspaces foreach -A run lint- Create a directory under
skills/<skill-name>/. - Add a
package.jsonwith"private": trueand askill.runtimefield:{ "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 ." } } - Add a
SKILL.mdwith YAML frontmatter:--- name: skill-name description: "One-sentence description. Include trigger phrases here." ---
- Add implementation scripts under
scripts/(Node.js, ESM). - Write a full test suite under
tests/usingnode --test. Tests must not require live credentials — mock all external API calls. - Run
yarn installto register the new workspace, thenyarn testto verify.
Use lowercase hyphenated names that match the directory name (e.g., gh-notification-summary). The name field in SKILL.md frontmatter must match the directory name exactly.
- Node.js ≥ 24 (use
nvm use— version pinned in.nvmrc) - Yarn 4 (workspaces monorepo, version pinned in
packageManagerfield) node --testfor skill test suites- c8 for coverage
- ESLint + Prettier for linting and formatting
- Conventional Commits enforced by commitlint + husky
Each skill declares its runtime via skill.runtime in its package.json. Today only "node" is supported. Adding another runtime (e.g. "bun", "deno") requires extending the dispatch in scripts/run-tests.js and documenting the toolchain here.
Commit messages will populate the changelog so it's important that their description be clear and succinct as well as written in a customer-focused way. If a pull request has multiple commits, they must be squashed before merging into main to ensure a clean release message.
feat(gh-notification-summary): creates a new skill for summarizing new notifications
Stop letting your GitHub notification inbox become a graveyard. This skill gives Claude the ability to fetch, display, and act on your unread GitHub notifications — all from a single prompt.
What it does:
- Opens an interactive local dashboard at http://localhost:8000 showing each unread notification as a card, complete with labels, latest comments, and ready-to-paste action commands
- Unsubscribes you from noisy threads (/unsub 4821) without requiring you to navigate GitHub
- Marks individual notifications or your entire inbox as done in one shot
Works with any repo — pass a repo explicitly or set GITHUB_REPO as your default
Say anything like "check my GitHub notifications", "what's in my GitHub inbox?", "get me off that thread", or "mark all done" — Claude will know what to do.
Pairs well with a morning routine prompt — ask Claude to open your dashboard, summarize what needs attention, and clear the rest.wipfix stufffeat: updates
Releases are fully automated via semantic-release. Merging to main triggers:
- Version bumps based on commit messages
prepublishOnly: dynamic assets (.claude-plugin/marketplace.json,plugin.json) are regenerated- Changelog update, npm publish, and a
chore(release):commit back tomain
Do not manually update package.json version or CHANGELOG.md.
- Do not edit
.claude-plugin/marketplace.jsonor.claude-plugin/plugin.jsonby hand — both are auto-generated during publish and committed by semantic-release. - Do not add secrets or real credentials to tests — mock all external API calls.