skill-calorie 0.1.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.
Files changed (373) hide show
  1. package/dist/analysis/anomaly/common.d.ts +53 -0
  2. package/dist/analysis/anomaly/common.d.ts.map +1 -0
  3. package/dist/analysis/anomaly/common.js +69 -0
  4. package/dist/analysis/anomaly/common.js.map +1 -0
  5. package/dist/analysis/anomaly/diet.d.ts +8 -0
  6. package/dist/analysis/anomaly/diet.d.ts.map +1 -0
  7. package/dist/analysis/anomaly/diet.js +95 -0
  8. package/dist/analysis/anomaly/diet.js.map +1 -0
  9. package/dist/analysis/anomaly/exercise.d.ts +9 -0
  10. package/dist/analysis/anomaly/exercise.d.ts.map +1 -0
  11. package/dist/analysis/anomaly/exercise.js +116 -0
  12. package/dist/analysis/anomaly/exercise.js.map +1 -0
  13. package/dist/analysis/anomaly/index.d.ts +19 -0
  14. package/dist/analysis/anomaly/index.d.ts.map +1 -0
  15. package/dist/analysis/anomaly/index.js +51 -0
  16. package/dist/analysis/anomaly/index.js.map +1 -0
  17. package/dist/analysis/anomaly/overall.d.ts +13 -0
  18. package/dist/analysis/anomaly/overall.d.ts.map +1 -0
  19. package/dist/analysis/anomaly/overall.js +128 -0
  20. package/dist/analysis/anomaly/overall.js.map +1 -0
  21. package/dist/analysis/anomaly/overall2.d.ts +5 -0
  22. package/dist/analysis/anomaly/overall2.d.ts.map +1 -0
  23. package/dist/analysis/anomaly/overall2.js +94 -0
  24. package/dist/analysis/anomaly/overall2.js.map +1 -0
  25. package/dist/analysis/anomaly/weight.d.ts +8 -0
  26. package/dist/analysis/anomaly/weight.d.ts.map +1 -0
  27. package/dist/analysis/anomaly/weight.js +106 -0
  28. package/dist/analysis/anomaly/weight.js.map +1 -0
  29. package/dist/analysis/anomaly/weight2.d.ts +4 -0
  30. package/dist/analysis/anomaly/weight2.d.ts.map +1 -0
  31. package/dist/analysis/anomaly/weight2.js +59 -0
  32. package/dist/analysis/anomaly/weight2.js.map +1 -0
  33. package/dist/analysis/contraindications.d.ts +63 -0
  34. package/dist/analysis/contraindications.d.ts.map +1 -0
  35. package/dist/analysis/contraindications.js +121 -0
  36. package/dist/analysis/contraindications.js.map +1 -0
  37. package/dist/analysis/cross.d.ts +75 -0
  38. package/dist/analysis/cross.d.ts.map +1 -0
  39. package/dist/analysis/cross.js +283 -0
  40. package/dist/analysis/cross.js.map +1 -0
  41. package/dist/analysis/dashboard.d.ts +18 -0
  42. package/dist/analysis/dashboard.d.ts.map +1 -0
  43. package/dist/analysis/dashboard.js +48 -0
  44. package/dist/analysis/dashboard.js.map +1 -0
  45. package/dist/analysis/deficit.d.ts +44 -0
  46. package/dist/analysis/deficit.d.ts.map +1 -0
  47. package/dist/analysis/deficit.js +54 -0
  48. package/dist/analysis/deficit.js.map +1 -0
  49. package/dist/analysis/diet.d.ts +76 -0
  50. package/dist/analysis/diet.d.ts.map +1 -0
  51. package/dist/analysis/diet.js +164 -0
  52. package/dist/analysis/diet.js.map +1 -0
  53. package/dist/analysis/exercise.d.ts +98 -0
  54. package/dist/analysis/exercise.d.ts.map +1 -0
  55. package/dist/analysis/exercise.js +298 -0
  56. package/dist/analysis/exercise.js.map +1 -0
  57. package/dist/analysis/exerciseReview.d.ts +36 -0
  58. package/dist/analysis/exerciseReview.d.ts.map +1 -0
  59. package/dist/analysis/exerciseReview.js +50 -0
  60. package/dist/analysis/exerciseReview.js.map +1 -0
  61. package/dist/analysis/precision.d.ts +15 -0
  62. package/dist/analysis/precision.d.ts.map +1 -0
  63. package/dist/analysis/precision.js +38 -0
  64. package/dist/analysis/precision.js.map +1 -0
  65. package/dist/analysis/result.d.ts +15 -0
  66. package/dist/analysis/result.d.ts.map +1 -0
  67. package/dist/analysis/result.js +13 -0
  68. package/dist/analysis/result.js.map +1 -0
  69. package/dist/analysis/review.d.ts +118 -0
  70. package/dist/analysis/review.d.ts.map +1 -0
  71. package/dist/analysis/review.js +195 -0
  72. package/dist/analysis/review.js.map +1 -0
  73. package/dist/analysis/series.d.ts +42 -0
  74. package/dist/analysis/series.d.ts.map +1 -0
  75. package/dist/analysis/series.js +127 -0
  76. package/dist/analysis/series.js.map +1 -0
  77. package/dist/analysis/simulate.d.ts +43 -0
  78. package/dist/analysis/simulate.d.ts.map +1 -0
  79. package/dist/analysis/simulate.js +109 -0
  80. package/dist/analysis/simulate.js.map +1 -0
  81. package/dist/analysis/simulate2.d.ts +65 -0
  82. package/dist/analysis/simulate2.d.ts.map +1 -0
  83. package/dist/analysis/simulate2.js +173 -0
  84. package/dist/analysis/simulate2.js.map +1 -0
  85. package/dist/analysis/trend.d.ts +39 -0
  86. package/dist/analysis/trend.d.ts.map +1 -0
  87. package/dist/analysis/trend.js +48 -0
  88. package/dist/analysis/trend.js.map +1 -0
  89. package/dist/analysis/utils.d.ts +17 -0
  90. package/dist/analysis/utils.d.ts.map +1 -0
  91. package/dist/analysis/utils.js +52 -0
  92. package/dist/analysis/utils.js.map +1 -0
  93. package/dist/analysis/volatility.d.ts +43 -0
  94. package/dist/analysis/volatility.d.ts.map +1 -0
  95. package/dist/analysis/volatility.js +96 -0
  96. package/dist/analysis/volatility.js.map +1 -0
  97. package/dist/analysis/weight.d.ts +86 -0
  98. package/dist/analysis/weight.d.ts.map +1 -0
  99. package/dist/analysis/weight.js +219 -0
  100. package/dist/analysis/weight.js.map +1 -0
  101. package/dist/analysis/weightCompare.d.ts +63 -0
  102. package/dist/analysis/weightCompare.d.ts.map +1 -0
  103. package/dist/analysis/weightCompare.js +212 -0
  104. package/dist/analysis/weightCompare.js.map +1 -0
  105. package/dist/analysis/weightCompare2.d.ts +63 -0
  106. package/dist/analysis/weightCompare2.d.ts.map +1 -0
  107. package/dist/analysis/weightCompare2.js +211 -0
  108. package/dist/analysis/weightCompare2.js.map +1 -0
  109. package/dist/analysis/weightCompare3.d.ts +13 -0
  110. package/dist/analysis/weightCompare3.d.ts.map +1 -0
  111. package/dist/analysis/weightCompare3.js +199 -0
  112. package/dist/analysis/weightCompare3.js.map +1 -0
  113. package/dist/cli/cmd_read.d.ts +8 -0
  114. package/dist/cli/cmd_read.d.ts.map +1 -0
  115. package/dist/cli/cmd_read.js +719 -0
  116. package/dist/cli/cmd_read.js.map +1 -0
  117. package/dist/cli/keys.d.ts +333 -0
  118. package/dist/cli/keys.d.ts.map +1 -0
  119. package/dist/cli/keys.js +103 -0
  120. package/dist/cli/keys.js.map +1 -0
  121. package/dist/cli/write.d.ts +24 -0
  122. package/dist/cli/write.d.ts.map +1 -0
  123. package/dist/cli/write.js +832 -0
  124. package/dist/cli/write.js.map +1 -0
  125. package/dist/fetch/audit.d.ts +25 -0
  126. package/dist/fetch/audit.d.ts.map +1 -0
  127. package/dist/fetch/audit.js +46 -0
  128. package/dist/fetch/audit.js.map +1 -0
  129. package/dist/fetch/batch.d.ts +68 -0
  130. package/dist/fetch/batch.d.ts.map +1 -0
  131. package/dist/fetch/batch.js +183 -0
  132. package/dist/fetch/batch.js.map +1 -0
  133. package/dist/fetch/body.d.ts +89 -0
  134. package/dist/fetch/body.d.ts.map +1 -0
  135. package/dist/fetch/body.js +217 -0
  136. package/dist/fetch/body.js.map +1 -0
  137. package/dist/fetch/cli.d.ts +3 -0
  138. package/dist/fetch/cli.d.ts.map +1 -0
  139. package/dist/fetch/cli.js +195 -0
  140. package/dist/fetch/cli.js.map +1 -0
  141. package/dist/fetch/cross-skill.d.ts +29 -0
  142. package/dist/fetch/cross-skill.d.ts.map +1 -0
  143. package/dist/fetch/cross-skill.js +42 -0
  144. package/dist/fetch/cross-skill.js.map +1 -0
  145. package/dist/fetch/db.d.ts +5 -0
  146. package/dist/fetch/db.d.ts.map +1 -0
  147. package/dist/fetch/db.js +4 -0
  148. package/dist/fetch/db.js.map +1 -0
  149. package/dist/fetch/diet.d.ts +174 -0
  150. package/dist/fetch/diet.d.ts.map +1 -0
  151. package/dist/fetch/diet.js +239 -0
  152. package/dist/fetch/diet.js.map +1 -0
  153. package/dist/fetch/errors.d.ts +5 -0
  154. package/dist/fetch/errors.d.ts.map +1 -0
  155. package/dist/fetch/errors.js +8 -0
  156. package/dist/fetch/errors.js.map +1 -0
  157. package/dist/fetch/exercise.d.ts +72 -0
  158. package/dist/fetch/exercise.d.ts.map +1 -0
  159. package/dist/fetch/exercise.js +270 -0
  160. package/dist/fetch/exercise.js.map +1 -0
  161. package/dist/fetch/goal.d.ts +48 -0
  162. package/dist/fetch/goal.d.ts.map +1 -0
  163. package/dist/fetch/goal.js +73 -0
  164. package/dist/fetch/goal.js.map +1 -0
  165. package/dist/fetch/goalHistory.d.ts +24 -0
  166. package/dist/fetch/goalHistory.d.ts.map +1 -0
  167. package/dist/fetch/goalHistory.js +51 -0
  168. package/dist/fetch/goalHistory.js.map +1 -0
  169. package/dist/fetch/history.d.ts +28 -0
  170. package/dist/fetch/history.d.ts.map +1 -0
  171. package/dist/fetch/history.js +29 -0
  172. package/dist/fetch/history.js.map +1 -0
  173. package/dist/fetch/index.d.ts +23 -0
  174. package/dist/fetch/index.d.ts.map +1 -0
  175. package/dist/fetch/index.js +16 -0
  176. package/dist/fetch/index.js.map +1 -0
  177. package/dist/fetch/nutritionGoal.d.ts +115 -0
  178. package/dist/fetch/nutritionGoal.d.ts.map +1 -0
  179. package/dist/fetch/nutritionGoal.js +154 -0
  180. package/dist/fetch/nutritionGoal.js.map +1 -0
  181. package/dist/fetch/photos.d.ts +76 -0
  182. package/dist/fetch/photos.d.ts.map +1 -0
  183. package/dist/fetch/photos.js +193 -0
  184. package/dist/fetch/photos.js.map +1 -0
  185. package/dist/fetch/plan.d.ts +145 -0
  186. package/dist/fetch/plan.d.ts.map +1 -0
  187. package/dist/fetch/plan.js +258 -0
  188. package/dist/fetch/plan.js.map +1 -0
  189. package/dist/fetch/products.d.ts +62 -0
  190. package/dist/fetch/products.d.ts.map +1 -0
  191. package/dist/fetch/products.js +73 -0
  192. package/dist/fetch/products.js.map +1 -0
  193. package/dist/fetch/profile.d.ts +46 -0
  194. package/dist/fetch/profile.d.ts.map +1 -0
  195. package/dist/fetch/profile.js +105 -0
  196. package/dist/fetch/profile.js.map +1 -0
  197. package/dist/fetch/shapes.d.ts +41 -0
  198. package/dist/fetch/shapes.d.ts.map +1 -0
  199. package/dist/fetch/shapes.js +38 -0
  200. package/dist/fetch/shapes.js.map +1 -0
  201. package/dist/fetch/validate.d.ts +11 -0
  202. package/dist/fetch/validate.d.ts.map +1 -0
  203. package/dist/fetch/validate.js +64 -0
  204. package/dist/fetch/validate.js.map +1 -0
  205. package/dist/fetch/weight.d.ts +109 -0
  206. package/dist/fetch/weight.d.ts.map +1 -0
  207. package/dist/fetch/weight.js +210 -0
  208. package/dist/fetch/weight.js.map +1 -0
  209. package/dist/fetch/xunji-catalog.d.ts +17 -0
  210. package/dist/fetch/xunji-catalog.d.ts.map +1 -0
  211. package/dist/fetch/xunji-catalog.js +57 -0
  212. package/dist/fetch/xunji-catalog.js.map +1 -0
  213. package/dist/index.d.ts +17 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +12 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/kcal.d.ts +21 -0
  218. package/dist/kcal.d.ts.map +1 -0
  219. package/dist/kcal.js +27 -0
  220. package/dist/kcal.js.map +1 -0
  221. package/dist/migrate/migrate.d.ts +71 -0
  222. package/dist/migrate/migrate.d.ts.map +1 -0
  223. package/dist/migrate/migrate.js +450 -0
  224. package/dist/migrate/migrate.js.map +1 -0
  225. package/dist/paths.d.ts +6 -0
  226. package/dist/paths.d.ts.map +1 -0
  227. package/dist/paths.js +34 -0
  228. package/dist/paths.js.map +1 -0
  229. package/dist/render/analysisPlate.d.ts +49 -0
  230. package/dist/render/analysisPlate.d.ts.map +1 -0
  231. package/dist/render/analysisPlate.js +149 -0
  232. package/dist/render/analysisPlate.js.map +1 -0
  233. package/dist/render/bodyPlate.d.ts +55 -0
  234. package/dist/render/bodyPlate.d.ts.map +1 -0
  235. package/dist/render/bodyPlate.js +97 -0
  236. package/dist/render/bodyPlate.js.map +1 -0
  237. package/dist/render/diet.d.ts +47 -0
  238. package/dist/render/diet.d.ts.map +1 -0
  239. package/dist/render/diet.js +94 -0
  240. package/dist/render/diet.js.map +1 -0
  241. package/dist/render/envelope.d.ts +60 -0
  242. package/dist/render/envelope.d.ts.map +1 -0
  243. package/dist/render/envelope.js +111 -0
  244. package/dist/render/envelope.js.map +1 -0
  245. package/dist/render/errors.d.ts +10 -0
  246. package/dist/render/errors.d.ts.map +1 -0
  247. package/dist/render/errors.js +9 -0
  248. package/dist/render/errors.js.map +1 -0
  249. package/dist/render/exercise.d.ts +20 -0
  250. package/dist/render/exercise.d.ts.map +1 -0
  251. package/dist/render/exercise.js +32 -0
  252. package/dist/render/exercise.js.map +1 -0
  253. package/dist/render/goal.d.ts +24 -0
  254. package/dist/render/goal.d.ts.map +1 -0
  255. package/dist/render/goal.js +23 -0
  256. package/dist/render/goal.js.map +1 -0
  257. package/dist/render/goalExtra.d.ts +45 -0
  258. package/dist/render/goalExtra.d.ts.map +1 -0
  259. package/dist/render/goalExtra.js +94 -0
  260. package/dist/render/goalExtra.js.map +1 -0
  261. package/dist/render/goalPlate.d.ts +66 -0
  262. package/dist/render/goalPlate.d.ts.map +1 -0
  263. package/dist/render/goalPlate.js +110 -0
  264. package/dist/render/goalPlate.js.map +1 -0
  265. package/dist/render/health.d.ts +21 -0
  266. package/dist/render/health.d.ts.map +1 -0
  267. package/dist/render/health.js +41 -0
  268. package/dist/render/health.js.map +1 -0
  269. package/dist/render/help.d.ts +18 -0
  270. package/dist/render/help.d.ts.map +1 -0
  271. package/dist/render/help.js +58 -0
  272. package/dist/render/help.js.map +1 -0
  273. package/dist/render/home.d.ts +30 -0
  274. package/dist/render/home.d.ts.map +1 -0
  275. package/dist/render/home.js +73 -0
  276. package/dist/render/home.js.map +1 -0
  277. package/dist/render/html.d.ts +66 -0
  278. package/dist/render/html.d.ts.map +1 -0
  279. package/dist/render/html.js +510 -0
  280. package/dist/render/html.js.map +1 -0
  281. package/dist/render/index.d.ts +47 -0
  282. package/dist/render/index.d.ts.map +1 -0
  283. package/dist/render/index.js +26 -0
  284. package/dist/render/index.js.map +1 -0
  285. package/dist/render/insightPlate.d.ts +55 -0
  286. package/dist/render/insightPlate.d.ts.map +1 -0
  287. package/dist/render/insightPlate.js +97 -0
  288. package/dist/render/insightPlate.js.map +1 -0
  289. package/dist/render/library.d.ts +32 -0
  290. package/dist/render/library.d.ts.map +1 -0
  291. package/dist/render/library.js +54 -0
  292. package/dist/render/library.js.map +1 -0
  293. package/dist/render/photo.d.ts +101 -0
  294. package/dist/render/photo.d.ts.map +1 -0
  295. package/dist/render/photo.js +241 -0
  296. package/dist/render/photo.js.map +1 -0
  297. package/dist/render/planPlate.d.ts +40 -0
  298. package/dist/render/planPlate.d.ts.map +1 -0
  299. package/dist/render/planPlate.js +72 -0
  300. package/dist/render/planPlate.js.map +1 -0
  301. package/dist/render/profilePlate.d.ts +17 -0
  302. package/dist/render/profilePlate.d.ts.map +1 -0
  303. package/dist/render/profilePlate.js +18 -0
  304. package/dist/render/profilePlate.js.map +1 -0
  305. package/dist/render/ranking.d.ts +22 -0
  306. package/dist/render/ranking.d.ts.map +1 -0
  307. package/dist/render/ranking.js +63 -0
  308. package/dist/render/ranking.js.map +1 -0
  309. package/dist/render/receipt.d.ts +71 -0
  310. package/dist/render/receipt.d.ts.map +1 -0
  311. package/dist/render/receipt.js +65 -0
  312. package/dist/render/receipt.js.map +1 -0
  313. package/dist/render/weightPlate.d.ts +54 -0
  314. package/dist/render/weightPlate.d.ts.map +1 -0
  315. package/dist/render/weightPlate.js +110 -0
  316. package/dist/render/weightPlate.js.map +1 -0
  317. package/dist/schema.d.ts +25 -0
  318. package/dist/schema.d.ts.map +1 -0
  319. package/dist/schema.js +281 -0
  320. package/dist/schema.js.map +1 -0
  321. package/dist/triggers/help-lookup.d.ts +28 -0
  322. package/dist/triggers/help-lookup.d.ts.map +1 -0
  323. package/dist/triggers/help-lookup.js +163 -0
  324. package/dist/triggers/help-lookup.js.map +1 -0
  325. package/dist/triggers/index.d.ts +24 -0
  326. package/dist/triggers/index.d.ts.map +1 -0
  327. package/dist/triggers/index.js +78 -0
  328. package/dist/triggers/index.js.map +1 -0
  329. package/dist/triggers/scene-01-home.d.ts +4 -0
  330. package/dist/triggers/scene-01-home.d.ts.map +1 -0
  331. package/dist/triggers/scene-01-home.js +13 -0
  332. package/dist/triggers/scene-01-home.js.map +1 -0
  333. package/dist/triggers/scene-02-diet.d.ts +4 -0
  334. package/dist/triggers/scene-02-diet.d.ts.map +1 -0
  335. package/dist/triggers/scene-02-diet.js +74 -0
  336. package/dist/triggers/scene-02-diet.js.map +1 -0
  337. package/dist/triggers/scene-03-weight.d.ts +4 -0
  338. package/dist/triggers/scene-03-weight.d.ts.map +1 -0
  339. package/dist/triggers/scene-03-weight.js +62 -0
  340. package/dist/triggers/scene-03-weight.js.map +1 -0
  341. package/dist/triggers/scene-04-exercise.d.ts +4 -0
  342. package/dist/triggers/scene-04-exercise.d.ts.map +1 -0
  343. package/dist/triggers/scene-04-exercise.js +43 -0
  344. package/dist/triggers/scene-04-exercise.js.map +1 -0
  345. package/dist/triggers/scene-05-workout.d.ts +4 -0
  346. package/dist/triggers/scene-05-workout.d.ts.map +1 -0
  347. package/dist/triggers/scene-05-workout.js +36 -0
  348. package/dist/triggers/scene-05-workout.js.map +1 -0
  349. package/dist/triggers/scene-06-goal.d.ts +4 -0
  350. package/dist/triggers/scene-06-goal.d.ts.map +1 -0
  351. package/dist/triggers/scene-06-goal.js +29 -0
  352. package/dist/triggers/scene-06-goal.js.map +1 -0
  353. package/dist/triggers/scene-07-profile.d.ts +4 -0
  354. package/dist/triggers/scene-07-profile.d.ts.map +1 -0
  355. package/dist/triggers/scene-07-profile.js +8 -0
  356. package/dist/triggers/scene-07-profile.js.map +1 -0
  357. package/dist/triggers/scene-08-body.d.ts +4 -0
  358. package/dist/triggers/scene-08-body.d.ts.map +1 -0
  359. package/dist/triggers/scene-08-body.js +17 -0
  360. package/dist/triggers/scene-08-body.js.map +1 -0
  361. package/dist/triggers/scene-09-photo.d.ts +4 -0
  362. package/dist/triggers/scene-09-photo.d.ts.map +1 -0
  363. package/dist/triggers/scene-09-photo.js +14 -0
  364. package/dist/triggers/scene-09-photo.js.map +1 -0
  365. package/dist/triggers/scene-10-analysis.d.ts +4 -0
  366. package/dist/triggers/scene-10-analysis.d.ts.map +1 -0
  367. package/dist/triggers/scene-10-analysis.js +180 -0
  368. package/dist/triggers/scene-10-analysis.js.map +1 -0
  369. package/dist/triggers/types.d.ts +66 -0
  370. package/dist/triggers/types.d.ts.map +1 -0
  371. package/dist/triggers/types.js +3 -0
  372. package/dist/triggers/types.js.map +1 -0
  373. package/package.json +35 -0
