skill-chef 0.3.0 → 0.3.2

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 (227) hide show
  1. package/SKILL.md +2 -2
  2. package/dist/add/commands.d.ts +15 -0
  3. package/dist/add/commands.d.ts.map +1 -0
  4. package/dist/add/commands.js +22 -0
  5. package/dist/add/commands.js.map +1 -0
  6. package/dist/add/index.d.ts +10 -0
  7. package/dist/add/index.d.ts.map +1 -0
  8. package/dist/add/index.js +10 -0
  9. package/dist/add/index.js.map +1 -0
  10. package/dist/add/routes.d.ts +11 -0
  11. package/dist/add/routes.d.ts.map +1 -0
  12. package/dist/add/routes.js +23 -0
  13. package/dist/add/routes.js.map +1 -0
  14. package/dist/add/run-write.d.ts +37 -0
  15. package/dist/add/run-write.d.ts.map +1 -0
  16. package/dist/add/run-write.js +187 -0
  17. package/dist/add/run-write.js.map +1 -0
  18. package/dist/cli/cmd_read.js +32 -289
  19. package/dist/cli/cmd_read.js.map +1 -1
  20. package/dist/cli/config.d.ts +6 -2
  21. package/dist/cli/config.d.ts.map +1 -1
  22. package/dist/cli/config.js +9 -3
  23. package/dist/cli/config.js.map +1 -1
  24. package/dist/cli/keys.d.ts +12 -0
  25. package/dist/cli/keys.d.ts.map +1 -0
  26. package/dist/cli/keys.js +58 -0
  27. package/dist/cli/keys.js.map +1 -0
  28. package/dist/config.d.ts +14 -6
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +73 -18
  31. package/dist/config.js.map +1 -1
  32. package/dist/cook/commands.d.ts +13 -0
  33. package/dist/cook/commands.d.ts.map +1 -0
  34. package/dist/cook/commands.js +21 -0
  35. package/dist/cook/commands.js.map +1 -0
  36. package/dist/cook/index.d.ts +9 -0
  37. package/dist/cook/index.d.ts.map +1 -0
  38. package/dist/cook/index.js +9 -0
  39. package/dist/cook/index.js.map +1 -0
  40. package/dist/cook/routes.d.ts +11 -0
  41. package/dist/cook/routes.d.ts.map +1 -0
  42. package/dist/cook/routes.js +35 -0
  43. package/dist/cook/routes.js.map +1 -0
  44. package/dist/cook/run.d.ts +24 -0
  45. package/dist/cook/run.d.ts.map +1 -0
  46. package/dist/cook/run.js +46 -0
  47. package/dist/cook/run.js.map +1 -0
  48. package/dist/data/commands.d.ts +12 -0
  49. package/dist/data/commands.d.ts.map +1 -0
  50. package/dist/data/commands.js +11 -0
  51. package/dist/data/commands.js.map +1 -0
  52. package/dist/data/index.d.ts +9 -0
  53. package/dist/data/index.d.ts.map +1 -0
  54. package/dist/data/index.js +9 -0
  55. package/dist/data/index.js.map +1 -0
  56. package/dist/data/routes.d.ts +12 -0
  57. package/dist/data/routes.d.ts.map +1 -0
  58. package/dist/data/routes.js +19 -0
  59. package/dist/data/routes.js.map +1 -0
  60. package/dist/data/run-query.d.ts +15 -0
  61. package/dist/data/run-query.d.ts.map +1 -0
  62. package/dist/data/run-query.js +73 -0
  63. package/dist/data/run-query.js.map +1 -0
  64. package/dist/fetch/db.d.ts +11 -31
  65. package/dist/fetch/db.d.ts.map +1 -1
  66. package/dist/fetch/db.js +39 -317
  67. package/dist/fetch/db.js.map +1 -1
  68. package/dist/fetch/index.d.ts +7 -1
  69. package/dist/fetch/index.d.ts.map +1 -1
  70. package/dist/fetch/index.js +9 -1
  71. package/dist/fetch/index.js.map +1 -1
  72. package/dist/fetch/paths.d.ts +37 -3
  73. package/dist/fetch/paths.d.ts.map +1 -1
  74. package/dist/fetch/paths.js +59 -8
  75. package/dist/fetch/paths.js.map +1 -1
  76. package/dist/fetch/schema.d.ts +7 -0
  77. package/dist/fetch/schema.d.ts.map +1 -0
  78. package/dist/fetch/schema.js +53 -0
  79. package/dist/fetch/schema.js.map +1 -0
  80. package/dist/health.d.ts.map +1 -1
  81. package/dist/health.js +7 -16
  82. package/dist/health.js.map +1 -1
  83. package/dist/help/manifest.d.ts +12 -5
  84. package/dist/help/manifest.d.ts.map +1 -1
  85. package/dist/help/manifest.js +15 -7
  86. package/dist/help/manifest.js.map +1 -1
  87. package/dist/history/commands.d.ts +32 -0
  88. package/dist/history/commands.d.ts.map +1 -0
  89. package/dist/history/commands.js +32 -0
  90. package/dist/history/commands.js.map +1 -0
  91. package/dist/history/index.d.ts +11 -0
  92. package/dist/history/index.d.ts.map +1 -0
  93. package/dist/history/index.js +9 -0
  94. package/dist/history/index.js.map +1 -0
  95. package/dist/history/routes.d.ts +19 -0
  96. package/dist/history/routes.d.ts.map +1 -0
  97. package/dist/history/routes.js +49 -0
  98. package/dist/history/routes.js.map +1 -0
  99. package/dist/history/run-query.d.ts +13 -0
  100. package/dist/history/run-query.d.ts.map +1 -0
  101. package/dist/history/run-query.js +44 -0
  102. package/dist/history/run-query.js.map +1 -0
  103. package/dist/history/run-record.d.ts +21 -0
  104. package/dist/history/run-record.d.ts.map +1 -0
  105. package/dist/history/run-record.js +71 -0
  106. package/dist/history/run-record.js.map +1 -0
  107. package/dist/relation/commands.d.ts +10 -0
  108. package/dist/relation/commands.d.ts.map +1 -0
  109. package/dist/relation/commands.js +9 -0
  110. package/dist/relation/commands.js.map +1 -0
  111. package/dist/relation/index.d.ts +8 -0
  112. package/dist/relation/index.d.ts.map +1 -0
  113. package/dist/relation/index.js +8 -0
  114. package/dist/relation/index.js.map +1 -0
  115. package/dist/relation/routes.d.ts +10 -0
  116. package/dist/relation/routes.d.ts.map +1 -0
  117. package/dist/relation/routes.js +28 -0
  118. package/dist/relation/routes.js.map +1 -0
  119. package/dist/render/index.d.ts +7 -1
  120. package/dist/render/index.d.ts.map +1 -1
  121. package/dist/render/index.js +9 -1
  122. package/dist/render/index.js.map +1 -1
  123. package/dist/render/views.d.ts +1 -39
  124. package/dist/render/views.d.ts.map +1 -1
  125. package/dist/render/views.js +6 -56
  126. package/dist/render/views.js.map +1 -1
  127. package/dist/search/commands.d.ts +14 -0
  128. package/dist/search/commands.d.ts.map +1 -0
  129. package/dist/search/commands.js +22 -0
  130. package/dist/search/commands.js.map +1 -0
  131. package/dist/search/index.d.ts +9 -0
  132. package/dist/search/index.d.ts.map +1 -0
  133. package/dist/search/index.js +9 -0
  134. package/dist/search/index.js.map +1 -0
  135. package/dist/search/routes.d.ts +11 -0
  136. package/dist/search/routes.d.ts.map +1 -0
  137. package/dist/search/routes.js +59 -0
  138. package/dist/search/routes.js.map +1 -0
  139. package/dist/search/run.d.ts +22 -0
  140. package/dist/search/run.d.ts.map +1 -0
  141. package/dist/search/run.js +105 -0
  142. package/dist/search/run.js.map +1 -0
  143. package/dist/setup/commands.d.ts +10 -0
  144. package/dist/setup/commands.d.ts.map +1 -0
  145. package/dist/setup/commands.js +9 -0
  146. package/dist/setup/commands.js.map +1 -0
  147. package/dist/setup/index.d.ts +8 -0
  148. package/dist/setup/index.d.ts.map +1 -0
  149. package/dist/setup/index.js +8 -0
  150. package/dist/setup/index.js.map +1 -0
  151. package/dist/setup/routes.d.ts +10 -0
  152. package/dist/setup/routes.d.ts.map +1 -0
  153. package/dist/setup/routes.js +16 -0
  154. package/dist/setup/routes.js.map +1 -0
  155. package/dist/shared/command-spec.d.ts +42 -0
  156. package/dist/shared/command-spec.d.ts.map +1 -0
  157. package/dist/shared/command-spec.js +15 -0
  158. package/dist/shared/command-spec.js.map +1 -0
  159. package/dist/shared/slots.d.ts +24 -0
  160. package/dist/shared/slots.d.ts.map +1 -0
  161. package/dist/shared/slots.js +63 -0
  162. package/dist/shared/slots.js.map +1 -0
  163. package/dist/shopping/commands.d.ts +13 -0
  164. package/dist/shopping/commands.d.ts.map +1 -0
  165. package/dist/shopping/commands.js +21 -0
  166. package/dist/shopping/commands.js.map +1 -0
  167. package/dist/shopping/index.d.ts +9 -0
  168. package/dist/shopping/index.d.ts.map +1 -0
  169. package/dist/shopping/index.js +9 -0
  170. package/dist/shopping/index.js.map +1 -0
  171. package/dist/shopping/routes.d.ts +11 -0
  172. package/dist/shopping/routes.d.ts.map +1 -0
  173. package/dist/shopping/routes.js +35 -0
  174. package/dist/shopping/routes.js.map +1 -0
  175. package/dist/shopping/run.d.ts +24 -0
  176. package/dist/shopping/run.d.ts.map +1 -0
  177. package/dist/shopping/run.js +74 -0
  178. package/dist/shopping/run.js.map +1 -0
  179. package/dist/triggers/chef-scenes.d.ts +47 -0
  180. package/dist/triggers/chef-scenes.d.ts.map +1 -0
  181. package/dist/triggers/chef-scenes.js +174 -0
  182. package/dist/triggers/chef-scenes.js.map +1 -0
  183. package/dist/update/commands.d.ts +12 -0
  184. package/dist/update/commands.d.ts.map +1 -0
  185. package/dist/update/commands.js +11 -0
  186. package/dist/update/commands.js.map +1 -0
  187. package/dist/update/index.d.ts +9 -0
  188. package/dist/update/index.d.ts.map +1 -0
  189. package/dist/update/index.js +9 -0
  190. package/dist/update/index.js.map +1 -0
  191. package/dist/update/routes.d.ts +12 -0
  192. package/dist/update/routes.d.ts.map +1 -0
  193. package/dist/update/routes.js +24 -0
  194. package/dist/update/routes.js.map +1 -0
  195. package/dist/update/run-write.d.ts +19 -0
  196. package/dist/update/run-write.d.ts.map +1 -0
  197. package/dist/update/run-write.js +99 -0
  198. package/dist/update/run-write.js.map +1 -0
  199. package/dist/view/commands.d.ts +14 -0
  200. package/dist/view/commands.d.ts.map +1 -0
  201. package/dist/view/commands.js +22 -0
  202. package/dist/view/commands.js.map +1 -0
  203. package/dist/view/index.d.ts +9 -0
  204. package/dist/view/index.d.ts.map +1 -0
  205. package/dist/view/index.js +9 -0
  206. package/dist/view/index.js.map +1 -0
  207. package/dist/view/routes.d.ts +11 -0
  208. package/dist/view/routes.d.ts.map +1 -0
  209. package/dist/view/routes.js +53 -0
  210. package/dist/view/routes.js.map +1 -0
  211. package/dist/view/run.d.ts +13 -0
  212. package/dist/view/run.d.ts.map +1 -0
  213. package/dist/view/run.js +34 -0
  214. package/dist/view/run.js.map +1 -0
  215. package/dist/zzshapeprobe/commands.d.ts +3 -0
  216. package/dist/zzshapeprobe/commands.d.ts.map +1 -0
  217. package/dist/zzshapeprobe/commands.js +3 -0
  218. package/dist/zzshapeprobe/commands.js.map +1 -0
  219. package/dist/zzshapeprobe/index.d.ts +3 -0
  220. package/dist/zzshapeprobe/index.d.ts.map +1 -0
  221. package/dist/zzshapeprobe/index.js +3 -0
  222. package/dist/zzshapeprobe/index.js.map +1 -0
  223. package/dist/zzshapeprobe/routes.d.ts +3 -0
  224. package/dist/zzshapeprobe/routes.d.ts.map +1 -0
  225. package/dist/zzshapeprobe/routes.js +3 -0
  226. package/dist/zzshapeprobe/routes.js.map +1 -0
  227. package/package.json +3 -3
