skill-chef 0.3.2 → 0.3.13

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.
Files changed (244) hide show
  1. package/SKILL.md +42 -29
  2. package/dist/add/commands.js +1 -1
  3. package/dist/add/index.d.ts +1 -0
  4. package/dist/add/index.d.ts.map +1 -1
  5. package/dist/add/index.js +1 -0
  6. package/dist/add/index.js.map +1 -1
  7. package/dist/add/pages.d.ts +62 -0
  8. package/dist/add/pages.d.ts.map +1 -0
  9. package/dist/add/pages.js +362 -0
  10. package/dist/add/pages.js.map +1 -0
  11. package/dist/add/routes.d.ts +4 -4
  12. package/dist/add/routes.d.ts.map +1 -1
  13. package/dist/add/routes.js +12 -6
  14. package/dist/add/routes.js.map +1 -1
  15. package/dist/add/run-write.d.ts.map +1 -1
  16. package/dist/add/run-write.js +39 -0
  17. package/dist/add/run-write.js.map +1 -1
  18. package/dist/cli/cmd_read.js +17 -1
  19. package/dist/cli/cmd_read.js.map +1 -1
  20. package/dist/cli/config.d.ts +0 -10
  21. package/dist/cli/config.d.ts.map +1 -1
  22. package/dist/cli/config.js +22 -1
  23. package/dist/cli/config.js.map +1 -1
  24. package/dist/cli/keys.d.ts +1 -1
  25. package/dist/cli/keys.d.ts.map +1 -1
  26. package/dist/cli/keys.js +16 -4
  27. package/dist/cli/keys.js.map +1 -1
  28. package/dist/cook/commands.js +1 -1
  29. package/dist/cook/index.d.ts +2 -1
  30. package/dist/cook/index.d.ts.map +1 -1
  31. package/dist/cook/index.js +1 -1
  32. package/dist/cook/index.js.map +1 -1
  33. package/dist/cook/page-art.d.ts +18 -0
  34. package/dist/cook/page-art.d.ts.map +1 -0
  35. package/dist/cook/page-art.js +30 -0
  36. package/dist/cook/page-art.js.map +1 -0
  37. package/dist/cook/page-css.d.ts +9 -0
  38. package/dist/cook/page-css.d.ts.map +1 -0
  39. package/dist/cook/page-css.js +206 -0
  40. package/dist/cook/page-css.js.map +1 -0
  41. package/dist/cook/page-text.d.ts +28 -0
  42. package/dist/cook/page-text.d.ts.map +1 -0
  43. package/dist/cook/page-text.js +65 -0
  44. package/dist/cook/page-text.js.map +1 -0
  45. package/dist/cook/routes.js +4 -4
  46. package/dist/cook/run.d.ts +56 -1
  47. package/dist/cook/run.d.ts.map +1 -1
  48. package/dist/cook/run.js +252 -22
  49. package/dist/cook/run.js.map +1 -1
  50. package/dist/data/commands.d.ts +6 -7
  51. package/dist/data/commands.d.ts.map +1 -1
  52. package/dist/data/commands.js +15 -8
  53. package/dist/data/commands.js.map +1 -1
  54. package/dist/data/index.d.ts +2 -0
  55. package/dist/data/index.d.ts.map +1 -1
  56. package/dist/data/index.js +2 -0
  57. package/dist/data/index.js.map +1 -1
  58. package/dist/data/pages.d.ts +50 -0
  59. package/dist/data/pages.d.ts.map +1 -0
  60. package/dist/data/pages.js +226 -0
  61. package/dist/data/pages.js.map +1 -0
  62. package/dist/data/routes.d.ts +4 -5
  63. package/dist/data/routes.d.ts.map +1 -1
  64. package/dist/data/routes.js +8 -10
  65. package/dist/data/routes.js.map +1 -1
  66. package/dist/data/run-batch.d.ts +21 -0
  67. package/dist/data/run-batch.d.ts.map +1 -0
  68. package/dist/data/run-batch.js +123 -0
  69. package/dist/data/run-batch.js.map +1 -0
  70. package/dist/data/run-query.d.ts +5 -6
  71. package/dist/data/run-query.d.ts.map +1 -1
  72. package/dist/data/run-query.js +113 -28
  73. package/dist/data/run-query.js.map +1 -1
  74. package/dist/help/lookup.d.ts.map +1 -1
  75. package/dist/help/lookup.js +20 -4
  76. package/dist/help/lookup.js.map +1 -1
  77. package/dist/help/sceneData.d.ts +8 -7
  78. package/dist/help/sceneData.d.ts.map +1 -1
  79. package/dist/help/sceneData.js +22 -21
  80. package/dist/help/sceneData.js.map +1 -1
  81. package/dist/history/commands.js +1 -1
  82. package/dist/history/page-css.d.ts +12 -0
  83. package/dist/history/page-css.d.ts.map +1 -0
  84. package/dist/history/page-css.js +208 -0
  85. package/dist/history/page-css.js.map +1 -0
  86. package/dist/history/pages.d.ts +77 -0
  87. package/dist/history/pages.d.ts.map +1 -0
  88. package/dist/history/pages.js +282 -0
  89. package/dist/history/pages.js.map +1 -0
  90. package/dist/history/routes.d.ts +4 -6
  91. package/dist/history/routes.d.ts.map +1 -1
  92. package/dist/history/routes.js +22 -16
  93. package/dist/history/routes.js.map +1 -1
  94. package/dist/history/run-query.d.ts +48 -0
  95. package/dist/history/run-query.d.ts.map +1 -1
  96. package/dist/history/run-query.js +96 -10
  97. package/dist/history/run-query.js.map +1 -1
  98. package/dist/history/run-record.d.ts +12 -2
  99. package/dist/history/run-record.d.ts.map +1 -1
  100. package/dist/history/run-record.js +28 -14
  101. package/dist/history/run-record.js.map +1 -1
  102. package/dist/history/validate.d.ts +22 -0
  103. package/dist/history/validate.d.ts.map +1 -0
  104. package/dist/history/validate.js +69 -0
  105. package/dist/history/validate.js.map +1 -0
  106. package/dist/policy/wakewords.d.ts +1 -1
  107. package/dist/policy/wakewords.d.ts.map +1 -1
  108. package/dist/policy/wakewords.js +23 -2
  109. package/dist/policy/wakewords.js.map +1 -1
  110. package/dist/relation/commands.d.ts +6 -5
  111. package/dist/relation/commands.d.ts.map +1 -1
  112. package/dist/relation/commands.js +23 -6
  113. package/dist/relation/commands.js.map +1 -1
  114. package/dist/relation/index.d.ts +3 -0
  115. package/dist/relation/index.d.ts.map +1 -1
  116. package/dist/relation/index.js +3 -0
  117. package/dist/relation/index.js.map +1 -1
  118. package/dist/relation/pages.d.ts +37 -0
  119. package/dist/relation/pages.d.ts.map +1 -0
  120. package/dist/relation/pages.js +224 -0
  121. package/dist/relation/pages.js.map +1 -0
  122. package/dist/relation/routes.d.ts +6 -5
  123. package/dist/relation/routes.d.ts.map +1 -1
  124. package/dist/relation/routes.js +17 -16
  125. package/dist/relation/routes.js.map +1 -1
  126. package/dist/relation/run-query.d.ts +10 -0
  127. package/dist/relation/run-query.d.ts.map +1 -0
  128. package/dist/relation/run-query.js +104 -0
  129. package/dist/relation/run-query.js.map +1 -0
  130. package/dist/relation/run-write.d.ts +13 -0
  131. package/dist/relation/run-write.d.ts.map +1 -0
  132. package/dist/relation/run-write.js +114 -0
  133. package/dist/relation/run-write.js.map +1 -0
  134. package/dist/relation/shapes.d.ts +8 -0
  135. package/dist/relation/shapes.d.ts.map +1 -0
  136. package/dist/relation/shapes.js +153 -0
  137. package/dist/relation/shapes.js.map +1 -0
  138. package/dist/relation/treeShapes.d.ts +23 -0
  139. package/dist/relation/treeShapes.d.ts.map +1 -0
  140. package/dist/relation/treeShapes.js +289 -0
  141. package/dist/relation/treeShapes.js.map +1 -0
  142. package/dist/render/copyArea.d.ts +67 -0
  143. package/dist/render/copyArea.d.ts.map +1 -0
  144. package/dist/render/copyArea.js +146 -0
  145. package/dist/render/copyArea.js.map +1 -0
  146. package/dist/render/envelope.d.ts.map +1 -1
  147. package/dist/render/envelope.js +4 -0
  148. package/dist/render/envelope.js.map +1 -1
  149. package/dist/render/index.d.ts +7 -0
  150. package/dist/render/index.d.ts.map +1 -1
  151. package/dist/render/index.js +7 -0
  152. package/dist/render/index.js.map +1 -1
  153. package/dist/render/sceneBand.d.ts +36 -0
  154. package/dist/render/sceneBand.d.ts.map +1 -0
  155. package/dist/render/sceneBand.js +166 -0
  156. package/dist/render/sceneBand.js.map +1 -0
  157. package/dist/render/sceneRhythm.d.ts +6 -0
  158. package/dist/render/sceneRhythm.d.ts.map +1 -0
  159. package/dist/render/sceneRhythm.js +149 -0
  160. package/dist/render/sceneRhythm.js.map +1 -0
  161. package/dist/render/sceneShell.d.ts +17 -0
  162. package/dist/render/sceneShell.d.ts.map +1 -0
  163. package/dist/render/sceneShell.js +46 -0
  164. package/dist/render/sceneShell.js.map +1 -0
  165. package/dist/render/skin.d.ts +13 -0
  166. package/dist/render/skin.d.ts.map +1 -0
  167. package/dist/render/skin.js +282 -0
  168. package/dist/render/skin.js.map +1 -0
  169. package/dist/search/routes.d.ts +12 -4
  170. package/dist/search/routes.d.ts.map +1 -1
  171. package/dist/search/routes.js +39 -7
  172. package/dist/search/routes.js.map +1 -1
  173. package/dist/search/run.d.ts +10 -2
  174. package/dist/search/run.d.ts.map +1 -1
  175. package/dist/search/run.js +61 -9
  176. package/dist/search/run.js.map +1 -1
  177. package/dist/setup/commands.d.ts +5 -5
  178. package/dist/setup/commands.d.ts.map +1 -1
  179. package/dist/setup/commands.js +14 -6
  180. package/dist/setup/commands.js.map +1 -1
  181. package/dist/setup/index.d.ts +3 -5
  182. package/dist/setup/index.d.ts.map +1 -1
  183. package/dist/setup/index.js +3 -5
  184. package/dist/setup/index.js.map +1 -1
  185. package/dist/setup/pages.d.ts +19 -0
  186. package/dist/setup/pages.d.ts.map +1 -0
  187. package/dist/setup/pages.js +163 -0
  188. package/dist/setup/pages.js.map +1 -0
  189. package/dist/setup/routes.d.ts +4 -5
  190. package/dist/setup/routes.d.ts.map +1 -1
  191. package/dist/setup/routes.js +7 -8
  192. package/dist/setup/routes.js.map +1 -1
  193. package/dist/setup/run-init.d.ts +11 -0
  194. package/dist/setup/run-init.d.ts.map +1 -0
  195. package/dist/setup/run-init.js +19 -0
  196. package/dist/setup/run-init.js.map +1 -0
  197. package/dist/shared/command-spec.d.ts +5 -3
  198. package/dist/shared/command-spec.d.ts.map +1 -1
  199. package/dist/shopping/commands.js +1 -1
  200. package/dist/shopping/commands.js.map +1 -1
  201. package/dist/shopping/index.d.ts +1 -0
  202. package/dist/shopping/index.d.ts.map +1 -1
  203. package/dist/shopping/index.js +1 -0
  204. package/dist/shopping/index.js.map +1 -1
  205. package/dist/shopping/pages.d.ts +22 -0
  206. package/dist/shopping/pages.d.ts.map +1 -0
  207. package/dist/shopping/pages.js +170 -0
  208. package/dist/shopping/pages.js.map +1 -0
  209. package/dist/shopping/routes.js +4 -4
  210. package/dist/shopping/routes.js.map +1 -1
  211. package/dist/shopping/run.d.ts +9 -5
  212. package/dist/shopping/run.d.ts.map +1 -1
  213. package/dist/shopping/run.js +58 -10
  214. package/dist/shopping/run.js.map +1 -1
  215. package/dist/triggers/chef-scenes.d.ts +3 -2
  216. package/dist/triggers/chef-scenes.d.ts.map +1 -1
  217. package/dist/triggers/chef-scenes.js +16 -15
  218. package/dist/triggers/chef-scenes.js.map +1 -1
  219. package/dist/update/routes.d.ts +6 -4
  220. package/dist/update/routes.d.ts.map +1 -1
  221. package/dist/update/routes.js +20 -6
  222. package/dist/update/routes.js.map +1 -1
  223. package/dist/update/run-write.d.ts.map +1 -1
  224. package/dist/update/run-write.js +211 -1
  225. package/dist/update/run-write.js.map +1 -1
  226. package/dist/view/commands.js +1 -1
  227. package/dist/view/page.d.ts +25 -0
  228. package/dist/view/page.d.ts.map +1 -0
  229. package/dist/view/page.js +306 -0
  230. package/dist/view/page.js.map +1 -0
  231. package/dist/view/pageCss.d.ts +8 -0
  232. package/dist/view/pageCss.d.ts.map +1 -0
  233. package/dist/view/pageCss.js +327 -0
  234. package/dist/view/pageCss.js.map +1 -0
  235. package/dist/view/pageSection.d.ts +21 -0
  236. package/dist/view/pageSection.d.ts.map +1 -0
  237. package/dist/view/pageSection.js +59 -0
  238. package/dist/view/pageSection.js.map +1 -0
  239. package/dist/view/routes.js +7 -7
  240. package/dist/view/run.d.ts +5 -1
  241. package/dist/view/run.d.ts.map +1 -1
  242. package/dist/view/run.js +66 -7
  243. package/dist/view/run.js.map +1 -1
  244. package/package.json +3 -3
