cortico-world-feast 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # 更新日志
2
2
 
3
+ ## 0.2.0
4
+
5
+ 菜单从 80 道加到 200 道,多了 5 个菜系;面板也不再在两三百道时悄悄截掉一截。
6
+
7
+ **菜品库:80 道 → 200 道**
8
+
9
+ - 原来的 20 个菜系组各从 4 道加到 **8 道**——川菜多了回锅肉、担担面、口水鸡、酸菜鱼;粤菜多了烧鹅、虾饺、豉汁蒸凤爪、老火靓汤;江浙多了松鼠鳜鱼、蟹粉小笼、腌笃鲜、葱油拌面;北方多了北京烤鸭、葱烧海参、锅贴、涮羊肉……每组都是补该菜系真正常见的做法,不是凑数。
10
+ - 新增 **5 个菜系组,各 8 道**:
11
+ - **西北菜**(羊肉泡馍、手抓羊肉、岐山臊子面、新疆大盘鸡、烤馕、陕西凉皮、黄焖羊肉、青海酸奶)
12
+ - **清真菜**(手抓饭、爆炒羊羔肉、它似蜜、羊杂汤、爆肚、馕包肉、油香配粉汤、八宝茶)
13
+ - **家常菜**(番茄炒蛋、红烧排骨、清蒸鲈鱼、手撕包菜、鸡蛋羹、土豆丝、可乐鸡翅、紫菜蛋花汤)
14
+ - **印度菜**(黄油鸡、玛莎拉多萨、比尔亚尼饭、帕拉塔饼、鹰嘴豆咖喱、坦都里烤鸡、菠菜奶酪、芒果拉西)
15
+ - **墨西哥菜**(烤猪肉塔可、莫莱酱鸡肉、玉米粽、波索莱汤、奇拉基莱斯、鱼肉塞维切、鳄梨酱、烤玉米)
16
+ - 现在 200 道 / 25 个菜系组,中餐 13 组、外餐与饮品 12 组。每道仍是 15 个字段、九维口味 0-100 的整数、一段 100-160 字的实吃描写。
17
+
18
+ **面板**
19
+
20
+ - 菜单面板一次请求的上限原来是写死的 200 条,正好等于旧的库容量。现在跟着库里实际有多少走(硬顶 400),所以扩到 300 道也不会有一截被悄悄截掉。
21
+
22
+ **写菜的规矩落了地**
23
+
24
+ - 新增 `DISH-SPEC.md`:15 个字段怎么写、九维怎么给、套话黑名单、每栏的字数区间,还有"每道菜的 prose 开头不许用同一个句式"这条——否则 8 道摆在一起就是一个模子。
25
+ - 新增 `tools/check-file.mjs`:一次只校验一个菜品 json,写菜时自己就能查,不用等全库跑完。
26
+
3
27
  ## 0.1.1
4
28
 
5
29
  同一天连着吃同一道菜,不该听见同一句话;端来的菜也不该看不出还剩多久。
package/PUBLISHING.md CHANGED
@@ -112,7 +112,7 @@ npm publish --otp 123456
112
112
  npm pack --dry-run
113
113
  ```
114
114
 
115
- 应该看到 **35 个文件**,压缩后约 129KB、解包约 306KB(`npm notice` 报的是 `package size: 129.3 kB` / `unpacked size: 306.3 kB`):`package.json`、`src/`(含 20 个菜品 json)、`dist/webui.js`、`describe.json`、`assets/icon.png`、`README.md`、`CHANGELOG.md`、`PUBLISHING.md`。
115
+ 应该看到 **40 个文件**,压缩后约 190KB、解包约 537KB:`package.json`、`src/`(含 25 个菜品 json)、`dist/webui.js`、`describe.json`、`assets/icon.png`、`README.md`、`CHANGELOG.md`、`PUBLISHING.md`。
116
116
 
117
117
  `test/`、`tools/`、`install.ps1` 都在 `files` 之外,不会发出去——菜品校验脚本、装机脚本是我们的工具,不是用户要的东西。
118
118
 
package/README.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  给 Coo 一张会端菜的桌子。
4
4
 
5
- 80 道菜,每道都有九维口味分值、上桌的样子、香气、口感、余韵,和一段 40-400 字的实吃描写。她能自己按菜系挑着吃,主人也能从面板把一道菜端到她面前。**同一道菜每次吃到的都不一样**——温度、状态、配的那口都会变,所以连着吃三次不会说三遍同一句话。吃过什么、对什么反应、攒出来的口味画像跨天留着。饭点提醒默认开着,可以在配置里一键关掉。
5
+ 200 道菜(25 个菜系组 × 8 道),每道都有九维口味分值、上桌的样子、香气、口感、余韵,和一段 40-400 字的实吃描写。她能自己按菜系挑着吃,主人也能从面板把一道菜端到她面前。**同一道菜每次吃到的都不一样**——温度、状态、配的那口都会变,所以连着吃三次不会说三遍同一句话。吃过什么、对什么反应、攒出来的口味画像跨天留着。饭点提醒默认开着,可以在配置里一键关掉。
6
6
 
7
7
  ---
8
8
 
9
9
  ## 里面有什么
10
10
 
11
- **菜品库**:80 道,20 个菜系,中餐和外餐各一半。
11
+ **菜品库**:200 道,25 个菜系组,每组 8 道。中餐 13 组、外餐与饮品 12 组。
12
12
 
13
13
  | 中餐 | 外餐与饮品 |
14
14
  | --- | --- |
15
- | 川菜、粤菜、江浙菜、北方菜、湘菜、云贵菜、东北菜 | 日料·寿司、日料·热食、韩式与泰式、越南与东南亚 |
15
+ | 川菜、粤菜、江浙菜、北方菜、湘菜、云贵菜、东北菜、西北菜、清真菜、家常菜 | 日料·寿司、日料·热食、韩式与泰式、越南与东南亚、印度菜、墨西哥菜 |
16
16
  | 面点主食、汤羹、中式小吃 | 意菜、西餐、甜品、饮品、冰品与冷饮、烧烤与夜市 |
17
17
 
18
18
  每道菜 15 个字段:`id` / `name` / `alias` / `cuisine` / `category` / `region` / `ingredients` / `method` / `serving` / `taste`(九维)/ `texture` / `aroma` / `finish` / `prose` / `keywords`。
@@ -122,7 +122,8 @@ Remove-Item "$ext\vendor\cortico-world-feast" -Recurse -Force
122
122
  ## 开发
123
123
 
124
124
  ```powershell