package/dist/config.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import type { ConfigRecord } from 'base-link-core';
2
2
  /** 配置文件主体名:`<配置目录>/chef.yaml`。 */
3
3
  export declare const CHEF_CONFIG_STEM: "chef";
4
- /** 私家大厨那份配置表:键即设置页的行,一层嵌套(子集支持范围见 base-link-core README)。 */
4
+ /** 私家大厨那份配置表:键即设置页的行,一层嵌套(子集支持范围见 base-link-core README)。
5
+ * **#796 起 3 键**(`db.dir`/`db.name`/`html.dir`):面板 5 行 → 3 行(可改 1 + 只读 2);
6
+ * **#766 起 4 键**:加 `html.sceneDir`(域产物根,默认 `cook_html`,`html.dir` 不动)。 */
5
7
  export declare const CHEF_CONFIG_DEFAULTS: {
6
8
  db: {
7
9
  dir: string;
@@ -9,12 +11,15 @@ export declare const CHEF_CONFIG_DEFAULTS: {
9
11
  };
10
12
  html: {
11
13
  dir: string;
12
- };
13
- files: {
14
- help: string;
15
- lookup: string;
14
+ sceneDir: string;
16
15
  };
17
16
  };
17
+ /** **已退休键**(#762 过渡件):我们自己删过、老配置文件里必然还留着的键的叶子全路径。命中的键跳过校验、
18
+ * 不进取值、也不会被写回(任何一次保存/重置天然抹掉它)。名单**只许写已经删掉的键**——键还在默认值表里
19
+ * 就写进清单=在护栏上开洞,`base-link-core` 收到清单时当场拒。
20
+ * `files.help`/`files.lookup`(#795 定稿)在本票 #796 里删:文件名回代码常量,产物名逐字不变。
21
+ * 退出条件:下一个大版本删掉这张清单。 */
22
+ export declare const CHEF_CONFIG_RETIRED: readonly string[];
18
23
  /** 取值形状由默认值表派生(同一件事只有一个定义地)。 */
19
24
  export type ChefConfigValues = typeof CHEF_CONFIG_DEFAULTS;
20
25
  /** 读回来的一份配置:文件路径(人话报错要指它)+数据目录+取值。 */
@@ -24,7 +29,10 @@ export interface LoadedChefConfig {
24
29
  readonly created: boolean;
25
30
  readonly values: ChefConfigValues;
26
31
  }
27
- /** 读一份配置(文件不存在即按默认值落一份并把配置目录/数据目录建出来)。 */
32
+ /** 读一份配置(文件不存在即按默认值落一份并把配置目录/数据目录建出来)。
33
+ *
34
+ * 读回来的 `values` 是**文件里那份 ⊕ 默认值**(文件里写空串则仍是空串=按默认落点);
35
+ * 首次落文件时写下去的是 `writableDefaults()`(可改落点=绝对路径)。 */
28
36
  export declare function loadChefConfig(): LoadedChefConfig;
29
37
  /** 写一份配置(写出去的是完整一份:没给的项按默认值补齐)。写完清记忆,同进程后续读也现取。 */
30
38
  export declare function saveChefConfig(values: ConfigRecord): {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,EAAG,MAAe,CAAC;AAEhD,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAIhC,CAAC;AAEF,gCAAgC;AAChC,MAAM,MAAM,gBAAgB,GAAG,OAAO,oBAAoB,CAAC;AAE3D,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;CACnC;AAKD,0CAA0C;AAC1C,wBAAgB,cAAc,IAAI,gBAAgB,CAajD;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAIrE;AAED,yCAAyC;AACzC,wBAAgB,eAAe,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAI7E;AAED;6DAC6D;AAC7D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,EAAG,MAAe,CAAC;AAEhD;;2EAE2E;AAC3E,eAAO,MAAM,oBAAoB;;;;;;;;;CAGhC,CAAC;AAEF;;;;yBAIyB;AACzB,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAmC,CAAC;AAErF,gCAAgC;AAChC,MAAM,MAAM,gBAAgB,GAAG,OAAO,oBAAoB,CAAC;AAiC3D,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;CACnC;AAQD;;;mDAGmD;AACnD,wBAAgB,cAAc,IAAI,gBAAgB,CAiBjD;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAIrE;AAED,yCAAyC;AACzC,wBAAgB,eAAe,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAI7E;AAED;6DAC6D;AAC7D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD"}
package/dist/config.js CHANGED
@@ -2,7 +2,7 @@
2
2
  *
3
3
  * 口径出处(「配置的存与生效口径裁定」#675 的解决评论,本票 #695 落地):**每个技能一份 YAML 配置文件,
4
4
  * 配置文件是唯一真相,环境变量不参与配置**。默认落点 `~/.ilife/chef.yaml`(由 `os.homedir()` 派生,
5
- * 平台无关),`ILIFE_CONFIG_DIR` 设定且非空即整体接管配置目录;数据目录默认 `~/.ilife/data/`,
5
+ * 平台无关,只此一处);数据目录默认 `~/.ilife/data/`,
6
6
  * 首次读时自动建;「重置为默认」先另存 `<配置目录>/chef.yaml.bak`。
7
7
  *
8
8
  * 读写实现(受限 YAML 子集解析、键表与类型校验、备份、建目录)住 `base-link-core` 的 `src/config/`
@@ -11,46 +11,101 @@
11
11
  * 默认值逐项等于改造前的代码常量(对照读数见 `docs/skills/skill-chef/t695-证据.md`):
12
12
  * · `db.name`=`chef_data.db`(原 `src/fetch/paths.ts` 的 `DB_FILENAME`);
13
13
  * · `html.dir`=`cook_html/help`(原 `src/help/manifest.ts` 的 `HELP_DIR_SEGMENTS` 两段——配置形状是
14
- * 字符串、段间用 `/` 或 `\` 分隔,因为受限子集不收数组;见 `base-link-core/README.md` §支持范围);
15
- * · `files.help`/`files.lookup`=`私家大厨_HELP`/`私家大厨_速查表`(原 `manifest.ts` 的两个主体名)。
14
+ * 字符串、段间用 `/` 或 `\` 分隔,因为受限子集不收数组;见 `base-link-core/README.md` §支持范围)。
15
+ * · `html.sceneDir`=`cook_html`(#766 新增:域产物根,三层目录层 1 的落点来源;
16
+ * `html.dir` 的语义与默认值一动不动,存量配置文件不受影响,缺项按此默认补).
17
+ * **#796 起 `files.help`/`files.lookup` 出表**(见下面 `CHEF_CONFIG_RETIRED`):两个产物文件名主体
18
+ * 回到代码常量(`src/help/manifest.ts` 的 `HELP_FILE_STEM`/`LOOKUP_FILE_STEM`)。
16
19
  * 用法上一处约定:**空串=按默认落点**——`db.dir` 空即用数据目录(`~/.ilife/data/`),由取用处算,
17
20
  * 所以空串不是「没配」,老数据不会看起来丢了。
21
+ * #796 起这条约定的**两半分头**:**读**认空串;**写**(首次落文件/保存/重置)把面板上可改的
22
+ * 那一格(`db.dir`)落成算出来的绝对路径——见下面 `writableDefaults()` 的注释。
18
23
  */
19
- import { loadConfig, resetConfig, saveConfig } from 'base-link-core';
24
+ import { configPaths, loadConfig, resetConfig, saveConfig } from 'base-link-core';
20
25
  /** 配置文件主体名:`<配置目录>/chef.yaml`。 */
21
26
  export const CHEF_CONFIG_STEM = 'chef';
22
- /** 私家大厨那份配置表:键即设置页的行,一层嵌套(子集支持范围见 base-link-core README)。 */
27
+ /** 私家大厨那份配置表:键即设置页的行,一层嵌套(子集支持范围见 base-link-core README)。
28
+ * **#796 起 3 键**(`db.dir`/`db.name`/`html.dir`):面板 5 行 → 3 行(可改 1 + 只读 2);
29
+ * **#766 起 4 键**:加 `html.sceneDir`(域产物根,默认 `cook_html`,`html.dir` 不动)。 */
23
30
  export const CHEF_CONFIG_DEFAULTS = {
24
31
  db: { dir: '', name: 'chef_data.db' },
25
- html: { dir: 'cook_html/help' },
26
- files: { help: '私家大厨_HELP', lookup: '私家大厨_速查表' },
32
+ html: { dir: 'cook_html/help', sceneDir: 'cook_html' },
27
33
  };
28
- /** 每进程只读一次:配置文件的「保存即生效」靠**下一次调用现读**,同一个进程里不反复读盘。 */
34
+ /** **已退休键**(#762 过渡件):我们自己删过、老配置文件里必然还留着的键的叶子全路径。命中的键跳过校验、
35
+ * 不进取值、也不会被写回(任何一次保存/重置天然抹掉它)。名单**只许写已经删掉的键**——键还在默认值表里
36
+ * 就写进清单=在护栏上开洞,`base-link-core` 收到清单时当场拒。
37
+ * `files.help`/`files.lookup`(#795 定稿)在本票 #796 里删:文件名回代码常量,产物名逐字不变。
38
+ * 退出条件:下一个大版本删掉这张清单。 */
39
+ export const CHEF_CONFIG_RETIRED = ['files.help', 'files.lookup'];
40
+ /** 写盘那一份用的默认值表:**可改落点**(`db.dir`)写成算出来的绝对路径(#746 总口径回灌,本票 #796 落地)。
41
+ *
42
+ * 为什么写绝对路径:面板上「数据目录」那一格显示的是从配置文件算出的生效值,而空串的语义是「按默认落点」
43
+ * ——默认落点由 `os.homedir()` 派生,换机器/改用户名就会漂到别处;写死了才是「这一格写的是什么就是什么」。
44
+ *
45
+ * 口径的两半:**读**仍认空串(=按默认落点,老文件一份不用动,也不与 #762 的退休键过渡打架);
46
+ * **写**(首次落文件/保存/重置)一律落绝对路径。那一格不自己拼路径——直接用 `configPaths(stem).dataDir`,
47
+ * 今天算数据目录只有这一处算法(`base-link-core/src/config/dirs.ts`)。 */
48
+ function writableDefaults() {
49
+ return {
50
+ ...CHEF_CONFIG_DEFAULTS,
51
+ db: { ...CHEF_CONFIG_DEFAULTS.db, dir: configPaths(CHEF_CONFIG_STEM).dataDir },
52
+ };
53
+ }
54
+ /** 写盘前把可改落点那一格的**空白值**去掉:空串=按默认落点,而写的时候那个落点要落成绝对路径
55
+ * (见 `writableDefaults`)——去掉这一格,`base-link-core` 的 `fillDefaults` 自会补上写盘用的默认值。
56
+ * 组里一个子项都不剩时连组一起去掉(空组写出去解析不回来)。 */
57
+ function withoutBlankEditableDir(values) {
58
+ const group = values['db'];
59
+ if (typeof group !== 'object' || group === null || Array.isArray(group))
60
+ return values;
61
+ const dir = group['dir'];
62
+ if (typeof dir !== 'string' || dir !== '')
63
+ return values;
64
+ const next = { ...group };
65
+ delete next['dir'];
66
+ const out = { ...values };
67
+ if (Object.keys(next).length === 0)
68
+ delete out['db'];
69
+ else
70
+ out['db'] = next;
71
+ return out;
72
+ }
73
+ /** 每份配置文件记一份:家目录一变(测试逐用例换临时家目录)即现读,
74
+ * 同一文件里不反复读盘(「保存即生效」由 `saveChefConfig`/`resetChefConfig` 清记忆保证,
75
+ * 不靠长连接)。记忆位不绑「进程」而绑「配置文件路径」,是为了不让换目录后的读落到上一份的缓存上
76
+ * ——照 `packages/skill-bill/src/config.ts` 同形(#749 那一侧先落的这条)。 */
29
77
  let memo = null;
30
- /** 读一份配置(文件不存在即按默认值落一份并把配置目录/数据目录建出来)。 */
78
+ /** 读一份配置(文件不存在即按默认值落一份并把配置目录/数据目录建出来)。
79
+ *
80
+ * 读回来的 `values` 是**文件里那份 ⊕ 默认值**(文件里写空串则仍是空串=按默认落点);
81
+ * 首次落文件时写下去的是 `writableDefaults()`(可改落点=绝对路径)。 */
31
82
  export function loadChefConfig() {
32
- if (memo === null) {
33
- const loaded = loadConfig(CHEF_CONFIG_STEM, CHEF_CONFIG_DEFAULTS);
83
+ const file = configPaths(CHEF_CONFIG_STEM).configFile;
84
+ if (memo === null || memo.file !== file) {
85
+ const loaded = loadConfig(CHEF_CONFIG_STEM, writableDefaults(), CHEF_CONFIG_RETIRED);
34
86
  // base-link-core 读回来时已经过了「键齐 + 类型对」两道校验(不认识的键、类型不符一律抛),
35
87
  // 故这一处从宽松记录到形状记录的转换是有依据的投影,不是猜测。
36
88
  memo = {
37
- path: loaded.path,
38
- dataDir: loaded.dataDir,
39
- created: loaded.created,
40
- values: loaded.values,
89
+ file,
90
+ loaded: {
91
+ path: loaded.path,
92
+ dataDir: loaded.dataDir,
93
+ created: loaded.created,
94
+ values: loaded.values,
95
+ },
41
96
  };
42
97
  }
43
- return memo;
98
+ return memo.loaded;
44
99
  }
45
100
  /** 写一份配置(写出去的是完整一份:没给的项按默认值补齐)。写完清记忆,同进程后续读也现取。 */
46
101
  export function saveChefConfig(values) {
47
- const r = saveConfig(CHEF_CONFIG_STEM, CHEF_CONFIG_DEFAULTS, values);
102
+ const r = saveConfig(CHEF_CONFIG_STEM, writableDefaults(), withoutBlankEditableDir(values), CHEF_CONFIG_RETIRED);
48
103
  memo = null;
49
104
  return r;
50
105
  }
51
106
  /** 重置为默认(先另存 `<配置目录>/chef.yaml.bak`)。 */
52
107
  export function resetChefConfig() {
53
- const r = resetConfig(CHEF_CONFIG_STEM, CHEF_CONFIG_DEFAULTS);
108
+ const r = resetConfig(CHEF_CONFIG_STEM, writableDefaults(), CHEF_CONFIG_RETIRED);
54
109
  memo = null;
55
110
  return r;
56
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGrE,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAe,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;IACrC,IAAI,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE;IAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE;CACjD,CAAC;AAaF,oDAAoD;AACpD,IAAI,IAAI,GAA4B,IAAI,CAAC;AAEzC,0CAA0C;AAC1C,MAAM,UAAU,cAAc;IAC5B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QAClE,wDAAwD;QACxD,iCAAiC;QACjC,IAAI,GAAG;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAqC;SACrD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,CAAC,GAAG,UAAU,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,GAAG,IAAI,CAAC;IACZ,OAAO,CAAC,CAAC;AACX,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,WAAW,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IAC9D,IAAI,GAAG,IAAI,CAAC;IACZ,OAAO,CAAC,CAAC;AACX,CAAC;AAED;6DAC6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** 做菜能力的命令声明(权威源:一条命令的事实只住这里)。
2
+ *
3
+ * 本能力即 HELP 一级分组「做菜」。一条命令管一摊:
4
+ * · `chef.cooking.run`(查询命令):做菜模式/开始做菜/继续做菜/完成做菜四句唤醒词都进这一条。
5
+ * 处理函数仍在老分派层(`src/cli/cmd_read.ts`),本票只立声明不搬实现——行为不变,
6
+ * 实现下沉由做菜域端到端票接走(本文件不动,后续只加 run)。
7
+ *
8
+ * 标题与代表唤醒词取 HELP 现成说法,示例照 `packages/skill-chef/SKILL.md` 同命令行照抄。
9
+ */
10
+ import type { CommandSpec } from '../shared/command-spec.js';
11
+ /** 做菜能力的声明表:恰好导出一个声明数组(生成器只认这一个)。 */
12
+ export declare const COOK_COMMANDS: readonly CommandSpec[];
13
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cook/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,qCAAqC;AACrC,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAS/C,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** 做菜能力的命令声明(权威源:一条命令的事实只住这里)。
2
+ *
3
+ * 本能力即 HELP 一级分组「做菜」。一条命令管一摊:
4
+ * · `chef.cooking.run`(查询命令):做菜模式/开始做菜/继续做菜/完成做菜四句唤醒词都进这一条。
5
+ * 处理函数仍在老分派层(`src/cli/cmd_read.ts`),本票只立声明不搬实现——行为不变,
6
+ * 实现下沉由做菜域端到端票接走(本文件不动,后续只加 run)。
7
+ *
8
+ * 标题与代表唤醒词取 HELP 现成说法,示例照 `packages/skill-chef/SKILL.md` 同命令行照抄。
9
+ */
10
+ /** 做菜能力的声明表:恰好导出一个声明数组(生成器只认这一个)。 */
11
+ export const COOK_COMMANDS = [
12
+ {
13
+ kind: 'read',
14
+ key: 'chef.cooking.run',
15
+ shape: 'list',
16
+ title: '做菜模式',
17
+ wakeWord: '做菜模式',
18
+ example: 'chef-cmd-read chef.cooking.run --params \'{"name":"宫保虾球"}\'',
19
+ },
20
+ ];
21
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cook/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,qCAAqC;AACrC,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD;QACE,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,kBAAkB;QACvB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,6DAA6D;KACvE;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** 做菜能力门:能力对外只经这里(结构纪律铁律一、铁律五)。
2
+ *
3
+ * 对外两件:命令声明表与路由声明表。处理函数与取数实现不在这里,
4
+ * 本票只立声明;外边要用做菜能力的东西,只经这两个名字。
5
+ */
6
+ export { COOK_COMMANDS } from './commands.js';
7
+ export { COOK_ROUTES } from './routes.js';
8
+ export { buildCookingRun, runCookingRun } from './run.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cook/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,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** 做菜能力门:能力对外只经这里(结构纪律铁律一、铁律五)。
2
+ *
3
+ * 对外两件:命令声明表与路由声明表。处理函数与取数实现不在这里,
4
+ * 本票只立声明;外边要用做菜能力的东西,只经这两个名字。
5
+ */
6
+ export { COOK_COMMANDS } from './commands.js';
7
+ export { COOK_ROUTES } from './routes.js';
8
+ export { buildCookingRun, runCookingRun } from './run.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cook/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,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** 做菜能力的路由声明(唤醒词命中哪条命令,声明面唯一一处)。
2
+ *
3
+ * 四行对应 `src/policy/wakewords.ts` 里做菜四句唤醒词:做菜模式/开始做菜/继续做菜/完成做菜
4
+ * 都进 `chef.cooking.run`。`order` 取唤醒词表 1-based 下标(24–27),只保证跨域可比;
5
+ * 全表级顺序由场景表定,本文件不另立顺序。
6
+ * 命令行写法照 `packages/skill-chef/SKILL.md` 同命令示例:需菜名的带菜名(空库可跑的那一行)。
7
+ */
8
+ import type { RouteDecl } from '../shared/command-spec.js';
9
+ /** 做菜能力的路由声明表:恰好导出一个声明数组。 */
10
+ export declare const COOK_ROUTES: readonly RouteDecl[];
11
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/cook/routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,6BAA6B;AAC7B,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAyB3C,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** 做菜能力的路由声明(唤醒词命中哪条命令,声明面唯一一处)。
2
+ *
3
+ * 四行对应 `src/policy/wakewords.ts` 里做菜四句唤醒词:做菜模式/开始做菜/继续做菜/完成做菜
4
+ * 都进 `chef.cooking.run`。`order` 取唤醒词表 1-based 下标(24–27),只保证跨域可比;
5
+ * 全表级顺序由场景表定,本文件不另立顺序。
6
+ * 命令行写法照 `packages/skill-chef/SKILL.md` 同命令示例:需菜名的带菜名(空库可跑的那一行)。
7
+ */
8
+ /** 做菜能力的路由声明表:恰好导出一个声明数组。 */
9
+ export const COOK_ROUTES = [
10
+ {
11
+ order: 24,
12
+ wakeWord: '做菜模式',
13
+ key: 'chef.cooking.run',
14
+ cli: 'chef-cmd-read chef.cooking.run --params \'{"name":"宫保虾球"}\'',
15
+ },
16
+ {
17
+ order: 25,
18
+ wakeWord: '开始做菜',
19
+ key: 'chef.cooking.run',
20
+ cli: 'chef-cmd-read chef.cooking.run --params \'{"name":"宫保虾球"}\'',
21
+ },
22
+ {
23
+ order: 26,
24
+ wakeWord: '继续做菜',
25
+ key: 'chef.cooking.run',
26
+ cli: 'chef-cmd-read chef.cooking.run --params \'{"name":"宫保虾球"}\'',
27
+ },
28
+ {
29
+ order: 27,
30
+ wakeWord: '完成做菜',
31
+ key: 'chef.cooking.run',
32
+ cli: 'chef-cmd-read chef.cooking.run --params \'{"name":"宫保虾球"}\'',
33
+ },
34
+ ];
35
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/cook/routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,WAAW,GAAyB;IAC/C;QACE,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,kBAAkB;QACvB,GAAG,EAAE,6DAA6D;KACnE;IACD;QACE,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,kBAAkB;QACvB,GAAG,EAAE,6DAA6D;KACnE;IACD;QACE,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,kBAAkB;QACvB,GAAG,EAAE,6DAA6D;KACnE;IACD;QACE,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,kBAAkB;QACvB,GAAG,EAAE,6DAA6D;KACnE;CACF,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** 做菜能力的命令处理(`chef.cooking.run`)+ 本域独占的视图装配。
2
+ *
3
+ * 老分派层(`src/cli/cmd_read.ts`)分支逐字节下沉:只改 import 出处,判定与装配一字不动。
4
+ * `buildCookingRun`(原 `src/render/views.ts`)只被本域调用,按“写不出的留回域目录”搬入本文件;
5
+ * 旧址改转出(搬迁债务,见 `src/render/index.ts`)。
6
+ */
7
+ import type { ChefDb } from '../fetch/db.js';
8
+ import type { CookingStep, RecipeHistoryStats, RecipeItem } from '../render/views.js';
9
+ export declare function buildCookingRun(args: {
10
+ recipe: RecipeItem;
11
+ steps: CookingStep[];
12
+ servings?: number;
13
+ history?: RecipeHistoryStats | null;
14
+ }): {
15
+ items: CookingStep[];
16
+ total: number;
17
+ recipe: RecipeItem;
18
+ servingsNote: string;
19
+ historyHint: string;
20
+ steps: CookingStep[];
21
+ };
22
+ /** 跑 `chef.cooking.run`:取单菜全貌+份数放大+历史提示(list 形)。 */
23
+ export declare function runCookingRun(handle: ChefDb, params: Record<string, unknown>): unknown;
24
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cook/run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMtF,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACrC,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,CAY/H;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAmBtF"}
@@ -0,0 +1,46 @@
1
+ /** 做菜能力的命令处理(`chef.cooking.run`)+ 本域独占的视图装配。
2
+ *
3
+ * 老分派层(`src/cli/cmd_read.ts`)分支逐字节下沉:只改 import 出处,判定与装配一字不动。
4
+ * `buildCookingRun`(原 `src/render/views.ts`)只被本域调用,按“写不出的留回域目录”搬入本文件;
5
+ * 旧址改转出(搬迁债务,见 `src/render/index.ts`)。
6
+ */
7
+ import { getRecipeDetail, historyStats } from '../fetch/db.js';
8
+ import { toRecipeItem } from '../render/views.js';
9
+ import { needServings, resolveNameOrId } from '../shared/slots.js';
10
+ // 开做 list:items 为步骤(内联食材)+ total;recipe/份数放大说明/历史提示作扩展字段(list 形只校验 items/total)。
11
+ // 原 `src/render/views.ts`,本域独占。
12
+ export function buildCookingRun(args) {
13
+ const base = args.recipe.servings > 0 ? args.recipe.servings : 2;
14
+ const servings = args.servings ?? base;
15
+ const factor = Math.round((servings / base) * 100) / 100;
16
+ const servingsNote = servings === base
17
+ ? '按原份量 ' + base + ' 人份备料'
18
+ : '已按 ' + servings + ' 人份放大(原 ' + base + ' 人份,倍率 ' + factor + ',食材用量同倍)';
19
+ const h = args.history;
20
+ 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 };
24
+ }
25
+ /** 跑 `chef.cooking.run`:取单菜全貌+份数放大+历史提示(list 形)。 */
26
+ export function runCookingRun(handle, params) {
27
+ const servings = needServings(params);
28
+ const detail = getRecipeDetail(handle, resolveNameOrId(params));
29
+ 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]
37
+ .sort((a, b) => a.sequence - b.sequence)
38
+ .map((s) => ({
39
+ sequence: s.sequence, action: s.action, duration_minutes: s.duration_minutes,
40
+ heat_level: s.heat_level, temperature: s.temperature, expected_result: s.expected_result,
41
+ ingredients: scaled,
42
+ }));
43
+ const history = historyStats(handle, detail.recipe.id);
44
+ return buildCookingRun({ recipe: toRecipeItem(detail.recipe), steps, servings, history });
45
+ }
46
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cook/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** 数据管理能力的命令声明(空):本域暂无自有 key。
2
+ *
3
+ * 本能力即 HELP 一级分组「数据管理」。数据管理域的三张卡(体检/批量改/备份)中,
4
+ * 可路由的两句(`体检`→`kind: 'quality'`、`备份`→`kind: 'backup'`)走 `chef.history.query`,
5
+ * 那条命令的事实住历史能力(`src/history/commands.ts`)——本域不另立第二份声明(铁律二)。
6
+ * 空数组仍是「恰好一个声明数组」(生成器认它为一域,来源域名单里有 `data`),
7
+ * 数据管理端到端票接入自有 key 时再填。
8
+ */
9
+ import type { CommandSpec } from '../shared/command-spec.js';
10
+ /** 数据管理能力的声明表:恰好导出一个声明数组(生成器只认这一个;本域暂空)。 */
11
+ export declare const DATA_COMMANDS: readonly CommandSpec[];
12
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ /** 数据管理能力的命令声明(空):本域暂无自有 key。
2
+ *
3
+ * 本能力即 HELP 一级分组「数据管理」。数据管理域的三张卡(体检/批量改/备份)中,
4
+ * 可路由的两句(`体检`→`kind: 'quality'`、`备份`→`kind: 'backup'`)走 `chef.history.query`,
5
+ * 那条命令的事实住历史能力(`src/history/commands.ts`)——本域不另立第二份声明(铁律二)。
6
+ * 空数组仍是「恰好一个声明数组」(生成器认它为一域,来源域名单里有 `data`),
7
+ * 数据管理端到端票接入自有 key 时再填。
8
+ */
9
+ /** 数据管理能力的声明表:恰好导出一个声明数组(生成器只认这一个;本域暂空)。 */
10
+ export const DATA_COMMANDS = [];
11
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +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"}
@@ -0,0 +1,9 @@
1
+ /** 数据管理能力门:能力对外只经这里(结构纪律铁律一、铁律五)。
2
+ *
3
+ * 对外两件:命令声明表(暂空,事实住 `history`)与路由声明表。处理函数与取数实现不在这里,
4
+ * 本票只立声明;外边要用数据管理能力的东西,只经这两个名字。
5
+ */
6
+ export { DATA_COMMANDS } from './commands.js';
7
+ export { DATA_ROUTES } from './routes.js';
8
+ export { healthCheck, runDataQuery } from './run-query.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,9 @@
1
+ /** 数据管理能力门:能力对外只经这里(结构纪律铁律一、铁律五)。
2
+ *
3
+ * 对外两件:命令声明表(暂空,事实住 `history`)与路由声明表。处理函数与取数实现不在这里,
4
+ * 本票只立声明;外边要用数据管理能力的东西,只经这两个名字。
5
+ */
6
+ export { DATA_COMMANDS } from './commands.js';
7
+ export { DATA_ROUTES } from './routes.js';
8
+ export { healthCheck, runDataQuery } from './run-query.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,12 @@
1
+ /** 数据管理能力的路由声明(唤醒词命中哪条命令,声明面唯一一处)。
2
+ *
3
+ * 一行:`备份`(#767 资产已定去向 `chef.history.query`/`kind: 'backup'`,但尚未入 `WAKE_TABLE`,
4
+ * 故 `order: 0` 标记待接入)。key 名是引用(事实住 `src/history/commands.ts`),本处不定义它。
5
+ * `体检`不行于此:它的短语→key 映射票 1 已声明在 `src/history/routes.ts`(一事一处,不重复声明),
6
+ * kind 级切分(quality 归本域实现)由入口注册表做,见 `src/data/run-query.ts`。
7
+ * 命令行写法照同 key 同 kind 的既有行类比(`kind` 透传,空库可跑的那一行)。
8
+ */
9
+ import type { RouteDecl } from '../shared/command-spec.js';
10
+ /** 数据管理能力的路由声明表:恰好导出一个声明数组。 */
11
+ export declare const DATA_ROUTES: readonly RouteDecl[];
12
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/data/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,+BAA+B;AAC/B,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAQ3C,CAAC"}
@@ -0,0 +1,19 @@
1
+ /** 数据管理能力的路由声明(唤醒词命中哪条命令,声明面唯一一处)。
2
+ *
3
+ * 一行:`备份`(#767 资产已定去向 `chef.history.query`/`kind: 'backup'`,但尚未入 `WAKE_TABLE`,
4
+ * 故 `order: 0` 标记待接入)。key 名是引用(事实住 `src/history/commands.ts`),本处不定义它。
5
+ * `体检`不行于此:它的短语→key 映射票 1 已声明在 `src/history/routes.ts`(一事一处,不重复声明),
6
+ * kind 级切分(quality 归本域实现)由入口注册表做,见 `src/data/run-query.ts`。
7
+ * 命令行写法照同 key 同 kind 的既有行类比(`kind` 透传,空库可跑的那一行)。
8
+ */
9
+ /** 数据管理能力的路由声明表:恰好导出一个声明数组。 */
10
+ export const DATA_ROUTES = [
11
+ {
12
+ // 待接入:`备份`未入 WAKE_TABLE(运行时唤醒词未命中),先占路由行,域票接入时把 order 填实。
13
+ order: 0,
14
+ wakeWord: '备份',
15
+ key: 'chef.history.query',
16
+ cli: 'chef-cmd-read chef.history.query --params \'{"kind":"backup"}\'',
17
+ },
18
+ ];
19
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/data/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,+BAA+B;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAyB;IAC/C;QACE,0DAA0D;QAC1D,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,oBAAoB;QACzB,GAAG,EAAE,iEAAiE;KACvE;CACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** 数据管理能力的查处理(`chef.history.query` 的 quality/backup 两 kind)+ 本域独占的体检取数。
2
+ *
3
+ * 老分派层(`src/cli/cmd_read.ts`)`chef.history.query` 分支中 quality/backup 两路逐字节下沉:
4
+ * 只改 import 出处,判定与装配一字不动。timeline/stats 两路住历史域
5
+ * (`src/history/run-query.ts`);kind 路由由入口注册表做(非法 kind 入口已拦,落不到这里)。
6
+ * `healthCheck`(原 `src/fetch/db.ts`)只被本域调用(backup kind),按“写不出的留回域目录”
7
+ * 搬入本文件;旧址改转出(搬迁债务,见 `src/fetch/index.ts`)。
8
+ */
9
+ import type { ChefDb, HealthIssue } from '../fetch/db.js';
10
+ /** 库体检:无食材/无步骤/缺火候/从未做过四档问题(无异常即空数组,由调用方拼 ok 条)。
11
+ * 原 `src/fetch/db.ts`,本域独占。 */
12
+ export declare function healthCheck(h: ChefDb): HealthIssue[];
13
+ /** 跑 `chef.history.query` 的 quality/backup:`kind` 由入口注册表算好下传,本函数只做本域两路分支。 */
14
+ export declare function runDataQuery(handle: ChefDb, params: Record<string, unknown>, kind: string): unknown;
15
+ //# sourceMappingURL=run-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-query.d.ts","sourceRoot":"","sources":["../../src/data/run-query.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK1D;+BAC+B;AAC/B,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAiBpD;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA6BnG"}
@@ -0,0 +1,73 @@
1
+ /** 数据管理能力的查处理(`chef.history.query` 的 quality/backup 两 kind)+ 本域独占的体检取数。
2
+ *
3
+ * 老分派层(`src/cli/cmd_read.ts`)`chef.history.query` 分支中 quality/backup 两路逐字节下沉:
4
+ * 只改 import 出处,判定与装配一字不动。timeline/stats 两路住历史域
5
+ * (`src/history/run-query.ts`);kind 路由由入口注册表做(非法 kind 入口已拦,落不到这里)。
6
+ * `healthCheck`(原 `src/fetch/db.ts`)只被本域调用(backup kind),按“写不出的留回域目录”
7
+ * 搬入本文件;旧址改转出(搬迁债务,见 `src/fetch/index.ts`)。
8
+ */
9
+ import { listRecipes, qAll, queryHistory } from '../fetch/db.js';
10
+ import { ChefFetchError, ChefPolicyError } from '../fetch/errors.js';
11
+ import { buildHistoryQuery } from '../render/index.js';
12
+ /** 库体检:无食材/无步骤/缺火候/从未做过四档问题(无异常即空数组,由调用方拼 ok 条)。
13
+ * 原 `src/fetch/db.ts`,本域独占。 */
14
+ export function healthCheck(h) {
15
+ const issues = [];
16
+ try {
17
+ const noIng = qAll(h, "SELECT r.name AS name FROM recipes r LEFT JOIN ingredients i ON i.recipe_id = r.id WHERE i.id IS NULL AND r.status != '已废弃'");
18
+ for (const r of noIng)
19
+ issues.push({ level: 'warn', message: '无食材:' + String(r.name ?? '') });
20
+ const noStep = qAll(h, "SELECT r.name AS name FROM recipes r LEFT JOIN cooking_steps s ON s.recipe_id = r.id WHERE s.id IS NULL AND r.status != '已废弃'");
21
+ for (const r of noStep)
22
+ issues.push({ level: 'warn', message: '无步骤:' + String(r.name ?? '') });
23
+ const noHeat = qAll(h, "SELECT r.name AS name, s.sequence AS seq FROM cooking_steps s JOIN recipes r ON r.id = s.recipe_id WHERE (s.heat_level IS NULL OR s.heat_level = '') AND r.status != '已废弃'");
24
+ for (const r of noHeat)
25
+ issues.push({ level: 'warn', message: '步骤缺火候:' + String(r.name ?? '') + '第' + String(r.seq ?? '') + '步' });
26
+ const never = qAll(h, "SELECT r.name AS name FROM recipes r LEFT JOIN recipe_history hh ON hh.recipe_id = r.id WHERE hh.id IS NULL AND r.status != '已废弃'");
27
+ for (const r of never)
28
+ issues.push({ level: 'info', message: '从未做过:' + String(r.name ?? '') });
29
+ }
30
+ catch (e) {
31
+ if (e instanceof ChefFetchError)
32
+ throw e;
33
+ throw new ChefFetchError('CHEF_DB_UNREADABLE', '体检查询失败', { cause: e });
34
+ }
35
+ issues.sort((a, b) => (a.level < b.level ? -1 : a.level > b.level ? 1 : String(a.message ?? '').localeCompare(String(b.message ?? ''), 'zh')));
36
+ return issues;
37
+ }
38
+ /** 跑 `chef.history.query` 的 quality/backup:`kind` 由入口注册表算好下传,本函数只做本域两路分支。 */
39
+ export function runDataQuery(handle, params, kind) {
40
+ void params;
41
+ if (kind === 'quality') {
42
+ const recipes = listRecipes(handle);
43
+ const items = recipes.map((r) => {
44
+ const rows = queryHistory(handle, r.id);
45
+ let total = 0;
46
+ let rated = 0;
47
+ let low = 0;
48
+ for (const h of rows) {
49
+ if (h.rating !== null && h.rating !== undefined) {
50
+ total += h.rating;
51
+ rated += 1;
52
+ if (h.rating < 3)
53
+ low += 1;
54
+ }
55
+ }
56
+ const avg = rated ? Math.round((total / rated) * 10) / 10 : null;
57
+ return {
58
+ recipe_id: r.id, name: r.name, count: rows.length, avgRating: avg, lowCount: low,
59
+ note: rated === 0 ? '暂无评分' : avg < 3 ? '口碑偏低,建议改良' : '口碑稳定',
60
+ };
61
+ });
62
+ return buildHistoryQuery('quality', items);
63
+ }
64
+ if (kind === 'backup') {
65
+ // 取数层无 exportAll:healthCheck 体检问题作条目统一 list;无异常则单条 ok。
66
+ const issues = healthCheck(handle);
67
+ const items = issues.length ? issues.map((i) => ({ level: i.level, message: i.message ?? '' })) : [{ level: 'ok', message: '库自检无异常' }];
68
+ return buildHistoryQuery('backup', items);
69
+ }
70
+ // 不可达:入口注册表已拦过非法 kind(原文分支尾 fail(2) 同报文,归用法错 exit 2)。
71
+ throw new ChefPolicyError('POLICY_BAD_INPUT', 'history.query 只接受 kind=timeline/stats/quality/backup');
72
+ }
73
+ //# sourceMappingURL=run-query.js.map