package/dist/cook/run.js CHANGED
@@ -1,46 +1,276 @@
1
- /** 做菜能力的命令处理(`chef.cooking.run`)+ 本域独占的视图装配。
1
+ /** 做菜能力的命令处理(`chef.cooking.run`)+ 本域独占的视图与页面装配。
2
2
  *
3
3
  * 老分派层(`src/cli/cmd_read.ts`)分支逐字节下沉:只改 import 出处,判定与装配一字不动。
4
4
  * `buildCookingRun`(原 `src/render/views.ts`)只被本域调用,按“写不出的留回域目录”搬入本文件;
5
5
  * 旧址改转出(搬迁债务,见 `src/render/index.ts`)。
6
+ *
7
+ * #772:取数缺口两条收在本域——`step_ingredients` 按步切分(每步只出本步用料,不再把全量
8
+ * 11 味挂在每一步上)与 `cookware` 炊具行;查法直连 `fetch/db` 既有原语(只读不写共用位,
9
+ * 共用位一行不动)。页面装配 `renderCookingPage` 照 `t768-页面族配方.md` §1 过程型十二格逐格调
10
+ * 公共层区块(含 #860 正文段落件),零自写样式;暂停/声音/重做/计时器/份量步进器归宿主,
11
+ * 页面只摆形状与 `data-action-id`。
6
12
  */
