skill-schedule 0.2.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.
- package/SKILL.md +12 -6
- package/dist/cli/cmd_read.js +96 -104
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/config.d.ts +16 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +84 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/health.d.ts +7 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +32 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/fetch/db.d.ts +4 -0
- package/dist/fetch/db.d.ts.map +1 -1
- package/dist/fetch/db.js +10 -0
- package/dist/fetch/db.js.map +1 -1
- package/dist/fetch/errors.d.ts +1 -1
- package/dist/fetch/errors.d.ts.map +1 -1
- package/dist/fetch/errors.js.map +1 -1
- package/dist/fetch/feishu.d.ts +33 -9
- package/dist/fetch/feishu.d.ts.map +1 -1
- package/dist/fetch/feishu.js +137 -23
- package/dist/fetch/feishu.js.map +1 -1
- package/dist/fetch/index.d.ts +4 -4
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/index.js +3 -3
- package/dist/fetch/index.js.map +1 -1
- package/dist/fetch/paths.d.ts +5 -3
- package/dist/fetch/paths.d.ts.map +1 -1
- package/dist/fetch/paths.js +19 -24
- package/dist/fetch/paths.js.map +1 -1
- package/dist/health.d.ts +41 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +580 -0
- package/dist/health.js.map +1 -0
- package/dist/help/helpFile.d.ts +6 -27
- package/dist/help/helpFile.d.ts.map +1 -1
- package/dist/help/helpFile.js +13 -50
- package/dist/help/helpFile.js.map +1 -1
- package/dist/help/helpPaths.d.ts +13 -12
- package/dist/help/helpPaths.d.ts.map +1 -1
- package/dist/help/helpPaths.js +23 -29
- package/dist/help/helpPaths.js.map +1 -1
- package/dist/help/lookup.d.ts.map +1 -1
- package/dist/help/lookup.js +8 -1
- package/dist/help/lookup.js.map +1 -1
- package/dist/help/output.d.ts +15 -14
- package/dist/help/output.d.ts.map +1 -1
- package/dist/help/output.js +40 -53
- package/dist/help/output.js.map +1 -1
- package/dist/help/scenes/help-assets.d.ts +10 -10
- package/dist/help/scenes/help-assets.d.ts.map +1 -1
- package/dist/help/scenes/help-assets.js +10 -10
- package/dist/help/scenes/help-assets.js.map +1 -1
- package/dist/plan/check.d.ts +3 -0
- package/dist/plan/check.d.ts.map +1 -0
- package/dist/plan/check.js +71 -0
- package/dist/plan/check.js.map +1 -0
- package/dist/plan/context.d.ts +18 -0
- package/dist/plan/context.d.ts.map +1 -0
- package/dist/plan/context.js +4 -0
- package/dist/plan/context.js.map +1 -0
- package/dist/plan/ensure.d.ts +4 -0
- package/dist/plan/ensure.d.ts.map +1 -0
- package/dist/plan/ensure.js +140 -0
- package/dist/plan/ensure.js.map +1 -0
- package/dist/plan/index.d.ts +8 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +56 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/iso.d.ts +27 -0
- package/dist/plan/iso.d.ts.map +1 -0
- package/dist/plan/iso.js +55 -0
- package/dist/plan/iso.js.map +1 -0
- package/dist/plan/overview.d.ts +23 -0
- package/dist/plan/overview.d.ts.map +1 -0
- package/dist/plan/overview.js +38 -0
- package/dist/plan/overview.js.map +1 -0
- package/dist/plan/pull.d.ts +25 -0
- package/dist/plan/pull.d.ts.map +1 -0
- package/dist/plan/pull.js +83 -0
- package/dist/plan/pull.js.map +1 -0
- package/dist/plan/receipt.d.ts +52 -0
- package/dist/plan/receipt.d.ts.map +1 -0
- package/dist/plan/receipt.js +57 -0
- package/dist/plan/receipt.js.map +1 -0
- package/dist/plan/remoteDay.d.ts +62 -0
- package/dist/plan/remoteDay.d.ts.map +1 -0
- package/dist/plan/remoteDay.js +102 -0
- package/dist/plan/remoteDay.js.map +1 -0
- package/dist/plan/single.d.ts +4 -0
- package/dist/plan/single.d.ts.map +1 -0
- package/dist/plan/single.js +176 -0
- package/dist/plan/single.js.map +1 -0
- package/dist/plan/sync.d.ts +14 -0
- package/dist/plan/sync.d.ts.map +1 -0
- package/dist/plan/sync.js +158 -0
- package/dist/plan/sync.js.map +1 -0
- package/dist/plan/upsert.d.ts +5 -0
- package/dist/plan/upsert.d.ts.map +1 -0
- package/dist/plan/upsert.js +102 -0
- package/dist/plan/upsert.js.map +1 -0
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.d.ts.map +1 -1
- package/dist/policy/index.js +1 -1
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/plan.d.ts +16 -1
- package/dist/policy/plan.d.ts.map +1 -1
- package/dist/policy/plan.js +51 -1
- package/dist/policy/plan.js.map +1 -1
- package/dist/policy/wakewords.js +4 -4
- package/dist/policy/wakewords.js.map +1 -1
- package/package.json +1 -1
package/dist/help/helpFile.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { HELP_GROUPS } from './scenes/help-assets.js';
|
|
2
2
|
import type { HelpGroupAsset } from './scenes/help-assets.js';
|
|
3
|
-
/** 「作息管家help
|
|
4
|
-
|
|
3
|
+
/** 「作息管家help」交付文件的**文件名主体**(接线层从配置文件取,调用方不接受外部传入,照 bill 先例)。
|
|
4
|
+
* #695 起值的唯一事实源是配置项 `files.help`(默认值 `作息管家_HELP` 住 `src/config.ts` 的默认值表);
|
|
5
|
+
* 改造前这里是写死的常量 `HELP_FILE_STEM`,调用点已全部改成函数调用。 */
|
|
6
|
+
export declare function helpFileStem(): string;
|
|
5
7
|
/** 5 键头(旧实物口径的逐字取值)。 */
|
|
6
8
|
export declare const HELP_FILE_SKILL_NAME: "\u4F5C\u606F\u7BA1\u5BB6";
|
|
7
9
|
export declare const HELP_FILE_TITLE: "\u4F5C\u606F\u7BA1\u5BB6 \u00B7 \u4F7F\u7528\u624B\u518C(HELP)";
|
|
@@ -21,12 +23,6 @@ export interface HelpContact {
|
|
|
21
23
|
readonly copy_all: true;
|
|
22
24
|
}
|
|
23
25
|
export declare const HELP_CONTACT: HelpContact;
|
|
24
|
-
/** 一次使用的信息块(契约 `meta_blocks[]` 的一条;`html` 原样透传,转义由技能方自理)。 */
|
|
25
|
-
export interface HelpSceneBlock {
|
|
26
|
-
readonly id: string;
|
|
27
|
-
readonly title: string;
|
|
28
|
-
readonly html: string;
|
|
29
|
-
}
|
|
30
26
|
/** 首次使用横幅(照 bill 五键 + 显隐开关 `hidden`)。 */
|
|
31
27
|
export interface HelpInitBanner {
|
|
32
28
|
readonly title: string;
|
|
@@ -36,14 +32,13 @@ export interface HelpInitBanner {
|
|
|
36
32
|
readonly closable: true;
|
|
37
33
|
readonly hidden: boolean;
|
|
38
34
|
}
|
|
39
|
-
/** 全量 HELP JSON(5 必需键 +
|
|
35
|
+
/** 全量 HELP JSON(5 必需键 + 两块可选键;共享 help 模板运行时契约的超集)。 */
|
|
40
36
|
export interface HelpFileData {
|
|
41
37
|
readonly skill_name: typeof HELP_FILE_SKILL_NAME;
|
|
42
38
|
readonly title: typeof HELP_FILE_TITLE;
|
|
43
39
|
readonly subtitle: string;
|
|
44
40
|
readonly contact: HelpContact;
|
|
45
41
|
readonly groups: typeof HELP_GROUPS;
|
|
46
|
-
readonly meta_blocks: readonly HelpSceneBlock[];
|
|
47
42
|
readonly version: typeof HELP_FILE_VERSION;
|
|
48
43
|
readonly init_banner: HelpInitBanner;
|
|
49
44
|
}
|
|
@@ -66,25 +61,9 @@ export declare function assertGroupsUsable(groups?: readonly HelpGroupAsset[]):
|
|
|
66
61
|
export declare function buildInitBanner(initialized: boolean): HelpInitBanner;
|
|
67
62
|
/** 内容资产 + 派生 → 全量 HELP JSON(纯函数;`now` 显式传入以保证可复现)。 */
|
|
68
63
|
export declare function buildHelpFileData(now?: Date, opts?: HelpFileOptions): HelpFileData;
|
|
69
|
-
/** 载荷里的信息块:**每个一级分组一块**(块 `id` 逐字等于该分组 id)。
|
|
70
|
-
*
|
|
71
|
-
* 模板在**分组页首**按 `m.id === g.key` 挑块渲染(`help-template.html` 页面侧 JS 的 A-3 落点),
|
|
72
|
-
* 故 `id` 对不上任何分组 id 的块**不上页**。块数与条数全由资产派生(块数=分组数、条数=场景数+分组数),
|
|
73
|
-
* 不写第二份数字。 */
|
|
74
|
-
export declare function buildMetaBlocks(): readonly HelpSceneBlock[];
|
|
75
|
-
/** 记账(事实陈述,不是待办):旧 HELP 页把「每条场景的预期结果说明」(85 条)与「一级分组说明」(5 条)
|
|
76
|
-
* 画给用户看,而共享 help 模板此前把载荷 `meta_blocks` 读进来后全文零引用(读入即弃)——那 90 条因此上不了页。
|
|
77
|
-
* 本图内落地两刀:① **模板侧**——分组页锚点(`h += '<div class="page" data-page="' + g.key + '">';` 之后)
|
|
78
|
-
* 按 `m.id === g.key` 条件渲染同 id 的块,无命中时该页 DOM 逐字节不变;② **技能侧**——`buildMetaBlocks`
|
|
79
|
-
* 把两张伴生表按一级分组聚合(每组建一块,不拆 85 块)并逐条转义。
|
|
80
|
-
*
|
|
81
|
-
* 公共层记录面已补齐:`docs/base/base-render/t202-help-meta-blocks.md`(改了什么/条件渲染契约/
|
|
82
|
-
* 在用四家/「不传 `meta_blocks` ⇒ 输出与旧版逐字节相同」与「`html` 原样透传、转义责任在技能侧」两条契约/
|
|
83
|
-
* 复现命令)。改的是 bill/calorie/schedule/memo-ilife 四家共用的资产,跨消费方影响表在那份记录里。
|
|
84
|
-
* `test/help-file-202.test.mjs` 的两条缺口反向锁与 bill 的页正文锁由另一路同步。 */
|
|
85
64
|
/** 全量 HELP JSON → 全壳 HTML(完整文档:`<!DOCTYPE html>` 起、带 `<meta charset>` 与样式)。
|
|
86
65
|
* 模板唯一实现=共享层 `base-paint/help-shell`;本函数只做接线转发,不自造第二套页面。
|
|
87
|
-
* 载荷按共享层声明的 `HelpShellData`
|
|
66
|
+
* 载荷按共享层声明的 `HelpShellData` 交出去:本模块多带的 `version`/`init_banner` 两块可选键是它的超集
|
|
88
67
|
* (共享层运行时全量读这些键),形状不匹配时在此就地编译报错,不拖到运行时。 */
|
|
89
68
|
export declare function renderHelpFileHtml(data: HelpFileData): string;
|
|
90
69
|
//# sourceMappingURL=helpFile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpFile.d.ts","sourceRoot":"","sources":["../../src/help/helpFile.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/help/helpFile.js
CHANGED
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
* - `groups` 由内容资产 `HELP_GROUPS` 直转(只读引用,不 clone、不二次转换);
|
|
8
8
|
* - `subtitle` 是页头摘要行(`deriveSummaryLine` 一处算、一处用),计数**全部派生**,不写死 5/34/85。
|
|
9
9
|
*
|
|
10
|
-
* 五必需键 +
|
|
10
|
+
* 五必需键 + 两块可选键(与其余技能 HELP 同一口径):
|
|
11
11
|
* - 必需:`skill_name`/`title`/`subtitle`/`contact`/`groups`;
|
|
12
|
-
* - 可选:`
|
|
13
|
-
* `version`(技能数据世代,非 npm 包版本)/
|
|
12
|
+
* - 可选:`version`(技能数据世代,非 npm 包版本)/
|
|
14
13
|
* `init_banner`(键常在、显隐走 `hidden`,照 bill 的口径:payload 形状不随状态变)。
|
|
14
|
+
* - **`meta_blocks` 不传**(用户 2026-09-13 裁定):作息 HELP 与其它技能 HELP 同构,**不多自带功能模块**;
|
|
15
|
+
* 旧实物那 90 条伴生信息(85 条场景「预期结果说明」+5 条一级分组说明)只在内容资产里留档,**不上页**。
|
|
15
16
|
*
|
|
16
17
|
* 缺必需键/空分组**抛错不降级**(票面 ③):本模块按 `src/render/errors.ts` 的既有形状抛
|
|
17
18
|
* `ScheduleRenderError`,`code` 取该类型已有的 `'SCHEDULE_BAD_PAYLOAD'`(不新增错误类、不改既有导出面)。
|
|
@@ -20,11 +21,15 @@
|
|
|
20
21
|
* 故本模块的正确性只有「跑起来看 DOM」才验得准 —— 见 `test/help-file-202.test.mjs` 的运行时段。
|
|
21
22
|
*/
|
|
22
23
|
import { renderHelpShellHtml } from 'base-paint/help-shell';
|
|
23
|
-
import { HELP_ASSETS, HELP_GROUPS
|
|
24
|
-
import { escapeHtml } from '../render/html.js';
|
|
24
|
+
import { HELP_ASSETS, HELP_GROUPS } from './scenes/help-assets.js';
|
|
25
25
|
import { ScheduleRenderError } from '../render/errors.js';
|
|
26
|
-
|
|
27
|
-
|
|
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
|
+
}
|
|
28
33
|
/** 5 键头(旧实物口径的逐字取值)。 */
|
|
29
34
|
export const HELP_FILE_SKILL_NAME = '作息管家';
|
|
30
35
|
export const HELP_FILE_TITLE = '作息管家 · 使用手册(HELP)';
|
|
@@ -116,55 +121,13 @@ export function buildHelpFileData(now = new Date(), opts = {}) {
|
|
|
116
121
|
subtitle: summaryLine,
|
|
117
122
|
contact: HELP_CONTACT,
|
|
118
123
|
groups: HELP_GROUPS,
|
|
119
|
-
meta_blocks: buildMetaBlocks(),
|
|
120
124
|
version: HELP_FILE_VERSION,
|
|
121
125
|
init_banner: buildInitBanner(opts.initialized === true),
|
|
122
126
|
};
|
|
123
127
|
}
|
|
124
|
-
/** 一个一级分组的伴生信息块正文:分组说明(`HELP_GROUP_NOTES`)+ 该组各场景「标题 · 预期」(`HELP_SCENE_RESULTS`)。
|
|
125
|
-
*
|
|
126
|
-
* `meta_blocks[].html` 由模板**原样透传**(不过滤),故这里逐条 `escapeHtml`:含 ASCII 尖括号的原文
|
|
127
|
-
* (如 `replay_range` 的 `<start> <end>`)不转义会被浏览器当标签解析、原文丢失。行形状复用模板
|
|
128
|
-
* `about-sec` 家族的 `.about-row`/`.a-t`(不新造类名)——样式由**模板侧** `.meta-sec` 区提供
|
|
129
|
-
* (`help-template.html:57` 的 `.meta-sec .a-t span`,靠源序盖过 `:52` 的 `.about-row .a-t span`):
|
|
130
|
-
* 本侧不自带 CSS,但正文形状与模板那一行样式**互相耦合**,改模板 `.meta-sec` 区须同步这里。
|
|
131
|
-
* 契约=`docs/base/base-render/t202-help-meta-blocks.md`。 */
|
|
132
|
-
function groupBlockHtml(group) {
|
|
133
|
-
const rows = [];
|
|
134
|
-
const note = HELP_GROUP_NOTES[group.id];
|
|
135
|
-
if (note)
|
|
136
|
-
rows.push('<div class="about-row"><div class="a-t"><span>' + escapeHtml(note) + '</span></div></div>');
|
|
137
|
-
for (const subgroup of group.subgroups) {
|
|
138
|
-
for (const scene of subgroup.scenes) {
|
|
139
|
-
const result = HELP_SCENE_RESULTS[scene.id];
|
|
140
|
-
rows.push('<div class="about-row"><div class="a-t"><b>' + escapeHtml(scene.title) + '</b>'
|
|
141
|
-
+ (result ? '<span>预期 · ' + escapeHtml(result) + '</span>' : '') + '</div></div>');
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return rows.join('');
|
|
145
|
-
}
|
|
146
|
-
/** 载荷里的信息块:**每个一级分组一块**(块 `id` 逐字等于该分组 id)。
|
|
147
|
-
*
|
|
148
|
-
* 模板在**分组页首**按 `m.id === g.key` 挑块渲染(`help-template.html` 页面侧 JS 的 A-3 落点),
|
|
149
|
-
* 故 `id` 对不上任何分组 id 的块**不上页**。块数与条数全由资产派生(块数=分组数、条数=场景数+分组数),
|
|
150
|
-
* 不写第二份数字。 */
|
|
151
|
-
export function buildMetaBlocks() {
|
|
152
|
-
return HELP_GROUPS.map((group) => ({ id: group.id, title: group.label, html: groupBlockHtml(group) }));
|
|
153
|
-
}
|
|
154
|
-
/* ── 90 条伴生信息:**已上页**(原 `TODO(t197-90条)` 缺口,在本图内落地后删去该标记)────────── */
|
|
155
|
-
/** 记账(事实陈述,不是待办):旧 HELP 页把「每条场景的预期结果说明」(85 条)与「一级分组说明」(5 条)
|
|
156
|
-
* 画给用户看,而共享 help 模板此前把载荷 `meta_blocks` 读进来后全文零引用(读入即弃)——那 90 条因此上不了页。
|
|
157
|
-
* 本图内落地两刀:① **模板侧**——分组页锚点(`h += '<div class="page" data-page="' + g.key + '">';` 之后)
|
|
158
|
-
* 按 `m.id === g.key` 条件渲染同 id 的块,无命中时该页 DOM 逐字节不变;② **技能侧**——`buildMetaBlocks`
|
|
159
|
-
* 把两张伴生表按一级分组聚合(每组建一块,不拆 85 块)并逐条转义。
|
|
160
|
-
*
|
|
161
|
-
* 公共层记录面已补齐:`docs/base/base-render/t202-help-meta-blocks.md`(改了什么/条件渲染契约/
|
|
162
|
-
* 在用四家/「不传 `meta_blocks` ⇒ 输出与旧版逐字节相同」与「`html` 原样透传、转义责任在技能侧」两条契约/
|
|
163
|
-
* 复现命令)。改的是 bill/calorie/schedule/memo-ilife 四家共用的资产,跨消费方影响表在那份记录里。
|
|
164
|
-
* `test/help-file-202.test.mjs` 的两条缺口反向锁与 bill 的页正文锁由另一路同步。 */
|
|
165
128
|
/** 全量 HELP JSON → 全壳 HTML(完整文档:`<!DOCTYPE html>` 起、带 `<meta charset>` 与样式)。
|
|
166
129
|
* 模板唯一实现=共享层 `base-paint/help-shell`;本函数只做接线转发,不自造第二套页面。
|
|
167
|
-
* 载荷按共享层声明的 `HelpShellData`
|
|
130
|
+
* 载荷按共享层声明的 `HelpShellData` 交出去:本模块多带的 `version`/`init_banner` 两块可选键是它的超集
|
|
168
131
|
* (共享层运行时全量读这些键),形状不匹配时在此就地编译报错,不拖到运行时。 */
|
|
169
132
|
export function renderHelpFileHtml(data) {
|
|
170
133
|
const payload = data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpFile.js","sourceRoot":"","sources":["../../src/help/helpFile.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"helpFile.js","sourceRoot":"","sources":["../../src/help/helpFile.ts"],"names":[],"mappings":"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"}
|
package/dist/help/helpPaths.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
|
|
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;
|
|
13
14
|
//# sourceMappingURL=helpPaths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpPaths.d.ts","sourceRoot":"","sources":["../../src/help/helpPaths.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/help/helpPaths.js
CHANGED
|
@@ -5,42 +5,36 @@
|
|
|
5
5
|
* 最小管线(#147 的裁决:**自持一份**,不上移公共层、不让技能之间互相依赖)。
|
|
6
6
|
*
|
|
7
7
|
* 老命名规则复刻(只读基线 `docs/skills/skill-schedule/t198-old-help-truth.md` 第四节):
|
|
8
|
-
* - 目录
|
|
9
|
-
* - 文件名主体 `作息管家_HELP`(`helpFile.ts:
|
|
8
|
+
* - 目录 `<库目录>/schedule_html/help/`(老 `scripts/help_render.py` 的落点,不存在则递归创建);
|
|
9
|
+
* - 文件名主体 `作息管家_HELP`(`helpFile.ts:helpFileStem()`),通式
|
|
10
10
|
* `〈文件名主体〉_<YYYYMMDD>_<HHMMSS>[_<N>].html`;
|
|
11
11
|
* - 时间戳取**本地**时区秒(老 `strftime("%Y%m%d_%H%M%S")`),同名递补。
|
|
12
12
|
*
|
|
13
|
+
* **#695 起值的唯一事实源是配置文件**(`~/.ilife/schedule.yaml`,默认值表住 `src/config.ts`):本件从配置取,
|
|
14
|
+
* 空串回落到默认;目录那一项是**段串**(`schedule_html/help`),段数由值自己决定——老技能里大厨/作息是两段、
|
|
15
|
+
* 备忘/居家是一段,同一套配置形状要能表达「几段」。
|
|
16
|
+
*
|
|
13
17
|
* 本模块只出**初候选**(零 IO):最终名由 `output.ts:writeExclusiveWithRetry` 的 `wx` 独占+`EEXIST` 递补仲裁
|
|
14
18
|
* ——判存与写入之间没有独占性,check-then-write 并发同秒必交叉覆盖(#128 的因果,照抄不重演)。
|
|
15
19
|
*/
|
|
16
20
|
import { join, resolve } from 'node:path';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
export const
|
|
21
|
-
/**
|
|
22
|
-
export function
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
const p = (n) => String(n).padStart(2, '0');
|
|
27
|
-
return String(now.getFullYear()) + p(now.getMonth() + 1) + p(now.getDate())
|
|
28
|
-
+ '_' + p(now.getHours()) + p(now.getMinutes()) + p(now.getSeconds());
|
|
29
|
-
}
|
|
30
|
-
/** 通式文件名 `〈文件名主体〉_<stamp>[_<n>].html`;主体原样拼入,不做清洗(老 `html_name` 同口径)。 */
|
|
31
|
-
export function buildHelpFileName(stem, date, n) {
|
|
32
|
-
if (typeof stem !== 'string' || stem.length === 0) {
|
|
33
|
-
throw new Error('[skill-schedule] buildHelpFileName stem 须为非空字符串(缺失阻断不返空)。');
|
|
34
|
-
}
|
|
35
|
-
const stamp = formatHelpStamp(date);
|
|
36
|
-
return n === undefined
|
|
37
|
-
? stem + '_' + stamp + HELP_HTML_EXT
|
|
38
|
-
: stem + '_' + stamp + '_' + String(n) + HELP_HTML_EXT;
|
|
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);
|
|
39
29
|
}
|
|
40
|
-
/**
|
|
41
|
-
*
|
|
42
|
-
* `
|
|
43
|
-
|
|
44
|
-
|
|
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());
|
|
45
39
|
}
|
|
46
40
|
//# sourceMappingURL=helpPaths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpPaths.js","sourceRoot":"","sources":["../../src/help/helpPaths.ts"],"names":[],"mappings":"AAAA
|
|
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;
|
|
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"}
|
package/dist/help/lookup.js
CHANGED
|
@@ -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
|
-
|
|
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);
|
package/dist/help/lookup.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/help/output.d.ts
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
/** 交付结果(`file` 态唯一;`path` 必为绝对路径;形状=票面第 2 条的顶层 `delivery{mode,path,bytes}`)。 */
|
|
6
|
-
export interface HtmlDelivery {
|
|
7
|
-
readonly mode: 'file';
|
|
8
|
-
readonly path: string;
|
|
9
|
-
readonly bytes: number;
|
|
10
|
-
}
|
|
1
|
+
import { type HtmlReceipt } from 'base-paint/save-html';
|
|
2
|
+
/** 交付结果(`file` 态唯一;`path` 必为绝对路径;形状=票面第 2 条的顶层 `delivery{mode,path,bytes}`)。
|
|
3
|
+
* #245 起=共用件回执的形状,别名指向它,不另立第二份定义。 */
|
|
4
|
+
export type HtmlDelivery = HtmlReceipt;
|
|
11
5
|
/** 交付一次 HTML 产物(**唯一落盘点**):
|
|
12
|
-
* - `explicit`(`--html <路径>`,用户逐字指定)→
|
|
13
|
-
*
|
|
6
|
+
* - `explicit`(`--html <路径>`,用户逐字指定)→ **覆盖写**,语义与该参数既有口径一致(票面第 3 条);
|
|
7
|
+
* **不吃复用窗口**(逐字落点=说哪落哪);
|
|
8
|
+
* - `targetDir`(`helpPaths.resolveHelpDir` 算出的**落点目录**;相对路径也收,写前归一为绝对)+
|
|
9
|
+
* `stem`(文件名主体,`HELP_FILE_STEM`)→ **独占创建 + 递补**(#128);
|
|
10
|
+
* 带 `reuseMs`(>0)时改为**窗口内复用**(#245):已有那份不超龄就返回它、不新建;
|
|
14
11
|
* - 两者都给时 `explicit` 优先(用户指定胜过默认落点;**逐字覆盖写,不带时间戳、不递补**)。
|
|
15
|
-
*
|
|
12
|
+
* ⚠️ **时间戳只在共用件里算一次**:调用方给的是「目录 + 主体」,**不**把「带戳的初候选路径」传进来
|
|
13
|
+
* ——那样共用件会用「带戳的名字」当主体再拼一次时间戳(实测会落出
|
|
14
|
+
* `作息管家_HELP_<stamp>_<stamp>.html`,本项目已踩过一次)。失败抛错给调用方走 exit 5。 */
|
|
16
15
|
export declare function deliverHtml(input: {
|
|
17
16
|
explicit?: string;
|
|
18
|
-
|
|
17
|
+
targetDir?: string;
|
|
18
|
+
stem?: string;
|
|
19
19
|
html: string;
|
|
20
|
+
reuseMs?: number;
|
|
20
21
|
}): HtmlDelivery;
|
|
21
22
|
//# sourceMappingURL=output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/help/output.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/help/output.js
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
|
-
/** #203 · HELP
|
|
1
|
+
/** #203 · HELP 产物的**唯一落盘点**(绝对路径回执;#245 起改用共用件 `saveHtmlFile`)。
|
|
2
2
|
*
|
|
3
3
|
* 归属=结构裁定 `docs/skills/skill-schedule/t199-structure-verdict.md` §「消费共享 help 模板的技术路线」
|
|
4
|
-
* 第 4 条:照 bill 的 `src/output.ts`
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 第 4 条:照 bill 的 `src/output.ts` 自持一份最小管线,只抄**需要的那一小块**。那一小块(命名通式 +
|
|
5
|
+
* 独占创建 + `EEXIST` 递补)**#237 起已收进共用件** `base-paint/save-html` 的 `saveHtmlFile`
|
|
6
|
+
* (记账/卡路里/大厨三家同期改走它;备忘录侧走 `#240`)——本件若继续自持,就是**第 5 份同逻辑实现**,
|
|
7
|
+
* 正是仓规铁律二禁止的「同一件事两份实现」。故本件只给**落点意图**(目录 + 文件名主体),命名与落盘全交共用件。
|
|
7
8
|
*
|
|
8
9
|
* #128 的因果(照抄注释,别重演):默认落点曾是「`readdirSync` 计数选名 → `writeFileSync`(`w` 覆盖)」
|
|
9
10
|
* 两步,两步之间无独占性;多进程并发同秒都选同一路径 → 后写覆盖先写,用户按回执路径可能打开
|
|
10
|
-
*
|
|
11
|
-
* -
|
|
11
|
+
* 另一次调用的产物。修法(现住共用件):`flag:'wx'` 独占创建,`EEXIST` 时递增 `_N` 重试(原子,无需锁)。
|
|
12
|
+
* - 串行语义不变:交付仍是「通式名 + 首试即中」⇒ 文件名与老版逐字一致;
|
|
12
13
|
* - 并发下由文件系统仲裁:败者 `EEXIST` → `_N+1` 重试,保证每个回执路径的内容就是本次产物;
|
|
13
14
|
* - 大小写不敏感(Windows `normcase`)由 `wx` 天然覆盖:`.HTML` 占位同样 `EEXIST`;
|
|
14
15
|
* - **仅** `EEXIST` 重试,其余错误原样抛出(不把权限/路径错伪装成「换个名再写一次」)。
|
|
15
16
|
*
|
|
16
17
|
* #83 返修 R-1 的教训(同抄):回执路径必须 `resolve()` 归一为**绝对路径**——`SKILLS_DB_PATH`
|
|
17
18
|
* 本身可以是相对路径,产物已写盘却把相对串回传给调用方,下游按它打开就会找不到(或找到别处的同名文件)。
|
|
19
|
+
* 共用件回执的 `path` 恒为绝对路径,这条由它保证(本件不再自己 `resolve`)。
|
|
20
|
+
*
|
|
21
|
+
* #245 · 复用窗口(`reuseMs`):**给了就「窗口内已有同一主体的一份 ⇒ 返回它、不新建」**——这是
|
|
22
|
+
* 「24 小时内只产出 1 个」那条口径的落点。判据在共用件里按**落盘名里的时间戳**算(不看 mtime:
|
|
23
|
+
* mtime 会被复制/同步/touch 改掉),超龄那份不算命中 ⇒ 与未命中同路落一份新的(旧的留着当留档)。
|
|
24
|
+
* 只对 `target` 那支生效:`explicit`(`--html <路径>`)是用户逐字指定的落点,共用件本身也不许
|
|
25
|
+
* `file` + `reuse` 同给(`EINVAL`)。
|
|
18
26
|
*
|
|
19
27
|
* 写失败**不静默降级**(本票面第 3 条):照本包 `src/render/errors.ts` 的既有形状抛
|
|
20
28
|
* `ScheduleRenderError`(`code` 取该类型已有的 `'SCHEDULE_HTML_TOO_LARGE'`=「体积/落盘门」那一条,
|
|
21
29
|
* 不新增错误类、不改既有导出面),由出口 `cmd_read.ts` 走 exit 5 + stderr 回执。
|
|
22
30
|
*/
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
31
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
32
|
+
import { saveHtmlFile } from 'base-paint/save-html';
|
|
25
33
|
import { ScheduleRenderError } from '../render/errors.js';
|
|
26
34
|
/** 落盘失败一律抛本包渲染层错误(`cause` 保留原始系统错,信息不丢)。 */
|
|
27
35
|
function writeFailed(path, e) {
|
|
@@ -31,62 +39,41 @@ function writeFailed(path, e) {
|
|
|
31
39
|
const detail = e?.message ?? String(e);
|
|
32
40
|
throw new ScheduleRenderError('SCHEDULE_HTML_TOO_LARGE', '[skill-schedule] HELP 落盘失败:' + path + '(' + (code ? code + ':' : '') + detail + ')');
|
|
33
41
|
}
|
|
34
|
-
/** 下一独占候选(可单测):`〈stem〉_<YYYYMMDD_HHMMSS>[_N].html` 的 `_N` 递增;无 `_N` 则 `_2`。 */
|
|
35
|
-
export function nextExclusiveCandidate(currentAbs) {
|
|
36
|
-
const dir = dirname(currentAbs);
|
|
37
|
-
const base = currentAbs.slice(dir.length + 1);
|
|
38
|
-
const m = base.match(/^(.*_\d{8}_\d{6})(?:_(\d+))?(\.html)$/i);
|
|
39
|
-
if (m) {
|
|
40
|
-
const prefix = m[1];
|
|
41
|
-
const n = m[2] !== undefined ? Number.parseInt(m[2], 10) : 1;
|
|
42
|
-
return join(dir, prefix + '_' + String(n + 1) + m[3]);
|
|
43
|
-
}
|
|
44
|
-
const dot = base.lastIndexOf('.');
|
|
45
|
-
const stem = dot >= 0 ? base.slice(0, dot) : base;
|
|
46
|
-
return join(dir, stem + '_2' + (dot >= 0 ? base.slice(dot) : ''));
|
|
47
|
-
}
|
|
48
|
-
/** 独占写 + 递补(可单测):`wx` 首试,`EEXIST` 则 `_N+1` 重试;目录不存在递归创建。 */
|
|
49
|
-
export function writeExclusiveWithRetry(initialAbs, html) {
|
|
50
|
-
let candidate = initialAbs;
|
|
51
|
-
for (let i = 0; i < 1000; i++) {
|
|
52
|
-
try {
|
|
53
|
-
mkdirSync(dirname(candidate), { recursive: true });
|
|
54
|
-
writeFileSync(candidate, html, { flag: 'wx', encoding: 'utf8' });
|
|
55
|
-
return candidate;
|
|
56
|
-
}
|
|
57
|
-
catch (e) {
|
|
58
|
-
if (e?.code === 'EEXIST') {
|
|
59
|
-
candidate = nextExclusiveCandidate(candidate);
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
writeFailed(candidate, e);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/* istanbul ignore next — 1000 次独占重试全撞名:真故障,不静默失败。 */
|
|
66
|
-
throw new ScheduleRenderError('SCHEDULE_HTML_TOO_LARGE', '[skill-schedule] HELP 落点独占创建重试超限:' + initialAbs);
|
|
67
|
-
}
|
|
68
42
|
/** 交付一次 HTML 产物(**唯一落盘点**):
|
|
69
|
-
* - `explicit`(`--html <路径>`,用户逐字指定)→
|
|
70
|
-
*
|
|
43
|
+
* - `explicit`(`--html <路径>`,用户逐字指定)→ **覆盖写**,语义与该参数既有口径一致(票面第 3 条);
|
|
44
|
+
* **不吃复用窗口**(逐字落点=说哪落哪);
|
|
45
|
+
* - `targetDir`(`helpPaths.resolveHelpDir` 算出的**落点目录**;相对路径也收,写前归一为绝对)+
|
|
46
|
+
* `stem`(文件名主体,`HELP_FILE_STEM`)→ **独占创建 + 递补**(#128);
|
|
47
|
+
* 带 `reuseMs`(>0)时改为**窗口内复用**(#245):已有那份不超龄就返回它、不新建;
|
|
71
48
|
* - 两者都给时 `explicit` 优先(用户指定胜过默认落点;**逐字覆盖写,不带时间戳、不递补**)。
|
|
72
|
-
*
|
|
49
|
+
* ⚠️ **时间戳只在共用件里算一次**:调用方给的是「目录 + 主体」,**不**把「带戳的初候选路径」传进来
|
|
50
|
+
* ——那样共用件会用「带戳的名字」当主体再拼一次时间戳(实测会落出
|
|
51
|
+
* `作息管家_HELP_<stamp>_<stamp>.html`,本项目已踩过一次)。失败抛错给调用方走 exit 5。 */
|
|
73
52
|
export function deliverHtml(input) {
|
|
74
|
-
const bytes = Buffer.byteLength(input.html, 'utf8');
|
|
75
53
|
if (input.explicit !== undefined && input.explicit.length > 0) {
|
|
76
54
|
const written = resolve(input.explicit);
|
|
77
55
|
try {
|
|
78
|
-
|
|
79
|
-
|
|
56
|
+
return saveHtmlFile({
|
|
57
|
+
dir: dirname(written), file: basename(written), html: input.html, onExists: 'overwrite',
|
|
58
|
+
});
|
|
80
59
|
}
|
|
81
60
|
catch (e) {
|
|
82
61
|
writeFailed(written, e);
|
|
83
62
|
}
|
|
84
|
-
return { mode: 'file', path: written, bytes };
|
|
85
63
|
}
|
|
86
|
-
if (input.
|
|
87
|
-
throw new ScheduleRenderError('SCHEDULE_HTML_TOO_LARGE', '[skill-schedule] deliverHtml 缺落点(`explicit`
|
|
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);
|
|
88
77
|
}
|
|
89
|
-
const finalPath = writeExclusiveWithRetry(resolve(input.target), input.html);
|
|
90
|
-
return { mode: 'file', path: finalPath, bytes };
|
|
91
78
|
}
|
|
92
79
|
//# sourceMappingURL=output.js.map
|
package/dist/help/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/help/output.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
|
@@ -24,13 +24,12 @@
|
|
|
24
24
|
* 里面没有类型位,旧实物 HELP 也没有类型徽章——凭空补一个空 `types` 等于自造内容,故不落该字段;
|
|
25
25
|
* 将来源数据真出现类型位,生成器会因字段闭集断言失败而报错(不会静默丢掉)。要变体徽章另开票。
|
|
26
26
|
*
|
|
27
|
-
*
|
|
28
|
-
* `
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* `
|
|
33
|
-
* 在那之前不得当作已交付的可见内容。
|
|
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` 载荷里都取不到这两个键。
|
|
34
33
|
* 为什么不塞进载荷:校验器按 `additionalProperties:false` 直接拒收多余键
|
|
35
34
|
* (`packages/base-render/src/help.ts` 的字段闭集判定);并进 `editable_fields[].hint` 会让
|
|
36
35
|
* 「可编辑参数」这个位变浑浊,且没有维度的场景(`first_use`)无处可放。
|
|
@@ -81,11 +80,12 @@ export interface HelpGroupAsset {
|
|
|
81
80
|
export declare const HELP_GROUPS: readonly HelpGroupAsset[];
|
|
82
81
|
/** 扁平 85 条(顺序与 HELP 分组一致;单源派生,不重复落词)。 */
|
|
83
82
|
export declare const HELP_ASSETS: readonly HelpSceneAsset[];
|
|
84
|
-
/** 源场景 `result` 原文(85/85,键=场景 id)。契约里没有这个位,故不进
|
|
85
|
-
*
|
|
83
|
+
/** 源场景 `result` 原文(85/85,键=场景 id)。契约里没有这个位,故不进
|
|
84
|
+
* `HELP_GROUPS`(`HELP_GROUPS` 只装纯场景数据);本表是源数据镜像,**当前 HELP 页不渲染**
|
|
85
|
+
* —— 页面上的「预期 ·」一律不出现(见文件头「页面外的两张源数据镜像」)。 */
|
|
86
86
|
export declare const HELP_SCENE_RESULTS: Readonly<Record<string, string>>;
|
|
87
87
|
/** 源一级分组 `desc` 原文(5/5,键=分组 id)。同上:契约里没有这个位,
|
|
88
|
-
*
|
|
88
|
+
* 不进 `HELP_GROUPS`;本表是源数据镜像,**当前 HELP 页不渲染**(见文件头「页面外的两张源数据镜像」)。 */
|
|
89
89
|
export declare const HELP_GROUP_NOTES: Readonly<Record<string, string>>;
|
|
90
90
|
/** 计数(全部由数据算出;改资产即跟变,内容另由测试里的摘要锁钉住)。 */
|
|
91
91
|
export declare const HELP_TOTALS: Readonly<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help-assets.d.ts","sourceRoot":"","sources":["../../../src/help/scenes/help-assets.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|