skill-schedule 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/SKILL.md +105 -0
  2. package/dist/cli/cmd_read.js +174 -116
  3. package/dist/cli/cmd_read.js.map +1 -1
  4. package/dist/cli/config.d.ts +16 -0
  5. package/dist/cli/config.d.ts.map +1 -0
  6. package/dist/cli/config.js +84 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/health.d.ts +7 -0
  9. package/dist/cli/health.d.ts.map +1 -0
  10. package/dist/cli/health.js +32 -0
  11. package/dist/cli/health.js.map +1 -0
  12. package/dist/config.d.ts +43 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +64 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/fetch/db.d.ts +4 -0
  17. package/dist/fetch/db.d.ts.map +1 -1
  18. package/dist/fetch/db.js +10 -0
  19. package/dist/fetch/db.js.map +1 -1
  20. package/dist/fetch/errors.d.ts +1 -1
  21. package/dist/fetch/errors.d.ts.map +1 -1
  22. package/dist/fetch/errors.js.map +1 -1
  23. package/dist/fetch/feishu.d.ts +33 -9
  24. package/dist/fetch/feishu.d.ts.map +1 -1
  25. package/dist/fetch/feishu.js +137 -23
  26. package/dist/fetch/feishu.js.map +1 -1
  27. package/dist/fetch/index.d.ts +4 -4
  28. package/dist/fetch/index.d.ts.map +1 -1
  29. package/dist/fetch/index.js +3 -3
  30. package/dist/fetch/index.js.map +1 -1
  31. package/dist/fetch/paths.d.ts +5 -3
  32. package/dist/fetch/paths.d.ts.map +1 -1
  33. package/dist/fetch/paths.js +19 -24
  34. package/dist/fetch/paths.js.map +1 -1
  35. package/dist/health.d.ts +41 -0
  36. package/dist/health.d.ts.map +1 -0
  37. package/dist/health.js +580 -0
  38. package/dist/health.js.map +1 -0
  39. package/dist/help/helpFile.d.ts +69 -0
  40. package/dist/help/helpFile.d.ts.map +1 -0
  41. package/dist/help/helpFile.js +136 -0
  42. package/dist/help/helpFile.js.map +1 -0
  43. package/dist/help/helpPaths.d.ts +14 -0
  44. package/dist/help/helpPaths.d.ts.map +1 -0
  45. package/dist/help/helpPaths.js +40 -0
  46. package/dist/help/helpPaths.js.map +1 -0
  47. package/dist/help/lookup.d.ts.map +1 -1
  48. package/dist/help/lookup.js +8 -1
  49. package/dist/help/lookup.js.map +1 -1
  50. package/dist/help/output.d.ts +22 -0
  51. package/dist/help/output.d.ts.map +1 -0
  52. package/dist/help/output.js +79 -0
  53. package/dist/help/output.js.map +1 -0
  54. package/dist/help/scenes/help-assets.d.ts +97 -0
  55. package/dist/help/scenes/help-assets.d.ts.map +1 -0
  56. package/dist/help/scenes/help-assets.js +2148 -0
  57. package/dist/help/scenes/help-assets.js.map +1 -0
  58. package/dist/plan/check.d.ts +3 -0
  59. package/dist/plan/check.d.ts.map +1 -0
  60. package/dist/plan/check.js +71 -0
  61. package/dist/plan/check.js.map +1 -0
  62. package/dist/plan/context.d.ts +18 -0
  63. package/dist/plan/context.d.ts.map +1 -0
  64. package/dist/plan/context.js +4 -0
  65. package/dist/plan/context.js.map +1 -0
  66. package/dist/plan/ensure.d.ts +4 -0
  67. package/dist/plan/ensure.d.ts.map +1 -0
  68. package/dist/plan/ensure.js +140 -0
  69. package/dist/plan/ensure.js.map +1 -0
  70. package/dist/plan/index.d.ts +8 -0
  71. package/dist/plan/index.d.ts.map +1 -0
  72. package/dist/plan/index.js +56 -0
  73. package/dist/plan/index.js.map +1 -0
  74. package/dist/plan/iso.d.ts +27 -0
  75. package/dist/plan/iso.d.ts.map +1 -0
  76. package/dist/plan/iso.js +55 -0
  77. package/dist/plan/iso.js.map +1 -0
  78. package/dist/plan/overview.d.ts +23 -0
  79. package/dist/plan/overview.d.ts.map +1 -0
  80. package/dist/plan/overview.js +38 -0
  81. package/dist/plan/overview.js.map +1 -0
  82. package/dist/plan/pull.d.ts +25 -0
  83. package/dist/plan/pull.d.ts.map +1 -0
  84. package/dist/plan/pull.js +83 -0
  85. package/dist/plan/pull.js.map +1 -0
  86. package/dist/plan/receipt.d.ts +52 -0
  87. package/dist/plan/receipt.d.ts.map +1 -0
  88. package/dist/plan/receipt.js +57 -0
  89. package/dist/plan/receipt.js.map +1 -0
  90. package/dist/plan/remoteDay.d.ts +62 -0
  91. package/dist/plan/remoteDay.d.ts.map +1 -0
  92. package/dist/plan/remoteDay.js +102 -0
  93. package/dist/plan/remoteDay.js.map +1 -0
  94. package/dist/plan/single.d.ts +4 -0
  95. package/dist/plan/single.d.ts.map +1 -0
  96. package/dist/plan/single.js +176 -0
  97. package/dist/plan/single.js.map +1 -0
  98. package/dist/plan/sync.d.ts +14 -0
  99. package/dist/plan/sync.d.ts.map +1 -0
  100. package/dist/plan/sync.js +158 -0
  101. package/dist/plan/sync.js.map +1 -0
  102. package/dist/plan/upsert.d.ts +5 -0
  103. package/dist/plan/upsert.d.ts.map +1 -0
  104. package/dist/plan/upsert.js +102 -0
  105. package/dist/plan/upsert.js.map +1 -0
  106. package/dist/policy/index.d.ts +2 -2
  107. package/dist/policy/index.d.ts.map +1 -1
  108. package/dist/policy/index.js +1 -1
  109. package/dist/policy/index.js.map +1 -1
  110. package/dist/policy/plan.d.ts +16 -1
  111. package/dist/policy/plan.d.ts.map +1 -1
  112. package/dist/policy/plan.js +51 -1
  113. package/dist/policy/plan.js.map +1 -1
  114. package/dist/policy/wakewords.js +4 -4
  115. package/dist/policy/wakewords.js.map +1 -1
  116. package/dist/render/html.d.ts +0 -6
  117. package/dist/render/html.d.ts.map +1 -1
  118. package/dist/render/html.js +0 -17
  119. package/dist/render/html.js.map +1 -1
  120. package/dist/render/index.d.ts +2 -1
  121. package/dist/render/index.d.ts.map +1 -1
  122. package/dist/render/index.js +3 -1
  123. package/dist/render/index.js.map +1 -1
  124. package/dist/shared/templateFill.d.ts +4 -0
  125. package/dist/shared/templateFill.d.ts.map +1 -0
  126. package/dist/shared/templateFill.js +20 -0
  127. package/dist/shared/templateFill.js.map +1 -0
  128. package/package.json +7 -4
