skill-calorie 0.1.1 → 0.2.0
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 +179 -0
- package/dist/cli/cmd_read.d.ts.map +1 -1
- package/dist/cli/cmd_read.js +38 -17
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/write.d.ts +15 -0
- package/dist/cli/write.d.ts.map +1 -1
- package/dist/cli/write.js +30 -19
- package/dist/cli/write.js.map +1 -1
- package/dist/db/readonly.d.ts +3 -0
- package/dist/db/readonly.d.ts.map +1 -0
- package/dist/db/readonly.js +22 -0
- package/dist/db/readonly.js.map +1 -0
- package/dist/output.d.ts +28 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +107 -0
- package/dist/output.js.map +1 -0
- package/dist/render/copy.d.ts +20 -0
- package/dist/render/copy.d.ts.map +1 -0
- package/dist/render/copy.js +36 -0
- package/dist/render/copy.js.map +1 -0
- package/dist/render/html.d.ts +12 -0
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +19 -4
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +5 -1
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +3 -1
- package/dist/render/index.js.map +1 -1
- package/dist/render/photo.d.ts +6 -1
- package/dist/render/photo.d.ts.map +1 -1
- package/dist/render/photo.js +8 -3
- package/dist/render/photo.js.map +1 -1
- package/dist/render/templates.d.ts +4 -0
- package/dist/render/templates.d.ts.map +1 -0
- package/dist/render/templates.js +29 -0
- package/dist/render/templates.js.map +1 -0
- package/dist/triggers/routing.d.ts +141 -0
- package/dist/triggers/routing.d.ts.map +1 -0
- package/dist/triggers/routing.js +648 -0
- package/dist/triggers/routing.js.map +1 -0
- package/package.json +5 -3
- package/templates/diet.html +40 -0
- package/templates/exercise.html +40 -0
- package/templates/goal.html +40 -0
- package/templates/help.html +40 -0
- package/templates/home.html +40 -0
- package/templates/photo-gallery.html +40 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** #81 · 唤醒词路由层(436 条 SoT 逐条恰一次 + 34 键新增入口)。
|
|
2
|
+
*
|
|
3
|
+
* 裁定 D-1(parity 与路由分家):`src/triggers/scene-*.ts` 唤醒词表原样冻结——它的 `main_prompt.cli` 是
|
|
4
|
+
* 19 字段 sha 的 parity 证据,不是路由;本票全部新能力落在本文件。本文件**只做路由**,不复制唤醒词表的
|
|
5
|
+
* 其它字段(category/desc/main_prompt.text/variants…),唤醒词集合与冻结表的相等性由断言钉死。
|
|
6
|
+
*
|
|
7
|
+
* 裁定 D-2(形态):每条路由记录以唤醒词为键,436 条逐条恰一次;顺序与 `TRIGGERS` 逐位对齐。
|
|
8
|
+
* - `kind: 'exec'` → 可执行桶,带 `key`(必在 77 键内)与 `cli`(唯一出口形态)
|
|
9
|
+
* - `kind: 'non-exec'` → 命中但不执行桶,带 `bucket` 与 `reason`
|
|
10
|
+
*
|
|
11
|
+
* 裁定 D-3(两个桶):
|
|
12
|
+
* - `exec` 判据与 `help-lookup.ts:100-104 execCliFor` 同口径:`main_prompt.cli` 已可执行,
|
|
13
|
+
* 或 `HELP_EXEC_OVERRIDES` 命中(SoT 原文不动,呈现层替换首命中)。
|
|
14
|
+
* - 补判据一(FX-81-2 · 同能力孪生词):冻结词的能力若已由 `NEW_KEY_ROUTES` 的新拟词承载
|
|
15
|
+
* (同一 key),则该冻结词一并入 `exec` 桶并指向同一 key——旧词指向的能力已经能执行,就不能
|
|
16
|
+
* 对用户说「做不到」(架构规格 `docs/calorie-architecture.md:32`/:60 的目的)。词表见
|
|
17
|
+
* `TWIN_WAKE_WORDS`,24 词/26 条记录,逐条孪生关系见 `docs/research/t81-route-evidence.md` §2.1。
|
|
18
|
+
* - 补判据二(FX-81-7 · 同 key 可参数化):一个旧唤醒词,只要存在一条能达成其所述能力的**单命令**
|
|
19
|
+
* (同 key + 参数,实跑 `exit 0`),就必须进 `exec` 桶。逐条映射(旧词 → 键 + 参数 → 实跑 exit)
|
|
20
|
+
* 见 `docs/research/t81-route-evidence.md` §2.3;实跑快照见 `docs/research/t81-exec-smoke.md`。
|
|
21
|
+
* - `non-exec` 细分 `bucket`:`'out-of-scope'`=架构规格 `docs/calorie-architecture.md:60`
|
|
22
|
+
* 的明确不做(定时复盘/训记/营养表/落地);`'legacy-chain'`=该词所述能力在 77 键内无同形可执行
|
|
23
|
+
* 入口(缺参数/缺形态/缺写键)或语义上必须多步交互(wizard)——逐条理由见 §2.3 右列。
|
|
24
|
+
* - t71 O1–O6 与规格的口径差异逐条登记在 `T71_DIFFS`(两处出处都给)。
|
|
25
|
+
*
|
|
26
|
+
* 裁定 D-4(34/77 无入口的键):`NEW_KEY_ROUTES` 补入口,唤醒词新拟(清单见
|
|
27
|
+
* `docs/research/t81-route-evidence.md`),**不写入冻结表**。
|
|
28
|
+
*
|
|
29
|
+
* 零 py 命令引用(含本注释):本文件不含任何 py 起头的命令,exec `cli` 一律 `calorie-cmd-read calorie.*` 形态;
|
|
30
|
+
* 断言见 `test/calorie-routing-81.test.mjs`。
|
|
31
|
+
*/
|
|
32
|
+
import type { CalorieComboKey, CalorieWriteKey } from '../cli/keys.js';
|
|
33
|
+
/** 77 键内的路由键(读 42 + 写 35;两 registry 无重叠) */
|
|
34
|
+
export type RouteKey = CalorieComboKey | CalorieWriteKey;
|
|
35
|
+
/** 场景号(与 SoT 10 场景一致) */
|
|
36
|
+
export type SceneNo = '01' | '02' | '03' | '04' | '05' | '06' | '07' | '08' | '09' | '10';
|
|
37
|
+
/** 「命中但不执行」桶内的细分标记(D-3) */
|
|
38
|
+
export type NonExecBucket = 'out-of-scope' | 'legacy-chain';
|
|
39
|
+
/** 可执行桶记录(D-2) */
|
|
40
|
+
export interface ExecWakeRoute {
|
|
41
|
+
readonly wakeWord: string;
|
|
42
|
+
readonly scene: SceneNo;
|
|
43
|
+
readonly kind: 'exec';
|
|
44
|
+
/** 必须在 77 键内(编译期由 RouteKey 约束,运行期由测试断言) */
|
|
45
|
+
readonly key: RouteKey;
|
|
46
|
+
/** 唯一出口形态:calorie-cmd-read calorie.* */
|
|
47
|
+
readonly cli: string;
|
|
48
|
+
}
|
|
49
|
+
/** 命中但不执行桶记录(D-2) */
|
|
50
|
+
export interface NonExecWakeRoute {
|
|
51
|
+
readonly wakeWord: string;
|
|
52
|
+
readonly scene: SceneNo;
|
|
53
|
+
readonly kind: 'non-exec';
|
|
54
|
+
readonly bucket: NonExecBucket;
|
|
55
|
+
/** 逐字理由(取值来自 NON_EXEC_REASONS,单一来源) */
|
|
56
|
+
readonly reason: string;
|
|
57
|
+
}
|
|
58
|
+
export type WakeRoute = ExecWakeRoute | NonExecWakeRoute;
|
|
59
|
+
/** 非执行理由(逐字;每条 non-exec 记录的 reason 取值于此,避免重复文本)。
|
|
60
|
+
*
|
|
61
|
+
* FX-81-7 复核:一个旧唤醒词,只要存在一条能达成其所述能力的单命令(同 key + 参数,实跑 exit 0),
|
|
62
|
+
* 就必须进 exec 桶(逐条映射与实跑见 docs/research/t81-route-evidence.md §2.3 + t81-exec-smoke.md)。
|
|
63
|
+
* 仍留在本桶的词只有两类:① 语义上必须多步交互(wizard,归 #86);② 77 键内无同形可执行入口
|
|
64
|
+
* (缺参数/缺形态/缺写键,逐条理由见 §2.3 右列)。
|
|
65
|
+
*/
|
|
66
|
+
export declare const NON_EXEC_REASONS: {
|
|
67
|
+
readonly wizard: "命中但不执行:需多步交互(wizard)——先预览/确认再写库,非单条命令可达成(归 #86)。";
|
|
68
|
+
readonly noNoteFilter: "命中但不执行:77 键无「备注」筛选参数(饮食/体重/运动三面的备注均非任何键的筛选维度),单命令不可达成(逐条见 docs/research/t81-route-evidence.md §2.3)。";
|
|
69
|
+
readonly noNutrientDetail: "命中但不执行:77 键无钠/糖/纤维等营养素明细维度(view.diet-review 的 macro 只有蛋白/碳水/脂肪配比),单命令不可达成。";
|
|
70
|
+
readonly noNutritionAdvice: "命中但不执行:77 键无营养建议形态(view.diet-review/view.health 给数据盘,不给建议条目)。";
|
|
71
|
+
readonly compoundCurve: "命中但不执行:该词要的是「曲线+标注」(目标线/里程碑/异常点)复合形态;view.weight-history 只给历史点与变化量,view.anomaly 只给异常点,无单键同形。";
|
|
72
|
+
readonly anchorCompare: "命中但不执行:该词需先派生锚点日期(平台期首日/历史最低/历史最高/里程碑日/季节最低/极端月)再对比;view.weight-compare 的四个参数皆为调用方给出的日期段,无锚点派生参数,单命令不可达成。";
|
|
73
|
+
readonly reviewWindowOnly: "命中但不执行:view.weight-review 只吃 today/date(复核形态),无期间窗口参数;view.weight-history 为历史点+变化量,非复盘形态 → 期间复盘无单命令同形。";
|
|
74
|
+
readonly milestoneForwardOnly: "命中但不执行:view.weight-review 的 milestone 是「目标达成预测」(estDays/estDate 前向),不是里程碑回溯列表 → 无单命令同形。";
|
|
75
|
+
readonly recordFilterMissing: "命中但不执行:77 键无运动记录级列表/筛选参数(view.exercise 是汇总盘:byType/byCategory 为分项统计,不含逐条记录与备注筛选)。";
|
|
76
|
+
readonly categoryOverviewMissing: "命中但不执行:view.exercise 无 category 参数(分项统计按运动类型 byType 渲染 TOP4,byCategory 未渲染,力量/有氧非独立形态),无单命令同形。";
|
|
77
|
+
readonly planFilterMissing: "命中但不执行:view.plan 无周/日/动作筛选参数(返回全计划),与词的周/日/动作粒度不同 → 无单命令同形。";
|
|
78
|
+
readonly planWriteMissing: "命中但不执行:77 键无训练计划写键(旧链 --live-plan-* 系列),本仓执行层不承接计划写入。";
|
|
79
|
+
readonly planReviewMissing: "命中但不执行:77 键无计划完成率/未完成训练/动作完成率入口(view.exercise-goal 只对照运动目标,不对照训练计划)→ 无单命令同形。";
|
|
80
|
+
readonly bodyCompareMissing: "命中但不执行:view.body-composition/view.body-measure 只有 days/source/limit/metric 等参数,无两期对比参数 → 无单命令同形(渲染层已有 buildBodyCompositionCompare/buildBodyMeasureCompare:render/bodyPlate.ts:49/:112,经 render/index.ts:25 导出,但 CLI 侧未接线)。";
|
|
81
|
+
readonly reportKindMissing: "命中但不执行:旧链 report --kind 的 BMI/TDEE/BMR/蛋白/水分/评分/趋势/对比属「报告子形态」,77 键内无同形报告键(view.health 只有 full 健康盘;TDEE/BMR 仅作为 view.goal-recommend 推荐盘的依据字段出现,非报告产物)。";
|
|
82
|
+
readonly multiTrendMissing: "命中但不执行:77 键无多指标趋势键(view.combined 只吃两指标配对,旧链 trend --group g1–g11 为 2–4 指标组合)→ 无单命令同形。";
|
|
83
|
+
readonly predictParamMissing: "命中但不执行:view.predict 只有 start/end/horizonDays(体重外推),无 target(目标体重)/deficit(每日缺口)/摄入速率参数 → 无单命令同形。";
|
|
84
|
+
readonly sixFactorsMissing: "命中但不执行:77 键无「每日 6 因素综合」形态(view.home 为当日总览,不含旧链 six 的 6 因素评分)。";
|
|
85
|
+
readonly lintMissing: "命中但不执行:77 键无数据质量/lint 形态(旧链 render_lint_health.py 为数据体检)。";
|
|
86
|
+
readonly oosCron: "明确不做(架构规格 docs/calorie-architecture.md:60:定时复盘);词只保证命中与文案,执行层不承接(t71 O1 同项)。";
|
|
87
|
+
readonly oosXunji: "明确不做(架构规格 docs/calorie-architecture.md:60:训记);词只保证命中与文案,执行层不承接(t71 O3 同项)。";
|
|
88
|
+
readonly oosLabel: "明确不做(架构规格 docs/calorie-architecture.md:60:营养表);词只保证命中与文案,执行层不承接(t71 O4 同项)。";
|
|
89
|
+
readonly oosLanding: "明确不做(架构规格 docs/calorie-architecture.md:60:落地);词只保证命中与文案,执行层不承接(t71 属 M8 需移植项、非 O1–O4,差异见 T71_DIFFS)。";
|
|
90
|
+
};
|
|
91
|
+
/** FX-81-2 词级孪生词(24 词/26 记录):能力已由 NEW_KEY_ROUTES 同 key 入口承载。
|
|
92
|
+
* 与 FX-81-7 的「同 key 可参数化」家族区分:本表是**词级**判定,FX-81-7 是按脚本+参数机械派生的**家族级**判定。 */
|
|
93
|
+
export declare const TWIN_WAKE_WORDS: readonly string[];
|
|
94
|
+
/** 436 条 SoT 唤醒词路由(顺序与 TRIGGERS 逐位对齐) */
|
|
95
|
+
export declare const WAKE_ROUTES: readonly WakeRoute[];
|
|
96
|
+
/** FX-81-5 覆盖修复:3 条链式 wizard 词的键失去**唯一**可跑入口,故补 1 条单命令入口。
|
|
97
|
+
*
|
|
98
|
+
* FX-81-7 复核后:`看目标预测达成` 已改 exec(≥14 天窗口实跑 exit 0)→ 其键
|
|
99
|
+
* `calorie.view.goal-predict` 由该词自身承接,原修复入口 `看目标达成预测` 删除(不再需要)。
|
|
100
|
+
* `定营养目标(自动算)`/`定饮水目标(自动算)`/`一键定全套目标` 三条链式词保留 non-exec(wizard),
|
|
101
|
+
* 其键 `calorie.view.goal-recommend` 由本条承接(D2③「77 键全部有可执行入口」不放宽)。 */
|
|
102
|
+
export declare const COVERAGE_REPAIR_ROUTES: readonly ExecWakeRoute[];
|
|
103
|
+
/** D-4:34 个无入口键的新拟入口(唤醒词新拟,不写入冻结表) */
|
|
104
|
+
export declare const NEW_KEY_ROUTES: readonly ExecWakeRoute[];
|
|
105
|
+
/** 全量路由(436 条 SoT + 34 条新拟入口 + 1 条覆盖修复入口) */
|
|
106
|
+
export declare const ALL_ROUTES: readonly WakeRoute[];
|
|
107
|
+
/** 唤醒词 → 路由(记身材照 3 条,故值为数组) */
|
|
108
|
+
export declare const ROUTES_BY_WAKE_WORD: Readonly<Record<string, readonly WakeRoute[]>>;
|
|
109
|
+
/** calorie key → 首条可执行路由(77 键全可达的索引) */
|
|
110
|
+
export declare const EXEC_ROUTE_BY_KEY: Readonly<Record<string, ExecWakeRoute>>;
|
|
111
|
+
/** t71 O1–O4 与架构规格 :60 的口径差异(逐条登记,两处出处都给) */
|
|
112
|
+
export interface T71Diff {
|
|
113
|
+
readonly id: string;
|
|
114
|
+
readonly wakeWords: readonly string[];
|
|
115
|
+
readonly spec: string;
|
|
116
|
+
readonly t71: string;
|
|
117
|
+
readonly note: string;
|
|
118
|
+
}
|
|
119
|
+
export declare const T71_DIFFS: readonly T71Diff[];
|
|
120
|
+
/** 明确不做桶成员(按规格 :60 建立;t71 差异见 T71_DIFFS) */
|
|
121
|
+
export declare const OUT_OF_SCOPE_ROUTES: readonly NonExecWakeRoute[];
|
|
122
|
+
/** 命中但不执行桶成员 */
|
|
123
|
+
export declare const HIT_NOT_EXEC_ROUTES: readonly NonExecWakeRoute[];
|
|
124
|
+
/** 可执行桶成员 */
|
|
125
|
+
export declare const EXEC_ROUTES: readonly ExecWakeRoute[];
|
|
126
|
+
/** 唤醒词 → 路由(查表;无命中返空数组,不返 null 冒充) */
|
|
127
|
+
export declare function routesFor(wakeWord: string): readonly WakeRoute[];
|
|
128
|
+
/** calorie key → 可执行 cli(无入口返 null) */
|
|
129
|
+
export declare function execCliForKey(key: string): string | null;
|
|
130
|
+
/** 路由计数(证据表用) */
|
|
131
|
+
export declare function routingSummary(): {
|
|
132
|
+
total: number;
|
|
133
|
+
exec: number;
|
|
134
|
+
nonExec: number;
|
|
135
|
+
outOfScope: number;
|
|
136
|
+
legacyChain: number;
|
|
137
|
+
newEntries: number;
|
|
138
|
+
repairEntries: number;
|
|
139
|
+
coveredKeys: number;
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/triggers/routing.ts"],"names":[],"mappings":"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"}
|