Day 2 · about 15 min
Turn a prompt you keep repeating into a skill
A /client-update skill that turns your recent commits into a plain-English update for a client, run by you or picked up by Claude when you simply ask.
You’ll finish with
- A working
client-updateskill that you run with/client-update. - Claude using that skill on its own when you ask for a client update in plain words.
- A clear rule for when a prompt belongs in a skill and when it belongs in CLAUDE.md.
- A pattern you can copy for your own repeated prompts and share with your team through git.
You’ll need
- Claude Code installed, signed in and up to date. Run
claude update, orbrew upgrade claude-codeorwinget upgrade Anthropic.ClaudeCodeif you installed it with Homebrew or WinGet. A Linux package install (apt, dnf or apk) updates with your normal system upgrades. Day 1 covers the install. - Git, because the skill reads your commit history. Run
git --versionto check. - A project: the practice project from Day 1, a fresh copy of it, or one of your own.
Before you start
Tell us about your setup and the steps change to fit it. Your answers stay in this browser, and you can change them at any time.
Which system are you on?
Commands differ between systems. Pick the one you’ll run Claude Code on.
Which project are you using?
The skill works in any project with git history. The practice project is the safest place to try it first.
Who should get the skill?
Not sure? Pick the project. You can move the folder later.
The steps
One step at a time. When a step’s check matches, tick it and the next one opens.
Step 1 of 7: Pick a prompt you keep repeating
Choose instructions you paste again and again that should give the same kind of answer every time.A skill is a saved set of instructions in a file called
SKILL.md. You run it by typing its name, like/client-update. Claude can also use it on its own when your request matches what the skill says it is for.A prompt is worth turning into a skill when:
- You have pasted the same instructions more than twice.
- The answer should come back in the same shape every time, such as the same headings or the same checklist.
- It is a procedure you run now and then, not a fact Claude needs in every session.
Note: Skill or CLAUDE.md? CLAUDE.md loads at the start of every session, so keep it for facts and rules that always apply. A skill’s body loads only when it is used, so a long procedure costs almost nothing until you need it.
Today’s example comes up for anyone who builds for clients: a short update that turns your commits into plain English, under the same three headings every time: Shipped, In progress and Needs your input.
For “My own project”
Got a repeated prompt of your own in mind? Write it down, but build
client-updatefirst. It works in any project with git history, and the last step shows you how to turn the same pattern into your own skill.Check it worked
You can finish this sentence for your prompt: “It writes ___, and I ask for it when ___.” For today’s skill: “It writes a plain-English client update from recent commits, and I ask for it when a client wants to know what changed.” That sentence is what the skill’s description will say.
Step 2 of 7: Give the project a git history
The skill writes its update from your commits, so the project needs to be a git repository with at least one commit.Open a terminal in the project’s top folder, the one with
README.mdin it. First see whether git is already set up there:Terminal or PowerShellgit log --oneline -3If that lists commits, this step is done. If git says the folder is
not a git repository, or that your branchdoes not have any commits yet, run these three commands:Terminal or PowerShellgit init git add . git commit -m "Start Acme Quotes"git initmay print a few hint lines about the default branch name. You can ignore them. In a folder git already knows, it says it reinitialized the repository instead, which is safe.For “The practice project from Day 1”
Use the same Acme Quotes folder you worked in on Day 1.
For “A fresh copy of the practice project”
Download and unzip the Day 1 kit first. Then open the terminal in the folder that holds
README.mdandpackage.json. On Windows, Extract All can put that folder inside another folder with the same name, so look one level down.For “My own project”
Your project is probably in git already, so
git loglists commits and you can move on. If it isn’t, run the same three commands with a commit message of your own.Check it worked
Terminal or PowerShellgit log --onelineYou see at least one line: a short code followed by the commit message, such as
Start Acme Quotes.If it didn’t work
Git says “Author identity unknown” and asks who you are
Git needs a name and an email for every commit. Set them with your own details, then run the commit again. Leave out
--globalto set them for this project only.Terminal or PowerShellgit config --global user.name "Your Name" git config --global user.email "[email protected]" git commit -m "Start Acme Quotes"The terminal says git isn’t found or isn’t recognised
For macOS
Install Apple’s command line tools, which include git. If you use Homebrew,
brew install gitworks too.Terminalxcode-select --installFor Linux and WSL
On Ubuntu or Debian, install it with apt. On other distributions, use your package manager.
Terminalsudo apt install gitFor Windows
Install Git for Windows, then close PowerShell and open a new window so it finds
git.PowerShellwinget install --id Git.Git -e --source wingetThen run
git --version. It prints a version number.Windows shows “LF will be replaced by CRLF” warnings
Those are warnings, not errors. Git for Windows converts line endings by default, and the commit still goes through. Run
git log --onelineto confirm it.Step 3 of 7: Create the skill folder
Make a folder called client-update in a skills folder; the folder’s name becomes the command you type.Every skill is a folder with a
SKILL.mdfile inside. The folder’s name is the command, soclient-updategives you/client-update. Keep names short, lowercase and joined with hyphens, since you will type them.Where the folder lives decides who gets the skill:
.claude/skills/<name>/inside a project: for everyone who works in that project, once you commit it.~/.claude/skills/<name>/in your home folder: for you, in every project on this computer. On Windows that’s%USERPROFILE%\.claude\skills\<name>\.
For “Everyone on this project”
Run this in the project’s top folder. It creates the folder, then lists what is in
.claude/skills.For macOS, Linux and WSL
Terminalmkdir -p .claude/skills/client-update ls .claude/skillsFor Windows
PowerShellNew-Item -ItemType Directory -Force -Path .claude\skills\client-update Get-ChildItem .claude\skillsFor “Just me, in every project”
Run this from any folder. It creates the folder in your home folder, then lists your personal skills.
For macOS, Linux and WSL
Terminalmkdir -p ~/.claude/skills/client-update ls ~/.claude/skillsFor Windows
PowerShellNew-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.claude\skills\client-update" Get-ChildItem "$env:USERPROFILE\.claude\skills"Check it worked
The listing shows a folder named
client-update. Other skill folders may sit next to it, which is fine.If it didn’t work
The folder was created somewhere else
Folder commands work from wherever your terminal is. Run
pwd(it works in PowerShell too) to see where you are,cdinto the project’s top folder and run the command again. Then delete the stray folder.You can’t see the .claude folder in Finder or your file manager
Folders whose names start with a dot are hidden by default on macOS and Linux. In Finder, press Cmd+Shift+. (full stop) to show them. The terminal listing is the check that counts.
Step 4 of 7: Write SKILL.md
Save the skill’s instructions in SKILL.md: a short header that tells Claude when to use it, then the steps it follows.Create
SKILL.mdin theclient-updatefolder and paste in the file below with its copy button. Any code editor works, such as VS Code. There are terminal commands for it at the end of this step too..claude/skills/client-update/SKILL.mdMarkdown--- description: Writes a short plain-English progress update for a non-technical client from recent git commits, always under the headings Shipped, In progress and Needs your input. Use when the user asks for a client update, a status update, a weekly summary or what changed this week. argument-hint: "[optional notes, such as since Monday or waiting on logo files]" --- Write a progress update for a client who doesn't read code. ## Gather the facts 1. Run this command in the project folder: `git log --since="7 days ago" --no-merges --date=short --format="%h %ad %s"` If the notes at the end name a different period, such as "since Monday" or "last two weeks", change `--since` to match. 2. If git reports that this isn't a git repository, or that there are no commits yet, tell the user that and stop. Don't write an update from guesses. 3. If the log is empty, say nothing was committed in that period and offer to look further back. 4. If a commit message is unclear, run `git show --stat <hash>` to see what it touched. Use it to understand the change, not to quote it. ## Write the update Use these three headings, in this order, every time. Keep a heading even when its section is empty. ``` ## Shipped ## In progress ## Needs your input ``` - **Shipped**: finished work, described by what the client can now do or see. Write "Quotes now show VAT on its own line", not "refactored buildQuote". - **In progress**: work that is started but not finished, such as commits marked WIP, plus anything the notes say is under way. - **Needs your input**: decisions or material only the client can give. If there are none, write "Nothing right now." Rules: - One bullet per change, one sentence each. Merge related commits into one bullet. - No commit hashes, file names, branch names or developer terms such as refactor, merge, PR, endpoint or deploy. - Only report what the commits and notes show. Never add results, numbers or dates that aren't there. - Under 150 words in total. Friendly and plain. No greeting or sign-off unless the user asks for one. For the tone and length to aim for, see [example.md](example.md). ## Notes from the user These may be empty. Use them for the period, for work in progress and for questions to put to the client. $ARGUMENTSName it
SKILL.md, in capitals. For a personal skill, it goes in~/.claude/skills/client-update/, which on Windows is%USERPROFILE%\.claude\skills\client-update\.What each part does:
- The first line must be exactly
---. Claude Code reads the header, called the frontmatter, only when---is the very first line. With anything above it, even a blank line, the whole file is treated as plain instructions. descriptionis how Claude decides when to use the skill. It says what the skill does first, then the requests that should trigger it.argument-hintshows as you type/client-update, a reminder that it takes optional notes.- The body is the prompt you would otherwise paste: where to get the facts, the three fixed headings and the rules for plain English.
$ARGUMENTSat the end is where Claude Code puts whatever you type after the command, such as notes about the week.
Warning: Field names must match exactly, hyphens included. Claude Code ignores a field it doesn’t recognise without telling you, so
argument_hintsimply does nothing.Now save the example next to it.
SKILL.mdlinks to it, so Claude can read it for tone and length when it writes an update. Long examples and reference notes belong in files like this, not inSKILL.mditself..claude/skills/client-update/example.mdMarkdown# Example client update A made-up update for Acme Quotes. Match its tone, length and headings, not its content: every update must come from the real git log and the user's notes. ## Shipped - Quotes now list the discount and the amount after discount on separate lines, so it's clear what the client saves. - Typing a role that isn't on the rate card now gives a clear error instead of a confusing total. ## In progress - A printable version of the quote. The layout is done and the totals are being checked. ## Needs your input - Should repeat clients get a standing discount? If so, what percent?For “The practice project from Day 1” or “A fresh copy of the practice project”
Note: Short on time? The finished Day 2 kit has both files in
.claude/skills/client-update/. Making them yourself is how the parts stick, though.For “Everyone on this project”
No editor handy? Save the files from the project’s top folder:
For macOS
Copy a file with its copy button, then run the matching command. It writes what you copied straight into the file.
After copying SKILL.mdpbpaste > .claude/skills/client-update/SKILL.mdAfter copying example.mdpbpaste > .claude/skills/client-update/example.mdFor Linux and WSL
Open each file in nano, paste (Ctrl+Shift+V in most terminals), then press Ctrl+O, Enter and Ctrl+X to save and close.
SKILL.mdnano .claude/skills/client-update/SKILL.mdexample.mdnano .claude/skills/client-update/example.mdFor Windows
Open each file in Notepad. If Notepad asks whether to create the file, choose Yes. Paste, save with Ctrl+S and close.
SKILL.mdnotepad .claude\skills\client-update\SKILL.mdexample.mdnotepad .claude\skills\client-update\example.mdFor “Just me, in every project”
No editor handy? Save the files into your personal skill folder:
For macOS
Copy a file with its copy button, then run the matching command. It writes what you copied straight into the file.
After copying SKILL.mdpbpaste > ~/.claude/skills/client-update/SKILL.mdAfter copying example.mdpbpaste > ~/.claude/skills/client-update/example.mdFor Linux and WSL
Open each file in nano, paste (Ctrl+Shift+V in most terminals), then press Ctrl+O, Enter and Ctrl+X to save and close.
SKILL.mdnano ~/.claude/skills/client-update/SKILL.mdexample.mdnano ~/.claude/skills/client-update/example.mdFor Windows
Open each file in Notepad. If Notepad asks whether to create the file, choose Yes. Paste, save with Ctrl+S and close.
SKILL.mdnotepad "$env:USERPROFILE\.claude\skills\client-update\SKILL.md"example.mdnotepad "$env:USERPROFILE\.claude\skills\client-update\example.md"Check it worked
List the folder, then print the first line of
SKILL.md:For macOS, Linux and WSL
Project skillls .claude/skills/client-update head -n 1 .claude/skills/client-update/SKILL.mdPersonal skillls ~/.claude/skills/client-update head -n 1 ~/.claude/skills/client-update/SKILL.mdFor Windows
Project skillGet-ChildItem .claude\skills\client-update Get-Content .claude\skills\client-update\SKILL.md -TotalCount 1Personal skillGet-ChildItem "$env:USERPROFILE\.claude\skills\client-update" Get-Content "$env:USERPROFILE\.claude\skills\client-update\SKILL.md" -TotalCount 1The listing shows
SKILL.mdandexample.md, and the last line printed is the start of the header:The first line of SKILL.md---
If it didn’t work
The first line isn’t ---
Open
SKILL.mdand delete everything above---: often a blank line, or extra text picked up by the copy. Save and print the first line again.The listing shows SKILL.md.txt or another extra extension
Your editor added its own extension. Rename the file. For a personal skill, use the folder in your home folder instead.
For macOS, Linux and WSL
Terminalmv .claude/skills/client-update/SKILL.md.txt .claude/skills/client-update/SKILL.mdFor Windows
PowerShellRename-Item .claude\skills\client-update\SKILL.md.txt SKILL.mdA file saved as rich text, such as
SKILL.md.rtf, has formatting mixed into it. Delete it and make it again in a plain-text editor or with the commands above.- The first line must be exactly
Step 5 of 7: Run /client-update yourself
Start Claude Code in the project and type the command; the update comes back under the three headings.Start Claude Code in the project’s top folder:
Terminal or PowerShellclaudeIf Claude Code asks whether you trust this folder, confirm it. It is your project.
Was Claude Code already running before you made the skills folder? Then run
/reload-skillsso it sees the new folder. Claude Code doesn’t watch a folder made mid-session, so until you restart it, run/reload-skillsagain after each edit toSKILL.md. In a session started after the folder existed, edits show up on their own.Now run the skill. Claude reads the git log, then writes the update.
In Claude Code/client-updateThen try it with notes. Everything after the name goes where
$ARGUMENTSsits in the skill:In Claude Code/client-update since Monday, still waiting on the logo files from the clientThe skill only reads the git log. If Claude Code asks before running a git command, allow it.
Check it worked
- Run
/skillsand typeclient:client-updateis in the list. Press Esc to close it, not Enter, which changes the skill’s visibility. - The reply has three headings in this order: Shipped, In progress, Needs your input.
- There are no commit hashes or file names in it, and after the second run the logo files appear under Needs your input.
If it didn’t work
/client-update isn’t in the menu, or Claude Code doesn’t recognise it
- For a project skill, start Claude Code in the folder that holds
.claude, or a folder inside it. - Run
/reload-skills. It reports how many skills it found. - Check the names: the folder is
client-updateand the file isSKILL.md, in capitals.
Claude says this isn’t a git repository, or there are no commits
That is the skill doing its job: it stops instead of guessing. Go back to Give the project a git history, then run
/client-updateagain.You edited SKILL.md but the reply hasn’t changed
If you made the skills folder while Claude Code was running, run
/reload-skillsfirst, because Claude Code isn’t watching that folder for edits. A skill that already ran also stays in the conversation as it was, so run/clearto start a fresh conversation, then/client-updateagain.The skill disappeared after you used /skills
In
/skills, Space or Enter changes a skill’s visibility and Esc saves the change. Open/skillsagain, highlightclient-updateand press Space until it is back on, then press Esc.- Run
Step 6 of 7: Let Claude use it without the command
Ask in plain words; when your request matches the skill’s description, Claude loads the skill by itself.Claude sees a list of your skills with their descriptions, and loads the full skill when a request matches. Start a fresh conversation first, so the copy of the skill from the last step isn’t already in it:
In Claude Code/clearThen ask the way you would ask a colleague:
Paste into Claude CodeWhat did we get done on this project this week? Write it up so I can send it to the client.Claude Code may ask before Claude uses the skill. Allow it.
Check it worked
The reply uses the skill’s three headings, Shipped, In progress and Needs your input, even though you never typed
/client-update. To see the skill being called, press Ctrl+O to open the transcript viewer, which shows the tools Claude used. Press Ctrl+O again to close it.If it didn’t work
Claude answered without the three headings
Ask Claude what it has available:
Paste into Claude CodeWhat skills are available?If
client-updateis listed with your description, your request didn’t match it closely enough. Use its words, such as client update or weekly summary, or rewrite the description so it leads with the words you use. Then/clearand ask again. You can always run it by name with/client-update.If it isn’t listed, or is listed without your description, its visibility may have changed in
/skills. Open/skills, highlightclient-updateand press Space until it is back on, then press Esc.If it is on but the description still isn’t the one you wrote, the header may not have parsed.
/client-updatestill runs in that case, but Claude can’t match a request to it. Check the header with Claude Code’s validator in a terminal. It needs Claude Code v2.1.233 or later.For macOS, Linux and WSL
Project skillclaude plugin validate .claude/skillsPersonal skillclaude plugin validate ~/.claude/skillsFor Windows
Project skillclaude plugin validate .claude\skillsPersonal skillclaude plugin validate "$env:USERPROFILE\.claude\skills"When it finds a problem, it names the file and says what is wrong. Fix that line, save, then
/clearand ask again.Claude uses the skill when you didn’t ask for an update
Make the description say more precisely when to use it. If you only ever want to run it yourself, add
disable-model-invocation: true, as the next step shows.Step 7 of 7: Make it yours and share it
Turn the same pattern into skills for your own repeated prompts, and commit project skills so your team gets them.Three changes cover most real use:
- Your own prompt. Copy the
client-updatefolder and rename the copy; the new name is the new command. Rewrite the description so it starts with the main use case, then replace the body with your prompt. - Manual only. For a skill with side effects, such as deploying or sending a message, add
disable-model-invocation: trueto the header. You still run it with/name, but Claude can’t start it on its own. - Supporting files. Keep
SKILL.mdshort, well under 500 lines. Move long examples, templates and reference notes into files next to it, and link each one fromSKILL.md, the wayclient-updatelinksexample.md.
Note: You will see
allowed-toolsin other people’s skills. It lets Claude use the listed tools without asking, during the turn the skill runs in. It doesn’t limit Claude to those tools. Because it skips permission prompts, read it before you run a skill you didn’t write.For “Everyone on this project”
Commit the skill so everyone who clones the project gets it with the code:
Terminal or PowerShellgit add .claude/skills git commit -m "Add client-update skill"For “Just me, in every project”
A personal skill lives in your home folder, so git never sees it. To share it later, copy its folder into a project’s
.claude/skills/and commit it there.Check it worked
- Project skill:
git log --oneline -1showsAdd client-update skill, and/skillsstill listsclient-update. - Personal skill: start Claude Code in a different project and run
/skills.client-updateis listed there too.
If it didn’t work
Your new skill doesn’t show up in /skills
Check that the copy has its own folder with a
SKILL.mdinside, and that its first line is---. Then run/reload-skills.- Your own prompt. Copy the
Finish · 7 of 7 steps to go
Your first skill works
What you’ll have checked
/skillslistsclient-update./client-updatereturns an update under Shipped, In progress and Needs your input.- In a fresh conversation, a plain request for a client update gets the same three headings.
- For a project skill,
.claude/skills/client-update/is committed with the code.
New lessons by email
Get new lessons by email
Leave your email and we’ll tell you when a new lesson goes live.
Claude Code for your team
Want Claude Code set up across your team?
HorizonLux sets up and repairs Claude Code for teams: CLAUDE.md rules, hooks that enforce them and reviewed MCP servers. Book a free call to talk it through.
Related
Questions
Questions about Day 2
What is the difference between a skill and a custom slash command?
Custom commands have been merged into skills. A file at .claude/commands/deploy.md and a skill at .claude/skills/deploy/SKILL.md both create /deploy and work the same way, and existing command files keep working. A skill is a folder, so it can also hold supporting files such as the example.md in this lesson. Use skills for anything new. If a skill and a command share a name, the skill wins.
Should my instructions go in CLAUDE.md or in a skill?
Put facts Claude needs in every session in CLAUDE.md: build commands, conventions and rules that always apply. Put a procedure you run now and then in a skill. CLAUDE.md loads at the start of every session, while a skill’s body loads only when it is used, so a long procedure costs almost nothing until you need it.
How do arguments work in a skill?
Whatever you type after the skill name replaces $ARGUMENTS in SKILL.md. To use single arguments, write $0 for the first, $1 for the second and so on, since the count starts at zero. Put quotes around several words to pass them as one argument. If the skill has no placeholder at all, Claude Code adds what you typed to the end of the skill, after the label ARGUMENTS.
What happens if a personal skill and a project skill have the same name?
The personal one wins. With client-update in both your home folder’s .claude/skills and the project’s .claude/skills, /client-update runs the one in your home folder. A skill your organisation deploys through managed settings beats both. Give a personal copy a different name if you want to keep both.
Can I use the same SKILL.md in the Claude app on claude.ai?
Check the header first. Uploads to claude.ai and the Skills API accept only six fields: name, description, license, compatibility, metadata and allowed-tools. Any other field, such as the argument-hint in this lesson’s skill, makes the upload fail with an error, so remove it before uploading. Add name: client-update as well, since the Agent Skills spec that uploads follow requires a name that matches the folder. Claude Code features in the body, such as running a shell command before Claude reads the skill, don’t work there either. And client-update reads your git history, so it is only useful where Claude can see your project.
Do skills use up my context window?
A little. Claude Code keeps a list of each skill’s name and description in context so Claude knows what exists, and loads the full SKILL.md only when the skill runs. After that, the skill stays in the conversation, so keep the body short. In that list, the description is cut off at 1,536 characters, so put the main use case first. A skill with disable-model-invocation: true keeps its description out of context completely.
Can I stop Claude from running a skill on its own?
Yes. Add disable-model-invocation: true to the skill’s header. You can still run it by typing its name with a slash, but Claude won’t start it by itself. Use it for anything with side effects, such as deploying or sending a message, so it only runs when you decide.
Sources
Checked against the official Claude Code docs on .
- Extend Claude with skills
- Commands
- How Claude remembers your project
- Explore the .claude directory
- Configure permissions
- Tools reference
- Interactive mode
- Security
Independent resource, not affiliated with Anthropic. HorizonLux wrote this lesson; Claude Code is made by Anthropic.