mcpField
R
resolve-recipe-ingredient-link

resolve-recipe-ingredient-link

github.com/gkwa生产力072 次安装2 天前更新
代码仓库

关于 resolve-recipe-ingredient-link

用于将 Obsidian 中未解析的食材 wikilink 匹配到 product 笔记的技能,采用语义判断,并规定歧义处理和新建笔记的方式。

主要功能

  1. 01检索带 product 标签的笔记
  2. 02按语义为候选项排序
  3. 03结合来源行消除歧义
  4. 04仍不明确时询问用户
  5. 05必要时新建 product 笔记
  6. 06使用无别名链接

适用场景

  1. 01解析食谱中的食材链接
  2. 02区分名称相似的食材
  3. 03为缺失食材创建笔记
  4. 04应用解析结果且不使用别名

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/gkwa/volcanicviper --skill resolve-recipe-ingredient-link

安装后在 Claude Code 中输入/resolve-recipe-ingredient-link确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

tile.json
tests/
build_prompt.py
linkform.promptfooconfig.yaml
products.txt
promptfooconfig.yaml
README.md

详细介绍

解析未解析的 Obsidian 双向链接

给定一个未解析的双向链接(例如 [[leeks]]),找到最匹配的现有笔记。

二进制文件:/Users/mtm/go/bin/islandiguana

库路径:/Users/mtm/Documents/Obsidian Vault

方法

链接文本是方括号内的名称(例如,[[leeks]] 中的 leeks)。

对于带管道的双向链接([[leek|leeks]]),链接文本是 | 前面的部分。

步骤 1 — 枚举候选项。

解析候选项来自标记为 product 的笔记。

islandiguana "/Users/mtm/Documents/Obsidian Vault" '.tags[] == "product"'

步骤 2 — 阅读完整候选列表并进行语义排序。

阅读 islandiguana 返回的每个文件名,并根据链接文本对整个列表进行排序。

不要使用关键词搜索预先筛选列表。

匹配依据是语义,而不是字面形式——关键词筛选可能会丢弃关键词无法预料的优质候选项(名为 wild ramps.md 的笔记可以解析 [[leeks]],尽管它与“leek”没有任何共同字母)。

目前产品池约有 1,300 条笔记,规模足够小,可以一次完整阅读。

步骤 3 — 按三级规则解析。

第 1 级 — 名称几乎完全匹配。

如果候选项与链接文本完全匹配,或仅存在单复数差异,则解析为该候选项。

示例:leek.md 解析 [[leeks]]。

第 2 级 — 根据来源行消歧。

如果不存在几乎完全匹配的候选项,请阅读来源笔记中包含该双向链接的完整行,而不只是方括号内的文本。

链接名词左侧的描述性词语用于消歧。

示例:行 2 teaspoons whole black [[peppercorns]] 包含“black”和“whole”,因此目标是“whole black peppercorns”,应解析为 black peppercorn.md,而不是字面匹配的 sichuan peppercorns.md。

第 3 级 — 询问用户。

如果来源行仍无法确定选项(例如,[[peppercorns]] to taste 没有指定类型),请列出候选项并询问用户选择哪一个。

第 4 级 — 创建新的产品笔记。

如果没有任何现有候选项是合理的解析结果,不要勉强匹配错误的候选项,也不要让链接悬空。

创建一条以链接文本命名的新产品笔记,以解析该双向链接,并遵循以下产品笔记格式。

近似替代不算解析成功:feta cheese 不是 cotija cheese,将前者解析为后者是错误的,尽管两者都是易碎奶酪。

如果原料是不同的产品,优先新建笔记,而不是替代匹配。

新笔记的文件名应为不带方括号的链接文本,并遵循库中其他笔记的大小写规则(全部小写,单词之间用空格),例如 [[cotija cheese]] 对应 cotija cheese.md。

使用以下模板,从任意现有产品笔记(例如 habanero peppers.md)中逐字复制 store 布尔值 frontmatter 和 store 部分,确保新笔记与库的结构完全一致。

将 tags 设为 product,再加上一个表示该原料类别的标签(例如 dairy、vegetable、spice)。

将 Google 图片搜索链接作为产品参考,因为新笔记暂时没有购买页面。

如果没有经过验证的图片 URL,请省略 pic frontmatter 字段和主图,以避免链接失效。

---
albertsons: false
amazon_com: false
amazon_fresh: false
central_co_op: false
chef_s_store: false
costco: false
dong_hing_market: false
east_african_imports_restaurant: false
franz_bakery: false
fred_meyer: false
grocery_outlet: false
h_mart: false
hau_hau_market: false
home_depot: false
india_depot_indian_grocery_kitchen_bakery: false
lam_s_seafood_asian_market: false
lowe_s: false
m2m: false
pacific_supply: false
pcc: false
public_storage: false
qfc: false
safeway: false
tags:
- product
- <category>
target: false
than_son_tofu_and_bakery: false
trader_joes: false
uwajimaya: false
walgreens: false
walmart: false
whole_foods: false
---

