Skip to content

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-email skill that takes a client name and line items as two arguments.
  • A template.md beside 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.

0 of 4 steps done0%
  1. 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, /skills lists quote-email with a user-only label.

    If it didn’t work

    `/skills` doesn’t list `quote-email`.

    Check the path is .claude/skills/quote-email/SKILL.md and that --- is its first line. Then run /reload-skills.

  2. 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 $client with the first argument and $items with 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-tools doesn’t limit Claude: it approves tools but removes none. Removing them is disallowed-tools.

  3. Step 3 of 4: Run it with two arguments

    Quote each argument so a name with spaces stays whole.
    In Claude Code

    You type: /quote-email "Bloom Bakery" "design:10 dev:24 --discount 10"

    What happens: Claude runs node src/cli.js design:10 dev:24 --discount 10 without a permission prompt.

    What happens: It reads template.md and 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.js to match allowed-tools. An ask or deny rule in your settings still wins.

  4. 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:

    1. You

      You type the command

      /quote-email "Bloom Bakery" "copywriting:5"

    2. Shell

      The quote command runs

      It prints Error: Unknown role "copywriting".

    3. 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

One command now drafts a quote email for any client, from real numbers, and only when you ask.

What you’ll have checked

  • /skills shows quote-email as 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.

We’ll email you when we add or update a lesson. We use your email only for this. Privacy policy

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.

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.