skill-chef 0.1.0 → 0.2.1

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 (48) hide show
  1. package/SKILL.md +108 -0
  2. package/dist/cli/cmd_read.js +79 -19
  3. package/dist/cli/cmd_read.js.map +1 -1
  4. package/dist/cli/config.d.ts +16 -0
  5. package/dist/cli/config.d.ts.map +1 -0
  6. package/dist/cli/config.js +84 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/health.d.ts +7 -0
  9. package/dist/cli/health.d.ts.map +1 -0
  10. package/dist/cli/health.js +32 -0
  11. package/dist/cli/health.js.map +1 -0
  12. package/dist/config.d.ts +41 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +62 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/fetch/index.d.ts +1 -1
  17. package/dist/fetch/index.d.ts.map +1 -1
  18. package/dist/fetch/index.js +1 -1
  19. package/dist/fetch/index.js.map +1 -1
  20. package/dist/fetch/paths.d.ts +5 -3
  21. package/dist/fetch/paths.d.ts.map +1 -1
  22. package/dist/fetch/paths.js +19 -24
  23. package/dist/fetch/paths.js.map +1 -1
  24. package/dist/health.d.ts +41 -0
  25. package/dist/health.d.ts.map +1 -0
  26. package/dist/health.js +466 -0
  27. package/dist/health.js.map +1 -0
  28. package/dist/help/helpFile.d.ts +78 -0
  29. package/dist/help/helpFile.d.ts.map +1 -0
  30. package/dist/help/helpFile.js +218 -0
  31. package/dist/help/helpFile.js.map +1 -0
  32. package/dist/help/index.d.ts +4 -0
  33. package/dist/help/index.d.ts.map +1 -1
  34. package/dist/help/index.js +4 -0
  35. package/dist/help/index.js.map +1 -1
  36. package/dist/help/manifest.d.ts +11 -0
  37. package/dist/help/manifest.d.ts.map +1 -0
  38. package/dist/help/manifest.js +38 -0
  39. package/dist/help/manifest.js.map +1 -0
  40. package/dist/help/output.d.ts +17 -0
  41. package/dist/help/output.d.ts.map +1 -0
  42. package/dist/help/output.js +54 -0
  43. package/dist/help/output.js.map +1 -0
  44. package/dist/help/sceneData.d.ts +41 -0
  45. package/dist/help/sceneData.d.ts.map +1 -0
  46. package/dist/help/sceneData.js +182 -0
  47. package/dist/help/sceneData.js.map +1 -0
  48. package/package.json +7 -4
