Kno2gether kno2gether.com ↗ Try Knotie free
Quick-Start Guide

Ship Claude Code skills inside your client's repo

The short showed you a teammate opening Claude and it already knew that client's deploy rules. This is the full template: where Claude Code finds skills, the exact SKILL.md that makes one fire, a copy-paste deploy skill, the commit-and-share workflow that hands a whole team the same standards, and the two quiet mistakes that stop a skill loading at all.

Start free with Knotie
01

The mental modelWhat a skill is, and why it travels with the repo

A Claude Code skill is a folder with a single SKILL.md file inside it. That file holds instructions Claude adds to its toolkit — a checklist, a playbook, a multi-step procedure you'd otherwise paste in by hand every time. The trick that makes it powerful for client work is where the folder lives. Put it in the repo, and the skill is part of the codebase. It clones when the repo clones. So the engineer who joins on Tuesday opens Claude in that project and it already knows the client's deploy steps, their naming rules, the one migration that always breaks prod — before anyone types a word of context.

There are two places Claude Code looks, and the difference is exactly who gets the skill:

LocationPathWho gets it
Project.claude/skills/<name>/SKILL.mdThis repo only — commit it and everyone who clones inherits it
Personal~/.claude/skills/<name>/SKILL.mdJust you, across all your projects on this machine
Per Anthropic's skills docs there are two more scopes — enterprise (managed, org-wide) and plugin (ships inside a plugin). For agency-to-client work the one that matters is project: it's the only one that travels with the code. If the same skill name exists at more than one level they can shadow each other — so if a personal skill ever seems to override a repo one, check the current precedence rules in Anthropic's skills docs before relying on a specific order.
02

AnatomyWhat's actually inside a SKILL.md

Every skill is one directory whose entrypoint is SKILL.md. That file has two parts: YAML frontmatter between --- markers, then the markdown body. The frontmatter is metadata; the body is the playbook Claude follows when the skill runs.

  • nameoptional. If you leave it out, it defaults to the directory name. (For project and personal skills the command you type is taken from the folder name regardless, so name is really just the display label.)
  • descriptionthe field that matters. Claude reads this to decide when the skill applies. This single line is the biggest determinant of whether your skill ever fires. The docs recommend it for exactly that reason; without it, Claude falls back to the first paragraph of the body, which is rarely as sharp.
  • The body — everything after the closing ---. The actual instructions: steps, rules, guardrails. Keep it tight; once a skill loads it stays in context for the session, so every line is a recurring cost.

Here's a complete, copy-paste skill for the exact job from the video — deploying a client's app. Drop it at .claude/skills/deploy-client/SKILL.md:

.claude/skills/deploy-client/SKILL.md
---
name: deploy-client
description: Deploy this client's app to production. Use when the user
  asks to deploy, ship, release, or push live — runs the client's exact
  build, migration, and smoke-test steps in order.
disable-model-invocation: true   # you decide when to deploy, not Claude
---

# Deploy <client> to production

Follow these steps in order. Stop and report if any step fails.

1. Confirm the branch is `main` and the tree is clean (`git status`).
2. Run the test suite: `npm test`. Do not continue on a failure.
3. Build: `npm run build`.
4. Apply DB migrations against production: `npm run db:migrate:prod`.
   NOTE: the 2023-loyalty migration must run BEFORE the billing one —
   reversing them has taken prod down here before.
5. Deploy: `npm run deploy:production`.
6. Smoke-test the live URL and report the HTTP status of `/health`.
Notice disable-model-invocation: true. That makes the skill manual-only — you trigger it with /deploy-client, and Claude won't run it on its own just because your code "looks ready". The docs call this out specifically for actions with side effects like deploy, commit, and send-message. Leave it off for read-only or advisory skills you want Claude to reach for automatically.
03

How it firesModel-invoked routing, honestly

Here's the part the short couldn't fit. Claude doesn't run every skill on every turn. In a normal session it loads each skill's description into context — just the description, not the whole body — and when your request matches one, it loads that skill's full instructions and uses it. That's "model-invoked routing": Claude reads the description and decides. You don't wire up triggers; the description is the trigger.

Be clear-eyed about it though: auto-activation is not guaranteed every time. Anthropic's own troubleshooting covers both failure modes — a skill that never fires, and one that fires too often. So treat auto-routing as a convenience, not a contract. For anything high-stakes (a deploy, a destructive migration) invoke it explicitly by typing /skill-name. That always works, regardless of how the description is written.

Which means the description carries the whole load. Write it as a crisp "use when…" intent sentence, packed with the words a teammate would actually type. Compare:

