Day 13 of 52 · about 20 min · Skills
Give your skill arguments and its own files
Most prompts you repeat differ only in a name and a few numbers. Pass those in as arguments, keep the template beside the skill, and one command drafts every client’s quote email from your real figures.
You’ll finish with
- A
/quote-emailskill that takes a client name and line items as two arguments. - A
template.mdbeside the skill that Claude reads only when the skill runs. - One pre-approved command, and a skill Claude never starts on its own.
You’ll need
- The Acme Quotes project from Day 12, or the Day 13 kit with today’s files in it.
- Claude Code and Node.js 22 or newer.
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.
The steps
One step at a time. When a step’s check matches, tick it and the next one opens.
Step 1 of 4: Save the skill and its template
Put SKILL.md and template.md in one folder under .claude/skills.acme-quotes/
- folder .claude
- folder skills
- folder client-updatefrom Day 12
- folder quote-emailNew
- SKILL.mdNewfrontmatter and steps
- template.mdNewread only when the skill runs
Supporting files live in the skill’s own folder. .claude/skills/quote-email/SKILL.mdMarkdown--- description: Drafts a short email that sends a client their Acme quote, from a client name and role:hours line items. argument-hint: '"<client name>" "<role:hours ...> [--discount <percent>]"' arguments: [client, items] disable-model-invocation: true allowed-tools: - Bash(node src/cli.js *) - PowerShell(node src/cli.js *) --- Draft a quote email for $client. 1. Run this command in the project folder and keep its output: `node src/cli.js $items` 2. If the command prints an error, show the error to the user and stop. Don't write an email from guessed numbers. 3. Fill in [template.md](template.md) with the client name and the numbers from the command output. Rules: - Copy every amount exactly as the command printed it, currency included. Never work out a number yourself. - Keep the discount line only when the output has one. - Leave `{{your name}}` as it is, for the user to fill in. - Put the finished email in your reply. Don't save it to a file and don't send it anywhere..claude/skills/quote-email/template.mdMarkdown# Quote email template Fill in every `{{...}}` from the quote command's output. Keep the wording around them. Drop the discount line when there is no discount. ``` Subject: Your quote from Acme: {{total}} Hi {{client}}, Thanks for asking us to price this job. Here is what it covers: {{one line per role: the role, its hours and its amount}} Subtotal: {{subtotal}} Discount ({{percent}}): {{discount}} VAT ({{vat percent}}): {{vat}} Total: {{total}} Reply to this email if you'd like to go ahead or change anything. Best regards, {{your name}} ```Check it worked
In Claude Code,
/skillslistsquote-emailwith a user-only label.If it didn’t work
`/skills` doesn’t list `quote-email`.
Check the path is
.claude/skills/quote-email/SKILL.mdand that---is its first line. Then run/reload-skills.Step 2 of 4: Read what each field does
Three frontmatter fields turn a fixed prompt into a small tool..claude/skills/quote-email/SKILL.md- arguments: [client, items]
- Fills
$clientwith the first argument and$itemswith the second. - disable-model-invocation: true
- Only you can start it. Claude doesn’t see its description.
- allowed-tools: Bash(node src/cli.js *)
- Runs that command without asking, for this turn only. A PowerShell line does the same on Windows.
The template link in the body tells Claude when to open template.md.Check it worked
You can say why
allowed-toolsdoesn’t limit Claude: it approves tools but removes none. Removing them isdisallowed-tools.Step 3 of 4: Run it with two arguments
Quote each argument so a name with spaces stays whole.In Claude CodeYou type: /quote-email "Bloom Bakery" "design:10 dev:24 --discount 10"
What happens: Claude runs
node src/cli.js design:10 dev:24 --discount 10without a permission prompt.What happens: It reads
template.mdand replies with the email.The same command works in every shell. Check it worked
An email to Bloom Bakery with a total of
EUR 3,326.40, and no prompt for the quote command.If it didn’t work
Claude asks before running the quote command.
The command must start with
node src/cli.jsto matchallowed-tools. An ask or deny rule in your settings still wins.Step 4 of 4: Feed it a role that doesn’t exist
The skill’s rules say what to do when the command fails.In order:
You
You type the command
/quote-email "Bloom Bakery" "copywriting:5"Shell
The quote command runs
It prints
Error: Unknown role "copywriting".Claude
Claude reads the result
If the command prints an error
Claude shows it and stops
If it prints a quote
Claude fills in the template
Rules in the skill keep guessed numbers out of client emails. Check it worked
Claude shows the unknown-role error and writes no email.
Finish · 4 of 4 steps to go
Your skill takes input
What you’ll have checked
/skillsshowsquote-emailas user-only.- The email total matches the quote command’s output.
Lesson updates by email
Get lesson updates by email
Leave your email and we’ll tell you when we add or update a lesson.
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 13
Why not use `$ARGUMENTS`?
`$ARGUMENTS` hands over everything you typed as one string. Named arguments split it the way a shell does, so the client and the items arrive separately.
Sources
Checked against the official Claude Code docs on .
Independent resource, not affiliated with Anthropic. HorizonLux wrote this lesson; Claude Code is made by Anthropic.