@@ -0,0 +1,63 @@
1
+ /** T5 #24 · 体重对比续(b8 平台期/e/c5/d4/分发,对照老家 weight_compare.py)。 */
2
+ import type { DatabaseSync } from 'node:sqlite';
3
+ export type Row = [string, number];
4
+ export interface Seg {
5
+ label: string;
6
+ range: string;
7
+ count: number;
8
+ avg: number | null;
9
+ startKg: number | null;
10
+ endKg: number | null;
11
+ netChange: number | null;
12
+ volatility: number | null;
13
+ }
14
+ export interface Compare {
15
+ deltaKg: number | null;
16
+ direction: string;
17
+ rateDiffG: number | null;
18
+ speed: string;
19
+ }
20
+ export interface ExtraRow {
21
+ label: string;
22
+ value: string;
23
+ spark?: Array<{
24
+ d: string;
25
+ kg: number;
26
+ }>;
27
+ }
28
+ export interface ScenarioResult {
29
+ segA: Seg;
30
+ segB: Seg;
31
+ compare: Compare;
32
+ extraRows?: ExtraRow[];
33
+ tolerance?: {
34
+ hit: boolean;
35
+ target: string;
36
+ hitDate?: string;
37
+ offsetDays?: number;
38
+ note?: string;
39
+ };
40
+ sampleWarning?: string;
41
+ }
42
+ export interface ScenarioOpts {
43
+ startA?: string;
44
+ endA?: string;
45
+ startB?: string;
46
+ endB?: string;
47
+ n?: number;
48
+ delta?: number;
49
+ scheduleDbPath?: string | null;
50
+ }
51
+ /** 平台期识别:日期跨度 ≥14 天且 max-min ≤0.5kg(允许 1-2 天缺口),取最近一个。 */
52
+ export declare function findPlateau(rows: Row[]): {
53
+ start: Row;
54
+ end: Row;
55
+ span: number;
56
+ } | null;
57
+ export declare function scenarioB8(db: DatabaseSync): ScenarioResult;
58
+ export declare function scenarioE1(db: DatabaseSync, today: string): ScenarioResult;
59
+ export declare function scenarioE2(db: DatabaseSync): ScenarioResult;
60
+ export declare function scenarioE3(db: DatabaseSync, deltaKg: number): ScenarioResult;
61
+ export declare function scenarioE5(db: DatabaseSync, today: string): ScenarioResult;
62
+ export declare function scenarioE6(db: DatabaseSync, today: string): ScenarioResult;
63
+ //# sourceMappingURL=weightCompare2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weightCompare2.d.ts","sourceRoot":"","sources":["../../src/analysis/weightCompare2.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,MAAM,WAAW,GAAG;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAC3L,MAAM,WAAW,OAAO;IAAG,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAC/G,MAAM,WAAW,QAAQ;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;AACpG,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;AAC9N,MAAM,WAAW,YAAY;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAyB5J,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqBtF;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,cAAc,CAiC3D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAY1E;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,cAAc,CAgB3D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAiC5E;AAgBD,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAa1E;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAa1E"}
@@ -0,0 +1,211 @@
1
+ import { FetchError } from '../fetch/errors.js';
2
+ const round = (n) => Math.round(n);
3
+ const round1 = (n) => Math.round(n * 10) / 10;
4
+ const round2 = (n) => Math.round(n * 100) / 100;
5
+ const round3 = (n) => Math.round(n * 1000) / 1000;
6
+ const mean = (xs) => xs.reduce((a, b) => a + b, 0) / xs.length;
7
+ const stdev = (xs) => {
8
+ if (xs.length < 2)
9
+ return 0;
10
+ const m = mean(xs);
11
+ return Math.sqrt(xs.reduce((a, b) => a + (b - m) * (b - m), 0) / (xs.length - 1));
12
+ };
13
+ function fetchRows(db, start, end) {
14
+ const raw = db.prepare('SELECT date AS d, weight_kg AS w FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date').all(start, end);
15
+ return raw.map((r) => [r.d, r.w]);
16
+ }
17
+ function fetchAll(db) {
18
+ const raw = db.prepare('SELECT date AS d, weight_kg AS w FROM weight_log ORDER BY date').all();
19
+ return raw.map((r) => [r.d, r.w]);
20
+ }
21
+ function dayDiff(a, b) {
22
+ return Math.round((Date.parse(b + 'T12:00:00Z') - Date.parse(a + 'T12:00:00Z')) / 86400000);
23
+ }
24
+ const singleSeg = (label, range, kg) => ({ label, range, count: 1, avg: kg, startKg: kg, endKg: kg, netChange: 0, volatility: 0 });
25
+ /** 平台期识别:日期跨度 ≥14 天且 max-min ≤0.5kg(允许 1-2 天缺口),取最近一个。 */
26
+ export function findPlateau(rows) {
27
+ const segs = [];
28
+ const n = rows.length;
29
+ for (let i = 0; i < n; i++) {
30
+ let j = i;
31
+ let lo = rows[i][1];
32
+ let hi = lo;
33
+ while (j + 1 < n) {
34
+ const nd = dayDiff(rows[j][0], rows[j + 1][0]);
35
+ if (nd > 2)
36
+ break;
37
+ j += 1;
38
+ lo = Math.min(lo, rows[j][1]);
39
+ hi = Math.max(hi, rows[j][1]);
40
+ if (hi - lo > 0.5)
41
+ break;
42
+ }
43
+ const span = dayDiff(rows[i][0], rows[j][0]) + 1;
44
+ if (span >= 14 && hi - lo <= 0.5)
45
+ segs.push({ start: rows[i], end: rows[j], span });
46
+ }
47
+ if (segs.length === 0)
48
+ return null;
49
+ segs.sort((a, b) => (a.end[0] < b.end[0] ? -1 : 1));
50
+ return segs[segs.length - 1];
51
+ }
52
+ export function scenarioB8(db) {
53
+ const rows = fetchAll(db);
54
+ if (rows.length < 14)
55
+ throw new FetchError('数据不足(需至少 14 天记录)');
56
+ const p = findPlateau(rows);
57
+ const current = rows[rows.length - 1][1];
58
+ if (!p)
59
+ throw new FetchError('未识别到平台期(需至少连续 14 天波动 ≤ ±0.5kg)');
60
+ const after = rows.filter((r) => r[0] > p.end[0]);
61
+ const inSeg = rows.filter((r) => r[0] >= p.start[0] && r[0] <= p.end[0]).map((r) => r[1]);
62
+ const plateauAvg = mean(inSeg);
63
+ const deltaAfter = round2(current - plateauAvg);
64
+ let plateauCount = 1;
65
+ const breakDays = [];
66
+ let remaining = [...rows];
67
+ while (remaining.length >= 14) {
68
+ const q = findPlateau(remaining);
69
+ if (!q)
70
+ break;
71
+ plateauCount += 1;
72
+ const nxt = remaining.filter((r) => r[0] > q.end[0]);
73
+ if (nxt.length > 0)
74
+ breakDays.push(dayDiff(q.end[0], nxt[0][0]));
75
+ remaining = remaining.filter((r) => r[0] < q.start[0]);
76
+ }
77
+ const avgBreak = breakDays.length > 0 ? round(mean(breakDays)) : null;
78
+ return {
79
+ segA: { label: '平台期首日', range: p.start[0] + '(持续 ' + p.span + ' 天)', count: p.span, avg: round2(plateauAvg), startKg: p.start[1], endKg: p.end[1], netChange: round2(p.end[1] - p.start[1]), volatility: round2(Math.abs(p.end[1] - p.start[1])) },
80
+ segB: singleSeg('当前', rows[rows.length - 1][0], current),
81
+ compare: { deltaKg: round2(current - plateauAvg), direction: current < plateauAvg ? '下降' : current > plateauAvg ? '上升' : '持平', rateDiffG: null, speed: '—' },
82
+ extraRows: [
83
+ { label: '平台期持续', value: p.span + ' 天' },
84
+ { label: '突破后变化', value: (deltaAfter >= 0 ? '+' : '') + deltaAfter.toFixed(1) + ' kg' },
85
+ { label: '第几次平台期', value: '第 ' + plateauCount + ' 次' },
86
+ { label: '历史平均突破耗时', value: avgBreak !== null ? avgBreak + ' 天' : '—' },
87
+ ],
88
+ };
89
+ }
90
+ export function scenarioE1(db, today) {
91
+ const rows = fetchAll(db);
92
+ if (rows.length === 0)
93
+ throw new FetchError('无体重记录');
94
+ const current = rows[rows.length - 1][1];
95
+ const minRow = rows.reduce((a, b) => (b[1] < a[1] ? b : a));
96
+ const daysSince = dayDiff(minRow[0], today);
97
+ return {
98
+ segA: singleSeg('历史最低', minRow[0], minRow[1]),
99
+ segB: singleSeg('当前', rows[rows.length - 1][0], current),
100
+ compare: { deltaKg: round2(current - minRow[1]), direction: current > minRow[1] ? '上升' : '持平', rateDiffG: null, speed: '—' },
101
+ extraRows: [{ label: '距历史最低', value: daysSince + ' 天' }],
102
+ };
103
+ }
104
+ export function scenarioE2(db) {
105
+ const rows = fetchAll(db);
106
+ if (rows.length === 0)
107
+ throw new FetchError('无体重记录');
108
+ const current = rows[rows.length - 1][1];
109
+ const maxRow = rows.reduce((a, b) => (b[1] > a[1] ? b : a));
110
+ const dropped = round2(maxRow[1] - current);
111
+ const days = Math.max(1, dayDiff(maxRow[0], rows[rows.length - 1][0]));
112
+ return {
113
+ segA: singleSeg('历史最高', maxRow[0], maxRow[1]),
114
+ segB: singleSeg('当前', rows[rows.length - 1][0], current),
115
+ compare: { deltaKg: round2(current - maxRow[1]), direction: current < maxRow[1] ? '下降' : '持平', rateDiffG: null, speed: '—' },
116
+ extraRows: [
117
+ { label: '已下降', value: dropped.toFixed(1) + ' kg' },
118
+ { label: '下降速率', value: round3(dropped / days).toFixed(3) + ' kg/天' },
119
+ ],
120
+ };
121
+ }
122
+ export function scenarioE3(db, deltaKg) {
123
+ const rows = fetchAll(db);
124
+ if (rows.length === 0)
125
+ throw new FetchError('无体重记录');
126
+ const current = rows[rows.length - 1][1];
127
+ const maxKg = Math.max(...rows.map((r) => r[1]));
128
+ const th = maxKg - deltaKg;
129
+ const hit = rows.find((r) => r[1] <= th);
130
+ if (!hit) {
131
+ const diff = round1(maxKg - current);
132
+ throw new FetchError('未达成减重 ' + deltaKg + 'kg 里程碑(当前距历史最高已减 ' + diff + 'kg)');
133
+ }
134
+ const elapsed = Math.max(1, dayDiff(hit[0], rows[rows.length - 1][0]));
135
+ const rate = round3((current - hit[1]) / elapsed);
136
+ let pts = rows.filter((r) => r[0] >= hit[0]);
137
+ const crossYear = pts.length > 1 && pts[0][0].slice(0, 4) !== pts[pts.length - 1][0].slice(0, 4);
138
+ const fmt = (d) => crossYear ? d.slice(2) : d.slice(5);
139
+ if (pts.length > 10) {
140
+ const step = (pts.length - 1) / 9;
141
+ const idxs = [...new Set([...Array.from({ length: 10 }, (_, i) => Math.trunc(i * step)), pts.length - 1])];
142
+ pts = idxs.map((i) => pts[i]);
143
+ }
144
+ return {
145
+ segA: singleSeg('减重 ' + deltaKg + 'kg 那天', hit[0], hit[1]),
146
+ segB: singleSeg('今天', rows[rows.length - 1][0], current),
147
+ compare: { deltaKg: round2(current - hit[1]), direction: current < hit[1] ? '下降' : current > hit[1] ? '上升' : '持平', rateDiffG: null, speed: '—' },
148
+ extraRows: [
149
+ { label: '用时', value: elapsed + ' 天' },
150
+ { label: '期间速率', value: rate.toFixed(3) + ' kg/天' },
151
+ { label: '体重轨迹', value: hit[1] + ' → ' + current + ' kg · ' + elapsed + ' 天', spark: pts.map((r) => ({ d: fmt(r[0]), kg: r[1] })) },
152
+ ],
153
+ };
154
+ function round1(n) { return Math.round(n * 10) / 10; }
155
+ }
156
+ function seasonMin(rows, today, season) {
157
+ const y = Number(today.slice(0, 4));
158
+ const m = Number(today.slice(5, 7));
159
+ let s;
160
+ let e;
161
+ if (season === 'summer') {
162
+ s = y + '-06-01';
163
+ e = y + '-08-31';
164
+ }
165
+ else if (m >= 12) {
166
+ s = y + '-12-01';
167
+ e = (y + 1) + '-02-28';
168
+ }
169
+ else {
170
+ s = (y - 1) + '-12-01';
171
+ e = y + '-02-28';
172
+ }
173
+ void m;
174
+ const inSeason = rows.filter((r) => r[0] >= s && r[0] <= e);
175
+ if (inSeason.length === 0)
176
+ return null;
177
+ return inSeason.reduce((a, b) => (b[1] < a[1] ? b : a));
178
+ }
179
+ export function scenarioE5(db, today) {
180
+ const rows = fetchAll(db);
181
+ if (rows.length === 0)
182
+ throw new FetchError('无体重记录');
183
+ const current = rows[rows.length - 1][1];
184
+ const m = seasonMin(rows, today, 'summer');
185
+ if (!m)
186
+ throw new FetchError('今年夏天(6-8 月)无体重记录');
187
+ const daysSince = Math.max(0, dayDiff(m[0], today));
188
+ return {
189
+ segA: singleSeg('入夏最低', m[0], m[1]),
190
+ segB: singleSeg('当前', rows[rows.length - 1][0], current),
191
+ compare: { deltaKg: round2(current - m[1]), direction: current > m[1] ? '上升' : current < m[1] ? '下降' : '持平', rateDiffG: null, speed: '—' },
192
+ extraRows: [{ label: '距入夏最低', value: daysSince + ' 天' }],
193
+ };
194
+ }
195
+ export function scenarioE6(db, today) {
196
+ const rows = fetchAll(db);
197
+ if (rows.length === 0)
198
+ throw new FetchError('无体重记录');
199
+ const current = rows[rows.length - 1][1];
200
+ const m = seasonMin(rows, today, 'winter');
201
+ if (!m)
202
+ throw new FetchError('最近一个冬天(12-2 月)无体重记录');
203
+ const daysSince = Math.max(0, dayDiff(m[0], today));
204
+ return {
205
+ segA: singleSeg('入冬最低', m[0], m[1]),
206
+ segB: singleSeg('当前', rows[rows.length - 1][0], current),
207
+ compare: { deltaKg: round2(current - m[1]), direction: current > m[1] ? '上升' : current < m[1] ? '下降' : '持平', rateDiffG: null, speed: '—' },
208
+ extraRows: [{ label: '距入冬最低', value: daysSince + ' 天' }],
209
+ };
210
+ }
211
+ //# sourceMappingURL=weightCompare2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weightCompare2.js","sourceRoot":"","sources":["../../src/analysis/weightCompare2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** T5 #24 · 体重对比续(c5 极端月/d4 工作周末/分发,对照老家 weight_compare.py)。
2
+ *
3
+ * c5 睡眠读外部技能库:默认不碰(标注缺失);仅显式 scheduleDbPath 才读
4
+ * (铁律:仓外目录与他人 worktree 不碰,路径由调用方显式给)。
5
+ */
6
+ import { DatabaseSync } from 'node:sqlite';
7
+ import type { ScenarioOpts, ScenarioResult } from './weightCompare.js';
8
+ export declare function scenarioC5(db: DatabaseSync, scheduleDbPath?: string | null): ScenarioResult;
9
+ export declare function scenarioD4(db: DatabaseSync, today?: string): ScenarioResult;
10
+ export declare const SCENARIO_LABELS: Record<string, string>;
11
+ export type ScenarioName = keyof typeof SCENARIO_LABELS;
12
+ export declare function runScenario(db: DatabaseSync, name: string, opts?: ScenarioOpts, today?: string): ScenarioResult;
13
+ //# sourceMappingURL=weightCompare3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weightCompare3.d.ts","sourceRoot":"","sources":["../../src/analysis/weightCompare3.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAwDvE,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAiD3F;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,GAAE,MAAmB,GAAG,cAAc,CA8BvF;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBlD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,eAAe,CAAC;AAExD,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,EAAE,KAAK,GAAE,MAAmB,GAAG,cAAc,CAqB/H"}
@@ -0,0 +1,199 @@
1
+ /** T5 #24 · 体重对比续(c5 极端月/d4 工作周末/分发,对照老家 weight_compare.py)。
2
+ *
3
+ * c5 睡眠读外部技能库:默认不碰(标注缺失);仅显式 scheduleDbPath 才读
4
+ * (铁律:仓外目录与他人 worktree 不碰,路径由调用方显式给)。
5
+ */
6
+ import { DatabaseSync } from 'node:sqlite';
7
+ import { FetchError } from '../fetch/errors.js';
8
+ import { todayISO } from './utils.js';
9
+ import { sameDayCompare, scenarioA1, scenarioA2, scenarioA3, scenarioA4, scenarioA5, scenarioB1 } from './weightCompare.js';
10
+ import { scenarioB8, scenarioE1, scenarioE2, scenarioE3, scenarioE5, scenarioE6 } from './weightCompare2.js';
11
+ const round = (n) => Math.round(n);
12
+ const round2 = (n) => Math.round(n * 100) / 100;
13
+ function fetchRows(db, start, end) {
14
+ const raw = db.prepare('SELECT date AS d, weight_kg AS w FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date').all(start, end);
15
+ return raw.map((r) => [r.d, r.w]);
16
+ }
17
+ function dayDiff(a, b) {
18
+ return Math.round((Date.parse(b + 'T12:00:00Z') - Date.parse(a + 'T12:00:00Z')) / 86400000);
19
+ }
20
+ function mean(xs) {
21
+ return xs.reduce((a, b) => a + b, 0) / xs.length;
22
+ }
23
+ function stdev(xs) {
24
+ if (xs.length < 2)
25
+ return 0;
26
+ const m = mean(xs);
27
+ return Math.sqrt(xs.reduce((a, b) => a + (b - m) * (b - m), 0) / (xs.length - 1));
28
+ }
29
+ function monthTotal(db, mStart, mEnd, table, col) {
30
+ try {
31
+ const row = db.prepare('SELECT COUNT(*) AS n, COALESCE(SUM(' + col + '), 0) AS v FROM ' + table + ' WHERE date BETWEEN ? AND ?').get(mStart, mEnd);
32
+ if (!row || row.n === 0)
33
+ return null;
34
+ return round(row.v);
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ function sleepHours(scheduleDbPath, mStart, mEnd) {
41
+ if (!scheduleDbPath)
42
+ return null;
43
+ try {
44
+ const sdb = new DatabaseSync(scheduleDbPath, { readOnly: true });
45
+ try {
46
+ const row = sdb.prepare("SELECT COUNT(*) AS n, COALESCE(SUM(duration_minutes), 0) AS v FROM schedule_records WHERE date BETWEEN ? AND ? AND (category LIKE '%睡眠%' OR activity LIKE '%睡眠%')").get(mStart, mEnd);
47
+ if (!row || row.n === 0)
48
+ return null;
49
+ return Math.round((row.v / 60) * 10) / 10;
50
+ }
51
+ finally {
52
+ sdb.close();
53
+ }
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ function monthRange(m) {
60
+ const y = Number(m.slice(0, 4));
61
+ const mo = Number(m.slice(5, 7));
62
+ const dim = [31, (y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][mo - 1];
63
+ return [m + '-01', m + '-' + String(dim).padStart(2, '0')];
64
+ }
65
+ export function scenarioC5(db, scheduleDbPath) {
66
+ const monthsRaw = db.prepare("SELECT strftime('%Y-%m', date) AS m, COALESCE(SUM(calories_burned), 0) AS v FROM exercise_log WHERE date IS NOT NULL GROUP BY m ORDER BY m").all();
67
+ const months = monthsRaw.map((r) => [r.m, r.v]);
68
+ if (months.length < 2)
69
+ throw new FetchError('数据不足(需至少 2 个月有运动记录)');
70
+ let lowM = months[0][0];
71
+ let highM = lowM;
72
+ let lowT = 0;
73
+ let highT = 0;
74
+ for (const [m, total] of months) {
75
+ if (total > highT) {
76
+ highT = total;
77
+ highM = m;
78
+ }
79
+ if (lowT === 0 || total < lowT) {
80
+ lowT = total;
81
+ lowM = m;
82
+ }
83
+ }
84
+ if (lowM === highM)
85
+ throw new FetchError('数据不足(各月运动量相同)');
86
+ const [lowS, lowE] = monthRange(lowM);
87
+ const [highS, highE] = monthRange(highM);
88
+ const segOf = (s, e, label) => {
89
+ const rows = fetchRows(db, s, e);
90
+ if (rows.length === 0)
91
+ return null;
92
+ const kgs = rows.map((r) => r[1]);
93
+ const first = rows[0];
94
+ const last = rows[rows.length - 1];
95
+ return { label, range: first[0] + ' ~ ' + last[0], count: rows.length, avg: round2(mean(kgs)), startKg: first[1], endKg: last[1], netChange: round2(last[1] - first[1]), volatility: round2(Math.max(...kgs) - Math.min(...kgs)) };
96
+ };
97
+ const a = segOf(lowS, lowE, lowM + '(运动最少)');
98
+ const b = segOf(highS, highE, highM + '(运动最多)');
99
+ if (!a || !b)
100
+ throw new FetchError('数据不足(极端月无体重记录)');
101
+ const calLow = monthTotal(db, lowS, lowE, 'food_log', 'calories');
102
+ const calHigh = monthTotal(db, highS, highE, 'food_log', 'calories');
103
+ const sleepLow = sleepHours(scheduleDbPath, lowS, lowE);
104
+ const sleepHigh = sleepHours(scheduleDbPath, highS, highE);
105
+ const delta = round2(b.avg - a.avg);
106
+ const extra = [
107
+ { label: lowM + ' 运动总量', value: round(lowT) + ' 卡' },
108
+ { label: highM + ' 运动总量', value: round(highT) + ' 卡' },
109
+ calLow !== null ? { label: lowM + ' 摄入', value: calLow + ' 卡' } : { label: lowM + ' 摄入', value: '缺失(无记录)' },
110
+ calHigh !== null ? { label: highM + ' 摄入', value: calHigh + ' 卡' } : { label: highM + ' 摄入', value: '缺失(无记录)' },
111
+ ];
112
+ if (sleepLow !== null && sleepHigh !== null) {
113
+ extra.push({ label: lowM + ' 睡眠', value: sleepLow + ' 小时' });
114
+ extra.push({ label: highM + ' 睡眠', value: sleepHigh + ' 小时' });
115
+ }
116
+ else
117
+ extra.push({ label: '睡眠数据', value: '缺失(外部技能未记录)' });
118
+ return {
119
+ segA: a,
120
+ segB: b,
121
+ compare: { deltaKg: delta, direction: delta < -0.05 ? '下降' : delta > 0.05 ? '上升' : '持平', rateDiffG: null, speed: '—' },
122
+ extraRows: extra,
123
+ };
124
+ }
125
+ export function scenarioD4(db, today = todayISO()) {
126
+ const start = (() => {
127
+ const t = Date.parse(today + 'T12:00:00Z');
128
+ return new Date(t - 6 * 86400000).toISOString().slice(0, 10);
129
+ })();
130
+ const rows = fetchRows(db, start, today);
131
+ if (rows.length === 0)
132
+ throw new FetchError('最近 7 天无记录');
133
+ const wd = rows.filter((r) => { const d = (new Date(r[0] + 'T12:00:00Z').getUTCDay() + 6) % 7; return d < 5; });
134
+ const we = rows.filter((r) => { const d = (new Date(r[0] + 'T12:00:00Z').getUTCDay() + 6) % 7; return d >= 5; });
135
+ if (wd.length === 0 || we.length === 0)
136
+ throw new FetchError('样本不足(工作日/周末需各有记录)');
137
+ const stats = (rr) => {
138
+ const kgs = rr.map((r) => r[1]);
139
+ return [round2(mean(kgs)), round2(stdev(kgs))];
140
+ };
141
+ const [wdAvg, wdVol] = stats(wd);
142
+ const [weAvg, weVol] = stats(we);
143
+ const delta = round2(weAvg - wdAvg);
144
+ const agreement = round(Math.max(0, 1 - Math.min(1, Math.abs(delta))) * 100);
145
+ const first = (rr) => rr[0];
146
+ const last = (rr) => rr[rr.length - 1];
147
+ return {
148
+ segA: { label: '工作日', range: first(wd)[0] + ' ~ ' + last(wd)[0], count: wd.length, avg: wdAvg, startKg: first(wd)[1], endKg: last(wd)[1], netChange: round2(last(wd)[1] - first(wd)[1]), volatility: wdVol },
149
+ segB: { label: '周末', range: first(we)[0] + ' ~ ' + last(we)[0], count: we.length, avg: weAvg, startKg: first(we)[1], endKg: last(we)[1], netChange: round2(last(we)[1] - first(we)[1]), volatility: weVol },
150
+ compare: { deltaKg: delta, direction: delta > 0.05 ? '周末更高' : delta < -0.05 ? '周末更低' : '持平', rateDiffG: null, speed: '—' },
151
+ extraRows: [
152
+ { label: '工作日波动', value: '±' + wdVol + ' kg' },
153
+ { label: '周末波动', value: '±' + weVol + ' kg' },
154
+ { label: '一致率', value: agreement + '%' },
155
+ ],
156
+ };
157
+ }
158
+ export const SCENARIO_LABELS = {
159
+ a1: '对比体重:最近 30 天 vs 之前 30 天',
160
+ a2: '对比体重:自定义两段时间',
161
+ a3: '对比体重:本周 vs 上周',
162
+ a4: '对比体重:本月 vs 上月',
163
+ a5: '对比体重:近 N 天 vs 上一个 N 天',
164
+ a6: '对比体重:今天 vs 一年前今天',
165
+ a7: '对比体重:今天 vs 半年前今天',
166
+ a8: '对比体重:今天 vs 三月前今天',
167
+ b1: '对比体重:当前 vs 目标体重',
168
+ b8: '对比体重:当前 vs 平台期首日',
169
+ e1: '对比体重:当前 vs 历史最低',
170
+ e2: '对比体重:当前 vs 历史最高',
171
+ e3: '对比体重:减重 N kg 那天 vs 今天',
172
+ e5: '对比体重:当前 vs 入夏最低',
173
+ e6: '对比体重:当前 vs 入冬最低',
174
+ c5: '对比体重:运动多 vs 运动少的两个月',
175
+ d4: '对比体重:工作日 vs 周末',
176
+ };
177
+ export function runScenario(db, name, opts = {}, today = todayISO()) {
178
+ switch (name) {
179
+ case 'a1': return scenarioA1(db, today);
180
+ case 'a2': return scenarioA2(db, opts);
181
+ case 'a3': return scenarioA3(db, today);
182
+ case 'a4': return scenarioA4(db, today);
183
+ case 'a5': return scenarioA5(db, today, opts.n ?? 30);
184
+ case 'a6': return sameDayCompare(db, today, 12, '一年前');
185
+ case 'a7': return sameDayCompare(db, today, 6, '半年前');
186
+ case 'a8': return sameDayCompare(db, today, 3, '三月前');
187
+ case 'b1': return scenarioB1(db, today);
188
+ case 'b8': return scenarioB8(db);
189
+ case 'e1': return scenarioE1(db, today);
190
+ case 'e2': return scenarioE2(db);
191
+ case 'e3': return scenarioE3(db, opts.delta ?? 5);
192
+ case 'e5': return scenarioE5(db, today);
193
+ case 'e6': return scenarioE6(db, today);
194
+ case 'c5': return scenarioC5(db, opts.scheduleDbPath);
195
+ case 'd4': return scenarioD4(db, today);
196
+ default: throw new FetchError('未知场景 ' + name);
197
+ }
198
+ }
199
+ //# sourceMappingURL=weightCompare3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weightCompare3.js","sourceRoot":"","sources":["../../src/analysis/weightCompare3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import type { DatabaseSync } from 'node:sqlite';
3
+ /** #41 · 测试直调出口(纯 CLI 同逻辑,不经过 argv/spawn;CLI 唯一出口仍为 main)。 */
4
+ export declare function dispatch(key: string, params: Record<string, unknown>, db: DatabaseSync): {
5
+ data: Record<string, unknown>;
6
+ html: string;
7
+ };
8
+ //# sourceMappingURL=cmd_read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd_read.d.ts","sourceRoot":"","sources":["../../src/cli/cmd_read.ts"],"names":[],"mappings":";AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA+LhD,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuaxI"}