skill-calorie 0.2.0 → 0.2.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.
- package/SKILL.md +54 -26
- package/dist/analysis/anomaly/common.d.ts.map +1 -1
- package/dist/analysis/anomaly/common.js +2 -1
- package/dist/analysis/anomaly/common.js.map +1 -1
- package/dist/analysis/cross.d.ts.map +1 -1
- package/dist/analysis/cross.js +3 -2
- package/dist/analysis/cross.js.map +1 -1
- package/dist/analysis/deficit.d.ts.map +1 -1
- package/dist/analysis/deficit.js +4 -0
- package/dist/analysis/deficit.js.map +1 -1
- package/dist/analysis/diet.js +2 -2
- package/dist/analysis/diet.js.map +1 -1
- package/dist/analysis/exercise.js +5 -5
- package/dist/analysis/exercise.js.map +1 -1
- package/dist/analysis/review.js +2 -2
- package/dist/analysis/review.js.map +1 -1
- package/dist/analysis/series.d.ts +7 -1
- package/dist/analysis/series.d.ts.map +1 -1
- package/dist/analysis/series.js +22 -6
- package/dist/analysis/series.js.map +1 -1
- package/dist/analysis/utils.d.ts +7 -0
- package/dist/analysis/utils.d.ts.map +1 -1
- package/dist/analysis/utils.js +7 -0
- package/dist/analysis/utils.js.map +1 -1
- package/dist/analysis/weightCompare3.js +2 -2
- package/dist/analysis/weightCompare3.js.map +1 -1
- package/dist/cli/cmd_read.d.ts +21 -3
- package/dist/cli/cmd_read.d.ts.map +1 -1
- package/dist/cli/cmd_read.js +460 -54
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/keys.d.ts +89 -1
- package/dist/cli/keys.d.ts.map +1 -1
- package/dist/cli/keys.js +30 -0
- package/dist/cli/keys.js.map +1 -1
- package/dist/cli/write.d.ts +12 -9
- package/dist/cli/write.d.ts.map +1 -1
- package/dist/cli/write.js +133 -48
- package/dist/cli/write.js.map +1 -1
- package/dist/output.d.ts +55 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +203 -5
- package/dist/output.js.map +1 -1
- package/dist/render/dietDocs.d.ts +45 -0
- package/dist/render/dietDocs.d.ts.map +1 -0
- package/dist/render/dietDocs.js +561 -0
- package/dist/render/dietDocs.js.map +1 -0
- package/dist/render/envelope.d.ts +32 -6
- package/dist/render/envelope.d.ts.map +1 -1
- package/dist/render/envelope.js +71 -0
- package/dist/render/envelope.js.map +1 -1
- package/dist/render/exercisePort.d.ts +161 -0
- package/dist/render/exercisePort.d.ts.map +1 -0
- package/dist/render/exercisePort.js +395 -0
- package/dist/render/exercisePort.js.map +1 -0
- package/dist/render/goal.d.ts.map +1 -1
- package/dist/render/goal.js +13 -2
- package/dist/render/goal.js.map +1 -1
- package/dist/render/goalPlate.d.ts +1 -1
- package/dist/render/goalPlate.d.ts.map +1 -1
- package/dist/render/goalPlate.js +5 -1
- package/dist/render/goalPlate.js.map +1 -1
- package/dist/render/helpCenter.d.ts +104 -0
- package/dist/render/helpCenter.d.ts.map +1 -0
- package/dist/render/helpCenter.js +386 -0
- package/dist/render/helpCenter.js.map +1 -0
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +2 -1
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +3 -0
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +2 -0
- package/dist/render/index.js.map +1 -1
- package/dist/render/nutritionPort.d.ts +89 -0
- package/dist/render/nutritionPort.d.ts.map +1 -0
- package/dist/render/nutritionPort.js +183 -0
- package/dist/render/nutritionPort.js.map +1 -0
- package/dist/render/nutritionPortDocs.d.ts +6 -0
- package/dist/render/nutritionPortDocs.d.ts.map +1 -0
- package/dist/render/nutritionPortDocs.js +317 -0
- package/dist/render/nutritionPortDocs.js.map +1 -0
- package/dist/render/photo.d.ts.map +1 -1
- package/dist/render/photo.js +5 -1
- package/dist/render/photo.js.map +1 -1
- package/dist/render/planPlate.d.ts +2 -1
- package/dist/render/planPlate.d.ts.map +1 -1
- package/dist/render/planPlate.js +6 -1
- package/dist/render/planPlate.js.map +1 -1
- package/dist/render/receipt.d.ts +47 -1
- package/dist/render/receipt.d.ts.map +1 -1
- package/dist/render/receipt.js +67 -3
- package/dist/render/receipt.js.map +1 -1
- package/dist/render/sportDocs.d.ts +14 -0
- package/dist/render/sportDocs.d.ts.map +1 -0
- package/dist/render/sportDocs.js +540 -0
- package/dist/render/sportDocs.js.map +1 -0
- package/dist/render/sportPortDocs.d.ts +8 -0
- package/dist/render/sportPortDocs.d.ts.map +1 -0
- package/dist/render/sportPortDocs.js +468 -0
- package/dist/render/sportPortDocs.js.map +1 -0
- package/dist/render/trendDocs.d.ts +11 -0
- package/dist/render/trendDocs.d.ts.map +1 -0
- package/dist/render/trendDocs.js +445 -0
- package/dist/render/trendDocs.js.map +1 -0
- package/dist/render/trendMiscPort.d.ts +127 -0
- package/dist/render/trendMiscPort.d.ts.map +1 -0
- package/dist/render/trendMiscPort.js +277 -0
- package/dist/render/trendMiscPort.js.map +1 -0
- package/dist/render/trendMiscPortDocs.d.ts +10 -0
- package/dist/render/trendMiscPortDocs.d.ts.map +1 -0
- package/dist/render/trendMiscPortDocs.js +397 -0
- package/dist/render/trendMiscPortDocs.js.map +1 -0
- package/dist/render/wizardPort.d.ts +125 -0
- package/dist/render/wizardPort.d.ts.map +1 -0
- package/dist/render/wizardPort.js +393 -0
- package/dist/render/wizardPort.js.map +1 -0
- package/dist/render/wizardPortDocs.d.ts +6 -0
- package/dist/render/wizardPortDocs.d.ts.map +1 -0
- package/dist/render/wizardPortDocs.js +274 -0
- package/dist/render/wizardPortDocs.js.map +1 -0
- package/dist/triggers/routing.d.ts +21 -21
- package/dist/triggers/routing.d.ts.map +1 -1
- package/dist/triggers/routing.js +60 -30
- package/dist/triggers/routing.js.map +1 -1
- package/package.json +2 -2
- package/templates/diet.html +2 -2
- package/templates/exercise.html +2 -2
- package/templates/goal.html +2 -2
- package/templates/help.html +2 -2
- package/templates/home.html +2 -2
- package/templates/photo-gallery.html +2 -2
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/** #113 · 趋势 2+其他 6 移植 8 键 HTML 填充器(t71 需移植八模板的展示面)。
|
|
2
|
+
*
|
|
3
|
+
* 包裹约定(沿 #111/#112,不新增):
|
|
4
|
+
* sharedCss = buildStyleSheet().css + blocksCss(),不走 extraCss;
|
|
5
|
+
* 图表页另加 CHARTS-HELPERS+buildChartsHelpersJs,图表 CSS 由其运行时注入)。
|
|
6
|
+
* 复制文本一律 buildDataText(#77 契约):stat 投影 metrics 只收确定数字。
|
|
7
|
+
* 本层不做取数(数据由 render/trendMiscPort.ts 备齐),不返空(缺失由数据层抛 missing-data)。
|
|
8
|
+
*/
|
|
9
|
+
import { blocksCss, renderChartBlock, renderCopyBlock, renderDataTable, renderDisclosure, renderKpiGrid, renderListRows, renderPageShell, renderParamForm, } from 'base-paint/blocks';
|
|
10
|
+
import { buildChartsHelpersJs, buildDataText, buildSharedHelpersJs, buildStyleSheet, fillTemplate } from 'base-paint';
|
|
11
|
+
/** envelope 头(值冻结对齐 cli/keys.ts ENVELOPE_VERSION/CALORIE_SKILL;测试钉死一致)。 */
|
|
12
|
+
const DOC_VERSION = '0.1.0';
|
|
13
|
+
const DOC_SKILL = 'calorie';
|
|
14
|
+
/** 内容页壳(裸标记+CONTENT 槽;包裹约定:资产裸文本+填充器包裹,标记不得预包裹)。
|
|
15
|
+
* wrap 带 ilife-page 兼容既有 --html 断言。 */
|
|
16
|
+
const DOC_SHELL = '<!doctype html>\n<html lang="zh-CN">\n<head>\n<meta charset="utf-8">\n' +
|
|
17
|
+
'<meta name="viewport" content="width=device-width,initial-scale=1">\n' +
|
|
18
|
+
'<title>卡路里·趋势其他移植</title>\n<!--SHARED-CSS-->\n</head>\n<body>\n' +
|
|
19
|
+
'<div class="wrap ilife-page">\n<!--CONTENT-->\n</div>\n<!--SHARED-HELPERS-->\n</body>\n</html>';
|
|
20
|
+
/** 图表页壳(多一个 CHARTS-HELPERS 标记,图表 CSS 由 charts helpers 运行时注入)。 */
|
|
21
|
+
const DOC_SHELL_CHARTS = '<!doctype html>\n<html lang="zh-CN">\n<head>\n<meta charset="utf-8">\n' +
|
|
22
|
+
'<meta name="viewport" content="width=device-width,initial-scale=1">\n' +
|
|
23
|
+
'<title>卡路里·趋势其他移植</title>\n<!--SHARED-CSS-->\n</head>\n<body>\n' +
|
|
24
|
+
'<div class="wrap ilife-page">\n<!--CONTENT-->\n</div>\n<!--SHARED-HELPERS-->\n<!--CHARTS-HELPERS-->\n</body>\n</html>';
|
|
25
|
+
function assemble(title, eyebrow, subtitle, content, charts) {
|
|
26
|
+
const assets = {
|
|
27
|
+
sharedCssText: buildStyleSheet().css + '\n' + blocksCss(),
|
|
28
|
+
sharedHelpersJs: buildSharedHelpersJs(),
|
|
29
|
+
};
|
|
30
|
+
if (charts)
|
|
31
|
+
assets.chartsHelpersJs = buildChartsHelpersJs();
|
|
32
|
+
const body = renderPageShell({
|
|
33
|
+
title,
|
|
34
|
+
...(eyebrow ? { eyebrow } : {}),
|
|
35
|
+
...(subtitle ? { subtitle } : {}),
|
|
36
|
+
content,
|
|
37
|
+
});
|
|
38
|
+
return fillTemplate({ template: charts ? DOC_SHELL_CHARTS : DOC_SHELL, assets, content: body }).html;
|
|
39
|
+
}
|
|
40
|
+
function copyBlock(title, input) {
|
|
41
|
+
return renderCopyBlock({ title, dataText: buildDataText(input) });
|
|
42
|
+
}
|
|
43
|
+
function fmt(n) {
|
|
44
|
+
if (n === null || n === undefined)
|
|
45
|
+
return '—';
|
|
46
|
+
return String(n);
|
|
47
|
+
}
|
|
48
|
+
/** 复制投影 stat-metrics 只收确定数字(冻结口径:null/undefined 不进投影)。 */
|
|
49
|
+
function metricsOf(obj) {
|
|
50
|
+
const out = {};
|
|
51
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
52
|
+
if (v !== null && v !== undefined)
|
|
53
|
+
out[k] = v;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
function windowForm(start, end, extra) {
|
|
58
|
+
return renderParamForm({
|
|
59
|
+
fields: [
|
|
60
|
+
{ name: 'start', label: '开始', value: start },
|
|
61
|
+
{ name: 'end', label: '结束', value: end },
|
|
62
|
+
],
|
|
63
|
+
description: extra,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/* ── 热量趋势(calorie_trend:T7 口径日序列+达标统计) ── */
|
|
67
|
+
export function buildCalorieTrendDoc(v) {
|
|
68
|
+
const s = v.data.summary;
|
|
69
|
+
const trendLabel = s.trend === 'down' ? '↓ 下降' : (s.trend === 'up' ? '↑ 上升' : '→ 平稳');
|
|
70
|
+
const parts = [
|
|
71
|
+
windowForm(v.start, v.end, 'T5 buildSeries 唯一源(水已排除);达标=单日≤目标×1.05'),
|
|
72
|
+
renderKpiGrid([
|
|
73
|
+
{ label: '日均', value: String(s.avg), unit: '卡', detail: '目标 ' + s.target + '卡' },
|
|
74
|
+
{ label: '趋势', value: trendLabel, detail: '窗首 ' + s.startAvg + ' → 窗尾 ' + s.endAvg + '(差 ' + s.trendValue + ')' },
|
|
75
|
+
{ label: '达标天数', value: String(s.compliantDays), unit: '天', detail: '达标率 ' + Math.round(s.complianceRate * 100) + '%' },
|
|
76
|
+
{ label: '周末−工作日', value: String(s.weekendDiff), unit: '卡', detail: '工作日 ' + s.weekdayAvg + '/周末 ' + s.weekendAvg },
|
|
77
|
+
]),
|
|
78
|
+
renderChartBlock({
|
|
79
|
+
kind: 'line',
|
|
80
|
+
title: '每日热量',
|
|
81
|
+
input: { items: v.data.series.map((d) => ({ label: d.date.slice(5), value: d.calorie })) },
|
|
82
|
+
}),
|
|
83
|
+
copyBlock('复制数据', {
|
|
84
|
+
envelope: {
|
|
85
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.calorie-trend',
|
|
86
|
+
data: {
|
|
87
|
+
metrics: metricsOf({
|
|
88
|
+
avg: s.avg, target: s.target, trendValue: s.trendValue,
|
|
89
|
+
startAvg: s.startAvg, endAvg: s.endAvg, weekdayAvg: s.weekdayAvg,
|
|
90
|
+
weekendAvg: s.weekendAvg, weekendDiff: s.weekendDiff,
|
|
91
|
+
compliantDays: s.compliantDays, complianceRate: s.complianceRate,
|
|
92
|
+
}),
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
}),
|
|
96
|
+
];
|
|
97
|
+
return assemble('热量趋势 ' + v.start + ' ~ ' + v.end, 'calorie.view.calorie-trend · 趋势其他移植域', '日序列+趋势方向+达标统计(空窗阻断,不编数)', parts.join(''), true);
|
|
98
|
+
}
|
|
99
|
+
/* ── 整体趋势(long_trend:体重+热量双序列) ── */
|
|
100
|
+
export function buildLongTrendDoc(v) {
|
|
101
|
+
const parts = [
|
|
102
|
+
renderKpiGrid([
|
|
103
|
+
{ label: '日均热量', value: String(v.avgCalorie), unit: '卡', detail: v.start + ' ~ ' + v.end },
|
|
104
|
+
{
|
|
105
|
+
label: '体重变化', value: fmt(v.weightChange), unit: v.weightChange === null ? '' : 'kg',
|
|
106
|
+
detail: v.weightChange === null ? '窗内称重不足 2 次' : '窗首→窗尾',
|
|
107
|
+
status: v.weightChange === null ? undefined : (v.weightChange < 0 ? 'ok' : (v.weightChange > 0 ? 'warn' : undefined)),
|
|
108
|
+
},
|
|
109
|
+
{ label: '窗口', value: String(v.windowDays), unit: '天', detail: '分组 ' + v.group },
|
|
110
|
+
]),
|
|
111
|
+
renderChartBlock({
|
|
112
|
+
kind: 'line',
|
|
113
|
+
title: '每日热量(' + v.windowDays + ' 天)',
|
|
114
|
+
input: { items: v.days.map((d) => ({ label: d.date.slice(5), value: d.calorie })) },
|
|
115
|
+
}),
|
|
116
|
+
];
|
|
117
|
+
let charts = true;
|
|
118
|
+
const weighed = v.days.filter((d) => d.weightKg !== null);
|
|
119
|
+
if (weighed.length > 0) {
|
|
120
|
+
parts.push(renderChartBlock({
|
|
121
|
+
kind: 'line',
|
|
122
|
+
title: '体重轨迹(共 ' + weighed.length + ' 次称重)',
|
|
123
|
+
input: { items: weighed.map((d) => ({ label: d.date.slice(5), value: d.weightKg })) },
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
parts.push(renderDataTable({
|
|
127
|
+
columns: [
|
|
128
|
+
{ key: 'date', label: '日期' },
|
|
129
|
+
{ key: 'calorie', label: '热量卡', align: 'right' },
|
|
130
|
+
{ key: 'weight', label: '体重kg', align: 'right' },
|
|
131
|
+
],
|
|
132
|
+
rows: v.days.map((d) => ({ date: d.date, calorie: d.calorie, weight: fmt(d.weightKg) })),
|
|
133
|
+
caption: '逐日明细(' + v.start + ' ~ ' + v.end + ')',
|
|
134
|
+
emptyText: '本窗无明细',
|
|
135
|
+
}));
|
|
136
|
+
parts.push(copyBlock('复制数据', {
|
|
137
|
+
envelope: {
|
|
138
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.long-trend',
|
|
139
|
+
data: {
|
|
140
|
+
metrics: metricsOf({ windowDays: v.windowDays, avgCalorie: v.avgCalorie, weightChange: v.weightChange }),
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
}));
|
|
144
|
+
return assemble('整体趋势(' + v.windowDays + ' 天)', 'calorie.view.long-trend · 趋势其他移植域', '体重+热量双序列(称重不足 2 次则体重变化明示缺失)', parts.join(''), charts);
|
|
145
|
+
}
|
|
146
|
+
/* ── 营养分析(nutrition_analysis:宏量占比+微量 vs 推荐+规则建议) ── */
|
|
147
|
+
export function buildNutritionAnalysisDoc(v) {
|
|
148
|
+
const parts = [
|
|
149
|
+
windowForm(v.start, v.end, '宏量占比=蛋白/碳水×4、脂肪×9 除以总热量;微量=日均 vs 每日推荐'),
|
|
150
|
+
renderKpiGrid([
|
|
151
|
+
{ label: '蛋白', value: String(v.proteinG), unit: 'g', detail: v.proteinPct + '%(建议 10~20%)' },
|
|
152
|
+
{ label: '碳水', value: String(v.carbG), unit: 'g', detail: v.carbPct + '%(建议 45~65%)' },
|
|
153
|
+
{ label: '脂肪', value: String(v.fatG), unit: 'g', detail: v.fatPct + '%(建议 20~35%)' },
|
|
154
|
+
{ label: '总摄入', value: String(v.totalCalorie), unit: '卡', detail: v.days + ' 天' },
|
|
155
|
+
]),
|
|
156
|
+
renderDataTable({
|
|
157
|
+
columns: [
|
|
158
|
+
{ key: 'label', label: '微量' },
|
|
159
|
+
{ key: 'avg', label: '日均', align: 'right' },
|
|
160
|
+
{ key: 'good', label: '推荐' },
|
|
161
|
+
{ key: 'status', label: '状态' },
|
|
162
|
+
],
|
|
163
|
+
rows: [
|
|
164
|
+
{
|
|
165
|
+
label: '膳食纤维', avg: v.fiberAvg + 'g', good: '≥25g/天',
|
|
166
|
+
status: v.fiberAvg >= 25 ? '✓' : '↓ 不足',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
label: '钠', avg: v.sodiumAvg + 'mg', good: '≤2000mg/天',
|
|
170
|
+
status: v.sodiumAvg <= 2000 ? '✓' : '↑ 超标',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
label: '糖', avg: v.sugarAvg + 'g', good: '≤50g/天',
|
|
174
|
+
status: v.sugarAvg <= 50 ? '✓' : '↑ 超标',
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
caption: '微量营养素 vs 推荐',
|
|
178
|
+
emptyText: '本窗无微量数据',
|
|
179
|
+
}),
|
|
180
|
+
];
|
|
181
|
+
let charts = false;
|
|
182
|
+
if (v.totalCalorie > 0) {
|
|
183
|
+
parts.push(renderChartBlock({
|
|
184
|
+
kind: 'donut',
|
|
185
|
+
title: '热量来源占比',
|
|
186
|
+
input: {
|
|
187
|
+
items: [
|
|
188
|
+
{ label: '蛋白', value: v.proteinG * 4 },
|
|
189
|
+
{ label: '碳水', value: v.carbG * 4 },
|
|
190
|
+
{ label: '脂肪', value: v.fatG * 9 },
|
|
191
|
+
],
|
|
192
|
+
options: { showPercent: true },
|
|
193
|
+
},
|
|
194
|
+
}));
|
|
195
|
+
charts = true;
|
|
196
|
+
}
|
|
197
|
+
parts.push(renderDisclosure({
|
|
198
|
+
title: '分析建议(共 ' + v.advice.length + ' 条,由窗内数据规则派生)',
|
|
199
|
+
contentHtml: renderListRows({
|
|
200
|
+
items: v.advice.map((a, i) => ({ left: String(i + 1), main: a, right: '' })),
|
|
201
|
+
}),
|
|
202
|
+
}));
|
|
203
|
+
parts.push(copyBlock('复制数据', {
|
|
204
|
+
envelope: {
|
|
205
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.nutrition-analysis',
|
|
206
|
+
data: {
|
|
207
|
+
metrics: metricsOf({
|
|
208
|
+
days: v.days, totalCalorie: v.totalCalorie,
|
|
209
|
+
proteinG: v.proteinG, proteinPct: v.proteinPct,
|
|
210
|
+
carbG: v.carbG, carbPct: v.carbPct, fatG: v.fatG, fatPct: v.fatPct,
|
|
211
|
+
fiberAvg: v.fiberAvg, sodiumAvg: v.sodiumAvg, sugarAvg: v.sugarAvg,
|
|
212
|
+
adviceCount: v.advice.length,
|
|
213
|
+
}),
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
}));
|
|
217
|
+
return assemble('营养分析 ' + v.start + ' ~ ' + v.end, 'calorie.view.nutrition-analysis · 趋势其他移植域', '配比+微量+规则建议(建议阈值见数据层注释,不编造结论)', parts.join(''), charts);
|
|
218
|
+
}
|
|
219
|
+
/* ── 每日六因素(six_factors) ── */
|
|
220
|
+
export function buildSixFactorsDoc(v) {
|
|
221
|
+
const parts = [
|
|
222
|
+
renderKpiGrid(v.factors.map((f) => ({
|
|
223
|
+
label: f.label, value: f.ok ? '✓' : '✗', detail: f.detail,
|
|
224
|
+
status: f.ok ? 'ok' : 'warn',
|
|
225
|
+
}))),
|
|
226
|
+
renderDataTable({
|
|
227
|
+
columns: [
|
|
228
|
+
{ key: 'label', label: '因素' },
|
|
229
|
+
{ key: 'ok', label: '达标' },
|
|
230
|
+
{ key: 'detail', label: '依据' },
|
|
231
|
+
],
|
|
232
|
+
rows: v.factors.map((f) => ({ label: f.label, ok: f.ok ? '✓' : '✗', detail: f.detail })),
|
|
233
|
+
caption: '六因素明细(' + v.date + ',得分 ' + v.score + '/6)',
|
|
234
|
+
emptyText: '当日无因素数据',
|
|
235
|
+
}),
|
|
236
|
+
copyBlock('复制数据', {
|
|
237
|
+
envelope: {
|
|
238
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.six-factors',
|
|
239
|
+
data: {
|
|
240
|
+
metrics: metricsOf({
|
|
241
|
+
score: v.score,
|
|
242
|
+
calorie: v.factors[0]?.ok ? 1 : 0,
|
|
243
|
+
protein: v.factors[1]?.ok ? 1 : 0,
|
|
244
|
+
water: v.factors[2]?.ok ? 1 : 0,
|
|
245
|
+
exercise: v.factors[3]?.ok ? 1 : 0,
|
|
246
|
+
weigh: v.factors[4]?.ok ? 1 : 0,
|
|
247
|
+
meals: v.factors[5]?.ok ? 1 : 0,
|
|
248
|
+
}),
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
}),
|
|
252
|
+
];
|
|
253
|
+
return assemble('每日六因素 ' + v.date, 'calorie.view.six-factors · 趋势其他移植域', '热量/蛋白/饮水/运动/称重/三餐(无目标项明示,不编数)', parts.join(''), false);
|
|
254
|
+
}
|
|
255
|
+
/* ── 数据健康检查(lint_health) ── */
|
|
256
|
+
export function buildLintHealthDoc(v) {
|
|
257
|
+
const parts = [
|
|
258
|
+
renderKpiGrid([
|
|
259
|
+
{
|
|
260
|
+
label: '问题总数', value: String(v.issueCount), unit: '项',
|
|
261
|
+
detail: v.issueCount === 0 ? '数据健康' : '见下表明细',
|
|
262
|
+
status: v.issueCount === 0 ? 'ok' : 'warn',
|
|
263
|
+
},
|
|
264
|
+
]),
|
|
265
|
+
renderDataTable({
|
|
266
|
+
columns: [
|
|
267
|
+
{ key: 'label', label: '检查项' },
|
|
268
|
+
{ key: 'count', label: '数量', align: 'right' },
|
|
269
|
+
{ key: 'detail', label: '明细' },
|
|
270
|
+
],
|
|
271
|
+
rows: v.checks.map((c) => ({ label: c.label, count: c.count, detail: c.detail })),
|
|
272
|
+
caption: '健康检查明细(只读体检,不写库)',
|
|
273
|
+
emptyText: '无检查项',
|
|
274
|
+
}),
|
|
275
|
+
copyBlock('复制数据', {
|
|
276
|
+
envelope: {
|
|
277
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.lint-health',
|
|
278
|
+
data: {
|
|
279
|
+
metrics: metricsOf({
|
|
280
|
+
issueCount: v.issueCount,
|
|
281
|
+
unmatched: v.checks[0]?.count,
|
|
282
|
+
badCalorie: v.checks[1]?.count,
|
|
283
|
+
future: v.checks[2]?.count,
|
|
284
|
+
duplicate: v.checks[3]?.count,
|
|
285
|
+
}),
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
}),
|
|
289
|
+
];
|
|
290
|
+
return assemble('数据健康检查', 'calorie.view.lint-health · 趋势其他移植域', '未匹配库/零负热量/未来日期/疑似重复(只读,不写库)', parts.join(''), false);
|
|
291
|
+
}
|
|
292
|
+
/* ── 批量导入预览(batch_import_preview) ── */
|
|
293
|
+
export function buildBatchImportPreviewDoc(v) {
|
|
294
|
+
const parts = [
|
|
295
|
+
renderKpiGrid([
|
|
296
|
+
{ label: '待导入', value: String(v.total), unit: '条' },
|
|
297
|
+
{ label: '已匹配库', value: String(v.matched), unit: '条', detail: '精确名匹配' },
|
|
298
|
+
{
|
|
299
|
+
label: '未匹配', value: String(v.missing), unit: '种',
|
|
300
|
+
detail: v.missing === 0 ? '全部可入库' : '导入后建议补录',
|
|
301
|
+
status: v.missing === 0 ? 'ok' : 'warn',
|
|
302
|
+
},
|
|
303
|
+
{ label: '合计热量', value: String(v.totalCalorie), unit: '卡' },
|
|
304
|
+
]),
|
|
305
|
+
renderDataTable({
|
|
306
|
+
columns: [
|
|
307
|
+
{ key: 'foodName', label: '食物' },
|
|
308
|
+
{ key: 'calories', label: '热量卡', align: 'right' },
|
|
309
|
+
{ key: 'lib', label: '库热量', align: 'right' },
|
|
310
|
+
{ key: 'status', label: '匹配' },
|
|
311
|
+
],
|
|
312
|
+
rows: v.items.map((it) => ({
|
|
313
|
+
foodName: it.foodName, calories: it.calories,
|
|
314
|
+
lib: fmt(it.libCalories), status: it.matched ? '✓' : '✗ 缺库',
|
|
315
|
+
})),
|
|
316
|
+
caption: '逐条预览(仅预览,不写库)',
|
|
317
|
+
emptyText: '无待导入条目',
|
|
318
|
+
}),
|
|
319
|
+
];
|
|
320
|
+
if (v.missingNames.length > 0) {
|
|
321
|
+
parts.push(renderDisclosure({
|
|
322
|
+
title: '缺库食物(共 ' + v.missingNames.length + ' 种)',
|
|
323
|
+
contentHtml: renderListRows({
|
|
324
|
+
items: v.missingNames.map((name) => ({ left: name, main: '未在食品库找到', right: '建议用「存食品」补录' })),
|
|
325
|
+
}),
|
|
326
|
+
}));
|
|
327
|
+
}
|
|
328
|
+
parts.push(copyBlock('复制数据', {
|
|
329
|
+
envelope: {
|
|
330
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.batch-import-preview',
|
|
331
|
+
data: {
|
|
332
|
+
metrics: metricsOf({
|
|
333
|
+
total: v.total, matched: v.matched, missing: v.missing, totalCalorie: v.totalCalorie,
|
|
334
|
+
}),
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
}));
|
|
338
|
+
return assemble('批量导入预览', 'calorie.view.batch-import-preview · 趋势其他移植域', '库匹配+合计试算(仅预览,不写库;确认后走 diet.batch 写入)', parts.join(''), false);
|
|
339
|
+
}
|
|
340
|
+
/* ── 落地训练进度(process_progress) ── */
|
|
341
|
+
export function buildProcessProgressDoc(v) {
|
|
342
|
+
const parts = [
|
|
343
|
+
renderKpiGrid([
|
|
344
|
+
{ label: '训练计划', value: v.hasPlan ? '有' : '无', detail: v.title ?? '未配置计划' },
|
|
345
|
+
{ label: '计划训练日', value: String(v.plannedDays), unit: '天', detail: v.totalWeeks === null ? '' : '共 ' + v.totalWeeks + ' 周' },
|
|
346
|
+
{ label: '近7天运动', value: String(v.sessions7d), unit: '次', detail: v.start + ' ~ ' + v.end },
|
|
347
|
+
{ label: '近7天时长', value: String(v.minutes7d), unit: '分钟' },
|
|
348
|
+
]),
|
|
349
|
+
copyBlock('复制数据', {
|
|
350
|
+
envelope: {
|
|
351
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.process-progress',
|
|
352
|
+
data: {
|
|
353
|
+
metrics: metricsOf({
|
|
354
|
+
hasPlan: v.hasPlan ? 1 : 0, plannedDays: v.plannedDays,
|
|
355
|
+
sessions7d: v.sessions7d, minutes7d: v.minutes7d,
|
|
356
|
+
}),
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
}),
|
|
360
|
+
];
|
|
361
|
+
return assemble('落地训练进度', 'calorie.view.process-progress · 趋势其他移植域', '计划配置+近 7 天执行(无计划且无执行即阻断)', parts.join(''), false);
|
|
362
|
+
}
|
|
363
|
+
/* ── 复盘报告(review_template) ── */
|
|
364
|
+
export function buildReviewTemplateDoc(v) {
|
|
365
|
+
const parts = [
|
|
366
|
+
windowForm(v.start, v.end, '饮食/运动/体重三面小结;记餐偏疏时结论明示仅供参考'),
|
|
367
|
+
renderKpiGrid([
|
|
368
|
+
{ label: '记餐', value: String(v.meals), unit: '餐', detail: v.days + ' 天' },
|
|
369
|
+
{ label: '日均热量', value: String(v.avgCalorie), unit: '卡', detail: v.goalCalorie === null ? '无目标' : '目标 ' + v.goalCalorie + '卡' },
|
|
370
|
+
{ label: '运动', value: String(v.sessions), unit: '次', detail: v.minutes + ' 分钟' },
|
|
371
|
+
{
|
|
372
|
+
label: '体重变化', value: fmt(v.weightChange), unit: v.weightChange === null ? '' : 'kg',
|
|
373
|
+
detail: v.weightChange === null ? '称重不足 2 次' : '窗首→窗尾',
|
|
374
|
+
},
|
|
375
|
+
]),
|
|
376
|
+
renderDisclosure({
|
|
377
|
+
title: '复盘要点(共 ' + v.points.length + ' 条,由窗内数据派生)',
|
|
378
|
+
contentHtml: renderListRows({
|
|
379
|
+
items: v.points.map((p, i) => ({ left: String(i + 1), main: p, right: '' })),
|
|
380
|
+
}),
|
|
381
|
+
}),
|
|
382
|
+
copyBlock('复制数据', {
|
|
383
|
+
envelope: {
|
|
384
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.review-template',
|
|
385
|
+
data: {
|
|
386
|
+
metrics: metricsOf({
|
|
387
|
+
days: v.days, meals: v.meals, avgCalorie: v.avgCalorie,
|
|
388
|
+
sessions: v.sessions, minutes: v.minutes, weightChange: v.weightChange,
|
|
389
|
+
points: v.points.length,
|
|
390
|
+
}),
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
}),
|
|
394
|
+
];
|
|
395
|
+
return assemble('复盘报告 ' + v.start + ' ~ ' + v.end, 'calorie.view.review-template · 趋势其他移植域', '三面小结+派生要点(要点为规则输出,非 AI 建议)', parts.join(''), false);
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=trendMiscPortDocs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trendMiscPortDocs.js","sourceRoot":"","sources":["../../src/render/trendMiscPortDocs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/** #86 · wizard 4 页复刻(D1 verify 体验)render 数据+ prompt 复刻。
|
|
2
|
+
*
|
|
3
|
+
* 点名(t71 §2 #4/#6/#11/#9;#52 明确不做、#54 新版已有不碰):
|
|
4
|
+
* 3 个配置型 wizard(记围度/记体脂/记身材照)+ 1 个 GIF 框选器。
|
|
5
|
+
* 形态=静态 HTML + copyText(B7 边界:B-09 表单零 JS,行为归宿主;
|
|
6
|
+
* formPrompt/selectList/smartSelect 一律不用,复制走 Base P0 双通道)。
|
|
7
|
+
*
|
|
8
|
+
* 数据源全复用既有取数层(fetch/body.ts、fetch/photos.ts),不自算:
|
|
9
|
+
* 围度 recent=listMeasurements(limit 1);体脂 recent=listCompositions(limit 1);
|
|
10
|
+
* 身材照 wizard 纯配置(老家 render_body_photo_log_wizard.py 无数据源)不读库;
|
|
11
|
+
* GIF 框选=listPhotos(tag/365 天窗)+ toCard 文件名引用+存在位(T10 二进制铁则,
|
|
12
|
+
* 永不 base64 内嵌;cropper.js 不引入,沿老家 v2.3.5 手动 4 数字坐标)。
|
|
13
|
+
* 空库一律不抛(场景 1 空 wizard 照开;recent 记 null)。
|
|
14
|
+
*
|
|
15
|
+
* prompt 复刻口径(旧模板 buildPrompt/generatePrompt 逐字结构,新 CLI 形态):
|
|
16
|
+
* 围度/体脂=参数式(老家即无命令段,复制给 AI 后由 AI 调写键);
|
|
17
|
+
* 身材照/GIF=参数+命令段(老家 python 命令译为 calorie-cmd-read 同形;
|
|
18
|
+
* photo.gif 无 photoIds/crops 形参,框选与裁剪落参数段由 AI 承接)。
|
|
19
|
+
* 预填 params 键名与写键同形(MEASURE_CAMEL/CALIPER_FIELDS/photo.add 口径),
|
|
20
|
+
* 未知字段 fail(2)(与 cli/write.ts 同字面「不支持字段: 」,防拼写漂移)。
|
|
21
|
+
*/
|
|
22
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
23
|
+
/** 写键 camel 口径镜像(cli/write.ts MEASURE_CAMEL;测试钉死键集一致)。 */
|
|
24
|
+
export declare const WIZARD_MEASURE_CAMEL: Record<string, string>;
|
|
25
|
+
export declare const WIZARD_MEASURE_LABELS: Record<string, string>;
|
|
26
|
+
export declare const WIZARD_CALIPER_LABELS: Record<string, string>;
|
|
27
|
+
export interface MeasureWizardView {
|
|
28
|
+
date: string;
|
|
29
|
+
note: string | null;
|
|
30
|
+
filled: {
|
|
31
|
+
camel: string;
|
|
32
|
+
snake: string;
|
|
33
|
+
label: string;
|
|
34
|
+
value: number;
|
|
35
|
+
}[];
|
|
36
|
+
filledCount: number;
|
|
37
|
+
recent: {
|
|
38
|
+
date: string;
|
|
39
|
+
values: Record<string, number | null>;
|
|
40
|
+
} | null;
|
|
41
|
+
prompt: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function buildMeasureWizardPrompt(date: string, filled: MeasureWizardView['filled'], note: string | null): string;
|
|
44
|
+
export declare function buildMeasureWizardView(db: DatabaseSync, raw: Record<string, unknown>): MeasureWizardView;
|
|
45
|
+
export interface CompositionWizardView {
|
|
46
|
+
date: string;
|
|
47
|
+
source: string | null;
|
|
48
|
+
sourceLabel: string | null;
|
|
49
|
+
bodyFatPct: number | null;
|
|
50
|
+
age: number | null;
|
|
51
|
+
sex: string | null;
|
|
52
|
+
note: string | null;
|
|
53
|
+
calipers: {
|
|
54
|
+
field: string;
|
|
55
|
+
label: string;
|
|
56
|
+
value: number;
|
|
57
|
+
}[];
|
|
58
|
+
sum7: number | null;
|
|
59
|
+
recent: {
|
|
60
|
+
date: string;
|
|
61
|
+
bodyFatPct: number | null;
|
|
62
|
+
source: string | null;
|
|
63
|
+
} | null;
|
|
64
|
+
prompt: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function buildCompositionWizardPrompt(v: {
|
|
67
|
+
date: string;
|
|
68
|
+
source: string | null;
|
|
69
|
+
bodyFatPct: number | null;
|
|
70
|
+
age: number | null;
|
|
71
|
+
sex: string | null;
|
|
72
|
+
note: string | null;
|
|
73
|
+
calipers: {
|
|
74
|
+
field: string;
|
|
75
|
+
label: string;
|
|
76
|
+
value: number;
|
|
77
|
+
}[];
|
|
78
|
+
}): string;
|
|
79
|
+
export declare function buildCompositionWizardView(db: DatabaseSync, raw: Record<string, unknown>): CompositionWizardView;
|
|
80
|
+
export declare const PHOTO_LOG_TAGS: string[];
|
|
81
|
+
export interface PhotoLogWizardView {
|
|
82
|
+
srcPaths: string[];
|
|
83
|
+
tag: string | null;
|
|
84
|
+
note: string | null;
|
|
85
|
+
prompt: string;
|
|
86
|
+
}
|
|
87
|
+
export declare function buildPhotoLogWizardPrompt(srcPaths: string[], tag: string | null, note: string | null): string;
|
|
88
|
+
export declare function buildPhotoLogWizardView(raw: Record<string, unknown>): PhotoLogWizardView;
|
|
89
|
+
export interface GifPlannerPhoto {
|
|
90
|
+
id: number;
|
|
91
|
+
date: string;
|
|
92
|
+
tagList: string[];
|
|
93
|
+
photoPath: string;
|
|
94
|
+
fileExists: boolean | null;
|
|
95
|
+
selected: boolean;
|
|
96
|
+
crop: [number, number, number, number] | null;
|
|
97
|
+
}
|
|
98
|
+
export interface GifPlannerView {
|
|
99
|
+
tag: string | null;
|
|
100
|
+
photos: GifPlannerPhoto[];
|
|
101
|
+
selectedIds: number[];
|
|
102
|
+
missingIds: number[];
|
|
103
|
+
duration: number;
|
|
104
|
+
loop: number;
|
|
105
|
+
width: number;
|
|
106
|
+
height: number;
|
|
107
|
+
watermark: string | null;
|
|
108
|
+
transition: string;
|
|
109
|
+
output: string | null;
|
|
110
|
+
prompt: string;
|
|
111
|
+
}
|
|
112
|
+
export declare function buildGifPlannerPrompt(v: {
|
|
113
|
+
selectedIds: number[];
|
|
114
|
+
crops: Record<string, [number, number, number, number]>;
|
|
115
|
+
duration: number;
|
|
116
|
+
loop: number;
|
|
117
|
+
width: number;
|
|
118
|
+
height: number;
|
|
119
|
+
watermark: string | null;
|
|
120
|
+
transition: string;
|
|
121
|
+
output: string | null;
|
|
122
|
+
tag: string | null;
|
|
123
|
+
}): string;
|
|
124
|
+
export declare function buildGifPlannerView(db: DatabaseSync, raw: Record<string, unknown>, photosDir?: string | null): GifPlannerView;
|
|
125
|
+
//# sourceMappingURL=wizardPort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizardPort.d.ts","sourceRoot":"","sources":["../../src/render/wizardPort.ts"],"names":[],"mappings":"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"}
|