@@ -0,0 +1,218 @@
1
+ /** #214 · 私家大厨 HELP 的**渲染接线**:内容资产(#213 的 `sceneData.ts`)+ 页面级派生 →
2
+ * 通用 help 模板(`base-paint/help-shell` 的 `renderHelpShellHtml`)全页 HTML。
3
+ *
4
+ * 走 **A 路**(与 bill/calorie/memo/schedule 四家同路),**不自持页面副本**:模板源恒在
5
+ * `packages/base-render/assets/help-template.html`(不进本包 `files`);要改渲染规则得改源再跑
6
+ * `pnpm --filter base-paint gen:help-shell`。
7
+ *
8
+ * ## 三件出口各碰什么(谁碰 IO)
9
+ *
10
+ * - `buildChefHelpFileData(now, opts)`:**纯函数、零 IO**(`now` 显式传入 ⇒ 同一 `now` 两次调用逐字节一致);
11
+ * - `buildChefHelpDelivery(dbPath, now)`:**只读**探针(`existsSync` 一次)+ 交付产物 `{html, target, index}`
12
+ * (`index` 是缺省支的信封载荷:域级索引,与页面**同一次装配、同一份资产**算出来,出口不再第二次读资产);
13
+ * - `buildChefLookupLanding(dbPath)`:速查支的落点**意图**(同目录、另一个主体;**不渲染页面**——速查页由
14
+ * 出口拿信封走本技能自己的 `templates/help.html` 渲染,落点与载荷因此不必互相等);
15
+ * - `deliverChefHelp(...)`(`src/help/output.ts`):唯一落盘点,写盘走共用件 `base-paint/save-html`。
16
+ * CLI 出口(`src/cli/cmd_read.ts` 的 `chef.help.lookup` 分支)由 #215 接上,本件不自持 argv 口径。
17
+ *
18
+ * ## 页面级五项怎么取(裁决 6「逐项照记账」;逐条实测留证)
19
+ *
20
+ * - `skill_name`/`title`/`version`:取**内容资产**的公开导出 `buildChefSceneData()`(同一件事只有一个
21
+ * 定义地 ⇒ 本件不写第二份副本,照 memo `src/help/helpFile.ts:179-181` 的同一理);
22
+ * - `subtitle`:本件派生(照 bill `src/render/helpFile.ts:102-106` 的式子,计数全是数出来的、不写死);
23
+ * - `contact`:老 chef 件**无对应物**(老家是 `window.__HELP__` 血统,载荷里没有 contact 块)⇒
24
+ * 照记账取值(bill `:46-53`/schedule `:52-59` 是同一份三项)。
25
+ *
26
+ * ⚠️ `title` 有一处**就地摆正**(本票):#213 首版照 t2 §七 草案取「私家大厨 · 能力速查」,票 6 票面要求
27
+ * 老家产物原文「私家大厨 HELP · 能力速查」(实测留档 `.scratch/chef-help/A1-legacy-chef-help-skeleton.md:340`
28
+ * /`:398`,即老件 `<title>`)⇒ 已改在**生成器声明处**(`scripts/gen-help-assets.mjs`)并重新生成资产,
29
+ * 本件不自造第二份字面量。
30
+ *
31
+ * ## 只读页不建库(票面第 2 条)
32
+ *
33
+ * 老入口 `src/cli/cmd_read.ts:98-99` 在 `:327` 的 help 分支**之前**就 `openChefDb()`
34
+ * (`src/fetch/db.ts:182` 的 DDL 会把库自愈建出来)⇒ 今天「说一句 help」就在磁盘上建出一个库。
35
+ * 本件**不许**走那条路:初始化状态只由 `existsSync(dbPath)` 判(口径=bill `src/cli/cmd_read.ts:83-86`/
36
+ * schedule `:83-86`,亦即老 `render_help._is_initialized`),判定本身出异常 ⇒ 当**未初始化**
37
+ * (横幅照显:误显的代价小于误藏)。全程不建目录、不开 SQLite。
38
+ *
39
+ * ## `subtitle` 与 `contact` 的共享层实测(如实记账,不做辩护)
40
+ *
41
+ * - `subtitle` 在 A 路**读了不渲染**:模板 `var SUBTITLE = HELP.subtitle || ''`
42
+ * (`assets/help-template.html:1650`)之后全文零引用 ⇒ 这一项写什么都看不见。**这是共享层的缺陷**,
43
+ * B 路 `src/help.ts:403` 的注释逐字写着「`subtitle` 必须渲染,F3 读而不渲染属缺陷」。
44
+ * 本件按裁决 6 照记账取值,**不是**「反正不渲染」才随便取的;
45
+ * - `contact` 在 A 路**真渲染**(关于 Tab 第一段)。
46
+ *
47
+ * ## 路由字段:**不需要**(本票实测的结论,证据在此)
48
+ *
49
+ * `SceneData` 的形状以 `packages/base-render/src/spec/help.ts` 为权威:`SCENE_DATA_SCHEMA` 的
50
+ * `scenes[].properties` 只有 `id`/`title`/`wake_word`/`types`/`status`/`prompt_template`/
51
+ * `editable_fields` 七键,且 `additionalProperties: false`(`:151-189`)——**没有**任何指向命令/CLI 的字段。
52
+ * 四家兄弟的装配层同样一律不传路由字段(memo `:96-107` 反而要**剥掉**资产侧的 `aliases`)。
53
+ * chef 侧「短语 → 命令」的路由另有其位:`src/help/lookup.ts` 的 `buildHelpLookup()`(`WAKE_TABLE` 唯一上游),
54
+ * 它出的是**速查信封**的数据、与页面载荷无关 ⇒ 本件**不补**路由字段。
55
+ */
56
+ import { existsSync } from 'node:fs';
57
+ import { dirname, resolve } from 'node:path';
58
+ import { renderHelpShellHtml } from 'base-paint/help-shell';
59
+ import { buildChefSceneData } from './sceneData.js';
60
+ import { helpDirSegments, helpFileStem, lookupFileStem } from './manifest.js';
61
+ import { ChefRenderError } from '../render/errors.js';
62
+ /** 落点值由 #215 收进 `src/help/manifest.ts`(A2)——本件从它 `import`,**不落第二处**(铁律二)。
63
+ * 时间戳格式与同秒递补一概不在本件(唯一定义地=共用件 `base-paint/save-html`)。 */
64
+ /** 首次使用横幅的 `prompt` 取自该场景的 `prompt_template`(单源,不抄第二份文案)。 */
65
+ const CHEF_HELP_INIT_SCENE_ID = 'first_use';
66
+ /** 联系作者三项(照记账 bill `:46-53`/schedule `:52-59`;老 chef 载荷无此块)。`url` 为真时模板渲染成 `<a>`。
67
+ * **不对外开出口**:要用它的是出口层,本件够用(导出面按铁律五收口)。 */
68
+ const CHEF_HELP_CONTACT = Object.freeze({
69
+ items: Object.freeze([
70
+ Object.freeze({ label: '邮箱', value: '975559549@qq.com' }),
71
+ Object.freeze({ label: 'GitHub', value: 'https://github.com/FeatherHunter/SKILLS', url: true }),
72
+ Object.freeze({ label: 'Issues', value: 'https://github.com/FeatherHunter/SKILLS/issues', url: true }),
73
+ ]),
74
+ copy_all: true,
75
+ });
76
+ /** 坏载荷一律抛本包渲染层错误(`code` 取既有码,不新增错误类、不改既有导出面;照 schedule 的取舍)。 */
77
+ function fail(message) {
78
+ throw new ChefRenderError('CHEF_BAD_PAYLOAD', message);
79
+ }
80
+ function isNonEmptyString(v) {
81
+ return typeof v === 'string' && v.length > 0;
82
+ }
83
+ /** 老 `%Y-%m-%d %H:%M` 等价物(本地时区、零填充;非法 Date 即坏参,不返空串)。 */
84
+ export function formatHelpMinute(now) {
85
+ if (!(now instanceof Date) || Number.isNaN(now.getTime())) {
86
+ fail('HELP 更新时间须为有效 Date(缺失阻断,不返空串)。');
87
+ }
88
+ const p = (n) => String(n).padStart(2, '0');
89
+ return String(now.getFullYear()) + '-' + p(now.getMonth() + 1) + '-' + p(now.getDate())
90
+ + ' ' + p(now.getHours()) + ':' + p(now.getMinutes());
91
+ }
92
+ /** 初始化状态:DB **文件存在**=已初始化;判定本身出异常 ⇒ `false`=横幅照显(fail-open)。
93
+ * **只读**,见件头「只读页不建库」。 */
94
+ function chefHelpInitialized(dbPath) {
95
+ try {
96
+ return existsSync(dbPath);
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ /** 横幅 `prompt` 的单源:按 id 在资产里找该场景(找不到即抛,不静默降级掉横幅)。 */
103
+ function initPromptFrom(groups) {
104
+ for (const g of groups) {
105
+ for (const sg of g.subgroups) {
106
+ for (const s of sg.scenes) {
107
+ if (s.id === CHEF_HELP_INIT_SCENE_ID) {
108
+ if (!isNonEmptyString(s.prompt_template)) {
109
+ fail('HELP 首次使用横幅缺 prompt:场景 ' + CHEF_HELP_INIT_SCENE_ID + ' 的 prompt_template 为空。');
110
+ }
111
+ return s.prompt_template;
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return fail('HELP 首次使用横幅缺 prompt:内容资产无场景 ' + CHEF_HELP_INIT_SCENE_ID + '。');
117
+ }
118
+ /** 全量 HELP JSON(5 必需键 + 两张可选键 `version`/`init_banner`;共享 help 模板运行时契约的超集)。
119
+ *
120
+ * `init_banner` **键常在**、显隐只走 `hidden`(载荷形状不随状态变,下游能断言同一个键集);
121
+ * `meta_blocks`(老家无此块;且用户裁 5「HELP 自身触发词不上页面」)与 `recommendations`
122
+ * (老 chef 页面无此键)**不传**——传了即第二真相源,漂移面无收益(照 calorie `:13` 的同一条理)。
123
+ *
124
+ * 返回类型**内联**、不另开导出(照 memo `:158-173`;本文件导出面按铁律五收到 ≤5)。 */
125
+ export function buildChefHelpFileData(now, opts = {}) {
126
+ const scene = buildChefSceneData();
127
+ const groups = scene.groups;
128
+ if (groups.length === 0)
129
+ fail('HELP 内容资产为空(CHEF_SCENES 无域)。');
130
+ const scenes = groups.reduce((n, g) => n + g.subgroups.reduce((m, sg) => m + sg.scenes.length, 0), 0);
131
+ if (scenes === 0)
132
+ fail('HELP 内容资产没有任何场景(二级组为空)。');
133
+ if (!isNonEmptyString(scene.skill_name) || !isNonEmptyString(scene.title)) {
134
+ fail('HELP 页面级缺 skill_name/title(内容资产不许留空)。');
135
+ }
136
+ // 技能数据世代取自资产的公开导出(`sceneData.ts` 有意只给 2 个导出 ⇒ 从它的返回值取,
137
+ // 不在本模块写第四份副本;值出自老载荷 `meta.version`,生成器 `:186` 逐字断言)。
138
+ if (!isNonEmptyString(scene.version))
139
+ fail('HELP 缺 version(内容资产没给技能数据世代)。');
140
+ const version = String(scene.version);
141
+ // `now` 非法在这里就炸,不把坏时间带进载荷。
142
+ const updatedAt = formatHelpMinute(now);
143
+ // 页头摘要行(照 bill `:102-106` 的式子):计数**全部派生**(域数/场景数),版本取资产。
144
+ // 只数「一级域 + 场景」两层:记账那一式也只数它的两级(7 功能域 · 74 场景),
145
+ // 组(chef 的 33 个二级组)在账单那一式里对应 `subgroups`,同样不进摘要行。
146
+ const subtitle = String(groups.length) + ' 功能域 · ' + String(scenes) + ' 场景 · 版本 '
147
+ + version + ' · 更新于 ' + updatedAt;
148
+ return Object.freeze({
149
+ skill_name: scene.skill_name,
150
+ title: scene.title,
151
+ subtitle,
152
+ contact: CHEF_HELP_CONTACT,
153
+ groups,
154
+ version,
155
+ init_banner: Object.freeze({
156
+ title: '🚀 第一次用私家大厨?',
157
+ subtitle: '从「首次使用」开始 — 检测环境、确认数据目录、建库、验证读写,全程零决策。完成初始化后,本区域将不再出现。',
158
+ button_text: '📋 复制初始化 prompt',
159
+ prompt: initPromptFrom(groups),
160
+ closable: true,
161
+ hidden: opts.initialized === true,
162
+ }),
163
+ });
164
+ }
165
+ /** 全量 HELP JSON → 全页 HTML(模板唯一实现=共享层 `base-paint/help-shell`;空分组抛 `missing-data`)。
166
+ *
167
+ * `HelpShellData`(`src/helpShell.ts:22-28`)只声明 5 键、运行时**全量透传**,且把 `subtitle`/`contact`
168
+ * 定为**必填**(`SceneData` 里这两项可选 ⇒ 直接把 `buildChefSceneData()` 喂进去会 tsc 报错);
169
+ * 本件产出的载荷是它的**超集**,在这一处收窄类型,**不改公共层**(照 memo `:213-220`/schedule `:228-235`)。 */
170
+ export function renderChefHelpHtml(data) {
171
+ const payload = data;
172
+ return renderHelpShellHtml(payload);
173
+ }
174
+ /** 落点目录(两个主体共用一个目录):`dbPath` 的**父目录** + manifest 的两段,`resolve` 成绝对路径
175
+ * (回执路径因此可用)。坏 `dbPath` 即抛,不返空落点。 */
176
+ /** 落点目录(两个主体共用一个目录):`dbPath` 的**父目录** + 配置里的段串(默认 `cook_html/help`,
177
+ * `#695` 起从配置文件取),`resolve` 成绝对路径(回执路径因此可用)。坏 `dbPath` 即抛,不返空落点。 */
178
+ function chefHelpDir(dbPath) {
179
+ if (!isNonEmptyString(dbPath))
180
+ fail('HELP 落点缺库路径(`dbPath` 须为非空字符串,缺失阻断不返空)。');
181
+ return resolve(dirname(dbPath), ...helpDirSegments());
182
+ }
183
+ /** 缺省支的信封载荷(`list` 形要 `items`):一行一个功能域,另附三个合计。
184
+ * 与 `{html, target}` **同一次装配**产出 ⇒ 出口不必为了载荷再读一遍内容资产。 */
185
+ function chefHelpIndex(groups) {
186
+ let sceneTotal = 0;
187
+ let subgroupTotal = 0;
188
+ const items = groups.map((g) => {
189
+ const sceneCount = g.subgroups.reduce((n, sg) => n + sg.scenes.length, 0);
190
+ sceneTotal += sceneCount;
191
+ subgroupTotal += g.subgroups.length;
192
+ return Object.freeze({
193
+ id: g.id, icon: g.icon ?? '', label: g.label,
194
+ subgroupCount: g.subgroups.length, sceneCount,
195
+ });
196
+ });
197
+ return Object.freeze({ items: Object.freeze(items), total: items.length, sceneTotal, subgroupTotal });
198
+ }
199
+ /** 交付产物:`{ html, target, index }`——出口拿 `deliverChefHelp({ explicit, target, html })` 落盘,
200
+ * 拿 `index` 当缺省支的信封载荷(`{...index, mode:'file', bytes}`)。
201
+ * `target` 是结构上的 `HtmlLanding`(`base-paint/save-html` 的 `{dir, stem}`),时间戳与同秒递补由共用件钉死。
202
+ * `dbPath` = **DB 文件路径**(`resolveDbPath()` 的返回值):落点取它的父目录,初始化探针也探它本人。 */
203
+ export function buildChefHelpDelivery(dbPath, now) {
204
+ const dir = chefHelpDir(dbPath);
205
+ const data = buildChefHelpFileData(now, { initialized: chefHelpInitialized(dbPath) });
206
+ return Object.freeze({
207
+ html: renderChefHelpHtml(data),
208
+ target: Object.freeze({ dir, stem: helpFileStem() }),
209
+ index: chefHelpIndex(data.groups),
210
+ });
211
+ }
212
+ /** 速查支的落点意图:与 HELP 文件**同目录、另一个主体**(分名,见 `manifest.ts` 的注释)。
213
+ * **不渲染页面**——速查页由出口拿信封走本技能自己的 `templates/help.html` 渲染(#215):
214
+ * 落点值与载荷因此不必互相等,本件也不预设那个页面的形状。 */
215
+ export function buildChefLookupLanding(dbPath) {
216
+ return Object.freeze({ dir: chefHelpDir(dbPath), stem: lookupFileStem() });
217
+ }
218
+ //# sourceMappingURL=helpFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpFile.js","sourceRoot":"","sources":["../../src/help/helpFile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;0DAC0D;AAE1D,6DAA6D;AAC7D,MAAM,uBAAuB,GAAG,WAAoB,CAAC;AAErD;2CAC2C;AAC3C,MAAM,iBAAiB,GAGnB,MAAM,CAAC,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,yCAAyC,EAAE,GAAG,EAAE,IAAa,EAAE,CAAC;QACxG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,gDAAgD,EAAE,GAAG,EAAE,IAAa,EAAE,CAAC;KAChH,CAAC;IACF,QAAQ,EAAE,IAAa;CACxB,CAAC,CAAC;AAqBH,gEAAgE;AAChE,SAAS,IAAI,CAAC,OAAe;IAC3B,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,GAAS;IACxC,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;UACnF,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;0BAC0B;AAC1B,SAAS,mBAAmB,CAAC,MAAc;IACzC,IAAI,CAAC;QAAC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAC5D,CAAC;AAED,qDAAqD;AACrD,SAAS,cAAc,CAAC,MAA6B;IACnD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,EAAE,KAAK,uBAAuB,EAAE,CAAC;oBACrC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC;wBACzC,IAAI,CAAC,yBAAyB,GAAG,uBAAuB,GAAG,wBAAwB,CAAC,CAAC;oBACvF,CAAC;oBACD,OAAO,CAAC,CAAC,eAAe,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,8BAA8B,GAAG,uBAAuB,GAAG,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;2DAM2D;AAC3D,MAAM,UAAU,qBAAqB,CAAC,GAAS,EAAE,OAA4B,EAAE;IAS7E,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,MAAM,MAAM,GAA0B,KAAK,CAAC,MAAM,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtG,IAAI,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAClD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAChD,CAAC;IACD,uDAAuD;IACvD,sDAAsD;IACtD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtC,2BAA2B;IAC3B,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,yDAAyD;IACzD,+CAA+C;IAC/C,mDAAmD;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW;UAC7E,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ;QACR,OAAO,EAAE,iBAAiB;QAC1B,MAAM;QACN,OAAO;QACP,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;YACzB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,wDAAwD;YAClE,WAAW,EAAE,iBAAiB;YAC9B,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;YAC9B,QAAQ,EAAE,IAAa;YACvB,MAAM,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI;SAClC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;;kFAIkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,IAA8C;IAC/E,MAAM,OAAO,GAAkB,IAAI,CAAC;IACpC,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;sCACsC;AACtC;qEACqE;AACrE,SAAS,WAAW,CAAC,MAAc;IACjC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC9E,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC,CAAC;AACxD,CAAC;AAYD;yDACyD;AACzD,SAAS,aAAa,CAAC,MAA6B;IAMlD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,UAAU,IAAI,UAAU,CAAC;QACzB,aAAa,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;QACpC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK;YAC5C,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU;SAC9C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;AACxG,CAAC;AAED;;;0EAG0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,GAAS;IAK7D,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC;QACpD,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED;;mCAEmC;AACnC,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC"}
@@ -1,2 +1,6 @@
1
1
  export { buildHelpLookup, lookupWake, type HelpHit } from './lookup.js';
2
+ export { CHEF_SCENES, buildChefSceneData } from './sceneData.js';
3
+ export { buildChefHelpFileData, buildChefHelpDelivery, renderChefHelpHtml, formatHelpMinute, buildChefLookupLanding } from './helpFile.js';
4
+ export { deliverChefHelp } from './output.js';
5
+ export type { ChefHtmlDelivery, HtmlLanding } from './output.js';
2
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/help/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/help/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC3I,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -1,2 +1,6 @@
1
1
  export { buildHelpLookup, lookupWake } from './lookup.js';
2
+ export { CHEF_SCENES, buildChefSceneData } from './sceneData.js';
3
+ // #214 渲染接线的转发出口(本件只做转发,不自造第二套页面);#215 补速查支的落点意图。
4
+ export { buildChefHelpFileData, buildChefHelpDelivery, renderChefHelpHtml, formatHelpMinute, buildChefLookupLanding } from './helpFile.js';
5
+ export { deliverChefHelp } from './output.js';
2
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/help/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/help/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjE,kDAAkD;AAClD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC3I,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** 落点子目录的默认值(=改造前的代码常量 `HELP_DIR_SEGMENTS` 两段;实测落点
2
+ * `D:\2Study\StudyNotes\.db\cook_html\help\`)。配置项 `html.dir` 空串即用它。 */
3
+ export declare const DEFAULT_HELP_DIR: "cook_html/help";
4
+ /** 落点子目录的段数组:配置 `html.dir`(空串=默认)拆成段。 */
5
+ export declare function helpDirSegments(): string[];
6
+ /** HELP 文件名主体(配置 `files.help`;产物=`<主体>_<YYYYMMDD_HHMMSS>[_N].html`,`_N` 从 1 起步)。 */
7
+ export declare function helpFileStem(): string;
8
+ /** 速查支的文件名主体:与 HELP 文件**分名**(照 #139 判法——别让用户按一个名字打开到另一个东西)。
9
+ * 老家只有 HELP 一支、无老名可循;取名照样板图 #143(记账的 `饼干记账_速查表`)的同一后缀。 */
10
+ export declare function lookupFileStem(): string;
11
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/help/manifest.ts"],"names":[],"mappings":"AAqBA;wEACwE;AACxE,eAAO,MAAM,gBAAgB,EAAG,gBAAyB,CAAC;AAE1D,yCAAyC;AACzC,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAG1C;AAED,oFAAoF;AACpF,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;2DAC2D;AAC3D,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,38 @@
1
+ /** #215 · 私家大厨 HELP 产物的**落点值**(本技能自己的三个值)。
2
+ *
3
+ * 形状照 `docs/skills/skill-chef/t236-structure-design.md` §1.2 的 A2 行:① 落点子目录;② HELP 文件名主体;
4
+ * ③ 速查支文件名主体。三个值都是**调用者能给的值**,装配层拿它拼出 `base-paint/save-html` 要的
5
+ * `{dir, stem}`(`src/help/helpFile.ts`)。
6
+ *
7
+ * **#695 起值的唯一事实源是配置文件**(`~/.ilife/chef.yaml`,默认值表住 `src/config.ts`):本件从配置取,
8
+ * 空串回落到默认;目录那一项是**段串**(`cook_html/help`),段数由值自己决定——老技能里大厨/作息是两段、
9
+ * 备忘/居家是一段,同一套配置形状要能表达「几段」。
10
+ *
11
+ * 命名与落盘的**逻辑**一概不在这里(维护者 2026-09-12 裁决 8:「放在 `base-paint` 吧,是绘制出 html 后的
12
+ * 相关操作」):时间戳格式 `YYYYMMDD_HHMMSS`、同秒 `_N` 递补、绝不静默覆盖,唯一定义地是
13
+ * 共用件 `saveHtmlFile`(`packages/base-render/src/output/saveHtml.ts`)。写在这里就是同一件事的
14
+ * 第二份定义(铁律二)。
15
+ *
16
+ * 老件对应物:`SKILLS\私家大厨\scripts\render_help.py` 的 `$CHEF_OUTPUT_DIR/help/私家大厨_HELP_<stamp>.html`。
17
+ * 落盘位置经用户 2026-09-12 改判:老目录 `CookHub/` 换成 `cook_html/`(与 `calorie_html/`/
18
+ * `biscuit_accountant_html/`/`home_manager_html/` 同形),`help/` 子目录保留;文件名主体不变。
19
+ */
20
+ import { loadChefConfig, splitDirSegments } from '../config.js';
21
+ /** 落点子目录的默认值(=改造前的代码常量 `HELP_DIR_SEGMENTS` 两段;实测落点
22
+ * `D:\2Study\StudyNotes\.db\cook_html\help\`)。配置项 `html.dir` 空串即用它。 */
23
+ export const DEFAULT_HELP_DIR = 'cook_html/help';
24
+ /** 落点子目录的段数组:配置 `html.dir`(空串=默认)拆成段。 */
25
+ export function helpDirSegments() {
26
+ const dir = loadChefConfig().values.html.dir;
27
+ return splitDirSegments(dir === '' ? DEFAULT_HELP_DIR : dir);
28
+ }
29
+ /** HELP 文件名主体(配置 `files.help`;产物=`<主体>_<YYYYMMDD_HHMMSS>[_N].html`,`_N` 从 1 起步)。 */
30
+ export function helpFileStem() {
31
+ return loadChefConfig().values.files.help;
32
+ }
33
+ /** 速查支的文件名主体:与 HELP 文件**分名**(照 #139 判法——别让用户按一个名字打开到另一个东西)。
34
+ * 老家只有 HELP 一支、无老名可循;取名照样板图 #143(记账的 `饼干记账_速查表`)的同一后缀。 */
35
+ export function lookupFileStem() {
36
+ return loadChefConfig().values.files.lookup;
37
+ }
38
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/help/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhE;wEACwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAyB,CAAC;AAE1D,yCAAyC;AACzC,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7C,OAAO,gBAAgB,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY;IAC1B,OAAO,cAAc,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;2DAC2D;AAC3D,MAAM,UAAU,cAAc;IAC5B,OAAO,cAAc,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type HtmlLanding, type HtmlReceipt } from 'base-paint/save-html';
2
+ /** 交付结果(`file` 态唯一;`path` 必为**绝对路径**,`bytes` 是**实际落盘**字节数)。
3
+ * =共用件回执的形状,别名指向它,不另立第二份定义(照 bill `src/output.ts:27`)。 */
4
+ export type ChefHtmlDelivery = HtmlReceipt;
5
+ /** 落点意图=共用件自己的形状,转出去给出口用(本件不另立定义)。 */
6
+ export type { HtmlLanding };
7
+ /** 交付一次 HELP HTML(**本包唯一落盘点**):见件头两态、`reuseMs` 与「不静默降级」的取舍。
8
+ *
9
+ * `reuseMs`(可选):给毫秒数即启用「窗口内复用」——已有那份不超龄就返回它,不新建。
10
+ * **各技能出口一律给缺省一天**(`HELP_REUSE_DEFAULT_HOURS` ⇒ 24 小时内只留一份;`reuseHours:0` 每次都新的)。只在 `target` 路上生效。 */
11
+ export declare function deliverChefHelp(input: {
12
+ explicit?: string;
13
+ target?: HtmlLanding;
14
+ html: string;
15
+ reuseMs?: number;
16
+ }): ChefHtmlDelivery;
17
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/help/output.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxF;2DAC2D;AAC3D,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE3C,sCAAsC;AACtC,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;uGAGuG;AACvG,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,gBAAgB,CAenB"}
@@ -0,0 +1,54 @@
1
+ /** #214 · 私家大厨 HELP 产物的**唯一落盘点**:`deliverChefHelp({explicit, target, html})` → `{mode, path, bytes}`。
2
+ *
3
+ * 落盘与命名归共用件 `base-paint/save-html` 的 `saveHtmlFile`(维护者 2026-09-12 裁决 8:「不应该是一个独立的
4
+ * base 包,放在 `base-paint` 吧,是绘制出 html 后的相关操作」;地图 #208 Q7 同轮裁「乙」=把「命名与落盘」
5
+ * 收成共用位):本件**不自持** `nextExclusiveCandidate`/`writeFileExclusiveWithRetry`——那两份
6
+ * (bill/calorie 各抄一份、逐行等价)正是铁律二禁止的「同一件事两份实现」。
7
+ *
8
+ * 本件是**本包唯一碰 `fs` 的 HELP 件**:`helpFile.ts` 只要渲染、不 import 本件;`base-paint/save-html`
9
+ * 走子路径出口 ⇒ 只要渲染的消费者不会被动吃进 `fs`(`base-paint` 的包根本身零文件系统依赖)。
10
+ *
11
+ * 两态(语义照 bill `src/output.ts:33-37`):
12
+ * - `explicit`(`--html <路径>`,用户逐字指定)→ **覆盖写**(共用件 `onExists:'overwrite'` + `file`:落点逐字、
13
+ * 不带时间戳、不递补),与该参数的既有口径一致;
14
+ * - `target`(`helpFile.buildChefHelpDelivery` 算出的落点意图)→ **独占创建 + 同秒递补**(共用件缺省
15
+ * `succession`:`wx` 首试,`EEXIST` 递增 `_N`;#128 的因果——「选名 → 覆盖写」两步无独占性,
16
+ * 并发同秒会互相覆盖,用户按回执路径可能打开另一次调用的产物);
17
+ * - 两者都给时 `explicit` 优先(用户指定胜过默认落点)。
18
+ *
19
+ * ## `reuseMs`:反复读时不再涨目录(**#245 起缺省启用,一天**)
20
+ *
21
+ * 给了窗口(毫秒)就「窗口内已有同一主体的一份 ⇒ 返回它、不新建」。**各技能出口一律给缺省一天**
22
+ * (`HELP_REUSE_DEFAULT_HOURS`,`--params` 的 `reuseHours` 可改;`0`=每次都落新的)——这是维护者
23
+ * 定的口径:「1 天内直接返回一份,不会再创建新的」。判据在共用件里按**本件自己产出的名字里的时间戳**算
24
+ * (不看 mtime),超龄那份不算命中 ⇒ 与未命中同路落一份新的(旧的留着当留档)。只在 `target` 路上生效;
25
+ * `explicit` 是用户逐字落点,不吃复用。
26
+ *
27
+ * 写失败**不静默降级**:目的地是「明确拿到文件」,写不进去就是真失败(出口走失败回执,票 7),
28
+ * 有意**不引入** calorie 的只读回退(写不进去就换一种交付形态)。错误**原样穿过**:
29
+ * 共用件的 `code`(`EEXIST`/`EINVAL`/`EIO`)就是它对外的契约,包一层只会把码吃掉。
30
+ */
31
+ import { basename, dirname, resolve } from 'node:path';
32
+ import { saveHtmlFile } from 'base-paint/save-html';
33
+ import { ChefRenderError } from '../render/errors.js';
34
+ /** 交付一次 HELP HTML(**本包唯一落盘点**):见件头两态、`reuseMs` 与「不静默降级」的取舍。
35
+ *
36
+ * `reuseMs`(可选):给毫秒数即启用「窗口内复用」——已有那份不超龄就返回它,不新建。
37
+ * **各技能出口一律给缺省一天**(`HELP_REUSE_DEFAULT_HOURS` ⇒ 24 小时内只留一份;`reuseHours:0` 每次都新的)。只在 `target` 路上生效。 */
38
+ export function deliverChefHelp(input) {
39
+ if (typeof input.html !== 'string' || input.html.length === 0) {
40
+ throw new ChefRenderError('CHEF_BAD_PAYLOAD', '[skill-chef] deliverChefHelp 缺 HTML 正文(缺失阻断,不写空页)。');
41
+ }
42
+ if (input.explicit !== undefined && input.explicit.length > 0) {
43
+ const abs = resolve(input.explicit);
44
+ return saveHtmlFile({ dir: dirname(abs), file: basename(abs), html: input.html, onExists: 'overwrite' });
45
+ }
46
+ if (input.target === undefined) {
47
+ throw new ChefRenderError('CHEF_BAD_PAYLOAD', '[skill-chef] deliverChefHelp 缺落点(`explicit` 与 `target` 至少给一个)');
48
+ }
49
+ const onExists = input.reuseMs === undefined ? undefined : { reuse: { byAge: input.reuseMs } };
50
+ return saveHtmlFile({
51
+ dir: input.target.dir, stem: input.target.stem, html: input.html, onExists,
52
+ });
53
+ }
54
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/help/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAsC,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAStD;;;uGAGuG;AACvG,MAAM,UAAU,eAAe,CAAC,KAK/B;IACC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,oDAAoD,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,+DAA+D,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IAC/F,OAAO,YAAY,CAAC;QAClB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ;KAC3E,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,41 @@
1
+ /** #213 · 私家大厨 HELP 内容资产:老骨架 48 卡 → 10 域/33 组/48 卡的 typed const。
2
+ *
3
+ * ⚠️ 机器生成,**禁手改**:由 `packages/skill-chef/scripts/gen-help-assets.mjs` 产出。
4
+ * 改内容=改生成器里的声明表(十域表/组→域归属表/字段映射),再跑
5
+ * `node packages/skill-chef/scripts/gen-help-assets.mjs`(`--check` 只比对不落盘)。
6
+ *
7
+ * 事实源(全程只读):
8
+ * ① 老技能 HELP 载荷 `.scratch/chef-help/legacy-chef-help-payload.json`(74,581 B);**以 `$.scenarios[]` 为准**——
9
+ * 载荷把同一批 48 条输出了两遍(`$.wake_words[].scenarios[]` 是第二遍视图,48/48 逐字相同),两遍不相加;
10
+ * ② `src/policy/wakewords.ts` 的 `WAKE_TABLE`(37 条 phrase):唤醒词单一事实源,本件的 chip 路由与
11
+ * 14 张卡的状态从它**派生**(`资产组名 − 表内 phrase`),不落第二份字面量。双向对账:表 37 ↔ 资产 33 组名;
12
+ * 资产有表中无 = 13 个老组名(→ 14 张 `'【待开发】'`);表中有资产无 = 17 条(4 条 HELP 自身触发词 +
13
+ * 13 条新表多出词——后者见 t2 §3.1/§5.1,本票资产按老骨架保持 48 卡、不含它们);
14
+ * ③ `docs/skills/skill-chef/t2-content-reconcile.md` §七 的 JSON 草案:形状起点,生成器已逐组/逐卡交叉复核。
15
+ * 摘要锁:载荷文件 sha256=c09f11d9ffa49e6b14c2ade094b5ab428f22fd440b2608442166e470db47d2ab
16
+ * 老 48 条 sha256=620653ed98c85acbeaf0ab646adf0ef48345f4d65d218a8d756f59f86757ae55
17
+ * 映射后 48 条 sha256=b87e504e2ecabccfcb9d7887e2a1153026bab6b882c9c068f29db93f82292d9f
18
+ *
19
+ * 与老骨架的**有意偏离**(四类,逐条对账见生成器头注释与 t2 §七):
20
+ * 1. `type`(单数、11 种字符串)→ `types`(复数数组):按 `+` 拆、去 `(过程型)` 这类括号注;
21
+ * 2. `dimensions`(42 键/80 条)→ `editable_fields`:键→`name`/`label`(逐字,不自造中文名),老值原文→`value`;
22
+ * **丢弃 1 条**=`data_export_backup` 的畸形键 `默认不含)`(值为 `null`,过不了 `value: string`);
23
+ * 同卡 `include_archived` 照 t2 丁类定案补 `hint`(「是否含已废弃(选填,默认不含)」);
24
+ * 3. `status`:老件 48/48 空串是老家缺陷,不照抄 ⇒ 13 个不在 `WAKE_TABLE` 的老组名下 **14 张卡**标
25
+ * `'【待开发】'`(卡面出「待开发」徽章),其余 34 张空串;
26
+ * 4. **不迁四项**:`result`(48/48;裁决「用户拿到的结果型 HTML 文件就是最好的执行结果」)/
27
+ * `html.command_cn`(与组名 48/48 逐字相同)/`html.template`(18 个老技能路径,新技能里一个不存在)/
28
+ * `html.data_source` + `variants`(96 处全空)。
29
+ *
30
+ * 本文件给 **2 个导出**:`CHEF_SCENES`(全量 `groups`,复用公共层 `base-paint` 的契约类型)与
31
+ * `buildChefSceneData()`(全量 `SceneData`)。页面级三项照裁决 6「逐项照记账」:`skill_name` 取老 `meta.skill`,
32
+ * `title` 取**老家产物原文**(`.scratch/chef-help/A1-legacy-chef-help-skeleton.md:340`/`:398` 实测的
33
+ * `<title>私家大厨 HELP · 能力速查</title>`;含技能名 ⇒ `composeDocTitle` 走「原样」支,标签页不重复技能名),
34
+ * `version` 取老载荷 `meta.version`=**技能数据世代**(非 npm 包版本;同值是巧合)。
35
+ */
36
+ import type { SceneData, SceneGroup } from 'base-paint';
37
+ /** 10 域/33 组/48 卡:域序=t2 §一 域序 1..10;组序=载荷 `$.wake_words[]` 序按域收组;卡序=载荷书写序。 */
38
+ export declare const CHEF_SCENES: readonly SceneGroup[];
39
+ /** 全量 `SceneData`(`base-paint` 的 `spec/help.ts` 契约形状;`subtitle`/`contact` 归装配层 #214)。 */
40
+ export declare function buildChefSceneData(): SceneData;
41
+ //# sourceMappingURL=sceneData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneData.d.ts","sourceRoot":"","sources":["../../src/help/sceneData.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,SAAS,UAAU,EAuI5C,CAAC;AAEF,yFAAyF;AACzF,wBAAgB,kBAAkB,IAAI,SAAS,CAO9C"}