SkillBad description (rarely fires)Good description (fires on the real ask)
deploy-client"Deployment helper""Deploy this client's app to production. Use when the user asks to deploy, ship, release, or push live."
db-migrate"Handles the database""Create and run a Prisma migration. Use when the user changes the schema, adds a model/field, or asks to migrate the DB."
pr-review"Code quality stuff""Review the current diff against our standards. Use when the user asks to review changes, before opening a PR, or after staging edits."
The pattern in every good one: what it does + "use when…" + the literal phrases a user says. The bad ones are vague and keyword-free, so nothing a person types lands near them. If a skill "isn't working", 90% of the time it's the description — the docs' first fix is literally "check the description includes keywords users would naturally say".
04

Beyond one fileBundling the scripts and files a skill calls

A skill isn't limited to SKILL.md. The folder can hold supporting files alongside it — templates Claude fills in, reference docs it loads only when needed, and scripts it actually executes. SKILL.md stays the short overview; the heavy material sits beside it and loads on demand, so it costs almost nothing until it's used. Reference each file from SKILL.md so Claude knows what it is and when to reach for it.

One detail that saves you a debugging session: when a skill runs a bundled script, reference it through the ${CLAUDE_SKILL_DIR} variable, not a relative path. That variable resolves to the skill's own directory no matter where it's installed (project, personal, or plugin) and no matter the current working directory — so the same skill works for every client without edits.

deploy-client/ — a skill with bundled assets
.claude/skills/deploy-client/
+-- SKILL.md            # the playbook (required)
+-- checklist.md         # pre-deploy gate Claude reads when needed
+-- env.example          # the env vars this client's deploy expects
+-- scripts/
    +-- smoke.sh         # run via ${CLAUDE_SKILL_DIR}/scripts/smoke.sh
In the body you'd point to them plainly: "Run the pre-deploy gate in checklist.md first," and "After deploy, run ${CLAUDE_SKILL_DIR}/scripts/smoke.sh and report the result." That's all Claude needs to find and use them.
05

The layout that scalesOne agency, many client repos

When you're shipping skills into several client repos, a little structure keeps them consistent. Each skill is its own folder under .claude/skills/; group them by job, give each a sharp description, and keep one house style across clients so an engineer who moves between accounts isn't relearning conventions. A sensible layout for a client repo:

<client-repo>/.claude/skills/
.claude/
+-- skills/
    +-- deploy-client/
    |   +-- SKILL.md
    |   +-- scripts/smoke.sh
    +-- db-migrate/
    |   +-- SKILL.md
    +-- pr-review/
    |   +-- SKILL.md
    +-- onboarding/
        +-- SKILL.md          # "how this client's stack fits together"

Two patterns worth standardising across every client:

  • House skills vs client skills. Keep a master set of your agency's standard skills (deploy, migrate, review) in a template repo, then drop them into each new client's .claude/skills/ at kickoff. Tune only the client-specific bits (their deploy command, their gotchas) in the body.
  • An onboarding skill per repo. A short, advisory skill (no disable-model-invocation) that explains how that client's stack fits together. Claude loads it when a new engineer asks "how does X work here", and they're productive without pinging you.
In a monorepo where a package wants its own skills, check the official skills docs for how Claude discovers package-level .claude/skills/ folders (the exact discovery rules can change between releases). For a single client app, the root .claude/skills/ is all you need — don't over-engineer it.
06

The whole pointCommit once, the whole team inherits it

This is the move that makes skills worth the setup. Project skills are just files in the repo, so they go through git like everything else.

commit-and-share
# in the client repo, after writing your skills
git add .claude/skills
git commit -m "Add deploy + migrate + review skills"
git push

From that moment, anyone who clones or pulls the repo gets the identical skills — the same deploy steps, the same guardrails, the same "use when" routing — with zero extra setup. No Slack message, no wiki page, no "here's how we deploy" call. The standards live where the work happens, in the editor, and they update the same way the code does: someone improves the deploy skill, opens a PR, and the whole team's Claude gets smarter on the next pull.

One trust note for project skills: a skill in a repo can pre-approve tools for itself (via an allowed-tools field) once you accept the workspace-trust dialog for that folder. That's a feature — it's how a deploy skill runs git without nagging you — but it means you should skim a repo's .claude/skills/ before trusting code you didn't write, the same way you'd read a Makefile.
07

The starter kit promised in the shortThe two gotchas that quietly stop a skill loading

Both of these fail silently — no error, the skill just doesn't run — which is exactly why they eat an afternoon. Know them and you'll never lose that afternoon.

  1. A vague or generic description — so Claude never routes to it. This is the number-one cause. Routing is the description; if it reads "deployment helper" instead of "use when the user asks to deploy / ship / release", nothing a person types matches it, and the skill sits there unused while you assume it's "not working". Fix: rewrite the description as a sharp "use when…" sentence with the literal words your team says (see section 03). And remember you can always force it with /skill-name to confirm the skill itself is fine and it's purely a routing miss.
  2. Creating the .claude/skills/ directory mid-session. Claude Code watches its skill directories and picks up edits to existing ones live — but per the docs, a brand-new top-level skills directory that didn't exist when the session started needs a Claude Code restart before it's watched. So if you make .claude/skills/ for the first time while Claude is already running, your shiny new skill is invisible until you restart. Fix: create the directory, then restart Claude Code (after that, adding more skills inside it is picked up live).
