skill-calorie 0.1.1 → 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 (144) hide show
  1. package/SKILL.md +207 -0
  2. package/dist/analysis/anomaly/common.d.ts.map +1 -1
  3. package/dist/analysis/anomaly/common.js +2 -1
  4. package/dist/analysis/anomaly/common.js.map +1 -1
  5. package/dist/analysis/cross.d.ts.map +1 -1
  6. package/dist/analysis/cross.js +3 -2
  7. package/dist/analysis/cross.js.map +1 -1
  8. package/dist/analysis/deficit.d.ts.map +1 -1
  9. package/dist/analysis/deficit.js +4 -0
  10. package/dist/analysis/deficit.js.map +1 -1
  11. package/dist/analysis/diet.js +2 -2
  12. package/dist/analysis/diet.js.map +1 -1
  13. package/dist/analysis/exercise.js +5 -5
  14. package/dist/analysis/exercise.js.map +1 -1
  15. package/dist/analysis/review.js +2 -2
  16. package/dist/analysis/review.js.map +1 -1
  17. package/dist/analysis/series.d.ts +7 -1
  18. package/dist/analysis/series.d.ts.map +1 -1
  19. package/dist/analysis/series.js +22 -6
  20. package/dist/analysis/series.js.map +1 -1
  21. package/dist/analysis/utils.d.ts +7 -0
  22. package/dist/analysis/utils.d.ts.map +1 -1
  23. package/dist/analysis/utils.js +7 -0
  24. package/dist/analysis/utils.js.map +1 -1
  25. package/dist/analysis/weightCompare3.js +2 -2
  26. package/dist/analysis/weightCompare3.js.map +1 -1
  27. package/dist/cli/cmd_read.d.ts +21 -3
  28. package/dist/cli/cmd_read.d.ts.map +1 -1
  29. package/dist/cli/cmd_read.js +480 -53
  30. package/dist/cli/cmd_read.js.map +1 -1
  31. package/dist/cli/keys.d.ts +89 -1
  32. package/dist/cli/keys.d.ts.map +1 -1
  33. package/dist/cli/keys.js +30 -0
  34. package/dist/cli/keys.js.map +1 -1
  35. package/dist/cli/write.d.ts +19 -1
  36. package/dist/cli/write.d.ts.map +1 -1
  37. package/dist/cli/write.js +148 -52
  38. package/dist/cli/write.js.map +1 -1
  39. package/dist/db/readonly.d.ts +3 -0
  40. package/dist/db/readonly.d.ts.map +1 -0
  41. package/dist/db/readonly.js +22 -0
  42. package/dist/db/readonly.js.map +1 -0
  43. package/dist/output.d.ts +82 -0
  44. package/dist/output.d.ts.map +1 -0
  45. package/dist/output.js +305 -0
  46. package/dist/output.js.map +1 -0
  47. package/dist/render/copy.d.ts +20 -0
  48. package/dist/render/copy.d.ts.map +1 -0
  49. package/dist/render/copy.js +36 -0
  50. package/dist/render/copy.js.map +1 -0
  51. package/dist/render/dietDocs.d.ts +45 -0
  52. package/dist/render/dietDocs.d.ts.map +1 -0
  53. package/dist/render/dietDocs.js +561 -0
  54. package/dist/render/dietDocs.js.map +1 -0
  55. package/dist/render/envelope.d.ts +32 -6
  56. package/dist/render/envelope.d.ts.map +1 -1
  57. package/dist/render/envelope.js +71 -0
  58. package/dist/render/envelope.js.map +1 -1
  59. package/dist/render/exercisePort.d.ts +161 -0
  60. package/dist/render/exercisePort.d.ts.map +1 -0
  61. package/dist/render/exercisePort.js +395 -0
  62. package/dist/render/exercisePort.js.map +1 -0
  63. package/dist/render/goal.d.ts.map +1 -1
  64. package/dist/render/goal.js +13 -2
  65. package/dist/render/goal.js.map +1 -1
  66. package/dist/render/goalPlate.d.ts +1 -1
  67. package/dist/render/goalPlate.d.ts.map +1 -1
  68. package/dist/render/goalPlate.js +5 -1
  69. package/dist/render/goalPlate.js.map +1 -1
  70. package/dist/render/helpCenter.d.ts +104 -0
  71. package/dist/render/helpCenter.d.ts.map +1 -0
  72. package/dist/render/helpCenter.js +386 -0
  73. package/dist/render/helpCenter.js.map +1 -0
  74. package/dist/render/html.d.ts +12 -0
  75. package/dist/render/html.d.ts.map +1 -1
  76. package/dist/render/html.js +21 -5
  77. package/dist/render/html.js.map +1 -1
  78. package/dist/render/index.d.ts +8 -1
  79. package/dist/render/index.d.ts.map +1 -1
  80. package/dist/render/index.js +5 -1
  81. package/dist/render/index.js.map +1 -1
  82. package/dist/render/nutritionPort.d.ts +89 -0
  83. package/dist/render/nutritionPort.d.ts.map +1 -0
  84. package/dist/render/nutritionPort.js +183 -0
  85. package/dist/render/nutritionPort.js.map +1 -0
  86. package/dist/render/nutritionPortDocs.d.ts +6 -0
  87. package/dist/render/nutritionPortDocs.d.ts.map +1 -0
  88. package/dist/render/nutritionPortDocs.js +317 -0
  89. package/dist/render/nutritionPortDocs.js.map +1 -0
  90. package/dist/render/photo.d.ts +6 -1
  91. package/dist/render/photo.d.ts.map +1 -1
  92. package/dist/render/photo.js +13 -4
  93. package/dist/render/photo.js.map +1 -1
  94. package/dist/render/planPlate.d.ts +2 -1
  95. package/dist/render/planPlate.d.ts.map +1 -1
  96. package/dist/render/planPlate.js +6 -1
  97. package/dist/render/planPlate.js.map +1 -1
  98. package/dist/render/receipt.d.ts +47 -1
  99. package/dist/render/receipt.d.ts.map +1 -1
  100. package/dist/render/receipt.js +67 -3
  101. package/dist/render/receipt.js.map +1 -1
  102. package/dist/render/sportDocs.d.ts +14 -0
  103. package/dist/render/sportDocs.d.ts.map +1 -0
  104. package/dist/render/sportDocs.js +540 -0
  105. package/dist/render/sportDocs.js.map +1 -0
  106. package/dist/render/sportPortDocs.d.ts +8 -0
  107. package/dist/render/sportPortDocs.d.ts.map +1 -0
  108. package/dist/render/sportPortDocs.js +468 -0
  109. package/dist/render/sportPortDocs.js.map +1 -0
  110. package/dist/render/templates.d.ts +4 -0
  111. package/dist/render/templates.d.ts.map +1 -0
  112. package/dist/render/templates.js +29 -0
  113. package/dist/render/templates.js.map +1 -0
  114. package/dist/render/trendDocs.d.ts +11 -0
  115. package/dist/render/trendDocs.d.ts.map +1 -0
  116. package/dist/render/trendDocs.js +445 -0
  117. package/dist/render/trendDocs.js.map +1 -0
  118. package/dist/render/trendMiscPort.d.ts +127 -0
  119. package/dist/render/trendMiscPort.d.ts.map +1 -0
  120. package/dist/render/trendMiscPort.js +277 -0
  121. package/dist/render/trendMiscPort.js.map +1 -0
  122. package/dist/render/trendMiscPortDocs.d.ts +10 -0
  123. package/dist/render/trendMiscPortDocs.d.ts.map +1 -0
  124. package/dist/render/trendMiscPortDocs.js +397 -0
  125. package/dist/render/trendMiscPortDocs.js.map +1 -0
  126. package/dist/render/wizardPort.d.ts +125 -0
  127. package/dist/render/wizardPort.d.ts.map +1 -0
  128. package/dist/render/wizardPort.js +393 -0
  129. package/dist/render/wizardPort.js.map +1 -0
  130. package/dist/render/wizardPortDocs.d.ts +6 -0
  131. package/dist/render/wizardPortDocs.d.ts.map +1 -0
  132. package/dist/render/wizardPortDocs.js +274 -0
  133. package/dist/render/wizardPortDocs.js.map +1 -0
  134. package/dist/triggers/routing.d.ts +141 -0
  135. package/dist/triggers/routing.d.ts.map +1 -0
  136. package/dist/triggers/routing.js +678 -0
  137. package/dist/triggers/routing.js.map +1 -0
  138. package/package.json +5 -3
  139. package/templates/diet.html +40 -0
  140. package/templates/exercise.html +40 -0
  141. package/templates/goal.html +40 -0
  142. package/templates/help.html +40 -0
  143. package/templates/home.html +40 -0
  144. package/templates/photo-gallery.html +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpCenter.d.ts","sourceRoot":"","sources":["../../src/render/helpCenter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,386 @@
