skill-schedule 0.3.1 → 0.3.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.
Files changed (135) hide show
  1. package/SKILL.md +9 -7
  2. package/dist/.gen-inputs.json +45 -0
  3. package/dist/admin/commands.d.ts +10 -0
  4. package/dist/admin/commands.d.ts.map +1 -0
  5. package/dist/admin/commands.js +5 -0
  6. package/dist/admin/commands.js.map +1 -0
  7. package/dist/admin/handlers.d.ts +3 -0
  8. package/dist/admin/handlers.d.ts.map +1 -0
  9. package/dist/admin/handlers.js +66 -0
  10. package/dist/admin/handlers.js.map +1 -0
  11. package/dist/admin/index.d.ts +3 -0
  12. package/dist/admin/index.d.ts.map +1 -0
  13. package/dist/admin/index.js +3 -0
  14. package/dist/admin/index.js.map +1 -0
  15. package/dist/admin/routes.d.ts +8 -0
  16. package/dist/admin/routes.d.ts.map +1 -0
  17. package/dist/admin/routes.js +7 -0
  18. package/dist/admin/routes.js.map +1 -0
  19. package/dist/analyze/commands.d.ts +10 -0
  20. package/dist/analyze/commands.d.ts.map +1 -0
  21. package/dist/analyze/commands.js +5 -0
  22. package/dist/analyze/commands.js.map +1 -0
  23. package/dist/analyze/handlers.d.ts +3 -0
  24. package/dist/analyze/handlers.d.ts.map +1 -0
  25. package/dist/analyze/handlers.js +57 -0
  26. package/dist/analyze/handlers.js.map +1 -0
  27. package/dist/analyze/index.d.ts +3 -0
  28. package/dist/analyze/index.d.ts.map +1 -0
  29. package/dist/analyze/index.js +3 -0
  30. package/dist/analyze/index.js.map +1 -0
  31. package/dist/analyze/routes.d.ts +8 -0
  32. package/dist/analyze/routes.d.ts.map +1 -0
  33. package/dist/analyze/routes.js +8 -0
  34. package/dist/analyze/routes.js.map +1 -0
  35. package/dist/cli/cmd_read.js +46 -249
  36. package/dist/cli/cmd_read.js.map +1 -1
  37. package/dist/cli/keys.d.ts +5 -0
  38. package/dist/cli/keys.d.ts.map +1 -0
  39. package/dist/cli/keys.js +21 -0
  40. package/dist/cli/keys.js.map +1 -0
  41. package/dist/cli/registry.d.ts +4 -0
  42. package/dist/cli/registry.d.ts.map +1 -0
  43. package/dist/cli/registry.js +12 -0
  44. package/dist/cli/registry.js.map +1 -0
  45. package/dist/config.d.ts +7 -1
  46. package/dist/config.d.ts.map +1 -1
  47. package/dist/config.js +9 -3
  48. package/dist/config.js.map +1 -1
  49. package/dist/delivery/index.d.ts +8 -0
  50. package/dist/delivery/index.d.ts.map +1 -0
  51. package/dist/delivery/index.js +7 -0
  52. package/dist/delivery/index.js.map +1 -0
  53. package/dist/delivery/naming.d.ts +24 -0
  54. package/dist/delivery/naming.d.ts.map +1 -0
  55. package/dist/delivery/naming.js +8 -0
  56. package/dist/delivery/naming.js.map +1 -0
  57. package/dist/delivery/output.d.ts +22 -0
  58. package/dist/delivery/output.d.ts.map +1 -0
  59. package/dist/delivery/output.js +83 -0
  60. package/dist/delivery/output.js.map +1 -0
  61. package/dist/fetch/paths.d.ts +19 -5
  62. package/dist/fetch/paths.d.ts.map +1 -1
  63. package/dist/fetch/paths.js +26 -8
  64. package/dist/fetch/paths.js.map +1 -1
  65. package/dist/health.d.ts.map +1 -1
  66. package/dist/health.js +2 -1
  67. package/dist/health.js.map +1 -1
  68. package/dist/help/helpPaths.d.ts +11 -13
  69. package/dist/help/helpPaths.d.ts.map +1 -1
  70. package/dist/help/helpPaths.js +9 -39
  71. package/dist/help/helpPaths.js.map +1 -1
  72. package/dist/plan/commands.d.ts +9 -0
  73. package/dist/plan/commands.d.ts.map +1 -0
  74. package/dist/plan/commands.js +5 -0
  75. package/dist/plan/commands.js.map +1 -0
  76. package/dist/plan/handlers.d.ts +3 -0
  77. package/dist/plan/handlers.d.ts.map +1 -0
  78. package/dist/plan/handlers.js +31 -0
  79. package/dist/plan/handlers.js.map +1 -0
  80. package/dist/plan/index.d.ts +2 -0
  81. package/dist/plan/index.d.ts.map +1 -1
  82. package/dist/plan/index.js +4 -2
  83. package/dist/plan/index.js.map +1 -1
  84. package/dist/plan/routes.d.ts +8 -0
  85. package/dist/plan/routes.d.ts.map +1 -0
  86. package/dist/plan/routes.js +18 -0
  87. package/dist/plan/routes.js.map +1 -0
  88. package/dist/policy/wakewords.d.ts.map +1 -1
  89. package/dist/policy/wakewords.js +9 -59
  90. package/dist/policy/wakewords.js.map +1 -1
  91. package/dist/query/commands.d.ts +26 -0
  92. package/dist/query/commands.d.ts.map +1 -0
  93. package/dist/query/commands.js +8 -0
  94. package/dist/query/commands.js.map +1 -0
  95. package/dist/query/handlers.d.ts +6 -0
  96. package/dist/query/handlers.d.ts.map +1 -0
  97. package/dist/query/handlers.js +67 -0
  98. package/dist/query/handlers.js.map +1 -0
  99. package/dist/query/index.d.ts +3 -0
  100. package/dist/query/index.d.ts.map +1 -0
  101. package/dist/query/index.js +3 -0
  102. package/dist/query/index.js.map +1 -0
  103. package/dist/query/routes.d.ts +9 -0
  104. package/dist/query/routes.d.ts.map +1 -0
  105. package/dist/query/routes.js +20 -0
  106. package/dist/query/routes.js.map +1 -0
  107. package/dist/render/envelope.d.ts +2 -1
  108. package/dist/render/envelope.d.ts.map +1 -1
  109. package/dist/render/envelope.js +5 -11
  110. package/dist/render/envelope.js.map +1 -1
  111. package/dist/shared/commandSpec.d.ts +83 -0
  112. package/dist/shared/commandSpec.d.ts.map +1 -0
  113. package/dist/shared/commandSpec.js +2 -0
  114. package/dist/shared/commandSpec.js.map +1 -0
  115. package/dist/triggers/routes.generated.d.ts +297 -0
  116. package/dist/triggers/routes.generated.d.ts.map +1 -0
  117. package/dist/triggers/routes.generated.js +52 -0
  118. package/dist/triggers/routes.generated.js.map +1 -0
  119. package/dist/write/commands.d.ts +9 -0
  120. package/dist/write/commands.d.ts.map +1 -0
  121. package/dist/write/commands.js +5 -0
  122. package/dist/write/commands.js.map +1 -0
  123. package/dist/write/handlers.d.ts +3 -0
  124. package/dist/write/handlers.d.ts.map +1 -0
  125. package/dist/write/handlers.js +24 -0
  126. package/dist/write/handlers.js.map +1 -0
  127. package/dist/write/index.d.ts +3 -0
  128. package/dist/write/index.d.ts.map +1 -0
  129. package/dist/write/index.js +3 -0
  130. package/dist/write/index.js.map +1 -0
  131. package/dist/write/routes.d.ts +8 -0
  132. package/dist/write/routes.d.ts.map +1 -0
  133. package/dist/write/routes.js +10 -0
  134. package/dist/write/routes.js.map +1 -0
  135. package/package.json +3 -3