Quick triage when a skill won't fire: ask Claude "What skills are available?" — if yours isn't listed, it's the directory/restart problem (gotcha 2). If it is listed but doesn't auto-trigger, it's the description (gotcha 1) — tighten it, or just call it by name.
08

Do it nowThe 5-step checklist

Start to shared in five steps. This is the whole loop — from nothing to a skill every teammate inherits.

  1. Make the folder. In the client repo: mkdir -p .claude/skills/deploy-client. If .claude/skills/ didn't already exist, restart Claude Code now (gotcha 2).
  2. Write SKILL.md. Paste the starter from section 02. Frontmatter (description first, written as "use when…") + the body steps.
  3. Sharpen the description. Make sure it names the real words your team types — deploy, ship, release. This is what decides if it ever fires.
  4. Test both ways. Invoke it explicitly with /deploy-client to confirm the body works, then phrase a natural request ("ship this to prod") to confirm routing picks it up.
  5. Commit and push. git add .claude/skills && git commit && git push. Now every clone of this repo has it — the whole team, same standards, no copy-paste.
Repeat per skill, per client. The agency version: keep these as house skills in a template repo and drop them into each new client at kickoff, tuning only the client-specific lines. One skill set, every client repo.

Get the next drop

New AI build guides + the occasional bonus template. No spam, unsubscribe anytime.

By submitting you agree to our Privacy Policy & Terms. Unsubscribe anytime.

Frequently asked questions

Where does Claude Code look for skills?
Two main places. Project skills live in a .claude/skills/ folder inside the repo (this project only); personal skills live in ~/.claude/skills/ in your home directory (all your projects). Each skill is its own directory with a SKILL.md entrypoint. Because project skills sit in the repo, committing .claude/skills/ ships them to everyone who clones it. (Two more scopes exist — enterprise/managed and plugin — but project is the one that travels with client code.)
Do I have to call a skill manually, or does Claude pick it up on its own?
Both. Claude reads each skill's description and loads it automatically when your request matches — that's model-invoked routing. You can also always invoke a skill explicitly by typing /skill-name. Auto-activation is convenient but not guaranteed on every phrasing, so for high-stakes steps like a deploy, invoke it by name.
What goes in a SKILL.md file?
YAML frontmatter between --- markers, then the markdown body. In the frontmatter, name is optional and defaults to the directory name; description is the field that matters because Claude uses it to decide when the skill applies. The body is the actual playbook — the instructions Claude follows when the skill runs.
Why does my skill never fire?
Almost always a vague description. Claude routes on the description text, so a generic line like "helps with deploys" rarely matches a real request — rewrite it as a crisp "use when…" sentence with the words a teammate would actually type. The other common cause: you created the top-level .claude/skills/ directory mid-session. A brand-new top-level skills directory that didn't exist at startup needs a Claude Code restart before it's watched.
Can a skill bundle scripts or files it needs?
Yes. A skill folder can hold supporting files alongside SKILL.md — templates, reference docs, and scripts Claude can execute. Reference them from SKILL.md so Claude knows what each file is, and use the ${CLAUDE_SKILL_DIR} variable in commands so paths resolve whether the skill is installed at the project, personal, or plugin level.
How does a whole client team inherit the same skills?
Commit the .claude/skills/ folder to version control. Anyone who clones or pulls the repo gets the identical skills — the same deploy steps, the same guardrails — with no extra setup. The skills travel with the code, so onboarding a new engineer means the standards are already in their editor.
Sources · Extend Claude with skills (where skills live, SKILL.md frontmatter, model-invoked routing, supporting files, live change detection, sharing) — Claude Code Docs, code.claude.com/docs/en/skills · Agent Skills open standard — agentskills.io. Facts are general Claude Code behaviour; no version numbers asserted.

Once your skills ship the work, the next move is to sell it

Bundling skills into every client repo makes your delivery fast and consistent — the same standards, everywhere, with no copy-paste. The harder part is turning that delivery into a product a client pays you for on repeat: putting your brand on an AI agent, and billing for usage without hand-rolling a meter. That's the gap Knotie fills. It's a white-label platform — spin up AI voice and chat agents (Retell, LiveKit, VAPI, Ultravox) plus automations for clients under your own brand and domain, with credit billing and your margin built in. You build it; Knotie handles reselling it as a product. Free to start; 550+ partners already do.

Start free with Knotie
Explore Kno2getherOne home for the products, experiments, tools & free guides.