APM

>Agent Skill

@keiththompson/cooklang-formatting

skilldevelopment

Format recipes using Cooklang markup syntax. Use when creating, editing, or converting recipes to Cooklang format. Covers ingredients, equipment, timers, metadata, and file organization.

apm::install
$apm install @keiththompson/cooklang-formatting
apm::skill.md
---
name: cooklang-formatting
description: Format recipes using Cooklang markup syntax. Use when creating, editing, or converting recipes to Cooklang format. Covers ingredients, equipment, timers, metadata, and file organization.
---

# Cooklang Recipe Formatting

## Style Guidelines (IMPORTANT)

### 1. Capitalize ingredients and equipment
```cook
@Leek{1}           -- correct
@leek{1}           -- wrong

#Pan{}             -- correct
#pan{}             -- wrong
```

### 2. No adjectives inside keywords
Adjectives go BEFORE the keyword, not as part of it:
```cook
large #Pan{}       -- correct
#large pan{}       -- wrong

hot #Skillet{}     -- correct
#hot skillet{}     -- wrong

medium @Onion{1}   -- correct
@medium onion{1}   -- wrong
```

### 3. Prefer metric measurements
Use grams, ml, litres instead of cups. Teaspoons and tablespoons are OK:
```cook
@Flour{250%g}      -- correct
@Flour{2%cups}     -- wrong

@Milk{500%ml}      -- correct
@Milk{2%cups}      -- wrong

@Stock{1%litre}    -- correct
@Stock{4%cups}     -- wrong

@Butter{2%tbsp}    -- OK (tbsp allowed)
@Vanilla{1%tsp}    -- OK (tsp allowed)
```

### 4. Include a recipe image
Save the most appealing frame from the video as an image with the same name:
```
Dinner/Garlic Butter Shrimp.cook
Dinner/Garlic Butter Shrimp.jpg    -- same name, .jpg extension
```

## Quick Reference

| Symbol | Purpose | Example |
|--------|---------|---------|
| `@` | Ingredient | `@Butter{30%g}` |
| `#` | Equipment | `#Frying Pan{}` |
| `~` | Timer | `~{5%minutes}` |
| `---` | Metadata block | YAML frontmatter |
| `==` | Section header | `== Sauce ==` |

## Ingredient Syntax

```
@ingredient                      -- name only (to taste)
@ingredient{quantity}            -- with amount, no unit
@ingredient{quantity%unit}       -- full specification
@multi word ingredient{}         -- braces required for multi-word
@ingredient{qty%unit}(prep)      -- with preparation instructions
```

### Examples
```cook
@Salt{}
@Eggs{3}
@Butter{30%g}
@Chicken Breast{500%g}
@Garlic{3%cloves}(minced)
@Onion{1}(diced)
```

### Notes on Ingredients
- For pantry staples (salt, pepper, oil), just use `@Salt{}` with no quantity
- For optional ingredients, write "optional" in the text: `Add optional @Chilli Flakes{1%tsp} if desired.`
- Don't use `-`, `?`, or `&` prefixes - they're not supported by most Cooklang apps
- **Don't mark cooking water as an ingredient** - water for boiling/blanching is not a shopping list item:
  ```cook
  Bring a large #Pot{} of water to a boil.     -- correct (plain text)
  Bring a large #Pot{} of @Water{} to a boil.  -- wrong (creates ingredient)
  ```

## Equipment Syntax

```cook
#Pot{}
#Frying Pan{}
#Mixing Bowl{}
#Baking Sheet{}
```

Adjectives go before, not inside:
```cook
large #Pot{}           -- correct
#large pot{}           -- wrong
```

## Timer Syntax

```cook
~{5%minutes}
~{30%seconds}
~{1%hour}
~resting{10%minutes}     -- named timer
```

**Important**: Use single values only, NOT ranges. Write `~{15%minutes}` not `~{10-15%minutes}`.
For variable times, pick the middle value or write it in text: "about 10-15 minutes".

## Recipe Structure

### Metadata (YAML Frontmatter)
```cook
---
source: https://example.com/recipe
servings: 4
prep_time: 15 minutes
cook_time: 30 minutes
---
```

Note: `servings` must be a number, not text.

### Steps
Each paragraph becomes a numbered step. Separate steps with blank lines:

```cook
Preheat #Oven{} to 190°C.

Season @Chicken Breast{500%g} with @Salt{} and @Pepper{}.

Bake for ~{25%minutes} until internal temperature reaches 75°C.
```

### Sections
Use `==` for complex recipes with multiple parts:

```cook
== Marinade ==

Combine @Soy Sauce{45%ml} and @Honey{30%g} in a #Bowl{}.

== Main Dish ==

Cook @Chicken{500%g} in the marinade.
```

### Notes
Use `>` prefix for tips:

```cook
> For extra flavor, marinate overnight.
```

## File Organization

Save recipes to category folders using Title Case:

```
Breakfast/Fluffy Pancakes.cook
Lunch/Greek Salad.cook
Dinner/Garlic Butter Shrimp.cook
```

### Categories
- **Breakfast**: Morning meals, eggs, pancakes, smoothies
- **Lunch**: Salads, sandwiches, soups, light meals
- **Dinner**: Main courses, proteins, pasta, substantial meals
- **Sides**: Accompaniments, vegetables
- **Sauces**: Dressings, marinades, condiments
- **Desserts**: Sweets, baked goods
- **Drinks**: Beverages, cocktails

## CLI Commands

If the `cook` CLI is installed:

```bash
cook recipe "path/to/recipe.cook"      # Parse and display
cook recipe "path/to/recipe.cook:2"    # Scale by 2x
cook shopping-list *.cook              # Generate shopping list
cook doctor validate                   # Check for syntax errors
```

## Common Patterns

### Simple Recipe
```cook
---
source: https://tiktok.com/@creator/video/123
servings: 2
---

Heat @Olive Oil{2%tbsp} in a large #Skillet{} over medium heat.

Add @Garlic{3%cloves}(minced) and cook for ~{30%seconds}.

Add @Prawns{450%g} and cook for ~{2%minutes} per side until pink.

Season with @Salt{} and @Pepper{} to taste.
```

### Recipe with Sections
```cook
---
servings: 4
---

== Sauce ==

Whisk @Soy Sauce{3%tbsp}, @Honey{2%tbsp}, and @Sesame Oil{1%tsp}.

== Stir Fry ==

Heat #Wok{} over high heat. Cook @Chicken{500%g}(sliced) for ~{5%minutes}.

Add sauce and toss to coat.
```