1
+ /** #88 · HELP 速查台(取 F3 并回补 F1/F2 独有能力)· 数据模型 + 壳落地。
2
+ *
3
+ * 三条口径(逐条对齐 `docs/research/t88-plan.md` v2 + `.scratch/orchestrator/t88-acceptance.md`):
4
+ * 1. **运行期派生,不做 codegen**:唯一权威是 `TRIGGERS`(436 条,`triggers/index.ts:48`),
5
+ * 本模块只把它**投影**成 `SceneData`(10 分组/54 子功能/436 场景),落盘 JSON 会构成
6
+ * 第二真相源,故不产。
7
+ * 2. **零 base-render 改动**:壳恒走 `renderHelpShell`(`base-render/src/help.ts:675`,冻结签名),
8
+ * 本模块只提供 `sceneData` + `assets`,不新增契约面、不自造第二份模板/样式/运行时。
9
+ * 3. **展示面常量取 F3 逐字**:分组 label/图标序取 `render_help_center.py:44-53`(F3 十组),
10
+ * 子功能序取 `:61-69`;SoT `CATEGORIES`(`triggers/index.ts:19-33`)是**13 条**且 diet 展示名
11
+ * 为「饮食记录」——差异已登记台账 **L-18**(`docs/research/t88-impl-a.md` §5),故不写
12
+ * 「label ⊆ CATEGORIES」这类会自红的守卫。
13
+ *
14
+ * 逐场景 CLI 形态文本(Q11/R17/R32):壳的 `cliText(scene) = scene.id`(`help.ts:391-393`)恒读
15
+ * `Scene.id`,故 **id 就是卡面展示面**:
16
+ * - 414 条新场景取 `key`(=真实键,与 F3 逐字相等);
17
+ * - **22 条 legacy 取 `main_prompt.cli` 原文**(R1-7 解耦):F3 的 `legacy_{wake_word}` 会让卡面
18
+ * 显示并复制一条**不存在的命令**(`help.ts` 侧无该键),差异已登记台账 **L-19**。
19
+ *
20
+ * **#106 回补(Q11 第二半:「F3 丢了逐场景 CLI 展示」)**:卡面 id 之外,另在**详情层**
21
+ * (壳的 Sheet)逐场景发一条 `editable_fields` 行「可执行命令」=**#81 路由层的 exec CLI**
22
+ * (`calorie-cmd-read calorie.*`,341/436;见 `helpSceneCli`)。三点口径:
23
+ * 1. **槽位**=冻结面既有的 `SceneEditableField`(`{name,label,value}`),**不新增契约面**;
24
+ * 落点对齐旧 ADR-0008 实施规范「`data_source` → ✅ cli 块 → L4 直接显示」。
25
+ * 2. **内容取路由层、不取 `main_prompt.cli` 原文**:后者 **376/436** 是已不存在的
26
+ * `python scripts/render_*.py`(370)/`mavis`(3)/`mmx`(2)/裸键(1)命令,展示它
27
+ * 违背 ADR-0008「必须遵守 3」(可一键复制执行)。
28
+ * 3. **非 exec 的 95 条不发该行**(#81 裁定:out-of-scope 10/legacy-chain 85,无单命令入口),
29
+ * 不造占位文案;`text` 态不加该行(纯文本索引,且 #88 D-3 锁「text 尖括号集恒 {<N>}」)。
30
+ */
31
+ import { ASSET_WRAPPERS, HELP_SHELL_ID, buildStyleSheet, escapeHtml, renderHelpShell } from 'base-paint';
32
+ import { TRIGGERS } from '../triggers/index.js';
33
+ import { routesFor } from '../triggers/routing.js';
34
+ import { COPY_RUNTIME_JS } from './copy.js';
35
+ import { CalorieRenderError } from './errors.js';
36
+ import { CALORIE_TEMPLATES, loadTemplate } from './templates.js';
37
+ /** 换行(仓库口径:`String.fromCharCode(10)`,不写字面 `\n`)。 */
38
+ const LF = String.fromCharCode(10);
39
+ /** 速查台标题面(F3 `卡路里.html` payload 逐字:`skill_name`/`title`)。 */
40
+ export const HELP_SKILL_NAME = '卡路里';
41
+ export const HELP_TITLE = '唤醒词速查台';
42
+ /** 10 分组(**F3 序 + F3 逐字 label/图标**,`render_help_center.py:44-53`)。
43
+ *
44
+ * 与 SoT `CATEGORIES`(13 条)的差异:① 本表只含**有场景落点**的 10 组;② diet 展示名 F3 是
45
+ * 「饮食」而 SoT 是「饮食记录」(L-18);③ 图标 `⚙️ profile`(F3)vs `🛠 profile`(SoT)。
46
+ * 台账见 `docs/research/t88-impl-a.md` §5。
47
+ */
48
+ export const HELP_GROUPS = Object.freeze([
49
+ { id: 'home', icon: '🏠', label: '主页' },
50
+ { id: 'diet', icon: '🍚', label: '饮食' },
51
+ { id: 'weight', icon: '⚖️', label: '体重' },
52
+ { id: 'exercise', icon: '🏃', label: '运动' },
53
+ { id: 'workout', icon: '💪', label: '健身计划' },
54
+ { id: 'goal', icon: '🎯', label: '目标管理' },
55
+ { id: 'body_detail', icon: '🧬', label: '身体细节' },
56
+ { id: 'body_photo', icon: '📸', label: '身材照片' },
57
+ { id: 'profile', icon: '⚙️', label: '基础信息' },
58
+ { id: 'analysis', icon: '📊', label: '分析' },
59
+ ]);
60
+ /** 7 个分组的**子功能显式顺序**(逐字照抄 `render_help_center.py:61-69`;未列出的子功能按首次
61
+ * 出现序,`既有唤醒词` 恒最后)。 */
62
+ export const HELP_SUBFUNC_ORDER = Object.freeze({
63
+ '基础信息': ['设置资料', '看档案', '改资料'],
64
+ '目标管理': ['定目标', '看目标', '改目标'],
65
+ '身体细节': ['记身体细节', '看身体细节', '比身体细节', '删身体细节'],
66
+ '运动': ['记运动', '改运动', '看运动', '运动分析', '运动复盘'],
67
+ '身材照片': ['存身材照', '看身材照', '比身材照', '管身材照'],
68
+ '饮食': ['记饮食', '改饮食', '看饮食', '查食品', '看营养', '看排行', '饮食复盘', '餐别分布'],
69
+ '健身计划': ['定训练计划', '看训练计划', '改训练计划', '落地训练', '计划复盘', '安全检查'],
70
+ });
71
+ /** legacy 分组收口:`复盘` → `分析`(`render_help_center.py:56-58`)。 */
72
+ export const HELP_LEGACY_CATEGORY = Object.freeze({ '复盘': '分析' });
73
+ /** legacy 子功能名(F3 恒把旧版条目收在「既有唤醒词」子功能下)。 */
74
+ export const HELP_LEGACY_SUBGROUP = '既有唤醒词';
75
+ /* ── #106 · 逐场景「可执行命令」回补(Q11 第二半) ────────────────────────────────
76
+ *
77
+ * 数据来源=**#81 路由层**(`triggers/routing.ts` 的 `WAKE_ROUTES`;exec 桶 341 条,
78
+ * `docs/research/t81-exec-smoke.md` 全量实跑 exit 0)。单一真相:本模块不自造键、
79
+ * 不读 `main_prompt.cli` 原文、不做 `python → calorie-cmd-read` 的二次翻译。
80
+ */
81
+ /** 字段名(`data-field` 承载值);**恒本模块常量**,不写第二份字面量。 */
82
+ export const HELP_CLI_FIELD_NAME = 'cli';
83
+ /** 对外文案(对齐 ADR-0008「可一键复制执行」口径)。 */
84
+ export const HELP_CLI_FIELD_LABEL = '可执行命令';
85
+ /** 唤醒词 → 该场景的**可执行 CLI**;无 exec 路由(#81 的 95 条 non-exec)→ `null`。
86
+ *
87
+ * 记身材照一词三命中(`body_photo_add_single`/`_note`/`_batch`):路由层按唤醒词给键,
88
+ * 三条同唤醒词场景取到同一条 CLI——如实照搬路由层口径,差异见 `t106-*.md` 台账。
89
+ */
90
+ export function helpSceneCli(wakeWord) {
91
+ for (const route of routesFor(wakeWord)) {
92
+ if (route.kind === 'exec')
93
+ return route.cli;
94
+ }
95
+ return null;
96
+ }
97
+ /** 该唤醒词的 `editable_fields`(无 exec CLI 时返空数组=**不发字段**,不造空值行)。 */
98
+ function cliFields(wakeWord) {
99
+ const cli = helpSceneCli(wakeWord);
100
+ return cli === null ? [] : [{ name: HELP_CLI_FIELD_NAME, label: HELP_CLI_FIELD_LABEL, value: cli }];
101
+ }
102
+ /** `output_type` → 徽章(**必须发 `SceneTypeBadge{text,bg,fg}`**,E-2)。
103
+ *
104
+ * 三档配色逐字取 F3 运行时 `TYPE_DEFAULT`(`卡路里.html` 的 `var TYPE_DEFAULT`,脚本段;
105
+ * 本 session 复算:`结果/回执 → #e8f2ff/#0a63ce`、`过程 → #e2f7f5/#00897b`)。
106
+ * 只发字符串会走 CSS 默认色=丢三档色(`help.ts:451-459`),故恒发对象。
107
+ * H-01 禁色表(`#0a84ff/#af52de/#ff375f/#0071e3`)**不含**本表两色(P-3 白名单断言)。
108
+ */
109
+ export const HELP_TYPE_BADGES = Object.freeze({
110
+ process: { text: '过程', bg: '#e2f7f5', fg: '#00897b' },
111
+ result: { text: '结果', bg: '#e8f2ff', fg: '#0a63ce' },
112
+ receipt: { text: '回执', bg: '#e8f2ff', fg: '#0a63ce' },
113
+ });
114
+ /** 联系作者(F3 payload 的 `contact.items` 逐字,含 Issues 一条)。 */
115
+ export const HELP_CONTACT = Object.freeze({
116
+ items: Object.freeze([
117
+ Object.freeze({ label: 'GitHub', value: 'https://github.com/FeatherHunter/SKILLS' }),
118
+ Object.freeze({ label: 'Issues', value: 'https://github.com/FeatherHunter/SKILLS/issues' }),
119
+ ]),
120
+ });
121
+ /** 新场景条目判定(与 SoT 结构一致:`SceneTrigger` 独有 `output_type` + `prompt_template`)。 */
122
+ function isSceneTrigger(trigger) {
123
+ return 'output_type' in trigger && 'prompt_template' in trigger;
124
+ }
125
+ /** 子功能排序键(F3 规则:显式序 → 未列出 → `既有唤醒词` 恒最后)。 */
126
+ function subfuncKey(category, subfunction) {
127
+ const order = HELP_SUBFUNC_ORDER[category];
128
+ if (order !== undefined && order.includes(subfunction))
129
+ return [0, order.indexOf(subfunction), subfunction];
130
+ if (subfunction === HELP_LEGACY_SUBGROUP)
131
+ return [2, 0, subfunction];
132
+ return [1, 0, subfunction];
133
+ }
134
+ function compareKey(a, b) {
135
+ if (a[0] !== b[0])
136
+ return a[0] - b[0];
137
+ if (a[1] !== b[1])
138
+ return a[1] - b[1];
139
+ return a[2] < b[2] ? -1 : a[2] > b[2] ? 1 : 0;
140
+ }
141
+ /** 运行期派生:`TRIGGERS` → `SceneData`(10 分组/54 子功能/436 场景)。
142
+ *
143
+ * 纯函数、零 I/O、零缓存;两次同参调用逐字相等(P-2 口径)。
144
+ */
145
+ export function buildHelpSceneData(opts = {}) {
146
+ const updatedAt = typeof opts.updatedAt === 'string' && opts.updatedAt !== '' ? opts.updatedAt : undefined;
147
+ const groups = HELP_GROUPS.map((group) => ({
148
+ id: group.id,
149
+ icon: group.icon,
150
+ label: group.label,
151
+ subgroups: [],
152
+ }));
153
+ const byLabel = new Map(groups.map((group) => [group.label, group]));
154
+ const push = (scene, category, subfunction) => {
155
+ const group = byLabel.get(category);
156
+ if (group === undefined)
157
+ return; // 非 10 组的 SoT 分类(食品库/综合等)不入速查台(F3 同口径)
158
+ let subgroup = group.subgroups.find((item) => item.label === subfunction);
159
+ if (subgroup === undefined) {
160
+ subgroup = { id: group.id + '_' + (group.subgroups.length + 1), label: subfunction, scenes: [] };
161
+ group.subgroups.push(subgroup);
162
+ }
163
+ subgroup.scenes.push(scene);
164
+ };
165
+ /* ── 414 条新场景:按(子功能序,order,name)排序;`id` = key ── */
166
+ const newTriggers = TRIGGERS.filter(isSceneTrigger).slice().sort((a, b) => {
167
+ const cmp = compareKey(subfuncKey(a.category, a.subfunction), subfuncKey(b.category, b.subfunction));
168
+ if (cmp !== 0)
169
+ return cmp;
170
+ if (a.order !== b.order)
171
+ return a.order - b.order;
172
+ return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
173
+ });
174
+ for (const trigger of newTriggers) {
175
+ const badge = HELP_TYPE_BADGES[trigger.output_type];
176
+ const fields = cliFields(trigger.wake_word);
177
+ const scene = {
178
+ id: trigger.key,
179
+ title: trigger.name,
180
+ wake_word: trigger.wake_word,
181
+ status: '',
182
+ prompt_template: trigger.prompt_template,
183
+ ...(badge === undefined ? {} : { types: [badge] }),
184
+ ...(fields.length === 0 ? {} : { editable_fields: fields }),
185
+ };
186
+ push(scene, trigger.category, trigger.subfunction !== '' ? trigger.subfunction : HELP_LEGACY_SUBGROUP);
187
+ }
188
+ /* ── 22 条 legacy:按唤醒词排序;`id` = `main_prompt.cli` 原文(R1-7,台账 L-19) ── */
189
+ const legacyTriggers = TRIGGERS.filter((trigger) => !isSceneTrigger(trigger))
190
+ .slice()
191
+ .sort((a, b) => (a.wake_word < b.wake_word ? -1 : a.wake_word > b.wake_word ? 1 : 0));
192
+ for (const trigger of legacyTriggers) {
193
+ const fields = cliFields(trigger.wake_word);
194
+ const scene = {
195
+ id: trigger.main_prompt.cli,
196
+ title: trigger.wake_word,
197
+ wake_word: trigger.wake_word,
198
+ status: '',
199
+ prompt_template: trigger.main_prompt.text,
200
+ ...(fields.length === 0 ? {} : { editable_fields: fields }),
201
+ };
202
+ const category = HELP_LEGACY_CATEGORY[trigger.category] ?? trigger.category;
203
+ push(scene, category, HELP_LEGACY_SUBGROUP);
204
+ }
205
+ /* ── 子功能排序(F3:显式序 → 首次出现序 → 既有唤醒词最后) ── */
206
+ for (const group of groups) {
207
+ group.subgroups.sort((a, b) => compareKey(subfuncKey(group.label, a.label), subfuncKey(group.label, b.label)));
208
+ }
209
+ const rendered = groups.filter((group) => group.subgroups.length > 0);
210
+ const sceneCount = rendered.reduce((total, group) => total + group.subgroups.reduce((sub, item) => sub + item.scenes.length, 0), 0);
211
+ const subtitle = String(rendered.length) + ' 分类 · ' + String(sceneCount) + ' 场景'
212
+ + (updatedAt === undefined ? '' : ' · 更新于 ' + updatedAt);
213
+ return {
214
+ skill_name: HELP_SKILL_NAME,
215
+ title: HELP_TITLE,
216
+ subtitle,
217
+ contact: HELP_CONTACT,
218
+ groups: rendered,
219
+ };
220
+ }
221
+ /* ── S3 · 看板页入口(#107):6 个 view 页模板 → 速查台「看板页入口」块 ──────────────
222
+ *
223
+ * 背景(#107/地图 #63 D4「6 个死模板并入 HELP」):`templates/*.html` 6 件此前只被
224
+ * 装载器与发布门读,**生产渲染链零消费=死文件**。本模块是它们的**唯一消费者**:
225
+ * 逐件经 `loadTemplate` 读盘 → 抽取三个锚点(`<h1>` 页名/`<p class="lead">` 一句说明/
226
+ * `<pre class="view-cli">` 取数命令)→ 走 `SceneData.meta_blocks`(base-paint 契约
227
+ * 既有槽位,`html` 原样透传)渲染进速查台。**改模板一个字,速查台产物即变**——
228
+ * 「被真正使用」由此可机械验证(`test/skill-t11.test.mjs`)。
229
+ *
230
+ * 锚点口径:每件**恰 1 处**,缺失/重复/空值即抛(`missing-data`;命令非 `calorie-cmd-read`
231
+ * 开头即 `bad-input`),不返空、不静默跳过(仓库「缺失阻断不返空」口径)。
232
+ */
233
+ export const HELP_VIEW_ENTRIES_META_ID = 'view-entries';
234
+ export const HELP_VIEW_ENTRIES_META_TITLE = '看板页入口';
235
+ /** 抽取锚点(**字面量恒此处一份**;模板侧只负责出现恰 1 次)。 */
236
+ const VIEW_ENTRY_ANCHORS = {
237
+ title: '<h1>([^<]*)</h1>',
238
+ lead: '<p class="lead">([^<]*)</p>',
239
+ cli: '<pre class="view-cli">([^<]*)</pre>',
240
+ };
241
+ function pickAnchor(html, pattern, name, label) {
242
+ const hits = [...html.matchAll(new RegExp(pattern, 'g'))].map((match) => match[1].trim());
243
+ if (hits.length !== 1) {
244
+ throw new CalorieRenderError('missing-data', '模板 ' + name + ' 的 ' + label + ' 必须恰 1 处,实测 ' + String(hits.length));
245
+ }
246
+ if (hits[0] === '')
247
+ throw new CalorieRenderError('missing-data', '模板 ' + name + ' 的 ' + label + ' 为空');
248
+ return hits[0];
249
+ }
250
+ /** 6 件模板 → 看板页入口(顺序恒 `CALORIE_TEMPLATES`;逐件真读盘,缺件即抛)。 */
251
+ export function buildHelpViewEntries() {
252
+ return CALORIE_TEMPLATES.map((name) => {
253
+ const html = loadTemplate(name);
254
+ const cli = pickAnchor(html, VIEW_ENTRY_ANCHORS.cli, name, '<pre class="view-cli">');
255
+ if (!cli.startsWith('calorie-cmd-read ')) {
256
+ throw new CalorieRenderError('bad-input', '模板 ' + name + ' 的取数命令非 calorie-cmd-read 开头:' + cli);
257
+ }
258
+ return {
259
+ name,
260
+ title: pickAnchor(html, VIEW_ENTRY_ANCHORS.title, name, '<h1>'),
261
+ lead: pickAnchor(html, VIEW_ENTRY_ANCHORS.lead, name, '<p class="lead">'),
262
+ cli,
263
+ };
264
+ });
265
+ }
266
+ /** 入口块 HTML(`meta_blocks[].html` **原样透传** ⇒ 本函数自负转义)。 */
267
+ export function renderViewEntriesHtml(entries = buildHelpViewEntries()) {
268
+ const items = entries.map((entry) => '<li data-view-entry="' + escapeHtml(entry.name) + '">'
269
+ + '<b>' + escapeHtml(entry.title) + '</b> ' + escapeHtml(entry.lead) + '<br>'
270
+ + '<code style="white-space:pre-wrap;word-break:break-all">' + escapeHtml(entry.cli) + '</code>'
271
+ + '</li>');
272
+ return '<ol class="view-entries">' + items.join(LF) + '</ol>';
273
+ }
274
+ /** 速查台「看板页入口」块(`meta_blocks` 槽位;`id`/`title` 恒本模块常量)。 */
275
+ export function helpViewEntriesMetaBlock(entries = buildHelpViewEntries()) {
276
+ return { id: HELP_VIEW_ENTRIES_META_ID, title: HELP_VIEW_ENTRIES_META_TITLE, html: renderViewEntriesHtml(entries) };
277
+ }
278
+ /* ── S2 · 壳落地:三态同源(file/inline/text),恒走 `renderHelpShell` ───────── */
279
+ /** 交付形态(P-5:默认 `file`;`inline` 供宿主页面内嵌;`text` 为纯文本索引接缝)。 */
280
+ export const HELP_CENTER_MODES = ['file', 'inline', 'text'];
281
+ /** 壳的共享资产(**唯一产出者恒为 base-paint**:helpers 取 `COPY_RUNTIME_JS`=
282
+ * `buildSharedHelpersJs()` 的逐字产出,样式取 `buildStyleSheet().css`;技能侧零自产)。 */
283
+ export function helpCenterAssets() {
284
+ return { sharedHelpersJs: COPY_RUNTIME_JS, sharedCssText: buildStyleSheet().css };
285
+ }
286
+ /** 取 `<section id="ilife-help-shell">…</section>` 片段(**按深度配对**,不靠正则贪婪)。 */
287
+ function sectionFragment(html) {
288
+ const anchor = 'id="' + HELP_SHELL_ID + '"';
289
+ const anchorIndex = html.indexOf(anchor);
290
+ if (anchorIndex < 0)
291
+ throw new CalorieRenderError('missing-data', 'HELP 壳产物缺锚点 ' + anchor);
292
+ const start = html.lastIndexOf('<section', anchorIndex);
293
+ if (start < 0)
294
+ throw new CalorieRenderError('missing-data', 'HELP 壳产物锚点前无 <section>');
295
+ const open = /<section\b/g;
296
+ const close = /<\/section>/g;
297
+ let depth = 0;
298
+ let cursor = start;
299
+ while (cursor < html.length) {
300
+ open.lastIndex = cursor;
301
+ close.lastIndex = cursor;
302
+ const nextOpen = open.exec(html);
303
+ const nextClose = close.exec(html);
304
+ if (nextClose === null)
305
+ break;
306
+ if (nextOpen !== null && nextOpen.index < nextClose.index) {
307
+ depth += 1;
308
+ cursor = nextOpen.index + nextOpen[0].length;
309
+ }
310
+ else {
311
+ depth -= 1;
312
+ cursor = nextClose.index + nextClose[0].length;
313
+ if (depth === 0)
314
+ return html.slice(start, cursor);
315
+ }
316
+ }
317
+ throw new CalorieRenderError('missing-data', 'HELP 壳产物 <section> 未闭合');
318
+ }
319
+ /** `inline` 态:**片段自带 `<style>`(钉死落点=片段最前)+ helpers(片段最后)**。
320
+ *
321
+ * 片段无 `<head>`,若不带 `<style>` 则整页无样式(P-5 蓝队补充);包裹标签恒读
322
+ * `ASSET_WRAPPERS`(不写第二份字面量)。
323
+ */
324
+ function inlineFragment(html, assets) {
325
+ const fragment = sectionFragment(html);
326
+ const style = ASSET_WRAPPERS.sharedCssText.openTag + assets.sharedCssText + ASSET_WRAPPERS.sharedCssText.closeTag;
327
+ const helpers = ASSET_WRAPPERS.sharedHelpersJs.openTag + assets.sharedHelpersJs
328
+ + ASSET_WRAPPERS.sharedHelpersJs.closeTag;
329
+ return style + LF + fragment + LF + helpers;
330
+ }
331
+ /** `text` 态:同一 `SceneData` 的纯文本索引(无标签、无脚本;供 CLI/日志面复用)。
332
+ *
333
+ * 末尾追加同一份「看板页入口」(#107):与 `file`/`inline` 的 `meta_blocks` 块**同源同序**,
334
+ * 使三态在内容上仍是一份数据换三个载体。入口行缩进 2 空格(场景行恒 4 空格,
335
+ * `help-center-91` 的 `textSceneIds` 只认 4 空格行,故不污染 436 条场景序)。
336
+ */
337
+ function renderTextIndex(data, entries) {
338
+ const lines = [data.skill_name + ' ' + data.title];
339
+ if (typeof data.subtitle === 'string')
340
+ lines.push(data.subtitle);
341
+ for (const group of data.groups) {
342
+ lines.push('');
343
+ lines.push('[' + group.label + ']');
344
+ for (const subgroup of group.subgroups) {
345
+ lines.push(' ' + subgroup.label + ' (' + subgroup.id + ')');
346
+ for (const scene of subgroup.scenes) {
347
+ lines.push(' ' + scene.wake_word + ' · ' + scene.id);
348
+ }
349
+ }
350
+ }
351
+ lines.push('');
352
+ lines.push('[' + HELP_VIEW_ENTRIES_META_TITLE + ']');
353
+ for (const entry of entries)
354
+ lines.push(' ' + entry.title + ' · ' + entry.cli);
355
+ return lines.join(LF) + LF;
356
+ }
357
+ /** HELP 速查台渲染(三态同源:同一 `SceneData` + 同一资产 + 同一 `renderHelpShell`)。
358
+ *
359
+ * - `file`:完整 HTML 文档(`<!DOCTYPE html>`…),落盘/`file://` 打开;
360
+ * - `inline`:`<style>` + `<section id="ilife-help-shell">` 片段 + helpers `<script>`;
361
+ * - `text`:纯文本索引(数据同源,只换载体)。
362
+ *
363
+ * 三态**都先过 `renderHelpShell`**(同一 schema 校验与同一填充器),故不存在第二套数据路径。
364
+ * #107:三态各自**同一份**「看板页入口」(6 件模板派生)——`file`/`inline` 走 `meta_blocks`,
365
+ * `text` 走文本段;签名与三态语义不变。
366
+ */
367
+ export function renderHelpCenterHtml(opts = {}) {
368
+ const mode = opts.mode === undefined ? 'file' : opts.mode;
369
+ if (!HELP_CENTER_MODES.includes(mode)) {
370
+ throw new CalorieRenderError('bad-input', 'HELP 交付形态非法:' + String(mode));
371
+ }
372
+ const baseData = opts.sceneData ?? buildHelpSceneData(opts.updatedAt === undefined ? {} : { updatedAt: opts.updatedAt });
373
+ const entries = buildHelpViewEntries();
374
+ const sceneData = {
375
+ ...baseData,
376
+ meta_blocks: [...(baseData.meta_blocks ?? []), helpViewEntriesMetaBlock(entries)],
377
+ };
378
+ const assets = helpCenterAssets();
379
+ const output = renderHelpShell({ sceneData, assets, strict: opts.strict === true });
380
+ if (mode === 'file')
381
+ return { mode, html: output.html, report: output.report };
382
+ if (mode === 'inline')
383
+ return { mode, html: inlineFragment(output.html, assets), report: output.report };
384
+ return { mode, html: renderTextIndex(sceneData, entries), report: output.report };
385
+ }
386
+ //# sourceMappingURL=helpCenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpCenter.js","sourceRoot":"","sources":["../../src/render/helpCenter.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,19 @@ export declare function renderGalleryHtml(g: GalleryData): string;
29
29
  export declare function renderCompareHtml(c: CompareData): string;
