dsh-metaphysics 0.13.6 → 0.14.3
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/CHANGELOG.md +83 -0
- package/README.md +31 -7
- package/client.js +3519 -2106
- package/engine/bazi.js +52 -13
- package/engine/calendar.js +88 -16
- package/engine/daliuren.js +36 -1
- package/engine/geo.js +28 -11
- package/engine/hepan.js +144 -0
- package/engine/index.js +263 -39
- package/engine/interpret.js +336 -10
- package/engine/liuyao.js +12 -1
- package/engine/lunar.js +46 -12
- package/engine/meihua.js +2 -2
- package/engine/qimen-interpret.js +176 -0
- package/engine/qimen.js +440 -0
- package/engine/random.js +33 -0
- package/engine/tarot.js +5 -4
- package/engine/vsop-earth.js +40 -0
- package/engine/ziwei-hepan.js +120 -0
- package/engine/ziwei.js +2 -2
- package/index.js +109 -25
- package/locale/en.json +1 -1
- package/locale/zh.json +2 -2
- package/package.json +13 -9
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,89 @@
|
|
|
2
2
|
|
|
3
3
|
版本按「一组可感知的改动」发,README 与市场条目描述随能力同步。
|
|
4
4
|
|
|
5
|
+
## 0.14.3(未发布)
|
|
6
|
+
|
|
7
|
+
- **经典通例对拍**:新增 `test/fixtures/classics.json` 与 `test/classics.test.mjs`,把典籍里的规则表当作期望值来验实现——
|
|
8
|
+
- 六爻:京房八宫卦序的宫属与世应(八纯上爻、一至五世依次、游魂四爻、归魂三爻),64 卦全表
|
|
9
|
+
- 六壬:日干寄宫(甲寅乙辰丙戊巳丁己未庚申辛戌壬亥癸丑)、中气换将(雨水登明亥将起,12 个中气抽样)
|
|
10
|
+
- 紫微:纳音定五行局、紫微天府以寅申为轴相照
|
|
11
|
+
- 出处与录入方式写在 fixture 的 `meta.sources`,由 `tools/gen-classics-fixture.mjs` 生成,不从引擎输出反推
|
|
12
|
+
- 说明:录入的是**通例表**(规则级),不是某本书的例课原文;例课需要可引用的原文,见 README「对拍」
|
|
13
|
+
- **卦象/牌阵类也给出「依据」**:六爻列本卦/变卦、世应爻位与六亲六神、动爻、日辰、卦宫;梅花列本卦/互卦/变卦、体用与生克、动爻;六壬列课体、三传、月将、旬空与青龙/朱雀/六合/天后/白虎/子孙是否出现;塔罗列牌阵与牌位、主轴牌、正逆位计数与元素分布
|
|
14
|
+
- 至此六个有维度的体系(八字/紫微/六爻/梅花/六壬/塔罗)都能核对依据;奇门走分节形态,事实本就写在 section 正文里
|
|
15
|
+
- **《增删卜易》卦例对拍**:从 PDF 电子本(有文字层)录入 9 条原文卦例——「月建 + 日干支 + 本卦 → 变卦」,出处精确到章(元神忌神衰旺章第十、月将章第十六、日辰章第十七、独发章第三十一、星煞章第三十三、用神元神忌神仇神章第九)。引擎须按 64 卦表还原这一对(名字、翻爻、变卦生成)
|
|
16
|
+
- 《卜筮正宗》(复城道长精校)此前是**扫描版 PDF、无文字层**;这次拿到同一版本的 **docx**(有文字层),从中提取 138 条带「占事」的卦例,99 条卦名可唯一解析,收 19 条进 `boshizhengzong`
|
|
17
|
+
- 每条核对:本卦 → 变卦、卦宫(宫 + 五行,与八宫表互证)、有日期的样本还核旬空
|
|
18
|
+
- 书中「空亡」与通用旬空不一致的例子(丙辰日作戌亥,应为子丑)只记卦名卦宫、不断言空亡;1 条卦宫与八宫表冲突(表格串行)不收,原因写在 fixture 的 `meta.sources`
|
|
19
|
+
- 原文用字保留异体(遯/遁、干/乾),动爻**不录**——原书卦象图在 PDF 里被压成一行,位置不可靠,硬录等于造数据
|
|
20
|
+
- **六爻补旬空**:`buildLiuyao` 现在输出 `xunShou`(旬首)与 `xunKong`(旬空两位),文本摘要多一行「旬首:甲午 旬空:辰巳」;六旬表与「丙辰日空子丑」都有断言
|
|
21
|
+
- **双 UI 收口(第一步)**:新增 `src/core.js`,把「爻值解析」「问事体系」「数字输入」三条规则收成单一来源,`app.js` 与 `web-ui.js` 都改为调用 `window.__MPCore`;构建脚本把 core 一并打进 `client.js` 与独立 HTML
|
|
22
|
+
- 单测 `test/core.test.mjs`(21 条)直接加载浏览器文件验证;`ask.test.mjs` 改为检查「单一来源 + 两端委托」
|
|
23
|
+
- 表单编排(参数拼装)仍各留一份,下一步再收
|
|
24
|
+
- **修合盘面板**:合盘的主方性别/出生地被漏在 `bazi|ziwei` 分支之外——0.14.1 起引擎把性别改为必填,面板点「合盘」会直接报 `你(主方)的gender 必须是 male 或 female`,看起来像"合盘不对"。现在三体系共用同一分支,合盘四柱与单盘一致(实测 庚午 辛巳 丁丑 丁未 对 庚午 辛巳 丁丑 丁未)
|
|
25
|
+
- **奇门进面板**:新增「奇门」tab,起局时刻 + **换局规则**(fieldset + legend + `role="radiogroup"` 的原生 radio:拆补 / 超神接气 / 置闰,附 `details` 说明),`juMethod` 透传给引擎;盘面下新增 `qimenFactsHTML`,用 `dl > div > dt/dd` 列出局数、节气、四柱、值符、值使、旬首、空亡、驿马、换局规则、晚子时——事实与解读区的结论分开,全部走 `esc()`
|
|
26
|
+
- 尚未做(下一步):三栏 Grid 布局、`<template>` 渲染、显式状态机(idle/missing_input/…)、960/1200 断点的布局断言
|
|
27
|
+
- **独立页补齐合盘 / 奇门**:`命理排盘.html` 由六个 tab 变八个
|
|
28
|
+
- 合盘:对方出生日期/时刻/性别/出生地 + 「合盘方式」八字/紫微切换;主方同样带性别与真太阳时,四柱与单盘一致
|
|
29
|
+
- 奇门:换局规则用 `fieldset + legend + role="radiogroup"` 的原生 radio(拆补/超神接气/置闰,附 `details`),加「询问方向(定用神)」;结果 = 九宫盘 + `dl` 事实表 + 分节解读;换规则重起局、换方向只重出解读
|
|
30
|
+
- `build-html` 导出 `page()` 且直接运行时才写盘,`test/standalone.test.mjs` 直接对生成源码做结构断言(24 条)
|
|
31
|
+
- **解析深化:把"怎么推出来的"也写出来**
|
|
32
|
+
- 八字 / 紫微新增四段:**看盘顺序**(月令→旺衰→用神→格局→大运→流年/命宫→三方→四化→大限,逐步引用实际值)、**时间窗**(当前与后续大运 + 近五年流年,带档位与理由)、**交叉校验**(喜忌分量对比、大运与流年同向/反向、调候与扶抑是否一致)、**未纳入**(没算什么、哪些流派差异会改变轻重)
|
|
33
|
+
- 六爻 / 六壬补**看卦/看课顺序**(卦宫→世应→动爻→用神→日辰→变卦;月将→四课→三传→课体→神将)与**未纳入**
|
|
34
|
+
- 这些段落全部由盘面数据推出,不新增断语;`test/deep.test.mjs` 41 条断言校验结构、关键步骤与"无占位值"
|
|
35
|
+
- 测试:44 个文件 / 1147 条 PASS
|
|
36
|
+
|
|
37
|
+
## 0.14.2 —— 口径、复现与性能(已发布)
|
|
38
|
+
|
|
39
|
+
- **1929 年前的节气改用当时的地方时**:`termInstantJd` 与农历共用同一套换算(1929-01-01 前为北京地方平时 UTC+7.7611,之后东八区),并顺手修正切点常量的半天偏移。此前农历切换、节气一律 +8,1929 年前出生者在交节前后约 14 分钟内可能月柱整柱错位
|
|
40
|
+
- **晚子时口径统一**:`lateZi`(八字/六壬)与 `lateZiHourMode`(奇门)互为别名,一个概念不再有两个参数名;四套体系的摘要都会写明实际采用的口径(换日 / 不换日)。默认值保持原样(八字/六壬换日、奇门不换日),不偷偷改盘
|
|
41
|
+
- **无经度必须告警**:没给出生地/经度时,八字与紫微摘要首行出现 ⚠(此前只在一行括号里提一句,海外出生很容易被忽略)
|
|
42
|
+
- **可复现**:塔罗/六爻新增 `seed`(同 seed 同结果,可回放、可对拍);塔罗 `castAt` 由 `asOf` 决定;八字流年可用 `asOf` 钉死基准年(此前锚在"当前年份",隔年重算结论就变了);六爻的日辰(六神起法)也可用 `asOf` 固定,不再随本机日期漂移
|
|
43
|
+
- **默认离线**:工具新增 `geocode: 'offline' | 'online'`,默认 `offline`——内置坐标表已到地级市,足够真太阳时;只有显式开启才会把出生地原文发给 Nominatim。地址解析加 6 小时缓存,UA 补上版本与仓库地址
|
|
44
|
+
- **性能**:`termInstantJd` / `termWindow` 按年缓存(农历换算一次要问几百次中气,而 VSOP87 是全引擎最贵的一段)
|
|
45
|
+
- 紫微盘 10.9ms → **0.5ms**,奇门 8.1ms → **0.07ms**,八字 2.4ms → **0.4ms**
|
|
46
|
+
- 全量回归 15.8s → **3.3s**
|
|
47
|
+
- **无障碍**:结果区补 `role="region"` + `aria-live="polite"`,错误提示 `role="alert"`,通知 `role="status"`
|
|
48
|
+
- **工具层**:`geocode` / `seed` 进 schema,`asOf` 说明覆盖紫微/八字/塔罗三个体系;非法 `geocode` 值报 `E_INPUT`
|
|
49
|
+
- **CI**:新增 `tools/check-html-sinks.mjs`(innerHTML 拼接必须经过白名单转义函数)与 `tools/check-patterns.mjs`(engine 纯净性、日志、`var`、`debugger`、`new Date()`/`Math.random` 白名单),正/负向都验证过
|
|
50
|
+
- **稳定性扫射**:`test/fuzz.test.mjs` —— 用固定种子随机 12 组生日跑遍八个体系,覆盖参数矩阵、边界日期(1600/2400/闰年/1929 切换点)、解析层与"同参数两次结果字节一致"
|
|
51
|
+
- **自刑补齐**:辰午酉亥两柱同见判「自刑」,大运/流年支与原局同支也按自刑处理。此前 `buildRelations` 遇到同支直接跳过,四柱里 3 个辰也不会报刑
|
|
52
|
+
- **权重口径显式化**:五行占比(1/0.5/0.3)与日主通根(1.2/0.6/0.3)各自命名并注明用途——数值未变,只是不再像"同一件事写了两份"
|
|
53
|
+
- **解析加「依据」**:八字与紫微的五个维度各附一行盘面事实(日主旺衰、月令、喜忌、大运流年、宫位主星、煞星),面板渲染 `mp-it-dev`、文本渲染「 依据:…」;卦象类的依据行在 0.14.3 补齐
|
|
54
|
+
- **解析失败不再变空壳**:builder 抛错时面板显示「⚠ 解析生成失败」并把原因转义后带出,文本摘要同样标出;此前只返回一个空 dimensions 的对象,用户看到的是"没有解析"
|
|
55
|
+
- **结构不变量**:`test/invariants.test.mjs` —— 不依赖外部样盘,用"盘面自身必须成立"的性质守算法:紫微 12 宫支互异/大限连续覆盖、奇门八门八神各一次、六十四卦一一对应、四柱纳音与世应合法。金标准只能覆盖少量样盘,不变量对每张盘都成立
|
|
56
|
+
- 测试:39 个文件 / 1011 条 PASS(新增 historical-tz、repro、caliber、tool-geo、fuzz、relations、evidence、invariants 八组)
|
|
57
|
+
|
|
58
|
+
## 0.14.1 —— 先让「通过」可信
|
|
59
|
+
|
|
60
|
+
这一版不加新体系,只补三件会静默出错的地基:测试的失败信号、渲染层的转义、入参的拒绝。
|
|
61
|
+
|
|
62
|
+
- **测试不再假绿**:`test/_harness.mjs` 统一断言,任何一条 FAIL 都让进程非零退出。此前 bazi / calendar / liuyao / lunar / shensha / tarot / ziwei / e2e / layout 九个文件只 `console.log`,断言写错也 exit 0,`npm test` 恒报 27/27
|
|
63
|
+
- `tools/check-assertions.mjs`:每个文件的 PASS 条数锁进 `test/assertion-baseline.json`,删断言即失败(`npm run test:baseline` 显式重建)
|
|
64
|
+
- `tools/verify-tests-can-fail.mjs`:故意写错一条断言,必须变红——保护「测试本身」
|
|
65
|
+
- **两处 XSS**:塔罗面板的「所问」与解读段落回显(`src/panel-kit.js`)、独立页错误提示(`src/web-ui.js`)此前把用户原文拼进 `innerHTML`;现改为 `esc()` 与 `textContent`,并加 `test/security.test.mjs` 回归
|
|
66
|
+
- **入参校验与错误码**:`compute()` 新增 `E_INPUT / E_RANGE / E_LINES / E_COUNT / E_ASOF / E_PARTNER / E_SYSTEM`
|
|
67
|
+
- 日期按月份天数与闰年校验(`1990-02-30`、`2026-04-31` 不再静默滚到下个月)
|
|
68
|
+
- `bazi / ziwei / hepan` 的 gender 改为必填(缺省按男命排会让大运/大限方向整个反掉)
|
|
69
|
+
- 六爻爻数 ≠ 6 时报错(不再悄悄换成随机卦);塔罗张数非 1/3/5 时报错;`asOf` 非法时报错(不再静默用「此刻」)
|
|
70
|
+
- 工具层 `execute()` 统一包上 `[错误码]` 前缀,内部异常不再以堆栈式文案直出
|
|
71
|
+
- **合盘口径与单盘对齐**:合盘现在把 `address / longitude / trueSolar / lateZi` 分别透传给双方(工具层也会为 `partner.address` 解析经度)。此前合盘完全忽略地址,同一次出生在单盘是 丁丑 日、在合盘里却是 戊寅 日
|
|
72
|
+
- 新增 `test/hepan.test.mjs`:断言「合盘里的你 == 单盘的你」,八字与紫微两条链路都覆盖
|
|
73
|
+
- **解析文案修复**:`命局身身强`(level 已含「身」)、`调候上还初夏`(硬拼连接词)、同一段两次「调候上…」、大运与流年档位并成一句导致建议前后矛盾
|
|
74
|
+
- 新增 `test/interpret-copy.test.mjs`:对 8 个体系的实际输出做病句/重复/未定义值扫描
|
|
75
|
+
- 测试新增 `test/args.test.mjs`(40 条)、`test/security.test.mjs`(10 条)、`test/hepan.test.mjs`(7 条)、`test/interpret-copy.test.mjs`(63 条),全量 31 个文件 893 条 PASS
|
|
76
|
+
- CI 增加「断言数不低于基线」与「测试自检」两步
|
|
77
|
+
|
|
78
|
+
## 0.14.0 —— 奇门、合盘与节气精度(此前只存在于工作树,本版一并落库)
|
|
79
|
+
|
|
80
|
+
- 新增**奇门遁甲**(时家转盘:拆补 / 超神接气 / 置闰三派取局、值符值使、九宫、空亡驿马)与对应解读
|
|
81
|
+
- 新增**合盘**:八字合盘(日主关系 / 夫妻宫 / 五行互补)与紫微合盘(命宫、夫妻宫、五行局)
|
|
82
|
+
- 节气计算改用 **VSOP87B 截断级数 + 岁差 + 章动 + 光行差**,与 NAOJ 历要项对拍偏差降到 1 分钟内
|
|
83
|
+
- `parseDateTime` 对 ΔT 覆盖范围(1900–2100)之外的年份给出精度提示,摘要顶部标 ⚠
|
|
84
|
+
- `geocodeAddress` 支持地址更细时联网(Nominatim)兜底,失败退回内置坐标表
|
|
85
|
+
- 六壬补神煞与格局文案;紫微补流月/流日/流时并接入盘面与解读
|
|
86
|
+
- `tools/qimen-divergence.mjs`:枚举三派取局的分裂样本,供排盘差异核对
|
|
87
|
+
|
|
5
88
|
## 0.13.6
|
|
6
89
|
|
|
7
90
|
- 修 `npm run release` 的发布后核对:npm 的发布是异步的(PUT 返回 202,registry 生效实测要 1–4 分钟),脚本原来 30 秒就判定失败
|
package/README.md
CHANGED
|
@@ -68,6 +68,8 @@ Chinese metaphysics for [DeepSeek Harness](https://github.com/deepseek-ai/deepse
|
|
|
68
68
|
|
|
69
69
|
- **结构化输出**:`{ moduleType, system, title, lead, dimensions[], sections[], disclaimer }`;`moduleType` 为 `natal`(命盘)/ `divination`(卦象)/ `card`(牌阵),`dimensions` 固定五个维度
|
|
70
70
|
- **五个维度**:整体运势、工作与职业选择、事业发展、爱情与感情、健康状况——每项给「解读 + 行动建议」
|
|
71
|
+
- **依据可核对**:每个维度都附一行「依据」,列出这条结论引用的事实——命盘类(八字/紫微)给日主旺衰、月令、喜忌、大运流年、宫位主星与煞星;卦象类(六爻/梅花/六壬)给本卦互卦变卦、世应、动爻、三传四课与神将;塔罗给牌阵、主轴、正逆位与元素分布。面板与文本两条输出路径都会显示
|
|
72
|
+
- **推导可复核**:八字/紫微另有「看盘顺序」「时间窗」「交叉校验」「未纳入」四段——先看什么后看什么、未来几步大运与近五年流年、喜忌分量与运年是否同向、以及这套算法**没有**计算什么;六爻/六壬对应给「看卦/看课顺序」与「未纳入」。这些都从盘面数据推出,不新增断语
|
|
71
73
|
- **卦象**(六爻/梅花/大六壬)额外给:卦名与卦辞大意、爻辞与动爻、体用关系、互卦与变卦、落到生活里
|
|
72
74
|
- **塔罗**额外给:整盘连贯解读(把几张牌串成一条线,避免各张互相矛盾)与牌面结构(大阿卡纳占比、元素分布、正逆位)
|
|
73
75
|
- **文案口径**:第二人称、温和、只给倾向与建议,不作绝对判断;底部保留理性参考的免责提示
|
|
@@ -123,7 +125,9 @@ dsh plugin install ./dsh-metaphysics-0.6.0.tgz
|
|
|
123
125
|
|
|
124
126
|
### 面板
|
|
125
127
|
|
|
126
|
-
|
|
128
|
+
重启后侧栏出现**太极图标**,点开是排盘面板:紫微 / 八字 / 六爻 / 梅花 / 六壬 / 奇门 / 合盘 / 塔罗八个 tab。奇门 tab 里「换局规则」可选拆补、超神接气、置闰;盘面下方用键值表列出局数、值符值使、空亡驿马等事实,与解读区的结论分开。
|
|
129
|
+
|
|
130
|
+
> 独立页(`命理排盘.html`)同样是这八个 tab:合盘要填双方出生信息、可选八字/紫微两种合盘;奇门用「换局规则」单选组(拆补/超神接气/置闰)与「询问方向」定用神。两份文件是**各自生成**的:重新构建后要单独同步你在用的那份拷贝(见「开发」里的 `--out`)。
|
|
127
131
|
|
|
128
132
|
### 深色与导出
|
|
129
133
|
|
|
@@ -133,28 +137,47 @@ dsh plugin install ./dsh-metaphysics-0.6.0.tgz
|
|
|
133
137
|
|
|
134
138
|
## 精度与口径
|
|
135
139
|
|
|
136
|
-
- **节气**:
|
|
140
|
+
- **节气**:VSOP87B 截断级数(105 项)+ 岁差 + 章动 + 光行差;与日本国立天文台《暦要項》对拍,2024/2025 共 48 个节气最大偏差 **0.6 分钟**;出生时刻距「节」不足 20 分钟时会提示复核。**1929-01-01 之前按北京地方平时(UTC+7.7611)**推算,之后按东八区——与农历共用同一套换算,避免 14 分钟错位
|
|
137
141
|
- **农历**:定朔(Meeus 第 49 章,误差约 1 分钟)+ 冬至所在月为十一月 + 无中气置闰
|
|
138
|
-
- **真太阳时**:经度差 + 均时差;内置 34 个省会 + 200 个地级市坐标(±0.2°),地址更细时可开「联网精确到区县」(Nominatim
|
|
142
|
+
- **真太阳时**:经度差 + 均时差;内置 34 个省会 + 200 个地级市坐标(±0.2°),地址更细时可开「联网精确到区县」(Nominatim)。**单盘与合盘用的是同一套修正**(合盘双方各按自己出生地算)。只按经度修正,**未含历史时区与夏令时**:海外出生请先把当地钟表时间换算成东八区标准时再输入;没给经度时摘要首行会出 ⚠
|
|
143
|
+
- **晚子时**:八字/大六壬默认 23:00 后换日,奇门默认归当日;`lateZi` 与 `lateZiHourMode` 是同一个开关的两个名字。各体系摘要都会写明本次采用的口径,不改默认值、不偷偷改盘
|
|
144
|
+
- **可复现**:塔罗/六爻给 `seed` 即得同一次抽牌/摇卦;紫微流月流日流时、塔罗的抽牌时刻、八字的流年基准年都可传 `asOf` 钉死
|
|
139
145
|
- **紫微四化**:中州派常用表(庚干作太阳禄、武曲权、太阴科、天同忌)
|
|
140
146
|
- **日主旺衰**:量化算法,非唯一流派
|
|
147
|
+
- **入参**:日期按月份天数与闰年校验(`1990-02-30` 直接报错,不滚到下个月);八字/紫微/合盘的性别必填(性别决定大运大限顺逆,不做默认);六爻爻值必须正好 6 个,留空才随机摇卦。非法入参带错误码返回(`E_INPUT` / `E_LINES` / `E_COUNT` / `E_ASOF` / `E_PARTNER`),不静默改成另一个盘
|
|
148
|
+
- **对拍**:历法对 NAOJ 历要项与 ICU 抽样的农历;流派规则对典籍通例——六爻八宫卦序与世应(京房)、六壬日干寄宫与中气换将(《大六壬指南》)、紫微纳音定五行局与紫微天府相照(《紫微斗数全书》);另有《增删卜易》9 条与《卜筮正宗》19 条原文卦例(本卦→变卦、卦宫、旬空)。期望值在 `test/fixtures/classics.json`,出处见其 `meta.sources`。规则表是**规则级**录入,卦例只取原文能稳定读出的字段;动爻位置不录(PDF/DOCX 的卦象表串行,硬解析等于造数据)
|
|
141
149
|
|
|
142
150
|
## 数据与隐私
|
|
143
151
|
|
|
144
152
|
- 全部计算在本地完成
|
|
145
|
-
-
|
|
146
|
-
-
|
|
153
|
+
- **默认不联网**:地址只查内置坐标表(最细到地级市,足够真太阳时)。只有把 `geocode` 设为 `online`(面板上勾「联网精确到区县」)才会把出生地原文发给 OpenStreetMap Nominatim,用于精确到区县/路名;失败即回退内置表,同一地址 6 小时内不重复请求
|
|
154
|
+
- 不收集、不上传任何其他数据
|
|
147
155
|
|
|
148
156
|
## 开发
|
|
149
157
|
|
|
150
158
|
```bash
|
|
151
159
|
npm run build # 生成 client.js(浏览器端产物)
|
|
152
|
-
npm run build:html # 生成独立的 命理排盘.html
|
|
160
|
+
npm run build:html # 生成独立的 命理排盘.html(可离线双击使用),默认写到工作区根目录
|
|
161
|
+
# 想同时更新别处的拷贝(例如桌面那份):node tools/build-html.mjs --out "C:\Users\<你>\Desktop\命理排盘.html"
|
|
153
162
|
npm test # 顺序跑完 test/ 下全部 *.test.mjs 并汇总
|
|
163
|
+
npm run test:ci # 回归 + 断言基线 + 测试自检 + HTML 注入面 + 工程约定(CI 跑的就是这条)
|
|
164
|
+
npm run test:baseline # 断言数确实要减少时,显式重建基线
|
|
165
|
+
npm run check:html # 单独跑 HTML 注入面扫描
|
|
166
|
+
npm run check:patterns # 单独跑工程约定检查
|
|
154
167
|
npm run release # 测试 → 构建 → 校验产物 → 发 npm(token 从 NPM_TOKEN 读)
|
|
155
168
|
```
|
|
156
169
|
|
|
157
|
-
也可以直接调脚本:`node tools/build-client.mjs`、`node tools/build-html.mjs`、`node tools/test-all.mjs`、`node tools/release.mjs`。
|
|
170
|
+
也可以直接调脚本:`node tools/build-client.mjs`、`node tools/build-html.mjs`、`node tools/test-all.mjs`、`node tools/check-assertions.mjs`、`node tools/verify-tests-can-fail.mjs`、`node tools/check-html-sinks.mjs`、`node tools/check-patterns.mjs`、`node tools/release.mjs`。
|
|
171
|
+
|
|
172
|
+
**测试的四道闸 + 一道稳定性扫射**:
|
|
173
|
+
|
|
174
|
+
1. `test/_harness.mjs`——任何一条 `ok()` 失败都让进程非零退出(此前 9 个文件只打印不失败,全量"全绿"没有意义)
|
|
175
|
+
2. `test/assertion-baseline.json`——每个文件的 PASS 条数低于基线即失败,防止"删断言让测试变绿"
|
|
176
|
+
3. `tools/verify-tests-can-fail.mjs`——故意写错一条断言,必须真的变红,防止第 1 条被改回去
|
|
177
|
+
4. `tools/check-html-sinks.mjs`——`innerHTML` 里拼接的量必须经过白名单转义函数,否则 CI 直接红
|
|
178
|
+
5. `tools/check-patterns.mjs`——engine 不得引用浏览器/Node API 与 `console`,不得用 `var`/`debugger`,`new Date()` 与 `Math.random` 只允许出现在白名单文件
|
|
179
|
+
6. `test/fuzz.test.mjs`——固定种子的随机生日扫射八个体系,覆盖边界日期、参数矩阵与"同参数必得同结果"
|
|
180
|
+
|
|
158
181
|
`client.js` 是构建产物,不要手改;改动记录见 [CHANGELOG.md](CHANGELOG.md)。
|
|
159
182
|
|
|
160
183
|
### 发版
|
|
@@ -195,3 +218,4 @@ NPM_CLI=/path/to/npm-cli.js NPM_TOKEN=... npm run release # 本机没有 npm C
|
|
|
195
218
|
## License
|
|
196
219
|
|
|
197
220
|
MIT
|
|
221
|
+
|