7
- import { getRecipeDetail, historyStats } from '../fetch/db.js';
13
+ import { getRecipeDetail, historyStats, qAll, queryHistory } from '../fetch/db.js';
14
+ import { ChefFetchError } from '../fetch/errors.js';
8
15
  import { toRecipeItem } from '../render/views.js';
9
16
  import { needServings, resolveNameOrId } from '../shared/slots.js';
10
- // 开做 list:items 为步骤(内联食材)+ total;recipe/份数放大说明/历史提示作扩展字段(list 形只校验 items/total)。
17
+ import { renderCaliberLine, renderChipRow, renderConclusionBar, renderDataTable, renderDisclosure, renderKpiCard, renderPageShell, renderProseBlock, } from 'base-paint/blocks';
18
+ import { chefCopyArea } from '../render/copyArea.js';
19
+ import { renderSceneShell } from '../render/sceneShell.js';
20
+ import { renderActionBar, renderFactStrip, renderTimelineRows } from 'base-paint';
21
+ import { COOK_STEP_CLASS, COOK_STEPS_CLASS, COOK_STEP_SIDE_CLASS, cookPageCss } from './page-css.js';
22
+ import { cookCountNote, qtyText, servingsNoteReceipt, stepProseHtml, stepTitle, usageChip } from './page-text.js';
23
+ /** 换行(仓库口径:`String.fromCharCode(10)`,不写字面换行转义)。 */
24
+ const LF = String.fromCharCode(10);
25
+ // 开做 list:items 为步骤(内联本步用料)+ total;recipe/份数放大说明/历史提示作扩展字段(list 形只校验 items/total)。
11
26
  // 原 `src/render/views.ts`,本域独占。