30
30
  export declare function renderViewerHtml(v: ViewerData): string;
31
31
  export declare function renderGifHtml(t: GifTask): string;
32
+ /** 唤醒词 HELP 速查(`calorie.help.lookup`)的一行;字段名沿用 envelope 口径。 */
33
+ export interface HelpLookupHit {
34
+ readonly wake_word: string;
35
+ readonly category: string;
36
+ readonly key: string;
37
+ readonly cli: string;
38
+ readonly desc: string;
39
+ }
40
+ /** #90:HELP 页的复制接线 = 每行复制按钮(渲染期写入 `ACTION_ID_ATTR`/`DEFAULT_DATA_ATTR`)
41
+ * + 页尾注入页面侧运行时(`buildSharedHelpersJs()` 产出,双通道 + toast)。 */
32
42
  export declare function renderPhotoHelpHtml(hits: PhotoHelpHit[], query?: string): string;
43
+ /** #90:唤醒词 HELP 速查列表(原 `cmd_read` 内联 HTML 收编)——同一套复制接线。 */
44
+ export declare function renderHelpLookupHtml(hits: readonly HelpLookupHit[], query: string): string;
33
45
  export declare function renderErrorHtml(e: ErrorReceipt): string;
34
46
  export declare function renderGoalConfigHtml(g: GoalConfig): string;