125
- node tools/validate-dishes.mjs # 校验菜品库(字段、九维、类别、套话、菜系与文件名一致)
125
+ node tools/validate-dishes.mjs # 校验菜品库(字段、九维、类别、套话、菜系与文件名一致、全库 id 唯一)
126
+ node tools/check-file.mjs sichuan # 只校验一个文件(写菜时自己查,不用等全库跑完)
126
127
  node tools/repair-dishes.mjs # 修一批已知跑偏(可重复跑)
127
128
  node tools/selfcheck.mjs # 复刻 Coo 的干装载检查(装之前先过这一关)
128
129
  node tools/publish-check.mjs --online # 市场收录口径 + npm 包名占用
@@ -153,12 +154,14 @@ src/state.js 纯状态逻辑(不碰 fs / 定时器 / 宿主,可单测
153
154
  src/dishes.js 菜品库加载、查找、筛选、随机、口味画像
154
155
  src/eat.js 「这一口」的渲染(种子化,可复现)
155
156
  src/ENV_PROMPT.md 进提示词的说明
156
- src/data/*.json 20 组菜品数据
157
+ src/data/*.json 25 组菜品数据
157
158
  dist/webui.js 浏览器端面板(menu / history)
158
159
  ```
159
160
 
160
161
  状态落在 `<dataDir>/feast/state.json`。跨天只清饭点那一层(`fired` / `pending` / `skippedDay`),`eaten` / `reactions` / `counts` 留着——她不会因为过了零点就忘了自己爱吃麻婆豆腐。
161
162
 
163
+ 加菜之前先读 `DISH-SPEC.md`:15 个字段怎么写、九维怎么给(按真实口味,不凑数)、套话黑名单、每栏的字数区间。一条硬规矩是**同一组里 8 段实吃描写的开头不许用同一个句式**——单看一条都合格,8 条摆在一起就成了模子。
164
+
162
165
  ## 设计上刻意没做的
163
166
 
164
167
  - **`envPromptVars()` 返回 `{}`**。吃过什么不往提示词里塞,要用 `feast_history` 查。不然每吃一顿就把整个前缀缓存打穿一次。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cortico-world-feast",
3
- "version": "0.1.1",
4
- "description": "一桌菜 · 给 Coo 一张会端菜的桌子:80 道带九维口味、香气、口感与实吃描写的菜品,她能自己挑、主人能从面板端一道过去;同一道菜每次吃到的都不一样,吃过什么和口味画像跨天攒着;另有一套可开关的饭点提醒。",
3
+ "version": "0.2.0",
4
+ "description": "一桌菜 · 给 Coo 一张会端菜的桌子:200 道带九维口味、香气、口感与实吃描写的菜品(25 个菜系组),她能自己挑、主人能从面板端一道过去;同一道菜每次吃到的都不一样,吃过什么和口味画像跨天攒着;另有一套可开关的饭点提醒。",
5
5
  "license": "MIT",
6
6
  "author": "青",
7
7
  "repository": {
@@ -62,11 +62,11 @@
62
62
  "locales": {
63
63
  "zh": {
64
64
  "displayName": "一桌菜",
65
- "description": "给 Coo 一张会端菜的桌子:80 道菜,每道都有九维口味、香气、口感、余韵和一段实吃描写。她能自己按菜系挑,主人也能从面板把一道菜端到她面前;同一道菜每次吃到的都不一样(温度、状态、配的那口会变),吃过什么、对什么反应、口味画像跨天攒着。饭点提醒默认开着,可以在配置里一键关掉。"
65
+ "description": "给 Coo 一张会端菜的桌子:200 道菜(25 个菜系组),每道都有九维口味、香气、口感、余韵和一段实吃描写。她能自己按菜系挑,主人也能从面板把一道菜端到她面前;同一道菜每次吃到的都不一样(温度、状态、配的那口会变),吃过什么、对什么反应、口味画像跨天攒着。饭点提醒默认开着,可以在配置里一键关掉。"
66
66
  },
67
67
  "en": {
68
68
  "displayName": "Table",
69
- "description": "A table that serves food to your Coo: 80 dishes, each with a nine-axis flavour profile, aroma, texture, aftertaste and a full paragraph of how it actually eats. She can pick by cuisine, or you can put a dish down in front of her from the panel. The same dish never lands the same way twice, and what she ate, how it landed and her taste profile accumulate across days. Meal reminders are on by default and can be switched off in config."
69
+ "description": "A table that serves food to your Coo: 200 dishes across 25 cuisines, each with a nine-axis flavour profile, aroma, texture, aftertaste and a full paragraph of how it actually eats. She can pick by cuisine, or you can put a dish down in front of her from the panel. The same dish never lands the same way twice, and what she ate, how it landed and her taste profile accumulate across days. Meal reminders are on by default and can be switched off in config."
70
70
  }
71
71
  },
72
72
  "tags": [
package/src/data/bbq.json CHANGED
@@ -150,5 +150,154 @@
150
150
  "酸甜辣",
151
151
  "东北夜市"
152
152
  ]
153
+ },
154
+ {
155
+ "id": "grilled-sanma",
156
+ "name": "炭烤秋刀鱼",
157
+ "alias": "Grilled Sanma",
158
+ "cuisine": "烧烤与夜市",
159
+ "category": "烧烤",
160
+ "region": "北海道",
161
+ "ingredients": [
162
+ "秋刀鱼",
163
+ "粗海盐",
164
+ "柠檬",
165
+ "白萝卜泥",
166
+ "酱油"
167
+ ],
168
+ "method": "秋刀鱼不刮鳞不剖肚,只在鱼身两侧各划两刀,从鳃后把内脏连血线一起抠出来擦净。鱼身抹一层粗海盐,静置十分钟逼出水。炭火压到没有明火,鱼架在离炭十五公分的铁网上,先烤透一面再翻,看鱼皮上的盐壳结硬、鱼鳍焦卷就离火,配柠檬角和一坨白萝卜泥。",
169
+ "serving": "铁网直接端过来,鱼皮上的盐壳裂成细纹,油珠从裂口往外冒,柠檬角架在鱼背上,白萝卜泥还在淌水。",
170
+ "taste": {
171
+ "辣": 2,
172
+ "麻": 0,
173
+ "咸": 46,
174
+ "鲜": 68,
175
+ "甜": 4,
176
+ "酸": 18,
177
+ "苦": 14,
178
+ "油": 62,
179
+ "香": 78
180
+ },
181
+ "texture": "鱼皮烤得发脆,筷子戳下去有响声,鱼肉散成一瓣一瓣,靠脊骨那层发黏,尾巴最干。",
182
+ "aroma": "先闻到鱼皮被炭火燎出的焦油味,混着一点海水的腥,挤上柠檬后酸气冒上来,把腥味压到后面。",
183
+ "finish": "咽下去之后腮帮子里泛出内脏的那点苦,酸停在舌头两侧,喉咙口留着烤鱼皮的干香。",
184
+ "prose": "筷子顺着鱼背的刀口划进去,连皮挑起一块,皮先脆响一声,热气和海腥一起涌上来,粗盐粒还挂在肉面上。吃到中段,靠尾巴的肉烤得发干,得蘸一点萝卜泥兑的酱油才咽得顺;脊骨边上那层黏肉最鲜,用筷子刮下来是散的。最后挑到肚肠,苦味在舌根铺开,赶紧挤上柠檬,酸把油和腥一起收走,盘里剩一根干净的鱼骨。",
185
+ "keywords": [
186
+ "炭火",
187
+ "整条不剖",
188
+ "挤柠檬"
189
+ ]
190
+ },
191
+ {
192
+ "id": "pork-enoki-skewer",
193
+ "name": "烤五花肉卷金针菇",
194
+ "alias": "Pork Belly and Enoki Skewers",
195
+ "cuisine": "烧烤与夜市",
196
+ "category": "烧烤",
197
+ "region": "东北夜市",
198
+ "ingredients": [
199
+ "五花肉薄片",
200
+ "金针菇",
201
+ "烧烤酱",
202
+ "辣椒面",
203
+ "蒜末"
204
+ ],
205
+ "method": "五花肉冻到半硬再切,两毫米厚的薄片才卷得动。金针菇掐掉根部撕成小把,一小把横放在肉片一头卷两圈收紧,竹签从中间横穿过去把卷钉住。烤架离炭八公分,勤翻防焦,肉片出油变色后刷一层烧烤酱,再烤一分钟收汁,撒辣椒面和蒜末立刻下架。",
206
+ "serving": "一根竹签横穿两卷,肉片的外沿已经卷起、焦成深褐色,酱汁在菇上挂着亮,辣椒面还看得见颗粒,签子底下在滴油。",
207
+ "taste": {
208
+ "辣": 48,
209
+ "麻": 5,
210
+ "咸": 58,
211
+ "鲜": 60,
212
+ "甜": 22,
213
+ "酸": 5,
214
+ "苦": 3,
215
+ "油": 78,
216
+ "香": 82
217
+ },
218
+ "texture": "肉片外沿焦脆、咬开是软的,金针菇在齿间咯吱咯吱,一根根弹着断,酱汁糊在舌面上。",
219
+ "aroma": "先闻到肉油滴进炭里烧出的焦香,接着是烧烤酱的甜酱气,辣椒面最后才顶上来。",
220
+ "finish": "咽下去以后嘴里又甜又咸,辣从舌中部慢慢起来,最后剩一点蒜末的冲味。",
221
+ "prose": "横着咬才咬得断:两圈肉箍着中间一小把菇,进口先是焦了的肉边,咸的、油的,接着金针菇在牙缝里咯吱一响。吃到第二卷,刷过酱的那面开始发甜,辣椒面的辣从舌根往上爬,得就着一口冰啤酒压下去。最后签子上的碎菇和酱渣舍不得扔,用牙从签子上撸干净,嘴里剩下甜辣和一点焦糊。",
222
+ "keywords": [
223
+ "刷酱",
224
+ "卷串",
225
+ "下酒"
226
+ ]
227
+ },
228
+ {
229
+ "id": "grilled-brains",
230
+ "name": "重庆烤脑花",
231
+ "alias": "Chongqing Grilled Pig Brains",
232
+ "cuisine": "烧烤与夜市",
233
+ "category": "烧烤",
234
+ "region": "重庆",
235
+ "ingredients": [
236
+ "猪脑",
237
+ "红油",
238
+ "花椒粉",
239
+ "折耳根碎",
240
+ "蒜末"
241
+ ],
242
+ "method": "猪脑泡在清水里,用牙签挑掉表面那层血丝和筋膜,手要轻,挑破了就散。垫两片姜放进锡纸折成的小碗,浇红油、撒花椒粉和蒜末,封口上烤架中火烤十五分钟。撕开锡纸撒折耳根碎和一点小葱花,回炉再烤一分钟让香味出来。",
243
+ "serving": "锡纸包鼓着肚子端上桌,撕开一条缝就有白汽窜出来,红油在脑花上汪成一层,折耳根碎还是生的,锡纸边烫手。",
244
+ "taste": {
245
+ "辣": 68,
246
+ "麻": 55,
247
+ "咸": 55,
248
+ "鲜": 58,
249
+ "甜": 3,
250
+ "酸": 6,
251
+ "苦": 8,
252
+ "油": 76,
253
+ "香": 80
254
+ },
255
+ "texture": "勺子挖下去像嫩豆腐,但比豆腐更黏更绵,几乎不用嚼,只在舌面上压出一层滑。",
256
+ "aroma": "先闻到红油里辣椒和花椒被烤热的呛香,撕开锡纸才冒出折耳根的腥气,两种味道拧在一起。",
257
+ "finish": "咽下去之后喉咙里发热,舌头先麻后辣,麻退得比辣慢,最后留下折耳根那股草腥。",
258
+ "prose": "锡纸撕开一条缝,热气和花椒味先扑到脸上。舀一勺送进嘴,烫得不敢嚼,只能含在舌头上转,脑花自己就化开,红油跟着糊满上膛。吃到一半,麻才从嘴唇内侧起来,辣在喉咙里堆着,得停一停喝口凉水。最后拿勺子把锡纸角的红油和折耳根渣刮到一起,麻一直留在嘴唇上,走到街口还没散。",
259
+ "keywords": [
260
+ "锡纸包",
261
+ "红油",
262
+ "折耳根"
263
+ ]
264
+ },
265
+ {
266
+ "id": "taiwanese-popcorn-chicken",
267
+ "name": "台式盐酥鸡",
268
+ "alias": "Taiwanese Popcorn Chicken (Yansuji)",
269
+ "cuisine": "烧烤与夜市",
270
+ "category": "小吃",
271
+ "region": "台北",
272
+ "ingredients": [
273
+ "鸡腿肉",
274
+ "地瓜粉",
275
+ "九层塔",
276
+ "胡椒盐",
277
+ "蒜泥",
278
+ "生抽"
279
+ ],
280
+ "method": "鸡腿去骨切成两公分见方的块,用蒜泥、生抽、一点糖和五香粉腌半小时,捞出来沥到不滴水。滚一层粗粒地瓜粉,摊开放五分钟返潮。油温一百七十度下锅炸两分钟捞出,等油回到一百八十度复炸四十秒,起锅前丢一把九层塔进去炸香,一块捞起撒胡椒盐。",
281
+ "serving": "纸袋拎在手里烫手,袋口敞着散热,九层塔的叶子卷成深绿贴在鸡块上,胡椒盐撒得表面发白,袋底已经渗出油点。",
282
+ "taste": {
283
+ "辣": 8,
284
+ "麻": 3,
285
+ "咸": 54,
286
+ "鲜": 66,
287
+ "甜": 12,
288
+ "酸": 4,
289
+ "苦": 4,
290
+ "油": 80,
291
+ "香": 88
292
+ },
293
+ "texture": "外层地瓜粉炸成一层脆壳,咬下去整块掉渣,里面的肉还嫩得能挤出水,九层塔的叶子一碰就碎。",
294
+ "aroma": "先闻到地瓜粉炸过的油香混着九层塔,随后胡椒盐的辛味从纸袋缝里冒出来。",
295
+ "finish": "咽下去之后舌头外侧发麻,是胡椒的辛,油味在嘴里停得久,最后收在一点九层塔的青气。",
296
+ "prose": "纸袋拎在手里,油已经渗到指头上。捏一块出来先抖两下,脆壳掉了几粒粉渣,进嘴滚烫,胡椒盐先冲到鼻子。第二块开始停不住手,连九层塔的叶子一起咬,叶子炸得比肉还脆;吃到袋底壳有点软了,肉里的汁水反而更明显。最后把袋子倒过来磕,碎渣和胡椒盐一起倒进嘴里。",
297
+ "keywords": [
298
+ "九层塔",
299
+ "地瓜粉",
300
+ "复炸酥脆"
301
+ ]
153
302
  }
154
303
  ]
@@ -6,7 +6,13 @@
6
6
  "cuisine": "粤菜",
7
7
  "category": "热菜",
8
8
  "region": "广东珠江口",
9
- "ingredients": ["东星斑一条", "姜片与姜丝", "青葱", "蒸鱼豉油", "花生油"],
9
+ "ingredients": [
10
+ "东星斑一条",
11
+ "姜片与姜丝",
12
+ "青葱",
13
+ "蒸鱼豉油",
14
+ "花生油"
15
+ ],
10
16
  "method": "鱼收拾干净后在背脊划一刀,盘底垫两根筷子把鱼身架空,让蒸汽从底下穿过去。水大开后整条上笼,一斤出头只蒸八分钟,关火再焖一分钟才揭盖。倒掉盘里那层腥水,铺上姜丝葱丝,泼一勺烧到冒烟的花生油激香,最后沿盘边淋蒸鱼豉油,不直接浇在鱼肉上。",
11
17
  "serving": "白瓷盘端上桌还在冒白汽,鱼皮微微卷起裂开,热油在葱丝上滋滋作响。",
12
18
  "taste": {
@@ -24,7 +30,11 @@
24
30
  "aroma": "先闻到滚油泼葱的焦香,凑近了才显出鱼本身带水汽的清甜。",
25
31
  "finish": "咽下去舌根留一点豉油的咸,喉咙里是温热的鱼汤味。",
26
32
  "prose": "第一筷夹脊背最厚那片,烫得在唇边吹两下才敢送进去,鱼肉几乎是滑进嘴的,只有豉油的咸先到。第三口转到鱼腹,油多了,肉更软,姜丝的辛和葱的甜混在咸里,鲜味开始往舌根后面走。盘底积的汁舀一勺浇在饭上,米粒立刻被染成浅褐色。最后剩一副完整的鱼骨和半盘浑汤,筷子停下来时嘴里还是清的那种咸。",
27
- "keywords": ["清蒸", "海鲜", "原味"]
33
+ "keywords": [
34
+ "清蒸",
35
+ "海鲜",
36
+ "原味"
37
+ ]
28
38
  },
29
39
  {
30
40
  "id": "white-cut-chicken",
@@ -33,7 +43,13 @@
33
43
  "cuisine": "粤菜",
34
44
  "category": "凉菜",
35
45
  "region": "广东湛江",
36
- "ingredients": ["清远鸡一只", "姜蓉", "小葱", "花生油", "粗盐"],
46
+ "ingredients": [
47
+ "清远鸡一只",
48
+ "姜蓉",
49
+ "小葱",
50
+ "花生油",
51
+ "粗盐"
52
+ ],
37
53
  "method": "提着鸡颈把整只浸入将沸未沸的虾眼水里三提三放,让鸡腔内外温度拉平,再压进水中保持水面只冒小泡,浸十八分钟。捞出立刻过冰水收紧鸡皮,挂起晾到常温、皮面收干。姜蓉葱花加盐拌匀,泼滚花生油调成蘸碟。",
38
54
  "serving": "斩件码在白盘上,鸡皮泛浅黄的光,骨缝里还带一点红,旁边一小碟姜蓉油。",
39
55
  "taste": {
@@ -51,7 +67,11 @@
51
67
  "aroma": "先是姜蓉被热油烫过的辛香,嚼开之后才散出鸡本身那点腥甜。",
52
68
  "finish": "嘴里留下姜的辣尾和一层圆润的鸡油。",
53
69
  "prose": "鸡皮是凉的,牙齿先碰到那层滑,然后才是温吞的肉,第一口几乎全靠蘸碟的姜蓉油提味。第三块挑带骨的部分,贴着骨边那点肉最嫩,咬下去汁从纤维缝里挤出来,咸退到后面,鸡肉自己的甜慢慢浮上来。啃到翅尖,皮更脆,胶质黏在手指上。放下骨头时舌面留着姜的余辣和薄薄一层油。",
54
- "keywords": ["浸鸡", "姜蓉", "原味"]
70
+ "keywords": [
71
+ "浸鸡",
72
+ "姜蓉",
73
+ "原味"
74
+ ]
55
75
  },
56
76
  {
57
77
  "id": "beef-chow-fun",
@@ -60,7 +80,13 @@
60
80
  "cuisine": "粤菜",
61
81
  "category": "主食",
62
82
  "region": "广东广州",
63
- "ingredients": ["新鲜河粉", "腌过的牛肉片", "银芽", "韭黄", "头抽与老抽"],
83
+ "ingredients": [
84
+ "新鲜河粉",
85
+ "腌过的牛肉片",
86
+ "银芽",
87
+ "韭黄",
88
+ "头抽与老抽"
89
+ ],
64
90
  "method": "河粉先用手一根根抖散,热锅冷油滑一遍再倒出,重新下油把牛肉片快炒到七成熟盛起。锅烧到微微冒烟,河粉下锅后尽量少翻,靠晃锅让粉条贴着锅底煎出焦边,再兜两下。回牛肉,下银芽韭黄和调好的豉油,大火十秒出锅。",
65
91
  "serving": "铁锅直接端到桌上,粉条根根分明没断,几处煎出深褐焦斑,热气里裹着油烟。",
66
92
  "taste": {
@@ -78,7 +104,11 @@
78
104
  "aroma": "先是一股铁锅的焦气,接着是豉油和牛油的混味扑上来。",
79
105
  "finish": "咽下去后整个口腔被油裹住,喉咙口留一点锅气的苦香。",
80
106
  "prose": "第一筷挑边缘焦掉的那几根,烫,油还往下滴,咬开是脆的,里头却是软的,豉油的咸直接压上来。吃到中段,银芽和韭黄混进去,脆和韧在嘴里交替,锅气的焦苦把油顶住,才不至于腻。碗底积起一层亮油,剩下的粉条被油吸住,越吃越沉。最后几口专挑带牛肉的,肉片滑,嚼两下就没了,只剩满嘴的咸香和铁锅的味道。",
81
- "keywords": ["大排档", "锅气", "河粉"]
107
+ "keywords": [
108
+ "大排档",
109
+ "锅气",
110
+ "河粉"
111
+ ]
82
112
  },
83
113
  {
84
114
  "id": "chenpi-red-bean-soup",
@@ -87,7 +117,13 @@
87
117
  "cuisine": "粤菜",
88
118
  "category": "甜品",
89
119
  "region": "广东新会",
90
- "ingredients": ["红小豆", "十年新会陈皮", "冰糖", "莲子", "清水"],
120
+ "ingredients": [
121
+ "红小豆",
122
+ "十年新会陈皮",
123
+ "冰糖",
124
+ "莲子",
125
+ "清水"
126
+ ],
91
127
  "method": "红豆提前泡两小时,冷水下锅大火滚开,转小火加盖煲一个半小时,中途不搅,让豆子自己沉底。陈皮温水泡软刮掉白瓤,切细丝在最后四十分钟下锅。豆子开花起沙后用勺背沿锅壁压一圈,下冰糖再煮十分钟,糖一化就关火。",
92
128
  "serving": "小碗盛八分满,汤面浮一层暗红细沙,几丝陈皮沉在碗底,端上来还冒着甜雾。",
93
129
  "taste": {
@@ -105,6 +141,158 @@
105
141
  "aroma": "先闻到陈皮的旧木头和柑橘皮味,热气散开之后才是红豆的甜香。",
106
142
  "finish": "咽下去舌根返出一点柑皮的清苦,把甜压回喉咙。",
107
143
  "prose": "第一勺是烫的,得沿着碗边吹两口气,送进嘴里先撞上来的是甜,厚得糊住上颚。喝到第三口,陈皮的苦从甜底下渗出来,在那层黏住的甜上划开一道口子,舌头才重新尝出豆子的沙。碗底的豆沙最稠,勺子插进去立得住,刮干净时带一点焦糖味。放下碗,嘴里剩的是柑皮那种发凉的苦,甜反倒记不清了。",
108
- "keywords": ["糖水", "陈皮", "慢煲"]
144
+ "keywords": [
145
+ "糖水",
146
+ "陈皮",
147
+ "慢煲"
148
+ ]
149
+ },
150
+ {
151
+ "id": "roast-goose",
152
+ "name": "烧鹅",
153
+ "alias": "Roast Goose",
154
+ "cuisine": "粤菜",
155
+ "category": "热菜",
156
+ "region": "广东江门新会古井",
157
+ "ingredients": [
158
+ "黑鬃鹅光鹅一只",
159
+ "荔枝木",
160
+ "五香盐",
161
+ "麦芽糖皮水",
162
+ "酸梅酱"
163
+ ],
164
+ "method": "鹅腔里塞五香盐和几片姜,缝针封口,从颈部插管打气让皮和肉分开,滚水淋遍全身收紧表皮,再刷一层麦芽糖皮水,挂起风干四小时,摸皮面不粘手才能入炉。荔枝木烧到明火不见烟,鹅吊在炉中央转着烤四十分钟,见皮色从浅黄转枣红、腿根滴下的油变清就出炉。",
165
+ "serving": "斩成两指宽的件,皮朝上码在白盘里,皮下那层油正往外渗,骨头还是烫手的。",
166
+ "taste": {
167
+ "辣": 2,
168
+ "麻": 0,
169
+ "咸": 55,
170
+ "鲜": 72,
171
+ "甜": 18,
172
+ "酸": 12,
173
+ "苦": 3,
174
+ "油": 76,
175
+ "香": 88
176
+ },
177
+ "texture": "皮一咬就碎成小片,皮下油脂在齿间化开,腿肉纤维粗,越嚼越紧。",
178
+ "aroma": "先是荔枝木的烟火气,随后是皮上焦糖和鹅油混在一起的那股味。",
179
+ "finish": "咽下去舌面留一点糖皮的焦甜,喉咙里泛出酸梅酱的果酸。",
180
+ "prose": "斩件的声音比味道先到,刀背磕在砧板上咚一下,一块带皮的腿肉落进盘里。第一口只咬皮,脆得带响,油顺着嘴角往下淌,咸紧跟着上来。吃到中段肉才开始起作用,腿肉要嚼七八下,纤维里的汁和皮下那层油一起出来,酸梅酱蘸重了,酸就把油压住,还能再吃第二块。最后剩一截骨头和盘底那点红油,手指黏,得擦两遍。",
181
+ "keywords": [
182
+ "荔枝木",
183
+ "脆皮",
184
+ "烧味"
185
+ ]
186
+ },
187
+ {
188
+ "id": "har-gow",
189
+ "name": "虾饺",
190
+ "alias": "Shrimp Dumpling",
191
+ "cuisine": "粤菜",
192
+ "category": "面点",
193
+ "region": "广东广州",
194
+ "ingredients": [
195
+ "澄面与生粉",
196
+ "鲜虾仁",
197
+ "肥膘粒",
198
+ "笋丁",
199
+ "猪油"
200
+ ],
201
+ "method": "澄面用滚水烫成半透明,趁热加生粉和一小勺猪油揉到不粘手,盖湿布防干。虾仁一半剁成泥一半留整粒,加盐搅到起胶,拌进焯过水的笋丁和肥膘粒,冷藏半小时。皮擀成薄圆片,捏十三道褶收口,水滚上笼蒸五分钟,掀盖要快,蒸汽一散皮就不塌。",
202
+ "serving": "小竹笼端上桌还烫手,四只各占一角,皮薄得透光,里面虾仁的影子隐约可见。",
203
+ "taste": {
204
+ "辣": 0,
205
+ "麻": 0,
206
+ "咸": 40,
207
+ "鲜": 82,
208
+ "甜": 12,
209
+ "酸": 3,
210
+ "苦": 0,
211
+ "油": 20,
212
+ "香": 64
213
+ },
214
+ "texture": "皮放凉一点就发韧,咬开有轻微拉扯,虾仁弹牙,笋丁在齿间咔嚓一下。",
215
+ "aroma": "笼盖掀开先是滚水的白气,接着才散出虾晒过的那种淡淡甜腥。",
216
+ "finish": "咽下去嘴里留一点猪油的润,鲜退得慢,咸很早就没了。",
217
+ "prose": "筷子下去得轻,皮太薄,夹重了会破,得贴着笼边把它托进碟里。送进嘴先烫的是上唇,皮黏住牙齿,咬开才渗出汁,鲜先冒头,咸在后面垫着。吃到第二只蘸一点红醋,酸把猪油冲开,虾仁本身的甜反倒清楚了,笋丁这时才在齿间响一声。整只咽完,笼里剩一张湿纸和两滴汁,嘴里是那种淡下来、有点凉的鲜。",
218
+ "keywords": [
219
+ "早茶",
220
+ "澄面",
221
+ "弹牙"
222
+ ]
223
+ },
224
+ {
225
+ "id": "chicken-feet-black-bean",
226
+ "name": "豉汁蒸凤爪",
227
+ "alias": "Chicken Feet in Black Bean Sauce",
228
+ "cuisine": "粤菜",
229
+ "category": "小吃",
230
+ "region": "广东广州",
231
+ "ingredients": [
232
+ "凤爪",
233
+ "阳江豆豉",
234
+ "蒜蓉",
235
+ "蚝油与老抽",
236
+ "白糖"
237
+ ],
238
+ "method": "凤爪剪去趾甲,冷水下锅加姜片煮十分钟,捞出抹干晾到表面没水,不然下油锅要炸。油烧到七成热整批下去,盖着锅盖炸到皮起泡发白,立刻捞进冰水里泡两小时,皱成虎皮才算成。再换热水加姜葱煮二十分钟去油,拌豆豉蒜蓉蚝油老抽和一点糖,装碗上笼蒸四十分钟。",
239
+ "serving": "小碟里堆着五六只,皮皱成一团团,黑亮的豉汁挂在缝隙间,边缘还滚着小泡。",
240
+ "taste": {
241
+ "辣": 0,
242
+ "麻": 0,
243
+ "咸": 60,
244
+ "鲜": 66,
245
+ "甜": 14,
246
+ "酸": 2,
247
+ "苦": 5,
248
+ "油": 55,
249
+ "香": 74
250
+ },
251
+ "texture": "皮皱而厚,吸饱汁水,一嘬就脱骨,软骨咬着脆,蹄筋那一段最黏。",
252
+ "aroma": "豆豉发酵过的咸香先冲上来,底下压着蒜蓉蒸熟后的甜气。",
253
+ "finish": "咽下去舌面剩一层豉汁的咸,指头上还发黏,得嘬干净才罢。",
254
+ "prose": "两根手指捏住爪尖,先把掌心那块最厚的皮啃下来,嘴一嘬,皮和肉整片脱骨,咸味重,得配一口茶。啃到第二只,豆豉那点发酵的苦才从咸后面翻上来,蒜蓉的甜又把油压下去,皮里含的汁越嘬越多,就不急着咽了。趾骨一根根吐在小碟边上,剩下的豉汁拌进肠粉,油亮亮地挂住每条粉。擦手时嘴里还是咸的,喉咙发干,想再喝两口茶。",
255
+ "keywords": [
256
+ "早茶",
257
+ "虎皮",
258
+ "豆豉"
259
+ ]
260
+ },
261
+ {
262
+ "id": "cantonese-slow-soup",
263
+ "name": "老火靓汤",
264
+ "alias": "Cantonese Slow-Simmered Soup",
265
+ "cuisine": "粤菜",
266
+ "category": "汤羹",
267
+ "region": "广东广州",
268
+ "ingredients": [
269
+ "猪筒骨",
270
+ "霸王花干",
271
+ "蜜枣",
272
+ "南北杏",
273
+ "姜片"
274
+ ],
275
+ "method": "猪筒骨冷水下锅焯透,捞起用温水把浮沫冲净。霸王花干提前泡开撕成条,南北杏和蜜枣冲一冲。砂锅一次加足冷水,骨头和姜片大火滚二十分钟,撇净浮油,转最小火让汤面只翻小泡,煲足三小时,中途不加水不开盖。关火前十分钟才放盐。",
276
+ "serving": "砂锅盖一掀,白汽冲起一尺高,汤色是清的浅琥珀,筒骨还沉在锅底。",
277
+ "taste": {
278
+ "辣": 0,
279
+ "麻": 0,
280
+ "咸": 35,
281
+ "鲜": 72,
282
+ "甜": 16,
283
+ "酸": 2,
284
+ "苦": 8,
285
+ "油": 25,
286
+ "香": 62
287
+ },
288
+ "texture": "汤体滑而薄,一点都不稠,骨头边的肉一撕就离,筋那段要嚼几下。",
289
+ "aroma": "先闻到干花和蜜枣的甜气,热气散开才显出猪骨熬久了的荤味。",
290
+ "finish": "咽下去喉咙是温的,舌根返出一点杏的微苦,口干被压下去。",
291
+ "prose": "汤端上来不能马上喝,砂锅烫手,得先舀进小碗里晾着,看碗面那层薄油慢慢聚到中间。第一口是温的,几乎没有咸味,只有骨头汤那种淡甜,霸王花的干香贴在喉咙上。喝到半碗,杏的苦和蜜枣的甜开始交替,汤越喝越淡,却停不下来。最后把碗底的料捞出来吃,肉柴,筋是软的,吸饱了汤。放下碗时嘴里干干净净,只剩一点温热的苦尾。",
292
+ "keywords": [
293
+ "煲三小时",
294
+ "例汤",
295
+ "祛湿"
296
+ ]
109
297
  }
110
298
  ]
@@ -106,5 +106,113 @@
106
106
  "finish": "咽完嘴里是咸鲜和卤料的辛香,舌根有点黏,指头上留着油,想再咬一口的渴。",
107
107
  "prose": "馍刚从炉子上下来,捧在手里得换两次手。第一口咬下去是脆的,馍皮碎在唇边,接着牙齿陷进软面,肉汁一下涌出来,咸得舌头发紧。吃到一半,卤汁已经把下半截馍泡软,面香被肉味压住,肥肉的油在口腔里铺开,反而不觉得腻。第三口咬到青椒,脆和一点点生辣把油腻刮掉一层。最后一口最咸,卤汁都沉在底下,得配一口凉水,吃完手指上的油在纸巾上按出印子,兜里掉了一层馍渣。",
108
108
  "keywords": ["腊汁肉", "白吉馍", "西安", "烫手"]
109
+ },
110
+ {
111
+ "id": "jianbing-guozi",
112
+ "name": "煎饼果子",
113
+ "alias": "Jianbing Guozi",
114
+ "cuisine": "中式小吃",
115
+ "category": "小吃",
116
+ "region": "天津",
117
+ "ingredients": ["绿豆面", "鸡蛋", "薄脆", "甜面酱", "腐乳", "葱花"],
118
+ "method": "绿豆面掺一点小米面,加水调成能挂住勺背的稀糊,静置半小时。铁鏊子烧到两百度,一勺糊倒上去,用竹刮子从中间往外推成直径三十厘米的圆,趁面还湿磕两个鸡蛋摊开,撒葱花,翻面刷甜面酱和腐乳调的酱,放两片薄脆,铲起四边对折,中间一刀切开。",
119
+ "serving": "纸包着递过来,烫得只能捏住两头,面皮上还看得见刮子的螺旋纹,从切口里露出金黄的薄脆,酱色发亮。",
120
+ "taste": {
121
+ "辣": 8,
122
+ "麻": 2,
123
+ "咸": 56,
124
+ "鲜": 52,
125
+ "甜": 22,
126
+ "酸": 8,
127
+ "苦": 2,
128
+ "油": 58,
129
+ "香": 78
130
+ },
131
+ "texture": "外层饼皮软中带韧,牙齿咬到薄脆时一下脆断,脆片扎在上颚,蛋皮那层是绵的。",
132
+ "aroma": "先闻到的是绿豆面在热铁板上烙出的豆香,接着甜面酱的焦糖气和腐乳的咸鲜一起冒出来,葱花最后才露头。",
133
+ "finish": "咽下去嘴里剩酱的咸甜和薄脆的油,舌侧有一点腐乳的发酵味,手指上的油纸味比嘴里的更久。",
134
+ "prose": "耳边先是一声竹刮子刮过铁板的沙响。第一口咬在折叠的那一头,饼皮是软的,牙齿走到中间才碰到薄脆,咔嚓一下碎在门牙上,蛋香和豆面香同时在嘴里铺开。吃到一半,甜面酱开始往饼皮里渗,咸里带一点腐乳的腥鲜,葱花的生辣从缝里钻出来,把油的闷味压下去。剩最后两口时薄脆已被热气焐软,只剩中间一截还脆,饼边焦得发硬,得就着豆浆才咽得顺。",
135
+ "keywords": ["绿豆面", "薄脆", "现摊", "早点"]
136
+ },
137
+ {
138
+ "id": "shengjian-bao",
139
+ "name": "生煎包",
140
+ "alias": "Shengjian Bao",
141
+ "cuisine": "中式小吃",
142
+ "category": "面点",
143
+ "region": "上海黄浦区云南路",
144
+ "ingredients": ["半发面", "猪前腿肉", "肉皮冻", "白芝麻", "葱花"],
145
+ "method": "面团用半发面,揉好醒二十分钟就擀,皮子中间厚边缘薄。猪前腿肉绞成粗粒,掺肉皮冻丁,加葱姜水顺一个方向搅到上劲。包成十八个褶的小包,收口朝上排在抹了油的平底锅里,先中火煎到底部结壳,沿锅边淋半碗水盖上盖,转大火焖六分钟,水收干后揭盖撒芝麻葱花,再淋一勺油把底烘脆。",
146
+ "serving": "锅端上桌,油还在底上响,八个包子挤在一圈,顶上的褶子塌着,白芝麻和葱花被热气顶着,底部边缘透出一线焦黄。",
147
+ "taste": {
148
+ "辣": 0,
149
+ "麻": 0,
150
+ "咸": 52,
151
+ "鲜": 70,
152
+ "甜": 12,
153
+ "酸": 4,
154
+ "苦": 2,
155
+ "油": 60,
156
+ "香": 76
157
+ },
158
+ "texture": "底部一层壳硬脆,咬开要用力;上面那半是发面的松软,肉馅里裹着汤,一压就往外冒。",
159
+ "aroma": "先闻到的是铁锅烘出来的面焦香和芝麻被烫过的坚果气,然后才是猪肉和皮冻化成汤的那股鲜。",
160
+ "finish": "咽下去嘴里是肉汤的鲜和一点姜的暖,壳的油留在上颚,甜味收得很干净。",
161
+ "prose": "这东西急不得,夹起来先在皮上咬一个小口,把里头的汤吸掉,不然一口下去要烫到上颚。吸完汤再整个咬,底下的壳咔嚓断开,脆的那一层薄得能听见响,上面半截却是松的发面。吃到第二个,汤比第一个多,肉馅里混着皮冻化开的胶质,鲜味是从舌根往两边散的。到最后两个,锅底那点油都渗进去了,壳更硬,也更香,配一碗蛋皮汤,把嘴里的油冲下去。",
162
+ "keywords": ["半发面", "爆汤", "底脆"]
163
+ },
164
+ {
165
+ "id": "oyster-omelette",
166
+ "name": "蚵仔煎",
167
+ "alias": "Oyster Omelette",
168
+ "cuisine": "中式小吃",
169
+ "category": "小吃",
170
+ "region": "福建泉州与台湾台南",
171
+ "ingredients": ["鲜蚵", "地瓜粉浆", "鸡蛋", "小白菜", "猪油", "甜辣酱"],
172
+ "method": "地瓜粉加水和一点盐调成稀浆,静置半小时让粉粒化开。平底锅下猪油烧到冒烟,鲜蚵先下去煎十来秒,倒粉浆摊满锅底,打一个鸡蛋划散铺在上面,撒一把切段的小白菜。等粉浆边缘透明起泡,翻面再煎,两面都要带一点焦。起锅淋甜辣酱。",
173
+ "serving": "整张圆饼摊在浅口盘里,边缘焦褐、中间半透明,蚵仔鼓在浆里一颗颗看得见,酱是粉红色的,淋成一圈绕在边上。",
174
+ "taste": {
175
+ "辣": 18,
176
+ "麻": 2,
177
+ "咸": 48,
178
+ "鲜": 62,
179
+ "甜": 38,
180
+ "酸": 14,
181
+ "苦": 2,
182
+ "油": 58,
183
+ "香": 64
184
+ },
185
+ "texture": "边上是脆的,靠里是软糯的胶质,一压就变形;咬到蚵仔是爆开的软,小白菜还留着一点梗的筋。",
186
+ "aroma": "猪油煎蛋的焦香先冲上来,接着是蚵仔那股海腥的鲜,甜辣酱的酸甜气浮在最上面。",
187
+ "finish": "咽下去嘴里是甜辣酱的黏甜和海味的咸鲜,油留在舌面上,凉下来之后有点腻。",
188
+ "prose": "盘子烫手,得先挑边上那圈焦的吃,脆得像薄饼干。往里走就变了——粉浆是软糯的,黏在牙上不肯走,蚵仔在嘴里一咬破,汁是咸的海水味,把糯糊的黏一下子冲开。吃到中间,鸡蛋和小白菜混进来,多了点清甜和叶子的涩。最后剩的那块酱最多,甜辣酱裹着油,吃两口就顶住了,用筷子把蚵仔挑出来先吃,剩下的饼皮留在盘里慢慢渗油。",
189
+ "keywords": ["地瓜粉", "甜辣酱", "夜市"]
190
+ },
191
+ {
192
+ "id": "tang-you-ba-ba",
193
+ "name": "糖油粑粑",
194
+ "alias": "Tangyou Baba",
195
+ "cuisine": "中式小吃",
196
+ "category": "小吃",
197
+ "region": "湖南长沙南门口",
198
+ "ingredients": ["糯米粉", "红糖", "菜籽油", "白芝麻"],
199
+ "method": "糯米粉用温水揉成团,不发酵,揪成乒乓球大的剂子,手掌压成两厘米厚的扁圆,中间按一个小坑。菜籽油和红糖一起下锅,小火熬到糖化开、油面起细泡,粑粑一个个贴着锅底摆进去,中火煎到一面起壳发黄再翻,两面都挂上糖色,出锅前撒芝麻,趁热用竹签串两个。",
200
+ "serving": "油纸托着递到手里,粑粑表面裹着一层琥珀色的糖壳,还在一颗一颗冒泡,签子插进去的地方糖丝拉起来又断。",
201
+ "taste": {
202
+ "辣": 0,
203
+ "麻": 0,
204
+ "咸": 6,
205
+ "鲜": 8,
206
+ "甜": 68,
207
+ "酸": 2,
208
+ "苦": 3,
209
+ "油": 52,
210
+ "香": 62
211
+ },
212
+ "texture": "外层糖壳薄脆,一咬就裂,里面是烫的糯米,软得粘牙,拉扯的时候能拽出丝。",
213
+ "aroma": "先闻到红糖在油里熬化的那股焦甜,甜里带一点锅气,然后才是糯米被煎过的米香。",
214
+ "finish": "咽下去嘴里黏着一层糖,甜从舌面慢慢往喉咙走,油味留在上颚,喝口茶才化得开。",
215
+ "prose": "长沙早上七点,油锅边已经围了一圈人,等这一锅刚翻面的。第一口不能急,糖壳底下全是滚烫的糯米,得先吹两下,咬开时壳裂成小片,糖黏在门牙上。吃到第二个,糖色更厚,甜压过了米香,油也从壳的缝里渗出来,手指上全是黏的。最后剩下签子上那半个,凉了一点,糯米变得有嚼劲,糖壳反倒脆得更清楚。吃完舔一下嘴角的糖,嘴里留着那点焦甜。",
216
+ "keywords": ["糯米", "糖油", "长沙早点"]
109
217
  }
110
- ]
218
+ ]