12
27
  export function buildCookingRun(args) {
13
28
  const base = args.recipe.servings > 0 ? args.recipe.servings : 2;
14
29
  const servings = args.servings ?? base;
15
30
  const factor = Math.round((servings / base) * 100) / 100;
16
- const servingsNote = servings === base
17
- ? '按原份量 ' + base + ' 人份备料'
18
- : '已按 ' + servings + ' 人份放大(原 ' + base + ' 人份,倍率 ' + factor + ',食材用量同倍)';
31
+ // 回执那一面的份量说明(`page-text.ts` 是它的唯一定义地);页面结论条走另一句,见那里的注。
32
+ const note = servingsNoteReceipt(servings, base, factor);
19
33
  const h = args.history;
34
+ // 人话收尾:命令键不上屏(#768 设计 §10),做完即记的衔接只说动作。
20
35
  const historyHint = h && h.count > 0
21
- ? '做过 ' + h.count + ' 次' + (h.avgRating !== null && h.avgRating !== undefined ? ',平均评分 ' + h.avgRating : '') + ';本次做完请走 chef.history.record 记录'
22
- : '还没做过;本次做完请走 chef.history.record 记录';
23
- return { items: args.steps, total: args.steps.length, recipe: args.recipe, servingsNote, historyHint, steps: args.steps };
36
+ ? '做过 ' + h.count + ' 次' + (h.avgRating !== null && h.avgRating !== undefined ? ',平均评分 ' + h.avgRating : '') + ',做完后记一次'
37
+ : '还没做过,做完后记一次';
38
+ return { items: args.steps, total: args.steps.length, recipe: args.recipe, servingsNote: note, historyHint, steps: args.steps };
24
39
  }