<Product Name>


Google image search: https://www.google.com/search?q=<product+name>&tbm=isch

## [[Amazon.com]]
- [x] shopping

## [[Central Co-op]]
- [x] shopping

## [[Grocery Outlet]]
- [x] shopping

## [[Chef's Store]]
- [x] shopping

## [[Hau Hau Market]]
- [x] shopping

## [[Lam's Seafood Asian Market]]
- [x] shopping

## [[M2M]]
- [x] shopping

## [[Pacific Supply]]
- [x] shopping

## [[PCC]]
- [x] shopping

## [[QFC]]
- [x] shopping

## [[Safeway]]
- [x] shopping

## [[Target]]
- [x] shopping

## [[Trader Joes]]
- [x] shopping

## [[Uwajimaya]]
- [x] shopping

## [[Walgreens]]
- [x] shopping

## [[Walmart]]
- [x] shopping

## [[Whole Foods]]
- [x] shopping

## [[Costco]]
- [x] shopping

## [[Fred Meyer]]
- [x] shopping

## [[H Mart]]
- [x] shopping

## [[Dong Hing Market]]
- [x] shopping

## [[Amazon Fresh]]
- [x] shopping

## [[Home Depot]]
- [x] shopping

## [[Franz Bakery]]
- [x] shopping

## [[Lowe's]]
- [x] shopping

## [[Than Son Tofu and Bakery]]
- [x] shopping

## [[India Depot Indian Grocery, Kitchen & Bakery]]
- [x] shopping

## [[Albertsons]]
- [x] shopping

## [[East African Imports & Restaurant]]
- [x] shopping

## [[Public Storage]]
- [x] shopping

步骤 4 — 报告。

报告已考虑的候选项数量和解析结果;若需询问用户,则提供排序后的候选列表;若没有候选项匹配,则报告新建的产品笔记。

除非用户明确要求,否则不要编辑双向链接——先告知解析结果。

编写已解析的链接

收到应用解析结果的请求时,请比较显示词(原始链接文本,例如 leeks)和解析后的笔记名称(例如 leek),以选择链接形式。

成分链接中绝不要使用别名形式([[note|displayed]])。

当显示词与笔记名称不同时,请改写食谱文本以匹配笔记名称,并保留普通链接,而不是用别名掩盖不匹配。

将词形变化部分放在方括号外是可以的;使用别名则不行。

此规则也适用于标题链接,不仅限于成分链接。

链接到同一笔记中的标题时,请使用不带别名的相对形式 [[#Heading]],而不是 [[note#Heading|Display]]。

规则不容违反:绝不要引入别名,即使 AskUserQuestion 选项文本提出了别名也不行。

请按以下顺序判断:

情况 0 — 先吸收相邻的消歧词。

如果解析结果使用了第 2 层——源行中方括号外的描述性词语用于确定笔记——且该词语紧邻 wikilink,请先将它纳入方括号内。

然后对扩展后的短语进行以下比较,而不是只比较方括号中的文本。

示例:行 2 teaspoons whole black [[peppercorns]],笔记 black peppercorn。

第 2 层消歧词 "black" 紧邻链接左侧,因此显示短语从 peppercorns 扩展为 black peppercorns。

笔记名称现在是该短语的前缀,因此链接写作 [[black peppercorn]]s,并将相邻的 black 纳入其中——这一行变为 2 teaspoons whole [[black peppercorn]]s。

这优于将消歧词留在外面的写法 black [[black peppercorn|peppercorns]],因为这样会让 "black" 留在方括号外,并重复笔记名称中已有的词。

原则:用于第 2 层消歧的词应纳入链接文本,而不是孤零零地留在别名旁边。

情况 1 — 显示词与笔记名称相同。

使用不带别名和后缀的普通链接。

示例:显示词 leek,笔记名称 leek,写作 [[leek]]。

情况 2 — 笔记名称是显示词的前缀。

将笔记名称保留在方括号内,并将剩余后缀放在外面。

示例:显示词 leeks,笔记名称 leek,写作 [[leek]]s。

示例:显示词 boxes,笔记名称 box,写作 [[box]]es。

情况 3 — 笔记名称不是显示词的前缀。

词干发生了变化,因此无法拆出后缀。不要使用别名。

请改写食谱文本,使用笔记中的词,并使用普通链接,同时调整周围措辞,使这一行读起来自然。

示例:显示词 leaves,笔记名称 leaf,写作 [[leaf]]——修改这一行,使其使用 "leaf",而不是留下 [[leaf|leaves]]。

如果改写这一行以使用笔记中的词会显得生硬,那么应优先创建或选择名称与原文中的成分相符的笔记,而不是退而使用别名。

备注

始终将库路径加上引号——路径中包含空格。

评论

支持 Markdown