Skill: cylqqqcyl/recipe-scout (version 1.0.0)

--- name: recipe-scout description: > Find and normalize Chinese recipes (中餐菜谱) from structured sources first, then export clean recipe notes to Obsidian markdown. Prefer stable recipe sites over social posts; use 小红书 only for inspiration/fallback. Use when user asks for: Chinese recipes / 中餐菜谱, "how to cook X" / 做法, meal ideas, home-style dishes, weeknight cooking, recipe collection / curation, or recipe note creation in Obsidian. user-invocable: true metadata: {"openclaw":{"emoji":"🥢","homepage":"https://docs.openclaw.ai/tools/skills"}} --- # recipe-scout Source-policy + normalization layer for Chinese recipes. Not a single-site scraper. ## Source Ranking (strict priority) ### Tier A — Structured recipe pages (primary) - **下厨房** (xiachufang.com) — largest Chinese UGC recipe platform, step-by-step photos, strong search - **美食天下** (meishichina.com) — broad category coverage, reliable ingredient lists - **豆果美食** (douguo.com) — large recipe app ecosystem - **HowToCook** (github.com/Anduin2017/HowToCook) — programmer-authored, precise gram-level measurements, no fluff; raw URLs: `https://raw.githubusercontent.com/Anduin2017/HowToCook/master/dishes/<category>/<dish>/<dish>.md`; categories: `meat_dish`, `aquatic`, `vegetable_dish`, `staple`, `soup`, `dessert`, `condiment` - Reputable cooking blogs with full recipe text ### Tier B — Video + transcript (secondary) - YouTube / Bilibili cooking videos with captions or clear on-screen ingredients ### Tier C — Social posts (fallback / inspiration only) - 小红书, short-post platforms, comment threads - Mark confidence `low` unless validated by another source - Do NOT treat as authoritative recipe specs > **Anti-pattern:** Do not make 小红书 the primary recipe backend. UI changes often, ingredient/timing details are frequently missing, extraction is brittle. ## Retrieval Strategy 1. Parse dish intent + constraints (cuisine, diet, equipment, time, restrictions) 2. Search Tier A first with Chinese queries (see `references/query-examples.md`) 3. Collect 3–7 candidates 4. Deduplicate by core technique + ingredient profile 5. Rank by: completeness → clarity → home-cooking fit → ingredient accessibility 6. Use Tier B/C only to fill gaps or add variants ## Normalization Rules - **Language:** Chinese default (English if user requests) - **Units:** metric preferred (g / ml / tbsp / tsp); preserve source units if conversion uncertain - **Times:** separate prep / cook / total; mark missing estimates as `estimated: true` - **Seasoning:** keep exact source values; record `适量` as-is with a practical note - **Heat:** normalize to 小火 / 中小火 / 中火 / 中大火 / 大火 - **Safety:** include basic food safety notes (chicken/pork doneness, etc.) when relevant ## Anti-Hallucination - Never fabricate ingredient quantities, temperatures, or timings - Missing fields → `unknown` / `未注明` - Clearly distinguish: **source facts** vs **inferred estimates** vs **your recommendations** ## Output Modes | Mode | When | Output | |------|------|--------| | Quick answer | Casual ask | Top 3 options, recommended version, concise steps + shopping list | | Structured pack | User wants detail | Normalized recipe using schema | | Obsidian export | Collection/save | One `.md` file per recipe → [REDACTED_SECRET]; fallback: `{workspace}/exports/recipes/` | **Schema:** See `references/schema.md` **Obsidian template:** See `references/obsidian-template.md` ## Execution Playbook When invoked: 1. Restate target dish + constraints in one line 2. Search Tier A with Chinese queries 3. Return candidate table (3–7): source | completeness | style | confidence 4. Pick one "default cooking path" 5. Normalize into canonical schema 6. Output quick summary in chat 7. If export requested → write Obsidian note(s), return file paths ## Browser vs Web Tools - **Prefer:** `web_search` (Brave Search API) + `web_fetch` for structured recipe pages — this is the primary retrieval method - **Brave Search tip:** Use Chinese queries for Tier A sources (下厨房, 豆果, 美食天下); English queries for fallback/Tier B - **Use browser only when:** page requires JS rendering, login/session, or video transcript interaction - If Chrome relay is unstable → switch to `openclaw` browser profile ## Hard No's - No aggressive scraping - No paywall/login bypass - No social-media hearsay presented as precise recipe specs - No invented measurements

path: references/obsidian-template.md
content: # Obsidian Recipe Note Template

**Filename:** `YYYY-MM-DD - <菜名>.md`
If duplicate, append ` - v2`.

**Vault path:** `/home/node/vault/Recipes/Chinese/`
**Fallback:** `{workspace}/exports/recipes/`

---

