dsh-metaphysics 0.62.3 → 0.62.5

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.
@@ -1,9 +1,11 @@
1
1
  // 《穷通宝鉴》120 格(十天干 × 十二月令)——用神顺序 + 原文摘句
2
2
  // 数据来源:
3
3
  // · 用神顺序:knowyourbazi.com 整理表(每格首选在前;甲木巳午未酉、辛金亥子丑依原文核对)
4
- // · 原文摘句:luckclub.cn《穷通宝鉴》(public domain),取每章首段原文,去掉「徐乐吾曰」评注
4
+ // · 原文摘句:luckclub.cn《穷通宝鉴》(public domain),取每章首段原文,去掉「徐乐吾曰」评注;
5
+ // 底本已入库为 test/fixtures/citation-sources.json,test/citations.test.mjs 逐格核验为页面子串
5
6
  // 口径说明:各版本原文有异文;用神顺序是整理表口径,原文摘句照录供核对;
6
- // qs 是「原文首段依次提到的天干」(去掉日主本身),与表首不同处可对照阅读。
7
+ // qs 是「原文首段依次提到的天干」(去掉日主本身),与表首不同处可对照阅读;
8
+ // cut 标记摘句在 96 字处截断(首段更长),展示时必须写明「下略」,不能让用户当成完整一句。
7
9
  // 本文件由 tools/qiongtong-build.mjs 生成,请勿手改。
8
10
 
9
11
  export const QT_BRANCHES = ["寅","卯","辰","巳","午","未","申","酉","戌","亥","子","丑"];
@@ -239,7 +241,8 @@ export const QT = {
239
241
  "y": "壬癸庚",
240
242
  "q": "四月丙火,建禄于巳,火势炎炎,宜专用壬水,解炎威之力,成既济之功。如无壬水,名孤阳失辅,难透清光,得庚发水源,方为有根之水。壬庚两透,不见戊己出干,号曰湖海汪洋,广映太阳,光辉显著,文明之象。",
241
243
  "ch": 28,
242
- "qs": "壬庚戊己"
244
+ "qs": "壬庚戊己",
245
+ "cut": true
243
246
  },