@@ -0,0 +1,69 @@
1
+ import { HELP_GROUPS } from './scenes/help-assets.js';
2
+ import type { HelpGroupAsset } from './scenes/help-assets.js';
3
+ /** 「作息管家help」交付文件的**文件名主体**(接线层从配置文件取,调用方不接受外部传入,照 bill 先例)。
4
+ * #695 起值的唯一事实源是配置项 `files.help`(默认值 `作息管家_HELP` 住 `src/config.ts` 的默认值表);
5
+ * 改造前这里是写死的常量 `HELP_FILE_STEM`,调用点已全部改成函数调用。 */
6
+ export declare function helpFileStem(): string;
7
+ /** 5 键头(旧实物口径的逐字取值)。 */
8
+ export declare const HELP_FILE_SKILL_NAME: "\u4F5C\u606F\u7BA1\u5BB6";
9
+ export declare const HELP_FILE_TITLE: "\u4F5C\u606F\u7BA1\u5BB6 \u00B7 \u4F7F\u7528\u624B\u518C(HELP)";
10
+ /** 技能数据世代版本(照 bill 口径:**不是** npm 包 `skill-schedule@0.1.0`)。 */
11
+ export declare const HELP_FILE_VERSION: "2.0";
12
+ /** 首次使用横幅的 prompt 取自该场景(单源;键=内容资产里的场景 id)。 */
13
+ export declare const HELP_INIT_SCENE_ID: "first_use";
14
+ /** 联系作者一项;`url` 为真时模板把它渲染成可点链接(照 bill 的 `HelpContactItem`)。 */
15
+ export interface HelpContactItem {
16
+ readonly label: string;
17
+ readonly value: string;
18
+ readonly url?: true;
19
+ }
20
+ /** 联系作者(旧实物的三项:邮箱/GitHub/Issues)。 */
21
+ export interface HelpContact {
22
+ readonly items: readonly HelpContactItem[];
23
+ readonly copy_all: true;
24
+ }
25
+ export declare const HELP_CONTACT: HelpContact;
26
+ /** 首次使用横幅(照 bill 五键 + 显隐开关 `hidden`)。 */
27
+ export interface HelpInitBanner {
28
+ readonly title: string;
29
+ readonly subtitle: string;
30
+ readonly button_text: string;
31
+ readonly prompt: string;
32
+ readonly closable: true;
33
+ readonly hidden: boolean;
34
+ }
35
+ /** 全量 HELP JSON(5 必需键 + 两块可选键;共享 help 模板运行时契约的超集)。 */
36
+ export interface HelpFileData {
37
+ readonly skill_name: typeof HELP_FILE_SKILL_NAME;
38
+ readonly title: typeof HELP_FILE_TITLE;
39
+ readonly subtitle: string;
40
+ readonly contact: HelpContact;
41
+ readonly groups: typeof HELP_GROUPS;
42
+ readonly version: typeof HELP_FILE_VERSION;
43
+ readonly init_banner: HelpInitBanner;
44
+ }
45
+ export interface HelpFileOptions {
46
+ /** 库是否已初始化(`true` ⇒ 首次使用横幅隐藏)。缺省 `false`=照显(误显的代价小于误藏)。 */
47
+ readonly initialized?: boolean;
48
+ }
49
+ /** 旧口径的 `%Y-%m-%d %H:%M`(本地时区、零填充;非法 Date 即坏参,不返空串)。 */
50
+ export declare function formatHelpMinute(now: Date): string;
51
+ /** 页头摘要行(旧口径):计数与版本派生。只进载荷 `subtitle`——A 路模板读了该键后全文零引用(无渲染落点)。 */
52
+ export declare function deriveSummaryLine(now: Date): string;
53
+ /** 坏分组即抛(不静默降级):校验内容资产的**三层形状**与场景必填字段,首个命中即抛。
54
+ *
55
+ * 入参是「待校验的那份分组数据」而不是直接读常量——接线层没有第二条内容来源,
56
+ * 这样写只是让「坏载荷必须抛」这条口径**可测**(用例能喂坏数据进来,而不用去改资产模块的常量)。
57
+ * 默认值与接线用的是同一个只读引用,行为不变。 */
58
+ export declare function assertGroupsUsable(groups?: readonly HelpGroupAsset[]): void;
59
+ /** 首次使用横幅:文案照旧,`prompt` 取该场景的 `prompt_template`(单源)。
60
+ * 该场景缺位即抛(内容资产是机器生成件,缺位属真故障,不把横幅静默降级掉)。 */
61
+ export declare function buildInitBanner(initialized: boolean): HelpInitBanner;
62
+ /** 内容资产 + 派生 → 全量 HELP JSON(纯函数;`now` 显式传入以保证可复现)。 */
63
+ export declare function buildHelpFileData(now?: Date, opts?: HelpFileOptions): HelpFileData;
64
+ /** 全量 HELP JSON → 全壳 HTML(完整文档:`<!DOCTYPE html>` 起、带 `<meta charset>` 与样式)。
65
+ * 模板唯一实现=共享层 `base-paint/help-shell`;本函数只做接线转发,不自造第二套页面。
66
+ * 载荷按共享层声明的 `HelpShellData` 交出去:本模块多带的 `version`/`init_banner` 两块可选键是它的超集
67
+ * (共享层运行时全量读这些键),形状不匹配时在此就地编译报错,不拖到运行时。 */
68
+ export declare function renderHelpFileHtml(data: HelpFileData): string;
69
+ //# sourceMappingURL=helpFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpFile.d.ts","sourceRoot":"","sources":["../../src/help/helpFile.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAe,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D;;iDAEiD;AACjD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAwB;AACxB,eAAO,MAAM,oBAAoB,EAAG,0BAAe,CAAC;AACpD,eAAO,MAAM,eAAe,EAAG,gEAA4B,CAAC;AAC5D,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,EAAG,KAAc,CAAC;AAChD,8CAA8C;AAC9C,eAAO,MAAM,kBAAkB,EAAG,WAAoB,CAAC;AAEvD,+DAA+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACrB;AAED,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,EAAE,WAOzB,CAAC;AAEH,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,oBAAoB,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,OAAO,eAAe,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAOlD;AASD,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAInD;AAED;;;;6BAI6B;AAC7B,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,SAAS,cAAc,EAAgB,GAAG,IAAI,CAuBxF;AAED;4CAC4C;AAC5C,wBAAgB,eAAe,CAAC,WAAW,EAAE,OAAO,GAAG,cAAc,CAepE;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,IAAiB,EAAE,IAAI,GAAE,eAAoB,GAAG,YAAY,CAYlG;AAED;;;4CAG4C;AAC5C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAG7D"}
@@ -0,0 +1,136 @@
1
+ /** #202 · 「作息管家help」的交付**内容**:内容资产 + 派生 → 共享 help 模板(`base-paint/help-shell`)全页 HTML。
2
+ *
3
+ * 本模块**零 IO、零落盘**:落点通式与写盘全在交付管线(#203:`help/helpPaths.ts` + `help/output.ts`)。
4
+ * 技术路线与 `skill-bill/src/render/helpFile.ts` 逐字同构(票 #202 与结构裁定 t199 §「消费共享 help 模板」):
5
+ * - **不自持模板副本**:模板源恒在 `packages/base-render/assets/help-template.html`(不进本包 `files`),
6
+ * 本模块只调 `base-paint/help-shell` 的 `renderHelpShellHtml`,不新写页面;
7
+ * - `groups` 由内容资产 `HELP_GROUPS` 直转(只读引用,不 clone、不二次转换);
8
+ * - `subtitle` 是页头摘要行(`deriveSummaryLine` 一处算、一处用),计数**全部派生**,不写死 5/34/85。
9
+ *
10
+ * 五必需键 + 两块可选键(与其余技能 HELP 同一口径):
11
+ * - 必需:`skill_name`/`title`/`subtitle`/`contact`/`groups`;
12
+ * - 可选:`version`(技能数据世代,非 npm 包版本)/
13
+ * `init_banner`(键常在、显隐走 `hidden`,照 bill 的口径:payload 形状不随状态变)。
14
+ * - **`meta_blocks` 不传**(用户 2026-09-13 裁定):作息 HELP 与其它技能 HELP 同构,**不多自带功能模块**;
15
+ * 旧实物那 90 条伴生信息(85 条场景「预期结果说明」+5 条一级分组说明)只在内容资产里留档,**不上页**。
16
+ *
17
+ * 缺必需键/空分组**抛错不降级**(票面 ③):本模块按 `src/render/errors.ts` 的既有形状抛
18
+ * `ScheduleRenderError`,`code` 取该类型已有的 `'SCHEDULE_BAD_PAYLOAD'`(不新增错误类、不改既有导出面)。
19
+ *
20
+ * 页面长相由共享模板的**页面侧 JS** 决定(静态段只有一个空 `<div id="screen">`,内容全靠运行时按载荷渲染),
21
+ * 故本模块的正确性只有「跑起来看 DOM」才验得准 —— 见 `test/help-file-202.test.mjs` 的运行时段。
22
+ */
23
+ import { renderHelpShellHtml } from 'base-paint/help-shell';
24
+ import { HELP_ASSETS, HELP_GROUPS } from './scenes/help-assets.js';
25
+ import { ScheduleRenderError } from '../render/errors.js';
26
+ import { loadScheduleConfig } from '../config.js';
27
+ /** 「作息管家help」交付文件的**文件名主体**(接线层从配置文件取,调用方不接受外部传入,照 bill 先例)。
28
+ * #695 起值的唯一事实源是配置项 `files.help`(默认值 `作息管家_HELP` 住 `src/config.ts` 的默认值表);
29
+ * 改造前这里是写死的常量 `HELP_FILE_STEM`,调用点已全部改成函数调用。 */
30
+ export function helpFileStem() {
31
+ return loadScheduleConfig().values.files.help;
32
+ }
33
+ /** 5 键头(旧实物口径的逐字取值)。 */
34
+ export const HELP_FILE_SKILL_NAME = '作息管家';
35
+ export const HELP_FILE_TITLE = '作息管家 · 使用手册(HELP)';
36
+ /** 技能数据世代版本(照 bill 口径:**不是** npm 包 `skill-schedule@0.1.0`)。 */
37
+ export const HELP_FILE_VERSION = '2.0';
38
+ /** 首次使用横幅的 prompt 取自该场景(单源;键=内容资产里的场景 id)。 */
39
+ export const HELP_INIT_SCENE_ID = 'first_use';
40
+ export const HELP_CONTACT = Object.freeze({
41
+ items: Object.freeze([
42
+ Object.freeze({ label: '邮箱', value: '975559549@qq.com' }),
43
+ Object.freeze({ label: 'GitHub', value: 'https://github.com/FeatherHunter/SKILLS', url: true }),
44
+ Object.freeze({ label: 'Issues', value: 'https://github.com/FeatherHunter/SKILLS/issues', url: true }),
45
+ ]),
46
+ copy_all: true,
47
+ });
48
+ /** 旧口径的 `%Y-%m-%d %H:%M`(本地时区、零填充;非法 Date 即坏参,不返空串)。 */
49
+ export function formatHelpMinute(now) {
50
+ if (!(now instanceof Date) || Number.isNaN(now.getTime())) {
51
+ throw new ScheduleRenderError('SCHEDULE_BAD_PAYLOAD', 'HELP 更新时间须为有效 Date(缺失阻断不返空)。');
52
+ }
53
+ const p = (n) => String(n).padStart(2, '0');
54
+ return String(now.getFullYear()) + '-' + p(now.getMonth() + 1) + '-' + p(now.getDate())
55
+ + ' ' + p(now.getHours()) + ':' + p(now.getMinutes());
56
+ }
57
+ /** 一级分组数/唤醒词条数/场景条数:全由内容资产数出来(改资产即跟变,不写第二份数字)。 */
58
+ function assetCounts() {
59
+ const wakeWords = HELP_GROUPS.reduce((n, g) => n + g.subgroups.length, 0);
60
+ const scenes = HELP_GROUPS.reduce((n, g) => n + g.subgroups.reduce((m, s) => m + s.scenes.length, 0), 0);
61
+ return { groups: HELP_GROUPS.length, wakeWords, scenes };
62
+ }
63
+ /** 页头摘要行(旧口径):计数与版本派生。只进载荷 `subtitle`——A 路模板读了该键后全文零引用(无渲染落点)。 */
64
+ export function deriveSummaryLine(now) {
65
+ const n = assetCounts();
66
+ return String(n.groups) + ' 类别 · ' + String(n.wakeWords) + ' 唤醒词 · ' + String(n.scenes)
67
+ + ' 场景 · 版本 ' + HELP_FILE_VERSION + ' · 更新于 ' + formatHelpMinute(now);
68
+ }
69
+ /** 坏分组即抛(不静默降级):校验内容资产的**三层形状**与场景必填字段,首个命中即抛。
70
+ *
71
+ * 入参是「待校验的那份分组数据」而不是直接读常量——接线层没有第二条内容来源,
72
+ * 这样写只是让「坏载荷必须抛」这条口径**可测**(用例能喂坏数据进来,而不用去改资产模块的常量)。
73
+ * 默认值与接线用的是同一个只读引用,行为不变。 */
74
+ export function assertGroupsUsable(groups = HELP_GROUPS) {
75
+ if (!Array.isArray(groups) || groups.length === 0) {
76
+ throw new ScheduleRenderError('SCHEDULE_BAD_PAYLOAD', 'HELP 内容资产缺分组(HELP_GROUPS 为空,不返空页)。');
77
+ }
78
+ if (!Array.isArray(HELP_ASSETS) || HELP_ASSETS.length === 0) {
79
+ throw new ScheduleRenderError('SCHEDULE_BAD_PAYLOAD', 'HELP 内容资产缺场景(HELP_ASSETS 为空,不返空页)。');
80
+ }
81
+ for (const group of groups) {
82
+ if (!Array.isArray(group.subgroups) || group.subgroups.length === 0) {
83
+ throw new ScheduleRenderError('SCHEDULE_BAD_PAYLOAD', 'HELP 分组无子功能(' + group.id + ' 的 subgroups 为空)。');
84
+ }
85
+ for (const subgroup of group.subgroups) {
86
+ if (!Array.isArray(subgroup.scenes) || subgroup.scenes.length === 0) {
87
+ throw new ScheduleRenderError('SCHEDULE_BAD_PAYLOAD', 'HELP 子功能无场景(' + subgroup.id + ' 的 scenes 为空,契约 scenes[] 非空)。');
88
+ }
89
+ for (const scene of subgroup.scenes) {
90
+ if (typeof scene.prompt_template !== 'string' || scene.prompt_template.length === 0) {
91
+ throw new ScheduleRenderError('SCHEDULE_BAD_PAYLOAD', 'HELP 场景缺 prompt(' + scene.id + ')。');
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ /** 首次使用横幅:文案照旧,`prompt` 取该场景的 `prompt_template`(单源)。
98
+ * 该场景缺位即抛(内容资产是机器生成件,缺位属真故障,不把横幅静默降级掉)。 */
99
+ export function buildInitBanner(initialized) {
100
+ const scene = HELP_ASSETS.find((s) => s.id === HELP_INIT_SCENE_ID);
101
+ const prompt = scene?.prompt_template;
102
+ if (typeof prompt !== 'string' || prompt.length === 0) {
103
+ throw new ScheduleRenderError('SCHEDULE_BAD_PAYLOAD', 'HELP 首次使用横幅缺 prompt:内容资产无场景 ' + HELP_INIT_SCENE_ID);
104
+ }
105
+ return {
106
+ title: '🚀 第一次用作息管家?',
107
+ subtitle: '从「首次使用」开始 — 建库、确认数据目录、验证读写,全程零决策。完成初始化后,本区域将不再出现。',
108
+ button_text: '📋 复制初始化 prompt',
109
+ prompt,
110
+ closable: true,
111
+ hidden: initialized === true,
112
+ };
113
+ }
114
+ /** 内容资产 + 派生 → 全量 HELP JSON(纯函数;`now` 显式传入以保证可复现)。 */
115
+ export function buildHelpFileData(now = new Date(), opts = {}) {
116
+ assertGroupsUsable();
117
+ const summaryLine = deriveSummaryLine(now);
118
+ return {
119
+ skill_name: HELP_FILE_SKILL_NAME,
120
+ title: HELP_FILE_TITLE,
121
+ subtitle: summaryLine,
122
+ contact: HELP_CONTACT,
123
+ groups: HELP_GROUPS,
124
+ version: HELP_FILE_VERSION,
125
+ init_banner: buildInitBanner(opts.initialized === true),
126
+ };
127
+ }
128
+ /** 全量 HELP JSON → 全壳 HTML(完整文档:`<!DOCTYPE html>` 起、带 `<meta charset>` 与样式)。
129
+ * 模板唯一实现=共享层 `base-paint/help-shell`;本函数只做接线转发,不自造第二套页面。
130
+ * 载荷按共享层声明的 `HelpShellData` 交出去:本模块多带的 `version`/`init_banner` 两块可选键是它的超集
131
+ * (共享层运行时全量读这些键),形状不匹配时在此就地编译报错,不拖到运行时。 */
132
+ export function renderHelpFileHtml(data) {
133
+ const payload = data;
134
+ return renderHelpShellHtml(payload);
135
+ }
136
+ //# sourceMappingURL=helpFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpFile.js","sourceRoot":"","sources":["../../src/help/helpFile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** 落点子目录的默认值:=改造前的代码常量 `HELP_HTML_DIR_PARTS` 两段(老实物两级逐字)。
2
+ * 配置项 `html.dir` 空串即用它。 */
3
+ export declare const DEFAULT_HELP_DIR: "schedule_html/help";
4
+ /** 落点子目录的段数组:配置 `html.dir`(空串=默认)拆成段。 */
5
+ export declare function helpDirSegments(): string[];
6
+ /** 落点**目录**(绝对路径、零 IO,不建目录):`<dbDir>/schedule_html/help/`。
7
+ * #245 起这是交付入口真正吃的东西——给「目录 + 主体」而不是「带戳的初候选路径」,
8
+ * 免得共用件把时间戳算两遍(落盘名由共用件 `saveHtmlFile` 按 `〈主体〉_<YYYYMMDD_HHMMSS>[_N].html` 生成)。
9
+ *
10
+ * ⚠️ **本件原先那三个导出(`formatHelpStamp`/`buildHelpFileName`/`resolveStemTarget`)已就地删除**:
11
+ * #245 把作息侧落盘迁到共用件后,它们是**零消费者**的死代码(时间戳格式与通式的唯一定义地已是
12
+ * `base-render/src/output/saveHtml.ts`),留着就是「同一件事的第二份实现」——铁律二禁止。 */
13
+ export declare function resolveHelpDir(dbDir: string): string;
14
+ //# sourceMappingURL=helpPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpPaths.d.ts","sourceRoot":"","sources":["../../src/help/helpPaths.ts"],"names":[],"mappings":"AAsBA;4BAC4B;AAC5B,eAAO,MAAM,gBAAgB,EAAG,oBAA6B,CAAC;AAE9D,yCAAyC;AACzC,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAG1C;AAED;;;;;;qEAMqE;AACrE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,40 @@
1
+ /** #203 · 「作息管家help」的**命名与落点**(零 IO,只出初候选)。
2
+ *
3
+ * 归属=结构裁定 `docs/skills/skill-schedule/t199-structure-verdict.md` §「消费共享 help 模板的技术路线」第 4 条:
4
+ * 落盘另建管线 `help/helpPaths.ts` + `help/output.ts`,照 bill 的 `render/helpPaths.ts` + `output.ts`
5
+ * 最小管线(#147 的裁决:**自持一份**,不上移公共层、不让技能之间互相依赖)。
6
+ *
7
+ * 老命名规则复刻(只读基线 `docs/skills/skill-schedule/t198-old-help-truth.md` 第四节):
8
+ * - 目录 `<库目录>/schedule_html/help/`(老 `scripts/help_render.py` 的落点,不存在则递归创建);
9
+ * - 文件名主体 `作息管家_HELP`(`helpFile.ts:helpFileStem()`),通式
10
+ * `〈文件名主体〉_<YYYYMMDD>_<HHMMSS>[_<N>].html`;
11
+ * - 时间戳取**本地**时区秒(老 `strftime("%Y%m%d_%H%M%S")`),同名递补。
12
+ *
13
+ * **#695 起值的唯一事实源是配置文件**(`~/.ilife/schedule.yaml`,默认值表住 `src/config.ts`):本件从配置取,
14
+ * 空串回落到默认;目录那一项是**段串**(`schedule_html/help`),段数由值自己决定——老技能里大厨/作息是两段、
15
+ * 备忘/居家是一段,同一套配置形状要能表达「几段」。
16
+ *
17
+ * 本模块只出**初候选**(零 IO):最终名由 `output.ts:writeExclusiveWithRetry` 的 `wx` 独占+`EEXIST` 递补仲裁
18
+ * ——判存与写入之间没有独占性,check-then-write 并发同秒必交叉覆盖(#128 的因果,照抄不重演)。
19
+ */
20
+ import { join, resolve } from 'node:path';
21
+ import { loadScheduleConfig, splitDirSegments } from '../config.js';
22
+ /** 落点子目录的默认值:=改造前的代码常量 `HELP_HTML_DIR_PARTS` 两段(老实物两级逐字)。
23
+ * 配置项 `html.dir` 空串即用它。 */
24
+ export const DEFAULT_HELP_DIR = 'schedule_html/help';
25
+ /** 落点子目录的段数组:配置 `html.dir`(空串=默认)拆成段。 */
26
+ export function helpDirSegments() {
27
+ const dir = loadScheduleConfig().values.html.dir;
28
+ return splitDirSegments(dir === '' ? DEFAULT_HELP_DIR : dir);
29
+ }
30
+ /** 落点**目录**(绝对路径、零 IO,不建目录):`<dbDir>/schedule_html/help/`。
31
+ * #245 起这是交付入口真正吃的东西——给「目录 + 主体」而不是「带戳的初候选路径」,
32
+ * 免得共用件把时间戳算两遍(落盘名由共用件 `saveHtmlFile` 按 `〈主体〉_<YYYYMMDD_HHMMSS>[_N].html` 生成)。
33
+ *
34
+ * ⚠️ **本件原先那三个导出(`formatHelpStamp`/`buildHelpFileName`/`resolveStemTarget`)已就地删除**:
35
+ * #245 把作息侧落盘迁到共用件后,它们是**零消费者**的死代码(时间戳格式与通式的唯一定义地已是
36
+ * `base-render/src/output/saveHtml.ts`),留着就是「同一件事的第二份实现」——铁律二禁止。 */
37
+ export function resolveHelpDir(dbDir) {
38
+ return join(resolve(dbDir), ...helpDirSegments());
39
+ }
40
+ //# sourceMappingURL=helpPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpPaths.js","sourceRoot":"","sources":["../../src/help/helpPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpE;4BAC4B;AAC5B,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAA6B,CAAC;AAE9D,yCAAyC;AACzC,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACjD,OAAO,gBAAgB,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;qEAMqE;AACrE,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../src/help/lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlE,MAAM,WAAW,OAAO;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAyBxG,wBAAgB,eAAe,IAAI,OAAO,EAAE,CAQ3C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAGnE"}
1
+ {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../src/help/lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlE,MAAM,WAAW,OAAO;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAgCxG,wBAAgB,eAAe,IAAI,OAAO,EAAE,CAQ3C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAGnE"}
@@ -5,7 +5,14 @@ function exampleParams(e) {
5
5
  const p = { ...(e.preset || {}) };
6
6
  for (const n of e.needs || []) {
7
7
  if (p[n] === undefined) {
8
- p[n] = n === 'id' ? 1 : n === 'start' || n === 'end' ? '2026-09-01' : n === 'date' ? '2026-09-01' : '<值>';
8
+ // 示例要**照抄即能跑**:每个槽位给一个真能过校验的样例值(数组槽位给数组,别给 "<值>")。
9
+ p[n] = n === 'id' ? 1
10
+ : n === 'start' || n === 'end' || n === 'date' ? '2026-09-01'
11
+ : n === 'dates' ? ['2026-09-21', '2026-09-22']
12
+ : n === 'time_start' ? '09:00'
13
+ : n === 'time_end' ? '10:00'
14
+ : n === 'title' ? '晨会'
15
+ : '<值>';
9
16
  }
10
17
  }
11
18
  const keys = Object.keys(p);
@@ -1 +1 @@
1
- {"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/help/lookup.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAIzD,SAAS,aAAa,CAAC,CAA2E;IAChG,MAAM,CAAC,GAA4B,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5G,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,KAAK,GAA2B;IACpC,uBAAuB,EAAE,2BAA2B;IACpD,uBAAuB,EAAE,mDAAmD;IAC5E,wBAAwB,EAAE,uBAAuB;IACjD,uBAAuB,EAAE,gDAAgD;IACzE,yBAAyB,EAAE,wCAAwC;IACnE,qBAAqB,EAAE,gBAAgB;IACvC,qBAAqB,EAAE,8BAA8B;IACrD,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC;AAEF,6BAA6B;AAC7B,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI;QACzC,GAAG,EAAE,oBAAoB,GAAG,CAAC,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC;QACpD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KACzB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,IAAY;IACtD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC"}
1
+ {"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/help/lookup.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAIzD,SAAS,aAAa,CAAC,CAA2E;IAChG,MAAM,CAAC,GAA4B,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACvB,mDAAmD;YACnD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY;oBAC3D,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC;wBAC5C,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO;4BAC5B,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO;gCAC1B,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI;oCACpB,CAAC,CAAC,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,KAAK,GAA2B;IACpC,uBAAuB,EAAE,2BAA2B;IACpD,uBAAuB,EAAE,mDAAmD;IAC5E,wBAAwB,EAAE,uBAAuB;IACjD,uBAAuB,EAAE,gDAAgD;IACzE,yBAAyB,EAAE,wCAAwC;IACnE,qBAAqB,EAAE,gBAAgB;IACvC,qBAAqB,EAAE,8BAA8B;IACrD,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC;AAEF,6BAA6B;AAC7B,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI;QACzC,GAAG,EAAE,oBAAoB,GAAG,CAAC,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC;QACpD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KACzB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,IAAY;IACtD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type HtmlReceipt } from 'base-paint/save-html';
2
+ /** 交付结果(`file` 态唯一;`path` 必为绝对路径;形状=票面第 2 条的顶层 `delivery{mode,path,bytes}`)。
3
+ * #245 起=共用件回执的形状,别名指向它,不另立第二份定义。 */
4
+ export type HtmlDelivery = HtmlReceipt;
5
+ /** 交付一次 HTML 产物(**唯一落盘点**):
6
+ * - `explicit`(`--html <路径>`,用户逐字指定)→ **覆盖写**,语义与该参数既有口径一致(票面第 3 条);
7
+ * **不吃复用窗口**(逐字落点=说哪落哪);
8
+ * - `targetDir`(`helpPaths.resolveHelpDir` 算出的**落点目录**;相对路径也收,写前归一为绝对)+
9
+ * `stem`(文件名主体,`HELP_FILE_STEM`)→ **独占创建 + 递补**(#128);
10
+ * 带 `reuseMs`(>0)时改为**窗口内复用**(#245):已有那份不超龄就返回它、不新建;
11
+ * - 两者都给时 `explicit` 优先(用户指定胜过默认落点;**逐字覆盖写,不带时间戳、不递补**)。
12
+ * ⚠️ **时间戳只在共用件里算一次**:调用方给的是「目录 + 主体」,**不**把「带戳的初候选路径」传进来
13
+ * ——那样共用件会用「带戳的名字」当主体再拼一次时间戳(实测会落出
14
+ * `作息管家_HELP_<stamp>_<stamp>.html`,本项目已踩过一次)。失败抛错给调用方走 exit 5。 */
15
+ export declare function deliverHtml(input: {
16
+ explicit?: string;
17
+ targetDir?: string;
18
+ stem?: string;
19
+ html: string;
20
+ reuseMs?: number;
21
+ }): HtmlDelivery;
22
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/help/output.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAYtE;sCACsC;AACtC,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC;AAEvC;;;;;;;;;mEASmE;AACnE,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,YAAY,CAyBf"}
@@ -0,0 +1,79 @@
1
+ /** #203 · HELP 产物的**唯一落盘点**(绝对路径回执;#245 起改用共用件 `saveHtmlFile`)。
2
+ *
3
+ * 归属=结构裁定 `docs/skills/skill-schedule/t199-structure-verdict.md` §「消费共享 help 模板的技术路线」
4
+ * 第 4 条:照 bill 的 `src/output.ts` 自持一份最小管线,只抄**需要的那一小块**。那一小块(命名通式 +
5
+ * 独占创建 + `EEXIST` 递补)**#237 起已收进共用件** `base-paint/save-html` 的 `saveHtmlFile`
6
+ * (记账/卡路里/大厨三家同期改走它;备忘录侧走 `#240`)——本件若继续自持,就是**第 5 份同逻辑实现**,
7
+ * 正是仓规铁律二禁止的「同一件事两份实现」。故本件只给**落点意图**(目录 + 文件名主体),命名与落盘全交共用件。
8
+ *
9
+ * #128 的因果(照抄注释,别重演):默认落点曾是「`readdirSync` 计数选名 → `writeFileSync`(`w` 覆盖)」
10
+ * 两步,两步之间无独占性;多进程并发同秒都选同一路径 → 后写覆盖先写,用户按回执路径可能打开
11
+ * 另一次调用的产物。修法(现住共用件):`flag:'wx'` 独占创建,`EEXIST` 时递增 `_N` 重试(原子,无需锁)。
12
+ * - 串行语义不变:交付仍是「通式名 + 首试即中」⇒ 文件名与老版逐字一致;
13
+ * - 并发下由文件系统仲裁:败者 `EEXIST` → `_N+1` 重试,保证每个回执路径的内容就是本次产物;
14
+ * - 大小写不敏感(Windows `normcase`)由 `wx` 天然覆盖:`.HTML` 占位同样 `EEXIST`;
15
+ * - **仅** `EEXIST` 重试,其余错误原样抛出(不把权限/路径错伪装成「换个名再写一次」)。
16
+ *
17
+ * #83 返修 R-1 的教训(同抄):回执路径必须 `resolve()` 归一为**绝对路径**——`SKILLS_DB_PATH`
18
+ * 本身可以是相对路径,产物已写盘却把相对串回传给调用方,下游按它打开就会找不到(或找到别处的同名文件)。
19
+ * 共用件回执的 `path` 恒为绝对路径,这条由它保证(本件不再自己 `resolve`)。
20
+ *
21
+ * #245 · 复用窗口(`reuseMs`):**给了就「窗口内已有同一主体的一份 ⇒ 返回它、不新建」**——这是
22
+ * 「24 小时内只产出 1 个」那条口径的落点。判据在共用件里按**落盘名里的时间戳**算(不看 mtime:
23
+ * mtime 会被复制/同步/touch 改掉),超龄那份不算命中 ⇒ 与未命中同路落一份新的(旧的留着当留档)。
24
+ * 只对 `target` 那支生效:`explicit`(`--html <路径>`)是用户逐字指定的落点,共用件本身也不许
25
+ * `file` + `reuse` 同给(`EINVAL`)。
26
+ *
27
+ * 写失败**不静默降级**(本票面第 3 条):照本包 `src/render/errors.ts` 的既有形状抛
28
+ * `ScheduleRenderError`(`code` 取该类型已有的 `'SCHEDULE_HTML_TOO_LARGE'`=「体积/落盘门」那一条,
29
+ * 不新增错误类、不改既有导出面),由出口 `cmd_read.ts` 走 exit 5 + stderr 回执。
30
+ */
31
+ import { basename, dirname, join, resolve } from 'node:path';
32
+ import { saveHtmlFile } from 'base-paint/save-html';
33
+ import { ScheduleRenderError } from '../render/errors.js';
34
+ /** 落盘失败一律抛本包渲染层错误(`cause` 保留原始系统错,信息不丢)。 */
35
+ function writeFailed(path, e) {
36
+ if (e instanceof ScheduleRenderError)
37
+ throw e;
38
+ const code = e?.code;
39
+ const detail = e?.message ?? String(e);
40
+ throw new ScheduleRenderError('SCHEDULE_HTML_TOO_LARGE', '[skill-schedule] HELP 落盘失败:' + path + '(' + (code ? code + ':' : '') + detail + ')');
41
+ }
42
+ /** 交付一次 HTML 产物(**唯一落盘点**):
43
+ * - `explicit`(`--html <路径>`,用户逐字指定)→ **覆盖写**,语义与该参数既有口径一致(票面第 3 条);
44
+ * **不吃复用窗口**(逐字落点=说哪落哪);
45
+ * - `targetDir`(`helpPaths.resolveHelpDir` 算出的**落点目录**;相对路径也收,写前归一为绝对)+
46
+ * `stem`(文件名主体,`HELP_FILE_STEM`)→ **独占创建 + 递补**(#128);
47
+ * 带 `reuseMs`(>0)时改为**窗口内复用**(#245):已有那份不超龄就返回它、不新建;
48
+ * - 两者都给时 `explicit` 优先(用户指定胜过默认落点;**逐字覆盖写,不带时间戳、不递补**)。
49
+ * ⚠️ **时间戳只在共用件里算一次**:调用方给的是「目录 + 主体」,**不**把「带戳的初候选路径」传进来
50
+ * ——那样共用件会用「带戳的名字」当主体再拼一次时间戳(实测会落出
51
+ * `作息管家_HELP_<stamp>_<stamp>.html`,本项目已踩过一次)。失败抛错给调用方走 exit 5。 */
52
+ export function deliverHtml(input) {
53
+ if (input.explicit !== undefined && input.explicit.length > 0) {
54
+ const written = resolve(input.explicit);
55
+ try {
56
+ return saveHtmlFile({
57
+ dir: dirname(written), file: basename(written), html: input.html, onExists: 'overwrite',
58
+ });
59
+ }
60
+ catch (e) {
61
+ writeFailed(written, e);
62
+ }
63
+ }
64
+ if (input.targetDir === undefined || input.targetDir.length === 0 || input.stem === undefined) {
65
+ throw new ScheduleRenderError('SCHEDULE_HTML_TOO_LARGE', '[skill-schedule] deliverHtml 缺落点(`explicit` 与「`targetDir` + `stem`」至少给一组)');
66
+ }
67
+ try {
68
+ return saveHtmlFile({
69
+ dir: input.targetDir,
70
+ stem: input.stem,
71
+ html: input.html,
72
+ ...(input.reuseMs === undefined ? {} : { onExists: { reuse: { byAge: input.reuseMs } } }),
73
+ });
74
+ }
75
+ catch (e) {
76
+ writeFailed(join(input.targetDir, input.stem), e);
77
+ }
78
+ }
79
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/help/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAoB,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,4CAA4C;AAC5C,SAAS,WAAW,CAAC,IAAY,EAAE,CAAU;IAC3C,IAAI,CAAC,YAAY,mBAAmB;QAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAI,CAAuC,EAAE,IAAI,CAAC;IAC5D,MAAM,MAAM,GAAI,CAAuB,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,mBAAmB,CAAC,yBAAyB,EACrD,6BAA6B,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;AAC1F,CAAC;AAMD;;;;;;;;;mEASmE;AACnE,MAAM,UAAU,WAAW,CAAC,KAM3B;IACC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC;gBAClB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW;aACxF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9F,MAAM,IAAI,mBAAmB,CAAC,yBAAyB,EACrD,2EAA2E,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC;YAClB,GAAG,EAAE,KAAK,CAAC,SAAS;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;SAC1F,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,97 @@
1
+ /** #201 · 作息管家 HELP 内容资产(机器生成,禁手改词)。
2
+ *
3
+ * 唯一内容源:`.scratch/t198/old-scenarios.json`——旧作息管家 HELP 实物里原样取出的场景数据
4
+ * (世代判定与内容骨架见 `docs/skills/skill-schedule/t198-old-help-truth.md`)。
5
+ * 本文件由 `scripts/gen-help-assets.mjs` 生成:5 个一级分组/34 条唤醒词/85 条场景,
6
+ * 分组、唤醒词、场景的先后次序与源数据一致。
7
+ *
8
+ * 载荷契约:`packages/base-render/src/spec/help.ts` 的 `SCENE_DATA_SCHEMA`——`HELP_GROUPS` 就是
9
+ * 共享 help 模板要的 `groups` 参数,分三层:一级分组 → 子功能(=旧唤醒词)→ 场景卡片。
10
+ * 该 schema 各层都是 `additionalProperties:false`,多一个键即校验失败,故本文件里的对象字段是闭集。
11
+ *
12
+ * 三处形状转换(生成器里写死、可复核):
13
+ * 1. 源 `dimensions`(参数名 → 说明的自由对象)→ 契约 `editable_fields`:`name`/`label` 取维度键
14
+ * 原名;`hint` 取维度说明原文(逐字;布尔与数字按其 JSON 字面量文本);`value` 一律空串、
15
+ * `required` 一律 false——理由见生成器的 `toField`。
16
+ * 2. 源 `status` 为空、但唤醒词属「今天没有命令可执行」的 5 条者,标 `【待开发】`:
17
+ * 源自标待开发 1 条,加上这几条下辖的场景,本文件标 `【待开发】` 的共 11 条。
18
+ * 3. 三层对齐:源「分组 → 唤醒词 → 场景」直接对到契约「groups → subgroups → scenes」,
19
+ * 不合并、不新造分组(用户在 HELP 页里看到的分组与旧技能所见一致)。
20
+ *
21
+ * 票面点名的逐场景「类型」字段(`type`)在本文件里不存在——这是有据的偏离,不是漏了:契约里那个位
22
+ * 叫 `types`(复数、无单数别名,`packages/base-render/src/spec/help.ts` 的 `SCENE_TYPE_FIELD`/
23
+ * `Scene.types`),而源数据的场景字段是闭集(生成器 `SOURCE_SCENE_KEYS`=wake_word/scenario_id/scenario_title/dimensions/prompt/status/result)、
24
+ * 里面没有类型位,旧实物 HELP 也没有类型徽章——凭空补一个空 `types` 等于自造内容,故不落该字段;
25
+ * 将来源数据真出现类型位,生成器会因字段闭集断言失败而报错(不会静默丢掉)。要变体徽章另开票。
26
+ *
27
+ * 页面外的两张源数据镜像(**留档,页面不渲染**):契约没有对应位、故不进 `HELP_GROUPS` 的两处源信息,
28
+ * 仍按原样镜像在本文件里——源场景的 `result` → `HELP_SCENE_RESULTS`(逐场景一条);
29
+ * 源一级分组的 `desc` → `HELP_GROUP_NOTES`(逐分组一条)。保留数据本身的理由:这两张表的源头在
30
+ * **未入库**的 `.scratch/t198/old-scenarios.json`,删掉即从仓库里彻底灭失,故留档备查。
31
+ * **当前 HELP 页不展示它们**(用户 2026-09-13 裁定:作息 HELP 与其它技能 HELP 同构,不多自带功能模块):
32
+ * 页面上的「预期 ·」与一级分组说明一律不出现,两个渲染出口与 `#help-data` 载荷里都取不到这两个键。
33
+ * 为什么不塞进载荷:校验器按 `additionalProperties:false` 直接拒收多余键
34
+ * (`packages/base-render/src/help.ts` 的字段闭集判定);并进 `editable_fields[].hint` 会让
35
+ * 「可编辑参数」这个位变浑浊,且没有维度的场景(`first_use`)无处可放。
36
+ *
37
+ * 计数全部由数据算出(见 `HELP_TOTALS`),本文件不写第二个数;改资产即跟变。
38
+ * 改词走生成器:`node packages/skill-schedule/scripts/gen-help-assets.mjs`(`--check` 只比对不落盘)。
39
+ */
40
+ /** 参数化表单字段(契约 `editable_fields` 的一条)。 */
41
+ export interface HelpSceneField {
42
+ /** 参数名(=源 `dimensions` 的维度键原名)。 */
43
+ readonly name: string;
44
+ /** 显示标签(源里没有更友好的显示名,同 `name`)。 */
45
+ readonly label: string;
46
+ /** 推荐值(源里没有独立的推荐值字段,一律空串)。 */
47
+ readonly value: string;
48
+ /** 源维度说明原文(逐字)。 */
49
+ readonly hint: string;
50
+ /** 必填(源里没有针对该维度自身的必填标记,一律 false)。 */
51
+ readonly required: boolean;
52
+ }
53
+ /** 两态状态(契约 `SCENE_STATUS`:空串=可用,【待开发】=禁用)。写成联合型,
54
+ * 好让 `HELP_GROUPS` 直接就是共享 help 模板 `SceneData['groups']` 的形状,接线上不做二次转换。 */
55
+ export type HelpSceneStatus = '' | '【待开发】';
56
+ /** 场景卡片(契约 `scenes[]` 的一条)。 */
57
+ export interface HelpSceneAsset {
58
+ readonly id: string;
59
+ readonly title: string;
60
+ readonly wake_word: string;
61
+ readonly status: HelpSceneStatus;
62
+ /** 「复制指令」按钮按出来的正文,逐字照搬源 `prompt`。 */
63
+ readonly prompt_template: string;
64
+ readonly editable_fields: readonly HelpSceneField[];
65
+ }
66
+ /** 子功能折叠组(契约 `subgroups[]` 的一条;=旧的一条唤醒词)。 */
67
+ export interface HelpSubgroupAsset {
68
+ readonly id: string;
69
+ readonly label: string;
70
+ readonly scenes: readonly HelpSceneAsset[];
71
+ }
72
+ /** 一级分组(契约 `groups[]` 的一条)。 */
73
+ export interface HelpGroupAsset {
74
+ readonly id: string;
75
+ readonly icon: string;
76
+ readonly label: string;
77
+ readonly subgroups: readonly HelpSubgroupAsset[];
78
+ }
79
+ /** 5 个一级分组/34 条唤醒词/85 条场景(=共享 help 模板要的 `groups` 参数)。 */
80
+ export declare const HELP_GROUPS: readonly HelpGroupAsset[];
81
+ /** 扁平 85 条(顺序与 HELP 分组一致;单源派生,不重复落词)。 */
82
+ export declare const HELP_ASSETS: readonly HelpSceneAsset[];
83
+ /** 源场景 `result` 原文(85/85,键=场景 id)。契约里没有这个位,故不进
84
+ * `HELP_GROUPS`(`HELP_GROUPS` 只装纯场景数据);本表是源数据镜像,**当前 HELP 页不渲染**
85
+ * —— 页面上的「预期 ·」一律不出现(见文件头「页面外的两张源数据镜像」)。 */
86
+ export declare const HELP_SCENE_RESULTS: Readonly<Record<string, string>>;
87
+ /** 源一级分组 `desc` 原文(5/5,键=分组 id)。同上:契约里没有这个位,
88
+ * 不进 `HELP_GROUPS`;本表是源数据镜像,**当前 HELP 页不渲染**(见文件头「页面外的两张源数据镜像」)。 */
89
+ export declare const HELP_GROUP_NOTES: Readonly<Record<string, string>>;
90
+ /** 计数(全部由数据算出;改资产即跟变,内容另由测试里的摘要锁钉住)。 */
91
+ export declare const HELP_TOTALS: Readonly<{
92
+ groups: number;
93
+ subgroups: number;
94
+ scenes: number;
95
+ pending: number;
96
+ }>;
97
+ //# sourceMappingURL=help-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-assets.d.ts","sourceRoot":"","sources":["../../../src/help/scenes/help-assets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;2EAC2E;AAC3E,MAAM,MAAM,eAAe,GAAG,EAAE,GAAG,OAAO,CAAC;AAE3C,+BAA+B;AAC/B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,qCAAqC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;CACrD;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;CAC5C;AAED,+BAA+B;AAC/B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED,yDAAyD;AACzD,eAAO,MAAM,WAAW,EAAE,SAAS,cAAc,EA88DhD,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,WAAW,EAAE,SAAS,cAAc,EAEhD,CAAC;AAEF;;6CAE6C;AAC7C,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsF/D,CAAC;AAEF;qEACqE;AACrE,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM7D,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,WAAW;;;;;EAKtB,CAAC"}