35
47
  export declare function renderGoalRecommendHtml(g: GoalRecommend): string;
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChI,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAmChF,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAgBlD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAgB9E;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAa1D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAalD;AAaD,yCAAyC;AACzC,wBAAgB,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAOlD;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAgB7D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CASxD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAQxD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAItD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAQhD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAMhF;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAOvD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAe1D;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAgBhE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAQ1D;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAa9D;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAW1D;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAa9D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CASxE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAe1D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAYvD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CASxD;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAY5D;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAShE;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CASlE;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAM9D;AACD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAW3D;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAOpE;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAUpE;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAWlE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAU9D;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAYxE;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAYhE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAQlD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAS9D;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CASlE;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CASlE;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAShE;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CASlE;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAQxD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAQxD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAUtD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAOtD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAWxD"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@
13
13
  */
14
14
  import { cx, escapeHtml, token } from 'base-paint';
15
15
  import { GIF_PASSTHROUGH_NOTE } from './photo.js';
16
+ import { copyActionHtml, copyRuntimeScriptHtml } from './copy.js';
16
17
  function pageShell(skill, slot, title, body) {
17
18
  return ('<section class="' + cx('page') + '" data-skill="' + escapeHtml(skill) + '" data-slot="' + escapeHtml(slot) + '"' +
18
19
  ' style="background:' + token('bg') + ';color:' + token('fg') + ';border:1px solid ' + token('border') +
@@ -164,12 +165,26 @@ export function renderGifHtml(t) {
164
165
  '<div style="color:' + token('muted') + '">' + escapeHtml(t.note) + '</div>';
165
166
  return pageShell('calorie', 'ilife:calorie:photo:gif', '生成身材照 GIF · ' + t.photoCount + ' 张', body);
166
167
  }
168
+ /** 一行 = 标题行 + 描述 + 可执行命令 + **复制按钮**(#90:复制交互走 Base P0 双通道)。 */
169
+ function helpRowHtml(head, desc, cli) {
170
+ return '<div class="' + cx('item') + '">' + head +
171
+ '<div>' + escapeHtml(desc) + '</div>' +
172
+ '<pre>' + escapeHtml(cli) + '</pre>' +
173
+ copyActionHtml(cli) + '</div>';
174
+ }
175
+ /** #90:HELP 页的复制接线 = 每行复制按钮(渲染期写入 `ACTION_ID_ATTR`/`DEFAULT_DATA_ATTR`)
176
+ * + 页尾注入页面侧运行时(`buildSharedHelpersJs()` 产出,双通道 + toast)。 */
167
177
  export function renderPhotoHelpHtml(hits, query) {
168
- const rows = hits.map((h) => '<div class="' + cx('item') + '"><b>' + escapeHtml(h.wakeWord) + '</b> ' +
169
- '<span style="color:' + token('muted') + '">' + escapeHtml(h.key) + '</span><div>' + escapeHtml(h.desc) + '</div>' +
170
- '<pre>' + escapeHtml(h.exec) + '</pre></div>').join('');
178
+ const rows = hits.map((h) => helpRowHtml('<b>' + escapeHtml(h.wakeWord) + '</b> <span style="color:' + token('muted') + '">' + escapeHtml(h.key) + '</span>', h.desc, h.exec)).join('');
171
179
  const body = (query ? '<div>查询:' + escapeHtml(query) + ' · 命中 ' + hits.length + ' 条</div>' : '<div>共 ' + hits.length + ' 条</div>') + rows;
172
- return pageShell('calorie', 'ilife:calorie:photo:help', '身材照片 HELP 速查', body);
180
+ return pageShell('calorie', 'ilife:calorie:photo:help', '身材照片 HELP 速查', body) + copyRuntimeScriptHtml();
181
+ }
182
+ /** #90:唤醒词 HELP 速查列表(原 `cmd_read` 内联 HTML 收编)——同一套复制接线。 */
183
+ export function renderHelpLookupHtml(hits, query) {
184
+ const rows = hits.map((h) => helpRowHtml('<b>' + escapeHtml(h.wake_word) + '</b> <span style="color:' + token('muted') + '">' + escapeHtml(h.key) + '</span>' +
185
+ '<span style="color:' + token('muted') + '">' + escapeHtml(h.category) + '</span>', h.desc, h.cli)).join('');
186
+ const body = '<div>查询:' + escapeHtml(query) + ' · 命中 ' + hits.length + ' 条</div>' + rows;
187
+ return pageShell('calorie', 'ilife:calorie:help', '唤醒词 HELP 速查 · ' + escapeHtml(query) + '(' + hits.length + ' 条)', body) + copyRuntimeScriptHtml();
173
188
  }
174
189
  export function renderErrorHtml(e) {
175
190
  const sug = e.suggestions.map((s) => '<li>' + escapeHtml(s) + '</li>').join('');
@@ -423,7 +438,8 @@ export function renderPlanWizardHtml(v) {
423
438
  const warns = v.warnings.slice(0, 5).map((e) => '<div>' + escapeHtml(e) + '</div>').join('');
424
439
  const body = '<div class="' + cx('grid') + '">' +
425
440
  kpi('构建向导', v.errorCount === 0 ? '可落地' : '有硬止', '错误 ' + v.errorCount + ' 警告 ' + v.warningCount) +
426
- kpi('dryRun', '不写库', '预览插入 ' + v.insertedCount) +
441
+ // G15 #102 · 已检查≠已通过:坏计划也计 N,通过与否看 errorCount;错误态追加(X硬止)与首 KPI 的“有硬止”呼应。
442
+ kpi('纯校验', '不写库', '已检查 ' + v.checkedSessions + ' 个会话' + (v.errorCount > 0 ? '(' + v.errorCount + '硬止)' : '')) +
427
443
  '</div><div>' + errs + warns + '</div>';
428
444
  return pageShell('calorie', 'ilife:calorie:plan-wizard', '构建向导', body);
429
445
  }