25
- /** 跑 `chef.cooking.run`:取单菜全貌+份数放大+历史提示(list 形)。 */
26
- export function runCookingRun(handle, params) {
40
+ function scaleQty(q, factor) {
41
+ return q === null ? null : Math.round(q * factor * 100) / 100;
42
+ }
43
+ /** 按步切分用料:悬空关联(指到不存在的步骤或食材)即抛错点名,不静默吞行。 */
44
+ function stepUsages(handle, recipeId, seqs, factor) {
45
+ const orphans = qAll(handle, 'SELECT si.id AS id, si.step_id AS stepId, si.ingredient_id AS ingId FROM step_ingredients si'
46
+ + ' LEFT JOIN cooking_steps s ON s.id = si.step_id LEFT JOIN ingredients i ON i.id = si.ingredient_id'
47
+ + ' WHERE (s.id IS NULL OR i.id IS NULL) AND si.step_id IN (SELECT id FROM cooking_steps WHERE recipe_id = ?)', [recipeId]);
48
+ if (orphans.length > 0) {
49
+ const o = orphans[0];
50
+ throw new ChefFetchError('CHEF_RECIPE_CORRUPT', '某步的食材关联已坏(关联行 ' + String(o.id) + ' 指到不存在的步骤或食材:step_id=' + String(o.stepId) + ' ingredient_id=' + String(o.ingId) + '),须先清关联再出页');
51
+ }
52
+ const rows = qAll(handle, 'SELECT s.sequence AS seq, s.id AS stepId, i.name AS name, i.quantity_text AS quantityText,'
53
+ + ' i.is_optional AS isOptional, si.quantity_used AS quantityUsed, si.unit AS stepUnit, i.unit AS ingUnit'
54
+ + ' FROM step_ingredients si JOIN cooking_steps s ON s.id = si.step_id'
55
+ + ' JOIN ingredients i ON i.id = si.ingredient_id WHERE s.recipe_id = ? ORDER BY s.sequence ASC, i.sequence ASC', [recipeId]);
56
+ const out = new Map();
57
+ // 零关联菜谱(录入流未写过一行 step_ingredients)=数据本就没有:逐歩显式缺,不抛;
58
+ // 有关联但某步缺行=数据断了:抛错点名到步,不许静默少显示一步。
59
+ if (rows.length === 0)
60
+ return out;
61
+ for (const r of rows) {
62
+ const row = r;
63
+ const list = out.get(row.seq) ?? [];
64
+ list.push({
65
+ name: String(row.name ?? ''), quantity: scaleQty(row.quantityUsed ?? null, factor),
66
+ unit: String(row.stepUnit || row.ingUnit || ''), quantity_text: String(row.quantityText ?? ''),
67
+ optional: Number(row.isOptional ?? 0) === 1,
68
+ });
69
+ out.set(row.seq, list);
70
+ }
71
+ // 有步骤无关联=取数断了:抛错点名到步,不许静默少显示一步。
72
+ for (const seq of seqs) {
73
+ if (!out.has(seq)) {
74
+ throw new ChefFetchError('CHEF_RECIPE_CORRUPT', '第 ' + seq + ' 步没有关联食材(step_ingredients 缺行),须先补关联再出页');
75
+ }
76
+ }
77
+ return out;
78
+ }
79
+ /** 炊具行(`cookware` 2 行,见配方 §4)。 */
80
+ function recipeCookware(handle, recipeId) {
81
+ const rows = qAll(handle, 'SELECT name, category FROM cookware WHERE recipe_id = ? ORDER BY name ASC', [recipeId]);
82
+ return rows.map((r) => ({ name: String(r.name ?? ''), category: String(r.category ?? '') }));
83
+ }
84
+ /** 取 `renderCookingPage` 要的整份数据(含校验:关联坏即抛错点名)。 */
85
+ export function getCookingPageData(handle, params) {
27
86
  const servings = needServings(params);
28
87
  const detail = getRecipeDetail(handle, resolveNameOrId(params));
29
88
  const base = detail.recipe.servings > 0 ? detail.recipe.servings : 2;
30
- const factor = servings === undefined ? 1 : servings / base;
31
- const scaled = detail.ingredients.map((g) => ({
32
- name: g.name,
33
- quantity: g.quantity === null ? null : Math.round(g.quantity * factor * 100) / 100,
34
- unit: g.unit, quantity_text: g.quantity_text, optional: g.is_optional === 1,
35
- }));
36
- const steps = [...detail.steps]
89
+ const actual = servings ?? base;
90
+ const factor = Math.round((actual / base) * 100) / 100;
91
+ const ingredients = [...detail.ingredients]
37
92
  .sort((a, b) => a.sequence - b.sequence)
38
- .map((s) => ({
93
+ .map((g) => ({
94
+ name: g.name, quantity: scaleQty(g.quantity, factor), unit: g.unit,
95
+ quantity_text: g.quantity_text, optional: g.is_optional === 1,
96
+ }));
97
+ const ordered = [...detail.steps].sort((a, b) => a.sequence - b.sequence);
98
+ const usages = stepUsages(handle, detail.recipe.id, ordered.map((s) => s.sequence), factor);
99
+ const steps = ordered.map((s) => ({
39
100
  sequence: s.sequence, action: s.action, duration_minutes: s.duration_minutes,
40
101
  heat_level: s.heat_level, temperature: s.temperature, expected_result: s.expected_result,
41
- ingredients: scaled,
102
+ ingredients: usages.get(s.sequence) ?? [],
42
103
  }));
43
- const history = historyStats(handle, detail.recipe.id);
44
- return buildCookingRun({ recipe: toRecipeItem(detail.recipe), steps, servings, history });
104
+ const stat = historyStats(handle, detail.recipe.id);
105
+ const histories = queryHistory(handle, detail.recipe.id);
106
+ const last = histories.length > 0 ? histories[histories.length - 1] : undefined;
107
+ return {
108
+ recipe: toRecipeItem(detail.recipe), baseServings: base, servings: actual, factor,
109
+ ingredients, steps, cookware: recipeCookware(handle, detail.recipe.id),
110
+ count: stat.count, avgRating: stat.avgRating,
111
+ lastHistory: last === undefined ? null : { cook_date: last.cook_date, rating: last.rating, feedback: last.feedback },
112
+ };
113
+ }
114
+ /** 跑 `chef.cooking.run`:取单菜全貌+份数放大+历史提示(list 形)。 */
115
+ export function runCookingRun(handle, params) {
116
+ const d = getCookingPageData(handle, params);
117
+ return buildCookingRun({ recipe: d.recipe, steps: d.steps, servings: d.servings, history: { count: d.count, avgRating: d.avgRating } });
118
+ }
119
+ /** 渲染过程型整页(配方 §1 十二格;全部步骤由六张折叠卡承载,不另起速览清单以避重复句)。 */
120
+ export function renderCookingPage(data, opts) {
121
+ const total = data.steps.length;
122
+ const cur = opts.currentStep ?? 1;
123
+ if (!Number.isInteger(cur) || cur < 1 || cur > total) {
124
+ throw new Error('当前步非法(须为 1–' + total + ' 的整数):' + String(opts.currentStep));
125
+ }
126
+ const prefix = 't772-' + opts.kind;
127
+ const facts = renderFactStrip({
128
+ items: [
129
+ { label: '份量', value: data.servings + ' 人份' },
130
+ { label: '步骤', value: total + ' 步' },
131
+ { label: '预计', value: data.recipe.total_time_minutes + ' 分钟' },
132
+ { label: '状态', value: data.recipe.status },
133
+ ],
134
+ });
135
+ // 结论条:只说「这道菜做过几次」(见 `cookCountNote` 的注:份量/用料/步骤别处都有,复述不加信息)。
136
+ const conclusion = renderConclusionBar(cookCountNote(data.count));
137
+ const progress = renderKpiCard({
138
+ label: '当前进度', value: String(cur), unit: '/ ' + total + ' 步',
139
+ // 第二轮返修:删掉原来的说明行「本步 中火 5 分钟」——它与下一张步骤卡里的「火候/时长」两格
140
+ // 说的是同一件事,同尺复评把首屏那句读成「四处都在重复」。火候与时长现在只在步骤卡里出现一次。
141
+ bar: { pct: Math.round((cur / total) * 100) },
142
+ });
143
+ // 第三轮返修:页头**只留族级装饰带**(`sceneShell` 插在版面根首节点的那条 process 带)。
144
+ // 本域第二轮自己加的两件——「锅+热气」图形牌与横贯波线带——是纯装饰且与族级带同题材,
145
+ // 按公共层第三轮的契约撤掉(对照读数见证据件 §7.4)。
146
+ const head = [facts, conclusion];
147
+ // 含上次经验卡:把上一次的日期/评分/反馈摆出来(缺历史就显式缺)。
148
+ if (opts.kind === 'with-history') {
149
+ head.push(data.lastHistory === null
150
+ ? renderCaliberLine('暂无历史记录,本次做完后记一次。')
151
+ : renderDisclosure({
152
+ title: '上次经验', open: true,
153
+ contentHtml: renderTimelineRows({
154
+ rows: [{
155
+ time: data.lastHistory.cook_date,
156
+ // 卡片标题已经是「上次经验」、时间槽已经是那次日期:这行只说评分,不再复述「上次做这道菜」。
157
+ main: data.lastHistory.rating === null ? '未评分' : '评分 ' + data.lastHistory.rating + ' 分',
158
+ note: data.lastHistory.feedback || '这次没写反馈',
159
+ }],
160
+ }),
161
+ }));
162
+ }
163
+ head.push(progress);
164
+ // 断点续做口径:会话记忆由 AI 侧承担(缺字段不编)。第三轮返修:只留「换新会话会怎样」这条
165
+ // 读者真会少知道的事——「上次做到第 3 步、这次从第 4 步接着做」在进度卡(4 / 6 步)与展开的
166
+ // 第 4 步卡上都已经写着,删掉它用户一点不少知道。
167
+ if (opts.kind === 'resume') {
168
+ head.push(renderCaliberLine('断点续接:换新会话后进度不保留。'));
169
+ }
170
+ // 每张步骤卡外面包一层状态类:当前步/已做步/还没做各有自己的形状(`page-css.ts` 里那三条)。
171
+ const cards = data.steps.map((s) => {
172
+ const state = s.sequence < cur ? 'done' : (s.sequence === cur ? 'current' : 'todo');
173
+ // 两个类都挂:`.ilife-cook-step` 是卡本体(第一轮只挂了状态类,样式段里那些按卡本体写的
174
+ // 规则因此一条都没命中——第二轮返修连同这个缺陷一起修),`-done/-current/-todo` 是状态。
175
+ return '<div class="' + COOK_STEP_CLASS + ' ' + COOK_STEP_CLASS + '-' + state + '">' + renderDisclosure({
176
+ title: stepTitle(s.sequence, state), open: s.sequence === cur,
177
+ // 正文走 `stepProseHtml`:库里的动作原文一字不动,只在**已有的标点之后**换行。
178
+ // 参数与用料收进一张侧栏(`ilife-cook-step-side`):宽档它与正文并排(2:1),窄档落在正文下面。
179
+ contentHtml: renderProseBlock({ html: stepProseHtml(s.action) })
180
+ + '<div class="' + COOK_STEP_SIDE_CLASS + '">'
181
+ + renderFactStrip({
182
+ items: [
183
+ { label: '火候', value: s.heat_level || '未写' },
184
+ { label: '时长', value: (s.duration_minutes ?? '—') + ' 分钟' },
185
+ { label: '锅温', value: s.temperature || '未写' },
186
+ ],
187
+ })
188
+ // 零关联菜谱的步:无料可内联就显式缺,不留空白让人猜。
189
+ + (s.ingredients.length === 0
190
+ ? renderCaliberLine('本步用料未登记。')
191
+ : renderChipRow({
192
+ items: s.ingredients.map((u) => ({ text: usageChip(u.name, u.quantity, u.unit, u.optional) })),
193
+ }))
194
+ + '</div>',
195
+ // 第二轮返修:删掉渲染层自己拼的那句「这一步做成:…」——它举的成品迹象与库里正文的收尾
196
+ // (「煸至半焦(不是半熟,出油微焦)」)在首屏上复述同义,同尺复评两页都点到这一处。
197
+ // 库里 `expected_result` 字段一字未改,只是这一步不再上屏(派单第二轮第 3 条具名授权)。
198
+ }) + '</div>';
199
+ });
200
+ const stepsHtml = '<div class="' + COOK_STEPS_CLASS + '">' + cards.join('') + '</div>';
201
+ const stepper = renderActionBar({
202
+ buttons: [
203
+ { label: '上一步', kind: 'ghost', actionId: prefix + '-prev' },
204
+ { label: '下一步', kind: 'primary', actionId: prefix + '-next' },
205
+ ],
206
+ });
207
+ const tail = [];
208
+ // 等待并行卡:本谱无炖烤腌类典型等待步骤,口径如实写,按耗时最长的两步给并行建议。
209
+ if (opts.kind === 'waiting') {
210
+ const longest = [...data.steps].sort((a, b) => (b.duration_minutes ?? 0) - (a.duration_minutes ?? 0)).slice(0, 2);
211
+ tail.push(renderDisclosure({
212
+ title: '等待时可并行', open: true,
213
+ // 第三轮返修:删掉「以下按耗时最长的两步给并行建议」——那是把实现讲给读者听;下面两行
214
+ // 已经写着第几步、约几分钟、下一步备什么料。留下的半句是读者真会少知道的(本谱为何没有等待位)。
215
+ contentHtml: renderCaliberLine('本谱没有炖烤腌这类等待步骤。')
216
+ + renderTimelineRows({
217
+ // 建议写“备下一步”,注里就摆下一步的料名(当前步的料已在步骤卡里,不复读)。
218
+ rows: longest.map((s) => {
219
+ const next = data.steps.find((x) => x.sequence === s.sequence + 1);
220
+ return {
221
+ time: '第 ' + s.sequence + ' 步',
222
+ main: '约 ' + (s.duration_minutes ?? '—') + ' 分钟,可同步备下一步用料。',
223
+ note: next === undefined ? '已是最后一步。' : next.ingredients.map((u) => u.name).join('、') || '下一步用料未登记',
224
+ };
225
+ }),
226
+ }),
227
+ }));
228
+ }
229
+ const prep = renderDisclosure({
230
+ title: '备料清单(' + data.servings + ' 人份)',
231
+ contentHtml: renderDataTable({
232
+ columns: [
233
+ { key: 'name', label: '食材' },
234
+ { key: 'qty', label: '用量', align: 'right' },
235
+ { key: 'note', label: '说明' },
236
+ ],
237
+ rows: data.ingredients.map((g) => ({ name: g.name, qty: qtyText(g.quantity, g.unit), note: g.quantity_text || '未写' })),
238
+ }),
239
+ });
240
+ const ware = renderDisclosure({
241
+ title: '炊具',
242
+ contentHtml: data.cookware.length === 0
243
+ ? renderCaliberLine('未登记炊具。')
244
+ : renderChipRow({ items: data.cookware.map((c) => ({ text: c.category ? c.name + '(' + c.category + ')' : c.name })) }),
245
+ });
246
+ const done = renderActionBar({
247
+ buttons: [
248
+ { label: '做完了,记一次', kind: 'primary', actionId: prefix + '-record' },
249
+ { label: '看这道菜的历史', kind: 'ghost', actionId: prefix + '-history' },
250
+ ],
251
+ });
252
+ // 复制区(三格式菜单):行文与改前逐行同义(备料行/进度行/评分行),`list` 形逐行透传。
253
+ const copy = chefCopyArea({
254
+ dataActionId: prefix + '-copy',
255
+ data: {
256
+ key: 'chef.cooking.run', shape: 'list',
257
+ items: ['备料清单(' + data.servings + ' 人份)']
258
+ .concat(data.ingredients.map((g) => g.name + ' ' + qtyText(g.quantity, g.unit)))
259
+ .concat(['进度:第 ' + cur + ' 步 / 共 ' + total + ' 步',
260
+ '评分:做过 ' + data.count + ' 次' + (data.avgRating === null ? '' : ',平均 ' + data.avgRating + ' 分')]),
261
+ },
262
+ });
263
+ const body = renderPageShell({
264
+ eyebrow: '私家大厨 | 做菜', title: '做菜模式:' + data.recipe.name,
265
+ content: head.join('') + stepsHtml + stepper + tail.join('') + prep + ware + done + copy,
266
+ });
267
+ return renderSceneShell({
268
+ family: 'process',
269
+ // 文档标题与页内标题错开一处(后者缀技能名):否则同一句在 `<title>` 与页标题各出现一次,
270
+ // 质量门「重复句」列会红(`t768` 原型即用不同标题避开此列)。
271
+ docTitle: '做菜模式:' + data.recipe.name + '(私家大厨)', bodyHtml: body,
272
+ // 页内收口那一段(本域五页共用的栅格与排印)追加在族级样式之后:两层不拆回去(包内测试守着)。
273
+ extraCss: cookPageCss(),
274
+ });
45
275
  }
46
276
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cook/run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnE,iFAAiF;AACjF,gCAAgC;AAChC,MAAM,UAAU,eAAe,CAAC,IAK/B;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACzD,MAAM,YAAY,GAAG,QAAQ,KAAK,IAAI;QACpC,CAAC,CAAC,OAAO,GAAG,IAAI,GAAG,OAAO;QAC1B,CAAC,CAAC,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACvB,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC;QAClC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,gCAAgC;QAC/I,CAAC,CAAC,oCAAoC,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAC5H,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,MAA+B;IAC3E,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,QAAmB,GAAG,IAAI,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG;QAClF,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,WAAW,KAAK,CAAC;KAC5E,CAAC,CAAC,CAAC;IACJ,MAAM,KAAK,GAAkB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QAC5E,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe;QACxF,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC,CAAC;IACN,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5F,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cook/run.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
- /** 数据管理能力的命令声明(空):本域暂无自有 key。
1
+ /** 数据管理能力的命令声明(权威源:一条命令的事实只住这里)。
2
2
  *
3
- * 本能力即 HELP 一级分组「数据管理」。数据管理域的三张卡(体检/批量改/备份)中,
4
- * 可路由的两句(`体检`→`kind: 'quality'`、`备份`→`kind: 'backup'`)走 `chef.history.query`,
5
- * 那条命令的事实住历史能力(`src/history/commands.ts`)——本域不另立第二份声明(铁律二)。
6
- * 空数组仍是「恰好一个声明数组」(生成器认它为一域,来源域名单里有 `data`),
7
- * 数据管理端到端票接入自有 key 时再填。
3
+ * 本能力即 HELP 一级分组「数据管理」。一条自有写命令:
4
+ * · `chef.data.batch`(会改数据库的命令):批量改进这一条(改既有行+改前对比+回执)。
5
+ * 体检与备份走 `chef.history.query`(事实住历史能力,kind 切分由入口做)——本域不另立第二份声明。
6
+ * 唤醒词路由:#841 起 `批量改` 已在 `WAKE_TABLE`(下标 49),`src/data/routes.ts` 同步填实 `order`。
8
7
  */
9
8
  import type { CommandSpec } from '../shared/command-spec.js';
10
- /** 数据管理能力的声明表:恰好导出一个声明数组(生成器只认这一个;本域暂空)。 */
9
+ /** 数据管理能力的声明表:恰好导出一个声明数组(生成器只认这一个)。 */
11
10
  export declare const DATA_COMMANDS: readonly CommandSpec[];
12
11
  //# sourceMappingURL=commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/data/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,4CAA4C;AAC5C,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAAO,CAAC"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/data/commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,uCAAuC;AACvC,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAQ/C,CAAC"}
@@ -1,11 +1,18 @@
1
- /** 数据管理能力的命令声明(空):本域暂无自有 key。
1
+ /** 数据管理能力的命令声明(权威源:一条命令的事实只住这里)。
2
2
  *
3
- * 本能力即 HELP 一级分组「数据管理」。数据管理域的三张卡(体检/批量改/备份)中,
4
- * 可路由的两句(`体检`→`kind: 'quality'`、`备份`→`kind: 'backup'`)走 `chef.history.query`,
5
- * 那条命令的事实住历史能力(`src/history/commands.ts`)——本域不另立第二份声明(铁律二)。
6
- * 空数组仍是「恰好一个声明数组」(生成器认它为一域,来源域名单里有 `data`),
7
- * 数据管理端到端票接入自有 key 时再填。
3
+ * 本能力即 HELP 一级分组「数据管理」。一条自有写命令:
4
+ * · `chef.data.batch`(会改数据库的命令):批量改进这一条(改既有行+改前对比+回执)。
5
+ * 体检与备份走 `chef.history.query`(事实住历史能力,kind 切分由入口做)——本域不另立第二份声明。
6
+ * 唤醒词路由:#841 起 `批量改` 已在 `WAKE_TABLE`(下标 49),`src/data/routes.ts` 同步填实 `order`。
8
7
  */
9
- /** 数据管理能力的声明表:恰好导出一个声明数组(生成器只认这一个;本域暂空)。 */
10
- export const DATA_COMMANDS = [];
8
+ /** 数据管理能力的声明表:恰好导出一个声明数组(生成器只认这一个)。 */
9
+ export const DATA_COMMANDS = [
10
+ {
11
+ kind: 'write',
12
+ key: 'chef.data.batch',
13
+ title: '批量改',
14
+ wakeWord: '批量改',
15
+ example: 'chef-cmd-read chef.data.batch --params \'{"name":"辣椒炒肉","ingredients":[{"name":"螺丝椒","quantity":300}]}\'',
16
+ },
17
+ ];
11
18
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/data/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,4CAA4C;AAC5C,MAAM,CAAC,MAAM,aAAa,GAA2B,EAAE,CAAC"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/data/commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,uCAAuC;AACvC,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD;QACE,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,0GAA0G;KACpH;CACF,CAAC"}
@@ -6,4 +6,6 @@
6
6
  export { DATA_COMMANDS } from './commands.js';
7
7
  export { DATA_ROUTES } from './routes.js';
8
8
  export { healthCheck, runDataQuery } from './run-query.js';
9
+ export { previewDataBatch, runDataBatch } from './run-batch.js';
10
+ export { dataBackupPage, dataBatchPage, dataQualityPage } from './pages.js';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -6,4 +6,6 @@
6
6
  export { DATA_COMMANDS } from './commands.js';
7
7
  export { DATA_ROUTES } from './routes.js';
8
8
  export { healthCheck, runDataQuery } from './run-query.js';
9
+ export { previewDataBatch, runDataBatch } from './run-batch.js';
10
+ export { dataBackupPage, dataBatchPage, dataQualityPage } from './pages.js';
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,50 @@
1
+ /** 数据管理能力的页面装配(三卡各一页,区块全走公共层,页内只追加本域自己的一段样式)。
2
+ *
3
+ * 配方来源:`docs/skills/skill-chef/t768-页面族配方.md`
4
+ * · 体检走结果型(结论条+事实条+完整度条+逐菜折叠);
5
+ * · 批量改走过程型目标形态(事实条+变更行+动作行+复制区);
6
+ * · 备份走回执型(结论条+事实条+动作行+复制区)。
7
+ * 老件对照:体检逐菜详情见 `data_quality_report.html`,批量三页见 `batch_edit.html`,
8
+ * 备份完成页见 `backup_receipt.html`(信息组织取老件,视觉走公共层)。
9
+ *
10
+ * 样式分两层(不许拆):公共层皮肤与**族级装饰带/族节奏**走 `renderSceneShell()` 一个入口,
11
+ * 页内专属的版式(逐菜卡里的完整度条、变更行的卡、复制按钮不铺满整行)由 `dataSeatCss()` 追加在它后面。
12
+ * **页内不再出第二条装饰带**(第三轮公共层席把「页头一条族带」定成共用标准;本席第二轮那条 720×120
13
+ * 满宽带与之重复,已撤)——体检页的完整度条是数据可视化,保留,色基与族带同取 `CHART_PALETTE`。
14
+ *
15
+ * #871 E 类裁定(2026-09-21):原体检页/备份页各有一组**读数卡**(`renderKpiGrid`,3 张),
16
+ * 读数与紧邻的事实条**同源重复**;公共层 `pageUi` ⑥ 在 ≤640 档把读数卡栅格写成两列 ⇒ 3 张卡必然
17
+ * 排成「两格 + 一张孤卡、右侧整格空着」(390 端实测,终审 68 分那一格)。本包不许改公共层,
18
+ * 故在页面侧收口:**读数只留事实条一份**(flex 按内容换行,无栅格空位),不再出读数卡网格。
19
+ * 若日后要恢复三格读数卡,须先给公共层补「奇数格在 ≤640 档」一条规则(另立票,见 #871 遗留出口)。
20
+ */
21
+ export interface QualityItem {
22
+ name: string;
23
+ score: number;
24
+ ingredients_count: number;
25
+ steps_count: number;
26
+ tips_count: number;
27
+ techniques_count: number;
28
+ has_background: boolean;
29
+ missing: string[];
30
+ }
31
+ /** 体检页(结果型)。 */
32
+ export declare function dataQualityPage(input: {
33
+ items: QualityItem[];
34
+ }): string;
35
+ /** 批量改页(过程型目标形态:改前对比+回执)。 */
36
+ export declare function dataBatchPage(input: {
37
+ name: string;
38
+ diffs: {
39
+ field: string;
40
+ before: string;
41
+ after: string;
42
+ }[];
43
+ }): string;
44
+ /** 备份回执页(回执型)。 */
45
+ export declare function dataBackupPage(input: {
46
+ recipeCount: number;
47
+ tableCount: number;
48
+ bytes: number;
49
+ }): string;
50
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/data/pages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA0IH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,MAAM,CA8EvE;AAED,6BAA6B;AAC7B,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,MAAM,CA+BxH;AAED,kBAAkB;AAClB,wBAAgB,cAAc,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA8BxG"}