package/SKILL.md CHANGED
@@ -103,18 +103,20 @@ schedule-cmd-read schedule.record.write --params '{"op":"add","date":"2026-09-06
103
103
  相关场景:schedule.help.lookup、schedule.plan.today、schedule.plan.write、schedule.record.compare、schedule.record.detail、schedule.record.range、schedule.record.today、schedule.record.write(8 联动,key 字符串后续票落表时冻结)。
104
104
  <!-- HELP-AUTO-END -->
105
105
 
106
- ## HELP 交付(说「作息管家 HELP」或「作息管家帮助」走这里)
106
+ ## 交付面(说唤醒词就跑,产物落盘并回绝对路径)
107
107
 
108
- - **缺省就是交付物**:`schedule-cmd-read schedule.help.lookup` **原样调用**即落一份能打开的 HELP 文件——`<库目录>/<产物目录>/作息管家_HELP_<YYYYMMDD_HHMMSS>[_N].html`(`<库目录>`=配置文件 `~/.ilife/schedule.yaml` 的 `db.dir`,空串=数据目录 `~/.ilife/data/`;`<产物目录>`=同文件的 `html.dir`,默认 `schedule_html/help`,段间用 `/` 或 `\` 分隔;5 类别/34 唤醒词/85 场景,走共享 help 模板)。stdout 的 `delivery.path` 是**绝对路径**,`delivery.bytes` 是文件字节数;回话就把这个路径给用户(回执即真相)。
108
+ - **缺省就是交付物**:上面 8 个联动 key **原样调用**即各落一份能打开的 HTML,stdout 顶层给 `delivery{mode,path,bytes}`——`path` 是**绝对路径**、`bytes` 是**落盘字节数**(回执即真相:回话就把 `path` 给用户)。
109
109
  **完成标准**:`delivery.path` 指向的文件真的存在,且大小=`delivery.bytes`。
110
- - **要现找才加参数**:`--params '{"q":"查作息"}'` 回命中条目(只出 JSON,不落盘);`q` 留空=全表。全量速查表读上「联动速查」块(48 条路由词,构建期注入,与 `q` 同一张表)。
111
- - **`--html <路径>`=显式落点**:逐字使用、覆盖写、缺父目录自动建(不参与同秒 `_N` 递补);缺省支写的是完整 HELP 页,`q` 支写的是该键的分节页(与其余 7 条命令同形)。
112
- - **同名不覆盖**:缺省落点按秒命名;真要同一秒落两份(`reuseHours:0`)时后到者递补 `_2`、`_3`……**任何时候都不覆盖已有产物**。
110
+ - **落点**:页面落**产物根** `<库目录>/<产物目录>`;`作息管家HELP` 落它的 `help` 子目录。`<库目录>`=配置文件 `~/.ilife/schedule.yaml` 的 `db.dir`(空串=数据目录 `~/.ilife/data/`);`<产物目录>`=同文件的 `html.dir`(默认 `schedule_html`,段间用 `/` 或 `\` 分隔),HELP 那一支=`html.helpDir`(默认 `help`)。
111
+ - **命名**:`〈主体〉_<YYYYMMDD_HHMMSS>[_N].html`。主体=`作息管家_〈页名〉`,页名就是该命令的标题(今日作息/汇总作息/作息详情/作息对比/查日程/写计划/记作息);HELP 的主体恒为 `作息管家_HELP`(老名字逐字不变;5 类别/34 唤醒词/85 场景,走共享 help 模板)。**同名不覆盖**:同一秒落第二份时递补 `_2`、`_3`……任何时候都不覆盖已有产物。
112
+ - **产物是整页**:`<!DOCTYPE html>` 起、`</html>` 收;7 个命令页里放真内容(`<section data-skill="schedule"…`),`作息管家HELP` 是完整 HELP 壳页(载荷在 `<script id="help-data">`)。
113
+ - **要现找才加参数**:`--params '{"q":"查作息"}'` 回命中条目(**按定义不落盘**:这一支顶层没有 `delivery`;`q` 留空=走上面的文件交付那一支)。全量速查表读上「联动速查」块(48 条路由词,构建期注入,与 `q` 同一张表)。
114
+ - **`--html <路径>`=显式落点**:逐字使用、覆盖写、缺父目录自动建(不参与同秒 `_N` 递补)。8 个 key 都认它;`q` 支带上它写的是该键的分节页。
113
115
  - **反复读不再涨目录(#245)**:同一主体**一天内只留一份**——24 小时内再读就**复用已有那份**(不新建、不改写;回执给的就是它)。要别的窗口给 `--params '{"reuseHours":3}'`(小时);要**每次都要一份最新的**给 `{"reuseHours":0}`。窗口内若已有一份、而你刚改过 HELP 内容,那份旧产物**不会被自动刷新**(窗口语义如此)——真要新的就带 `reuseHours:0`。
114
- - **看帮助不开库**:本键在开库之前分派,跑完不建 `schedule_data.db`(库还没建出来时也看得到帮助);DB 文件已存在时,页首的首次使用横幅隐藏(判定只看文件在不在,不开库)。
116
+ - **看帮助不开库**:`作息管家HELP` 在开库之前分派,跑完不建 `schedule_data.db`(库还没建出来时也看得到帮助);DB 文件已存在时,页首的首次使用横幅隐藏(判定只看文件在不在,不开库)。
115
117
  - **边界**:面板/侧栏的 HELP 入口不在本技能范围(属插件侧那条线,见下「环境与出 scope」)。
116
118
 
117
119
  ## 环境与出 scope
118
120
 
119
- - 路径类取值一律读配置文件 `~/.ilife/schedule.yaml`(**配置文件是唯一真相,环境变量不参与配置**):库目录=`db.dir`(空串=数据目录 `~/.ilife/data/`,首次读时自动建)、库文件名=`db.name`(默认 `schedule_data.db`)、产物目录=`html.dir`(默认 `schedule_html/help`)。HELP 文件主体名回到代码常量(`作息管家_HELP`,#764 起不再是配置项);飞书 CLI 不再是配置项(#764 起由设置页「飞书 CLI」状态行替代,只探测、不配置)。飞书同步另须 lark-cli 四门全绿。取值面与环境项见 docs/env.md。
121
+ - 路径类取值一律读配置文件 `~/.ilife/schedule.yaml`(**配置文件是唯一真相,环境变量不参与配置**):库目录=`db.dir`(空串=数据目录 `~/.ilife/data/`,首次读时自动建)、库文件名=`db.name`(默认 `schedule_data.db`)、产物根目录=`html.dir`(默认 `schedule_html`;页面落它下面)、HELP 子目录=`html.helpDir`(默认 `help`)。HELP 文件主体名回到代码常量(`作息管家_HELP`,#764 起不再是配置项);飞书 CLI 不再是配置项(#764 起由设置页「飞书 CLI」状态行替代,只探测、不配置)。飞书同步另须 lark-cli 四门全绿。取值面与环境项见 docs/env.md。
120
122
  - 出 scope:定时任务/早睡提醒(老家 Cron 已删,外部定时以外置为准)、面板(二期单 MAP)、本技能外联动(combos 登记走后续票);语录取数(daily_recorder.db)以外置为准;真实数据禁迁,测试 tmp 隔离。
@@ -0,0 +1,45 @@
1
+ {
2
+ "version": 2,
3
+ "files": {
4
+ "packages\\skill-schedule\\src\\admin\\commands.ts": {
5
+ "src": "fe7acad696a075951bba63991b6a207b7b1f673c452831a3b5ae88717a5d4495",
6
+ "dist": "c7b0133b7d3464ce8e27769d7f29a03f9c6c6233d96009841818354fc32c51f6"
7
+ },
8
+ "packages\\skill-schedule\\src\\admin\\routes.ts": {
9
+ "src": "fa8a84e170e539cc193150a99d2cec1aa0f0afd30826851e0328d2ecf9e33984",
10
+ "dist": "59106cac5a5e0eff2282119664380742fc063946715ecf7ca1e952d2c0447269"
11
+ },
12
+ "packages\\skill-schedule\\src\\analyze\\commands.ts": {
13
+ "src": "fa2821f39c95c7121b4797e913d591f004ddaffa3d78528ba7fdc032f7052f4e",
14
+ "dist": "32f3f0a1363519786462bb50b08f0ca9123fa75b06ad2e6e55d5d29c39006034"
15
+ },
16
+ "packages\\skill-schedule\\src\\analyze\\routes.ts": {
17
+ "src": "a126be304020be6fae211adacfa71887cb2ad4582f160a244055fc868712b8b7",
18
+ "dist": "0a3d40f3671f08d2563f86cc156078f47558ae07491847359bb93b48337b6b9b"
19
+ },
20
+ "packages\\skill-schedule\\src\\plan\\commands.ts": {
21
+ "src": "e70e3aa06d0d7f163e5755a595cf37f553e5b6e6a519009292713e9392a4c1ab",
22
+ "dist": "bd8822f57adcc40ee847d6c732820f492da707e487360df75843434eceb81813"
23
+ },
24
+ "packages\\skill-schedule\\src\\plan\\routes.ts": {
25
+ "src": "03626d5432f4b2708f364c07e4a7dfeac66ff175c8e71442be6bc0c1435d14c1",
26
+ "dist": "c03726f2e9743604cdc768c4c3fe74eac63aafa89b1c8799bdf5edf40d04f043"
27
+ },
28
+ "packages\\skill-schedule\\src\\query\\commands.ts": {
29
+ "src": "7c1030ed6de6766f8089bc4924c3ae7188e1b679cf86e07fae86984357674919",
30
+ "dist": "d2fc80595fdf065ddc955332d185aefb791dabbb8ab95ad4fd9f821cdb952981"
31
+ },
32
+ "packages\\skill-schedule\\src\\query\\routes.ts": {
33
+ "src": "39274c0f3445bcae76073eff7d8d092c2f0176caa7a058883639b1a79cdaa17f",
34
+ "dist": "7d5ecf524b058208aa0a2599860e02dd0a8ef1909057a01e3ca820f909e3d16d"
35
+ },
36
+ "packages\\skill-schedule\\src\\write\\commands.ts": {
37
+ "src": "7a283c8056df789e938609979636ea7ee6a89b5cd8ab48aac1e3c51d8bc77512",
38
+ "dist": "d9bd93d9e32741bd00f99c13c6b045c475e47f95fade432c2f86e055f5e59a0d"
39
+ },
40
+ "packages\\skill-schedule\\src\\write\\routes.ts": {
41
+ "src": "0b7b669b766ca1c8926a207a893aa5d2c65c6a8c8cdf125ce6d809b1cf8288a9",
42
+ "dist": "3a5ffd8c964871665345ed5c09267cffeac6d6c84a4eced0bb8658c02532856c"
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,10 @@
1
+ export declare const ADMIN_COMMANDS: {
2
+ kind: "read";
3
+ key: string;
4
+ shape: "list";
5
+ title: string;
6
+ wakeWord: string;
7
+ run: (params: Record<string, unknown>) => import("../shared/commandSpec.js").ViewOut;
8
+ example: string;
9
+ }[];
10
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/admin/commands.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc;;;;;;;;GAEO,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { lookupHelp } from './handlers.js';
2
+ export const ADMIN_COMMANDS = [
3
+ { kind: 'read', key: 'schedule.help.lookup', shape: 'list', title: '作息管家帮助', wakeWord: '作息管家 HELP', run: (params) => lookupHelp(params), example: 'schedule-cmd-read schedule.help.lookup' },
4
+ ];
5
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/admin/commands.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,wCAAwC,EAAE;CAC5J,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ViewOut } from '../shared/commandSpec.js';
2
+ export declare function lookupHelp(params: Record<string, unknown>): ViewOut;
3
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/admin/handlers.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAkCxD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAkBnE"}
@@ -0,0 +1,66 @@
1
+ /** 辅助与管理的处理函数(命令事实的执行一半;声明在 `./commands.ts`)。
2
+ *
3
+ * 逐字搬自 `src/cli/cmd_read.ts` 的 `dispatchHelp` 一家(行为零改动):落盘意图只算不执行,
4
+ * 出口凭返回的 `landing` 走统一管线;坏参抛同文案的类型错误(出口归 exit 2)。
5
+ * 本键全程不开库(#203):判定只看 DB 文件在不在。
6
+ */
7
+ import { existsSync } from 'node:fs';
8
+ import { SchedulePolicyError, resolveDbPath } from '../fetch/index.js';
9
+ import { buildHelpLookup } from '../help/index.js';
10
+ import { resolveHelpDir } from '../help/helpPaths.js';
11
+ import { helpFileStem, buildHelpFileData, renderHelpFileHtml } from '../help/helpFile.js';
12
+ import { HELP_GROUPS } from '../help/scenes/help-assets.js';
13
+ import { assertHtmlSize, buildHelpItems } from '../render/index.js';
14
+ import { helpReuseWindowOf } from 'base-paint/save-html';
15
+ const HELP_MODE_FILE = 'file';
16
+ /** HELP 产物吃的复用窗口(毫秒):缺省**一天**、`reuseHours` 可改(`0`=每次都落新的)。
17
+ * 坏参在这里抛类型错误,出口归「参数错」那一档(exit 2),与其余四家同档。 */
18
+ const helpWindowOrFail = helpReuseWindowOf((m) => {
19
+ throw new SchedulePolicyError('POLICY_BAD_INPUT', m);
20
+ });
21
+ /** 初始化状态:DB **文件存在**=已初始化(照老 `render_help._is_initialized`)。
22
+ * 判定本身异常 ⇒ `false`=横幅照显(fail-open)。 */
23
+ function helpInitialized() {
24
+ try {
25
+ return existsSync(resolveDbPath());
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ /** 交付索引(`list` 形):一级分组一行,计数全**派生**自内容资产(改资产即跟变)。 */
32
+ function buildHelpIndex() {
33
+ const items = HELP_GROUPS.map((g) => ({
34
+ id: g.id,
35
+ icon: g.icon,
36
+ label: g.label,
37
+ subgroupCount: g.subgroups.length,
38
+ sceneCount: g.subgroups.reduce((n, s) => n + s.scenes.length, 0),
39
+ }));
40
+ return {
41
+ items,
42
+ total: items.length,
43
+ sceneTotal: items.reduce((n, it) => n + it.sceneCount, 0),
44
+ subgroupTotal: items.reduce((n, it) => n + it.subgroupCount, 0),
45
+ };
46
+ }
47
+ export function lookupHelp(params) {
48
+ const now = new Date();
49
+ const q = params.q === undefined ? undefined : String(params.q);
50
+ if (q !== undefined) {
51
+ // 现找:只回命中,**按定义不落盘**(#843:`delivery:false` 显式表态,别与「忘了给 landing」混同);
52
+ // 要落盘只有用户显式给 `--html <路径>`(出口那支吃 `explicit`)。
53
+ const all = buildHelpLookup().map((h) => ({ phrase: h.phrase, key: h.key, shape: h.shape, cli: h.cli, desc: h.desc }));
54
+ return { data: { ...buildHelpItems(all, q), mode: 'lookup', query: q }, html: '', delivery: false };
55
+ }
56
+ // #245:HELP 产物吃复用窗口(缺省一天内只留一份,`reuseHours` 可改)。
57
+ const reuseMs = helpWindowOrFail(params);
58
+ const html = renderHelpFileHtml(buildHelpFileData(now, { initialized: helpInitialized() }));
59
+ assertHtmlSize(html);
60
+ return {
61
+ data: { ...buildHelpIndex(), mode: HELP_MODE_FILE, bytes: Buffer.byteLength(html, 'utf8') },
62
+ html,
63
+ landing: { targetDir: resolveHelpDir(), stem: helpFileStem(), reuseMs },
64
+ };
65
+ }
66
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/admin/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './commands.js';
2
+ export * from './routes.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './commands.js';
2
+ export * from './routes.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** 辅助与管理的路由声明(**权威源**,`schedule.help.lookup` 的 4 条)。
2
+ *
3
+ * `order`=今日 `WAKE_TABLE` 下标:归并保序,HELP 速查与 SKILL.md 逐字节不动。
4
+ * 条目逐字照搬 `src/policy/wakewords.ts`(Layer2 退役它之前,两处由对账测试钉死相等)。
5
+ */
6
+ import type { RouteEntry } from '../shared/commandSpec.js';
7
+ export declare const ADMIN_ROUTES: readonly RouteEntry[];
8
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/admin/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAK7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const ADMIN_ROUTES = [
2
+ { phrase: '作息管家 HELP', key: 'schedule.help.lookup', order: 0 },
3
+ { phrase: '作息管家帮助', key: 'schedule.help.lookup', order: 1 },
4
+ { phrase: '作息管家能做什么', key: 'schedule.help.lookup', order: 2 },
5
+ { phrase: '作息管家使用说明', key: 'schedule.help.lookup', order: 3 },
6
+ ];
7
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/admin/routes.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;IAC9D,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;IAC3D,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;IAC7D,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;CAC9D,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const ANALYZE_COMMANDS: {
2
+ kind: "read";
3
+ key: string;
4
+ shape: "analysis";
5
+ title: string;
6
+ wakeWord: string;
7
+ run: import("../shared/commandSpec.js").ViewHandler;
8
+ example: string;
9
+ }[];
10
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/analyze/commands.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,gBAAgB;;;;;;;;GAEK,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { viewRecordCompare } from './handlers.js';
2
+ export const ANALYZE_COMMANDS = [
3
+ { kind: 'read', key: 'schedule.record.compare', shape: 'analysis', title: '作息对比', wakeWord: '对比两个月', run: viewRecordCompare, example: 'schedule-cmd-read schedule.record.compare --params \'{"kind":"months"}\'' },
4
+ ];
5
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/analyze/commands.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAyB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,0EAA0E,EAAE;CAClL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ViewHandler } from '../shared/commandSpec.js';
2
+ export declare const viewRecordCompare: ViewHandler;
3
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/analyze/handlers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAS5D,eAAO,MAAM,iBAAiB,EAAE,WAuC/B,CAAC"}
@@ -0,0 +1,57 @@
1
+ /** 分析与洞察的处理函数(命令事实的执行一半;声明在 `./commands.ts`)。
2
+ *
3
+ * 逐字搬自 `src/cli/cmd_read.ts` 的 switch 一臂 + `monthRange`(行为零改动)。
4
+ */
5
+ import { ScheduleFetchError, listRecordsRange } from '../fetch/index.js';
6
+ import { l1Of, validateCompareInput } from '../policy/index.js';
7
+ import { buildAnomaly, buildCategoryDeep, buildRecordCompare } from '../render/index.js';
8
+ function monthRange(month) {
9
+ const [y, m] = month.split('-').map(Number);
10
+ const last = new Date(y, m, 0).getDate();
11
+ const dd = String(last).padStart(2, '0');
12
+ return { start: month + '-01', end: month + '-' + dd };
13
+ }
14
+ export const viewRecordCompare = (params, handle) => {
15
+ const c = validateCompareInput(params);
16
+ if (c.kind === 'months') {
17
+ const ra = monthRange(c.monthA);
18
+ const rb = monthRange(c.monthB);
19
+ const a = listRecordsRange(handle, ra.start, ra.end);
20
+ const b = listRecordsRange(handle, rb.start, rb.end);
21
+ if (!a.length || !b.length) {
22
+ throw new ScheduleFetchError('SCHEDULE_EMPTY_RANGE', '对比缺数据:' + c.monthA + '(' + a.length + '块)/' + c.monthB + '(' + b.length + '块)');
23
+ }
24
+ return { data: buildRecordCompare({ labelA: c.monthA, labelB: c.monthB, a, b }), html: '' };
25
+ }
26
+ if (c.kind === 'ranges') {
27
+ const a = listRecordsRange(handle, c.startA, c.endA);
28
+ const b = listRecordsRange(handle, c.startB, c.endB);
29
+ if (!a.length || !b.length)
30
+ throw new ScheduleFetchError('SCHEDULE_EMPTY_RANGE', '对比缺数据(两侧均须有记录)');
31
+ return { data: buildRecordCompare({ labelA: c.labelA, labelB: c.labelB, a, b }), html: '' };
32
+ }
33
+ if (c.kind === 'category') {
34
+ const records = listRecordsRange(handle, c.start, c.end);
35
+ if (!records.length)
36
+ throw new ScheduleFetchError('SCHEDULE_EMPTY_RANGE', '区间无记录:' + c.start + '~' + c.end);
37
+ return { data: buildCategoryDeep(c.start, c.end, c.category, records), html: '' };
38
+ }
39
+ const w = c.windowDays;
40
+ const end = c.end;
41
+ const d = new Date(end + 'T00:00:00');
42
+ d.setDate(d.getDate() - (w - 1));
43
+ const start = d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');
44
+ const records = listRecordsRange(handle, start, end);
45
+ if (!records.length)
46
+ throw new ScheduleFetchError('SCHEDULE_EMPTY_RANGE', '窗口无记录:' + start + '~' + end);
47
+ const byDay = new Map();
48
+ for (const r of records) {
49
+ const m = byDay.get(r.date) || {};
50
+ const k = l1Of(r.category);
51
+ m[k] = (m[k] || 0) + (r.duration_minutes || 0);
52
+ byDay.set(r.date, m);
53
+ }
54
+ const daily = [...byDay.entries()].sort().map(([date, byL1]) => ({ date, byL1 }));
55
+ return { data: buildAnomaly(end, w, daily), html: '' };
56
+ };
57
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/analyze/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './commands.js';
2
+ export * from './routes.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './commands.js';
2
+ export * from './routes.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** 分析与洞察的路由声明(**权威源**,`schedule.record.compare` 的 5 条)。
2
+ *
3
+ * `order`=今日 `WAKE_TABLE` 下标:归并保序,HELP 速查与 SKILL.md 逐字节不动。
4
+ * 条目逐字照搬 `src/policy/wakewords.ts`(Layer2 退役它之前,两处由对账测试钉死相等)。
5
+ */
6
+ import type { RouteEntry } from '../shared/commandSpec.js';
7
+ export declare const ANALYZE_ROUTES: readonly RouteEntry[];
8
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/analyze/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,eAAO,MAAM,cAAc,EAAE,SAAS,UAAU,EAM/C,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const ANALYZE_ROUTES = [
2
+ { phrase: '对比两个月', key: 'schedule.record.compare', preset: { kind: 'months' }, order: 24 },
3
+ { phrase: '月份对比', key: 'schedule.record.compare', preset: { kind: 'months' }, order: 25 },
4
+ { phrase: '跨月对比', key: 'schedule.record.compare', preset: { kind: 'months' }, order: 26 },
5
+ { phrase: '类别深挖', key: 'schedule.record.compare', preset: { kind: 'category' }, order: 27 },
6
+ { phrase: '异常检测', key: 'schedule.record.compare', preset: { kind: 'anomaly' }, order: 28 },
7
+ ];
8
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/analyze/routes.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,cAAc,GAA0B;IACnD,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IAC1F,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IACzF,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IACzF,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IAC3F,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;CAC3F,CAAC"}