```markdown
---
type: recipe
title: <菜名>
aliases: [<别名1>, <别名2>]
cuisine: <菜系/家常菜>
category: <分类>
servings: <份数 or 未注明>
difficulty: <easy|medium|hard|unknown>
prep_minutes: <number or unknown>
cook_minutes: <number or unknown>
total_minutes: <number or unknown>
source_quality: <high|medium|low>
source_type: [structured, video, social]
sources:
  - title: "<标题1>"
    url: "<URL1>"
  - title: "<标题2>"
    url: "<URL2>"
tags: [recipes, chinese, <菜系>, <主食材>, <烹饪方式>]
created: <YYYY-MM-DD>
updated: <YYYY-MM-DD>
---

# <菜名>

## 一句话判断
<这道菜适合谁/什么场景；例如：15分钟家常下饭菜，适合工作日晚上>

## 配方摘要
- 口味：<咸鲜/麻辣/清淡/...>
- 核心技法：<滑炒/红烧/清蒸/...>
- 关键成功点：<1-2条>

## 食材（主料）
- <食材>：<数量>
- ...

## 调味料
- <调味料>：<数量>
- ...

## 前处理
- <切配/腌制/焯水/...>

## 步骤
1. <步骤1>（火候：<...>；时长：<...>）
2. <步骤2>（火候：<...>；时长：<...>）
3. ...

## 翻车点（避坑）
- <常见失败原因1>
- <常见失败原因2>

## 可替代方案
- <食材替代>
- <口味变体>

## 我自己的改造（可选）
- <根据用户设备/食材做的修改建议，例如 air fryer / Instant Pot / 少油版本>

## 证据与来源
- [<标题1>](<URL1>) — structured/video/social
- [<标题2>](<URL2>) — structured/video/social

## 置信度
<high|medium|low>（原因：<是否有完整克数、是否交叉验证、是否仅社媒来源>）
```


path: references/query-examples.md
content: # Query Formulation Examples

Use these patterns when constructing search queries for Tier A sources.

## By Dish

**番茄炒蛋:**
- `番茄炒蛋 家常菜 做法`
- `番茄炒蛋 下厨房`
- `番茄炒蛋 美食天下`
- `番茄炒蛋 少油版本`

**红烧牛腩 (with Instant Pot):**
- `红烧牛腩 高压锅 做法`
- `红烧牛腩 Instant Pot 中文`
- `牛腩炖土豆 家常菜谱`

## Constraint Modifiers

Append to base query as needed:

| Constraint | Modifier |
|-----------|---------|
| 川菜 style | `川菜 做法` |
| Low oil | `少油 清淡` |
| Air fryer | `空气炸锅` |
| High protein | `高蛋白` |
| Under 15 min | `15分钟 快手` |
| Ingredient restriction | `不放<食材>` / `素` |

## Recommended Primary Sources

| Source | Strengths | Access pattern |
|--------|-----------|----------------|
| 下厨房 | User-generated, trend sections, wide coverage | Search: `<菜名> site:xiachufang.com` |
| 美食天下 | 菜谱大全 structure, good for broad recall | Search: `<菜名> site:meishichina.com` |
| 豆果美食 | Large recipe app ecosystem | Search: `<菜名> 豆果美食` |
| **HowToCook** | Precise gram-level measurements, programmer-friendly, no ads | Raw fetch: `https://raw.githubusercontent.com/Anduin2017/HowToCook/master/dishes/<category>/<dish>/<dish>.md` |
| The Woks of Life | English, excellent normalization, cross-validation | Direct fetch: `thewoksoflife.com/<dish-slug>/` |
| Omnivore's Cookbook | English, Chinese home-style focus | Direct fetch: `omnivorescookbook.com/<dish-slug>/` |
| China Sichuan Food | English, Sichuan specialist | Direct fetch: `chinasichuanfood.com/<dish-slug>/` |

## HowToCook Category Map

| Category folder | Contents |
|----------------|----------|
| `meat_dish` | 宫保鸡丁, 红烧肉, 回锅肉, 糖醋里脊 … |
| `aquatic` | 清蒸鲈鱼, 红烧鱼, 酸菜鱼 … |
| `vegetable_dish` | 蒜蓉西兰花, 地三鲜, 拍黄瓜 … |
| `staple` | 蛋炒饭, 煮面条 … |
| `soup` | 番茄蛋花汤, 酸辣汤 … |
| `condiment` | 辣椒油, 葱油 … |


path: references/schema.md
content: # Extraction Schema (Canonical)

Use internally and when returning structured JSON/YAML.

```json
{
  "dish_name": "string",
  "dish_name_aliases": ["string"],
  "cuisine_region": "川菜|粤菜|湘菜|鲁菜|苏菜|浙菜|闽菜|徽菜|家常菜|融合|unknown",
  "category": "热菜|凉菜|汤羹|主食|小吃|早餐|甜品|酱料|unknown",
  "servings": "number|string|unknown",
  "difficulty": "easy|medium|hard|unknown",
  "times": {
    "prep_minutes": "number|unknown",
    "cook_minutes": "number|unknown",
    "total_minutes": "number|unknown",
    "estimated": "boolean"
  },
  "ingredients": [
    {
      "name": "string",
      "amount": "string",
      "unit": "string",
      "prep": "string",
      "optional": "boolean",
      "substitutions": ["string"]
    }
  ],
  "seasonings": [
    {
      "name": "string",
      "amount": "string",
      "unit": "string",
      "notes": "string"
    }
  ],
  "steps": [
    {
      "idx": 1,
      "instruction": "string",
      "heat": "小火|中小火|中火|中大火|大火|unknown",
      "time_minutes": "number|unknown",
      "visual_cues": ["string"],
      "warnings": ["string"]
    }
  ],
  "tips": ["string"],
  "common_failures": ["string"],
  "variants": [
    {
      "name": "string",
      "difference": "string",
      "source_type": "structured|video|social"
    }
  ],
  "nutrition_notes": ["string"],
  "confidence": "high|medium|low",
  "source_urls": ["string"],
  "source_titles": ["string"],
  "source_type": ["structured|video|social"],
  "traceability_notes": ["string"]
}
```


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)