244
247
  {
245
248
  "b": "午",
@@ -361,7 +364,8 @@ export const QT = {
361
364
  "y": "甲庚丙戊",
362
365
  "q": "七月丁火,退气柔弱,端用甲木,金虽乘旺司权,无伤丁之理,仍取庚劈甲,为引火之物,或借丙暖金晒甲,不虑丙夺丁光,凡两丙夹丁者,夏月忌之,余月不忌,但此格少年困苦刑克中年富贵,必要地支见水制丙,方",
363
366
  "ch": 43,
364
- "qs": "甲庚丙"
367
+ "qs": "甲庚丙",
368
+ "cut": true
365
369
  },
366
370
  {
367
371
  "b": "酉",
@@ -370,6 +374,7 @@ export const QT = {
370
374
  "q": "或八月一派辛金,不见庚金,又无比劫,比弃命从才,富而且贵,虽不科甲,亦有异途,从才者水为妻,不克,有正偏,木为子,不刑。或九月一派戊土,泄丁火之气,不见甲木,为伤官伤尽,非寻常可比,或甲木透出",
371
375
  "ch": 44,
372
376
  "qs": "辛庚甲戊",
377
+ "cut": true,
373
378
  "note": "原文全章未见「丙」,此格按整理表录入,待以善本核对"
374
379
  },
375
380
  {
@@ -378,7 +383,8 @@ export const QT = {
378
383
  "y": "甲庚戊",
379
384
  "q": "或八月一派辛金,不见庚金,又无比劫,比弃命从才,富而且贵,虽不科甲,亦有异途,从才者水为妻,不克,有正偏,木为子,不刑。或九月一派戊土,泄丁火之气,不见甲木,为伤官伤尽,非寻常可比,或甲木透出",
380
385
  "ch": 44,
381
- "qs": "辛庚甲戊"
386
+ "qs": "辛庚甲戊",
387
+ "cut": true
382
388
  },
383
389
  {
384
390
  "b": "亥",
@@ -386,7 +392,8 @@ export const QT = {
386
392
  "y": "甲庚",
387
393
  "q": "三冬丁火微寒,端用庚甲,甲乃庚之良友,凡用甲木,庚不可少,无庚无甲,何能引丁,难云木火通明,冬丁有甲,不怕水多金多,可称上格,甲庚两透,科甲分明,见己则否,己多合甲,则为常人。或一丙夺丁,必赖",
388
394
  "ch": 45,
389
- "qs": "庚甲己丙"
395
+ "qs": "庚甲己丙",
396
+ "cut": true
390
397
  },
391
398
  {
392
399
  "b": "子",
@@ -394,7 +401,8 @@ export const QT = {
394
401
  "y": "甲庚",
395
402
  "q": "或仲冬水多癸旺,金无比印,此作弃命从杀,亦有异途功名,见丁比出干,难合格局,常人,且主骨肉浮云,六亲流水,戊出破癸,颇有兄弟妻儿,此格用戊,火妻土子,用甲,水妻木子。或四柱多丙丁,又用癸制火,",
396
403
  "ch": 46,
397
- "qs": "癸戊甲丙"
404
+ "qs": "癸戊甲丙",
405
+ "cut": true
398
406
  },
399
407
  {
400
408
  "b": "丑",
@@ -402,7 +410,8 @@ export const QT = {
402
410
  "y": "甲庚",
403
411
  "q": "或仲冬水多癸旺,金无比印,此作弃命从杀,亦有异途功名,见丁比出干,难合格局,常人,且主骨肉浮云,六亲流水,戊出破癸,颇有兄弟妻儿,此格用戊,火妻土子,用甲,水妻木子。或四柱多丙丁,又用癸制火,",
404
412
  "ch": 46,
405
- "qs": "癸戊甲丙"
413
+ "qs": "癸戊甲丙",
414
+ "cut": true
406
415
  }
407
416
  ],
408
417
  "戊": [
@@ -510,7 +519,8 @@ export const QT = {
510
519
  "y": "丙庚甲",
511
520
  "q": "正月己土,寒气未退,田园犹冻,丙暖为尊,得丙照暖,万物自生。忌见壬水,盖壬不为丙优,反为己病,何也?壬乃江湖之水,田园浸没,急须修堤岸,田园始得播种,须戊作堤,以保园圃,壬多见戊者,定主清雅富",
512
521
  "ch": 58,
513
- "qs": "丙壬戊"
522
+ "qs": "丙壬戊",
523
+ "cut": true
514
524
  },
515
525
  {
516
526
  "b": "卯",
@@ -714,7 +724,8 @@ export const QT = {
714
724
  "y": "壬甲",
715
725
  "q": "二月辛金,阳和之际,壬水为尊。见戊己为病,得甲制伏,则辛金不致埋没,壬水不致混浊,合此者,必身入玉堂。故二月庚金,有壬甲透者贵显;否则,乡绅。或壬坐亥支,不见土出,可能入芥,家亦小康。得申中之",
716
726
  "ch": 78,
717
- "qs": "壬戊己甲庚"
727
+ "qs": "壬戊己甲庚",
728
+ "cut": true
718
729
  },
719
730
  {
720
731
  "b": "辰",
@@ -943,6 +954,7 @@ export const QT = {
943
954
  "q": "六月癸水,有上下月之分,上半月庚辛无气,下半月庚辛有气。凡六癸日,人多推此月多不验者,何也?俗士不知此理,不知未中有乙,与己同宫,破而不破,故癸水不能从煞,所以专用庚辛。如上半月,金神衰弱,火",
944
955
  "ch": 107,
945
956
  "qs": "庚辛乙己",
957
+ "cut": true,
946
958
  "note": "原文全章未见「壬」,此格按整理表录入,待以善本核对"
947
959
  },
948
960
  {
@@ -983,7 +995,8 @@ export const QT = {
983
995
  "y": "丙辛",
984
996
  "q": "十一月癸水,值冰冻之时,金水无交欢之象,专用丙火解冻,庶不致变雨为雪,结露为霜。又要辛金滋扶,然无丙火,辛亦不妙。凡冬季癸水,有丙透解冻,则金温水暖,两两相生,要不见壬透,自然登科及第,紫诰金",
985
997
  "ch": 112,
986
- "qs": "丙辛壬"
998
+ "qs": "丙辛壬",
999
+ "cut": true
987
1000
  },
988
1001
  {
989
1002
  "b": "丑",
@@ -1011,6 +1024,7 @@ export function qtOf(dayStem, monthBranch) {
1011
1024
  yong,
1012
1025
  primary: yong[0] || null,
1013
1026
  quote: e.q,
1027
+ truncated: !!e.cut,
1014
1028
  quoteStems: [...e.qs],
1015
1029
  chapter: e.ch,
1016
1030
  url: QT_BASE_URL + String(e.ch).padStart(3, '0') + '/',
@@ -0,0 +1,218 @@
1
+ // 八大地支结构(炳祥课堂口径)
2
+ //
3
+ // 定位:只做「静态结构 + 宫位权重」的只读标注,不改旺衰、不改喜忌。
4
+ // 课堂口径来源见 docs/炳祥八字-课程知识内化.md 第 2 节;
5
+ // 这里把「四个地支落在身强阵营还是身弱阵营」按年支定 A 档(年支那一档记 A,另一档记 B),
6
+ // 于是八种排布可以写成 AAAA / ABBB / AAAB / AABA / ABAA / AABB / ABAB / ABBA,
7
+ // 再从「异类那一支的宫位权重」读出静态从格概率:
8
+ // 年支独异 11 分 → 80% 从;时支独异 16 分 → 50-60% 从;
9
+ // 日支独异 27 分 → 20% 从;月支独异 36 分 → 99% 不从。
10
+ //
11
+ // 注意:这是**静态**概率。三合、三会、六合把某一支「合走」之后,阵营可能整体改写,
12
+ // 那时要以合化后的阵营重新排结构;课堂原话也是「静态条件之外,生克合化的演化会更多」。
13
+
14
+ const STEM_ELEMENT = {
15
+ 甲: '木', 乙: '木', 丙: '火', 丁: '火', 戊: '土',
16
+ 己: '土', 庚: '金', 辛: '金', 壬: '水', 癸: '水',
17
+ };
18
+ const GENERATES = { 木: '火', 火: '土', 土: '金', 金: '水', 水: '木' };
19
+
20
+ /** 干支宫位权重:天干合计 10、地支合计 90(日干为参照点,计 0) */
21
+ export const PILLAR_WEIGHT = {
22
+ stem: { year: 2, month: 5, day: 0, hour: 3 },
23
+ branch: { year: 11, month: 36, day: 27, hour: 16 },
24
+ };
25
+
26
+ /** 藏干固定百分比(课堂口径,同一支内合计 100) */
27
+ export const HIDDEN_PCT = {
28
+ 子: { 癸: 100 },
29
+ 丑: { 己: 20, 辛: 40, 癸: 40 },
30
+ 寅: { 甲: 65, 丙: 30, 戊: 5 },
31
+ 卯: { 乙: 100 },
32
+ 辰: { 戊: 45, 乙: 30, 癸: 25 },
33
+ 巳: { 丙: 65, 戊: 20, 庚: 15 },
34
+ 午: { 丁: 90, 己: 10 },
35
+ 未: { 己: 55, 丁: 40, 乙: 5 },
36
+ 申: { 庚: 65, 壬: 30, 戊: 5 },
37
+ 酉: { 辛: 100 },
38
+ 戌: { 戊: 55, 辛: 25, 丁: 20 },
39
+ 亥: { 壬: 70, 甲: 30 },
40
+ };
41
+
42
+ // 得地 / 半得地 / 不得地。数值只作标签与说明,不参与旺衰打分。
43
+ // 半得地一律不计入身强阵营(课堂:土日主见辰「不能当得地看」;戌对火日主须午戌合/寅午戌才得地)。
44
+ const SUPPORT = {
45
+ 木: { 得地: '亥子寅卯', 半: { 辰: 0.5, 未: 0.2 } },
46
+ 火: { 得地: '寅卯巳午未', 半: { 戌: 0 } },
47
+ 土: { 得地: '巳午未戌', 半: { 寅: 0.2, 辰: 0.5 } },
48
+ 金: { 得地: '丑酉申戌辰', 半: { 未: 0.1, 巳: 0.1 } },
49
+ 水: { 得地: '申亥子丑', 半: { 辰: 0.5 } },
50
+ };
51
+
52
+ const PILLARS = ['year', 'month', 'day', 'hour'];
53
+ const LABEL = { year: '年', month: '月', day: '日', hour: '时' };
54
+
55
+ /** 静态从格概率(%)。null 表示课堂只说「有可能」,未给数字。 */
56
+ const CONG_PROB = {
57
+ AAAA: { prob: 99, range: '≈99%', word: '四支同党,基本为真从' },
58
+ ABBB: { prob: 80, range: '≈80%', word: '年支独异,极易从' },
59
+ AAAB: { prob: 55, range: '50-60%', word: '时支独异,从与不从各半' },
60
+ AABA: { prob: 20, range: '≈20%', word: '日支独异,不易从' },
61
+ ABAA: { prob: 1, range: '≈1%', word: '月支独异,几乎不从' },
62
+ AABB: { prob: 0, range: '0%', word: '二对二最平衡,无从格' },
63
+ ABAB: { prob: 0, range: '0%', word: '二对二,无从格' },
64
+ ABBA: { prob: null, range: '原文未给', word: '二对二,原文只说「有可能从格」' },
65
+ };
66
+
67
+ /** 日主在某一支的得地程度 */
68
+ export function supportOf(dayStem, branch) {
69
+ const el = STEM_ELEMENT[dayStem];
70
+ const table = SUPPORT[el];
71
+ if (!table) return { level: '不得地', weight: 0 };
72
+ if (table.得地.includes(branch)) return { level: '得地', weight: 1 };
73
+ const half = table.半[branch];
74
+ if (half !== undefined) return { level: '半得地', weight: half };
75
+ return { level: '不得地', weight: 0 };
76
+ }
77
+
78
+ /** 天干属于身强阵营(印比)还是身弱阵营(食伤财官杀) */
79
+ function stemCamp(dayStem, stem) {
80
+ const me = STEM_ELEMENT[dayStem];
81
+ const el = STEM_ELEMENT[stem];
82
+ if (!me || !el) return 'B';
83
+ return el === me || GENERATES[el] === me ? 'A' : 'B';
84
+ }
85
+
86
+ /**
87
+ * 八大地支结构。
88
+ * @param {object} pillars 四柱(时柱可为 null)
89
+ * @param {string} dayStem 日干
90
+ */
91
+ export function branchStructureOf(pillars, dayStem) {
92
+ const keys = PILLARS.filter((k) => pillars[k] && pillars[k].branch);
93
+ if (!keys.length) return null;
94
+
95
+ const yearCamp = branchCamp(pillars.year.branch, dayStem);
96
+ const branches = keys.map((k) => {
97
+ const branch = pillars[k].branch;
98
+ const sup = supportOf(dayStem, branch);
99
+ const camp = sup.weight >= 1 ? 'A' : 'B';
100
+ return {
101
+ key: k,
102
+ label: LABEL[k],
103
+ branch,
104
+ camp: camp === yearCamp ? 'A' : 'B',
105
+ support: sup.level,
106
+ supportWeight: sup.weight,
107
+ weight: PILLAR_WEIGHT.branch[k],
108
+ };
109
+ });
110
+
111
+ // 年支那一档记 A;四支不足时(无时辰)只报实际存在的三支,code 相应变短
112
+ const code = branches.map((b) => b.camp).join('');
113
+ const prob = CONG_PROB[code] || null;
114
+
115
+ const aCamp = supportOf(dayStem, pillars.year.branch).weight >= 1 ? '身强阵营' : '身弱阵营';
116
+ const bCamp = aCamp === '身强阵营' ? '身弱阵营' : '身强阵营';
117
+
118
+ const sum = (camp, field) => branches.filter((b) => b.camp === camp).reduce((n, b) => n + b[field], 0);
119
+ const branchBal = { A: sum('A', 'weight'), B: sum('B', 'weight') };
120
+ const branchStrong = aCamp === '身强阵营' ? branchBal.A : branchBal.B;
121
+ const branchWeak = aCamp === '身强阵营' ? branchBal.B : branchBal.A;
122
+
123
+ const stemKeys = ['year', 'month', 'hour'].filter((k) => pillars[k] && pillars[k].stem);
124
+ const stemBal = { A: 0, B: 0 };
125
+ for (const k of stemKeys) stemBal[stemCamp(dayStem, pillars[k].stem)] += PILLAR_WEIGHT.stem[k];
126
+
127
+ const weakDays = branches.filter((b) => b.support !== '得地');
128
+ const aCount = branches.filter((b) => b.camp === 'A').length;
129
+ const bCount = branches.length - aCount;
130
+ // 异类=人数少的那一档;二对二没有异类
131
+ const minority = aCount === 0 || bCount === 0 ? null : aCount < bCount ? 'A' : bCount < aCount ? 'B' : null;
132
+ const odd = minority ? branches.filter((b) => b.camp === minority) : [];
133
+
134
+ const balance = {
135
+ aCamp,
136
+ branch: branchBal,
137
+ stem: stemBal,
138
+ total: { A: branchBal.A + stemBal.A, B: branchBal.B + stemBal.B },
139
+ };
140
+
141
+ const shapeText = !minority
142
+ ? (aCount === branches.length || bCount === branches.length
143
+ ? `四支同党(均属${aCamp})`
144
+ : `二对二:${branches.filter((b) => b.camp === 'A').map((b) => b.label).join('、')}支属${aCamp},`
145
+ + `${branches.filter((b) => b.camp === 'B').map((b) => b.label).join('、')}支属${bCamp}`)
146
+ : `异类为${odd.map((b) => `${b.label}支(${b.weight} 分)`).join('、')}`;
147
+
148
+ const detail = [
149
+ `四支${code}(${branches.map((b) => `${b.label}支${b.branch}${b.support}`).join('、')})`,
150
+ shapeText,
151
+ `地支 身强${branchStrong} : 身弱${branchWeak},加天干 ${balance.total[aCamp === '身强阵营' ? 'A' : 'B']}:${balance.total[aCamp === '身强阵营' ? 'B' : 'A']}`,
152
+ ];
153
+
154
+ // 没有时柱时概率表不适用:AAAA 之类需要四支齐全才成立
155
+ const complete = branches.length === 4;
156
+
157
+ return {
158
+ code,
159
+ complete,
160
+ aCamp,
161
+ congProb: complete && prob ? prob.prob : null,
162
+ congRange: complete && prob ? prob.range : '三柱不判结构概率',
163
+ word: complete && prob ? prob.word : '时柱暂缺,只列三支结构,不套从格概率',
164
+ branches,
165
+ balance,
166
+ odd: odd.map((b) => ({ key: b.key, label: b.label, branch: b.branch, weight: b.weight })),
167
+ halfSupported: weakDays.filter((b) => b.support === '半得地').map((b) => `${b.label}支${b.branch}`),
168
+ detail: detail.join(';'),
169
+ method: '按年支定 A 档,四支分两营;异类支的宫位权重决定静态从格概率(炳祥课堂口径,非唯一流派)',
170
+ note: '静态结构。三合/三会/六合把某一支合走时,应以合化后的阵营重排;概率只作提示,不直接断从格。',
171
+ };
172
+ }
173
+
174
+ function branchCamp(branch, dayStem) {
175
+ return supportOf(dayStem, branch).weight >= 1 ? 'A' : 'B';
176
+ }
177
+
178
+ /**
179
+ * 宫位权重的百分比视图(炳祥课程第 2.1 节)。
180
+ *
181
+ * 天干合计 10(年 2 / 月 5 / 日 0 / 时 3),地支合计 90(年 11 / 月 36 / 日 27 / 时 16),
182
+ * 两表相加正好 100,所以「按柱合计」本身就是百分比:年 13%、月 41%、日 27%、时 19%。
183
+ * 这里只做展示层换算,不改 bazi.js 的旺衰评分,也不参与取格与喜忌。
184
+ *
185
+ * 三柱模式(未给出生时刻)时,时柱是正午占位:权重照表列出,但合计只有 81,
186
+ * 不重新归一化——权重是固定口径,归一化会把占位时柱洗成实有。
187
+ */
188
+ export function weightPctOf(pillars = {}, { hourUnknown = false } = {}) {
189
+ const present = PILLARS.filter((k) => pillars[k] && pillars[k].branch);
190
+ const complete = !hourUnknown && present.length === 4;
191
+ // 三柱模式:时柱是正午占位,不计入合计;其余缺柱同理
192
+ const counted = complete ? PILLARS.slice() : present.filter((k) => !(k === 'hour' && hourUnknown));
193
+ const stem = {};
194
+ const branch = {};
195
+ const pct = {};
196
+ for (const k of PILLARS) {
197
+ stem[k] = PILLAR_WEIGHT.stem[k];
198
+ branch[k] = PILLAR_WEIGHT.branch[k];
199
+ pct[k] = counted.includes(k) ? stem[k] + branch[k] : 0;
200
+ }
201
+ const totalStem = counted.reduce((n, k) => n + stem[k], 0);
202
+ const totalBranch = counted.reduce((n, k) => n + branch[k], 0);
203
+ const all = totalStem + totalBranch;
204
+ const rows = counted.map((k) => `${LABEL[k]} ${pct[k]}%(干${stem[k]}+支${branch[k]})`).join('、');
205
+ const missing = counted.length < 4 ? `;${PILLARS.filter((k) => !counted.includes(k)).map((k) => LABEL[k]).join('、')}柱未计` : '';
206
+ return {
207
+ complete,
208
+ stem,
209
+ branch,
210
+ pct,
211
+ total: { stem: totalStem, branch: totalBranch, all },
212
+ detail: `宫位权重合计 ${all}:${rows}${missing}`,
213
+ method: '炳祥课程宫位权重:天干 2/5/0/3、地支 11/36/27/16,合计 100;日干为参照点计 0。只作展示换算,不改旺衰评分',
214
+ note: complete
215
+ ? '月令 41% 为四柱之首(课堂称事业宫);日 27%、时 19%、年 13%'
216
+ : '时柱暂缺,权重表照列,但本盘合计不足 100;不重新归一化',
217
+ };
218
+ }
package/engine/trace.js CHANGED
@@ -57,7 +57,7 @@ function liuyaoTrace(r, opts = {}) {
57
57
  ['变卦', bian ? `${text(bian.name)}(上${text(bian.upper)}·下${text(bian.lower)})` : '无'],
58
58
  ],
59
59
  lines.map((l) => `${l.position}爻 ${text(l.ganzhi)}${text(l.element)}`).join('|'),
60
- '京房纳甲(八宫纳甲表);实现:engine/liuyao.js · NAJIA(规则表,本仓未录入古籍章页)',
60
+ '京房纳甲逐爻配干支五行;爻辰可对读《京氏易传》卷上各宫首卦注文;实现:engine/liuyao.js · NAJIA(八宫纳甲表)',
61
61
  );
62
62
 
63
63
  const liuqin = step(
@@ -70,7 +70,7 @@ function liuyaoTrace(r, opts = {}) {
70
70
  ['日干起六神', `${text(r.dayGanZhi && r.dayGanZhi.stem)}日`],
71
71
  ],
72
72
  lines.map((l) => `${l.position}爻 ${text(l.liuqin)}(${text(l.element)})`).join('|'),
73
- '五行生克定六亲;取用可对读《增删卜易》卷一·用神章第八;实现:engine/liuyao.js · liuqin()',
73
+ '以卦宫为「我」定六亲,六亲从宫主出(《火珠林》六亲根源);取用可对读《增删卜易》卷一·用神章第八;实现:engine/liuyao.js · liuqin()',
74
74
  );
75
75
 
76
76
  const shiying = step(
@@ -84,7 +84,7 @@ function liuyaoTrace(r, opts = {}) {
84
84
  ],
85
85
  `${text(ben.shi)}爻${shi ? ` ${text(shi.liuqin)}·${text(shi.ganzhi)}${text(shi.element)}` : ''}为世,`
86
86
  + `${text(ben.ying)}爻${ying ? ` ${text(ying.liuqin)}·${text(ying.ganzhi)}${text(ying.element)}` : ''}为应`,
87
- '八宫世应诀(世爻序与应爻隔三位);实现:engine/liuyao.js · SHI_POSITION(通行动诀,本仓未录入古籍章页)',
87
+ '世位依八宫(首卦上爻、一至五世、游魂四、归魂三),逐卦标世应见《京氏易传》卷上;应爻隔三位属通行推步;实现:engine/liuyao.js · SHI_POSITION',
88
88
  );
89
89
 
90
90
  let fushen;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-metaphysics",
3
- "version": "0.62.3",
3
+ "version": "0.62.5",
4
4
  "type": "module",
5
5
  "description": "命理排盘(玄学 xuanxue)for DeepSeek Harness: nineteen systems and eleven quick references (almanac, solar–lunar conversion, …), with climate adjustment (tiaohou), the 120 Qiongtong Baojian entries, 1,062-char name library with per-character pinyin, Kangxi stroke counts, five-grid (五格/三才) analysis and mechanical phonetics checks, a 78-card tarot library on the Rider-Waite-Smith base (per-card English name, image description, core meaning and astrological correspondence, cross-checked against three published sources; court cards carry no zodiac by design and the chart says so), classical quotes (Ziping Zhenquan / Di Tian Sui / San Ming Tong Hui), hexagram body relations (六冲/六合/伏吟/反吟/化进神/化退神) plus yongshen placement (用神落位) with month/day strength (月建日辰旺衰) and whole-hexagram per-line strength (全卦逐爻旺衰) and response-time clues (应期线索:逢值/逢冲/逢合 + 月建五态快慢) for liuyao, plus an MBTI-style 16-type questionnaire and exact dayun handover dates (交运日) with annual suiyun hints (岁运并临/伏吟反吟), palace conditions (击刑/入墓), month states (旺相休囚死) and stem–palace relations (天盘干与宫生克) for qimen, flying four-transformations with chained flights (四化飞星串连), three-way-four-corner composite flights (三方四正复合飞化), switchable leap-month policy (闰月按日切分/整月归次月/整月归本月) eleven school switches (亮度/庚干四化/天马/天空/截空旬空/魁钺/天伤天使/长生/晚子时/身主/杂曜全表) for ziwei, the last one opting in to a 61-star minor-star (杂曜) table where each of the twelve extra stars carries its placement verse and the palace it landed in (verses accepted only when at least two independent published editions give the same table, homonymous stars never merged), caliber diffs for bazi/ziwei/qimen (same inputs, one switch, root-field changes), shadow-chart IDs (same normalized params → same ID; version bumps auto-diff chart fields), step-by-step deduction traces (liuyao najia→liuqin→shiying→fushen→strength; bazi strength score and pattern/yongshen; ziwei pattern conditions), and a bundled offline single-file page (命理排盘.html), a panel-to-chat handoff that asks the Harness about a finished chart, per-tab lazy engine chunks so the first-screen client bundle stays under 100KB gzip, and a public verification report (128 classical hexagram cases, 312 Zi Wei charts × 34 patterns, 12 dayun handover cases) generated from the same source that gates CI.",
6
6
  "keywords": [