dsh-metaphysics 0.63.0 → 0.64.0
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 +68 -0
- package/client.almanac.js +10 -10
- package/client.chart.js +132 -132
- package/client.chenggu.js +12 -12
- package/client.convert.js +14 -14
- package/client.daliuren.js +43 -43
- package/client.fengshui.js +3 -3
- package/client.js +204 -192
- package/client.liuyao.js +5 -5
- package/client.mbti.js +3 -3
- package/client.name.js +14 -14
- package/client.numerology.js +3 -3
- package/client.qimen.js +5 -5
- package/client.star.js +40 -40
- package/client.tarot.js +38 -38
- package/client.xiaoliuren.js +3 -3
- package/client.zeri.js +14 -14
- package/engine/diff.js +14 -0
- package/engine/index.js +4 -4
- package/engine/interpret.js +4 -3
- package/engine/ziwei.js +114 -19
- package/index.js +22 -2
- package/package.json +1 -1
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +193 -46
package/engine/diff.js
CHANGED
|
@@ -338,9 +338,23 @@ export const CALIBER_SWITCHES = {
|
|
|
338
338
|
ziweiSchoolSwitch('shenzhuSchool', '身主:子午皆火星 / 子铃午火', '身主', 'common', 'verse', {
|
|
339
339
|
common: '子午皆火星', verse: '子铃午火(安身主诀逐字)',
|
|
340
340
|
}),
|
|
341
|
+
ziweiSchoolSwitch('mingzhuSchool', '命主取法:命宫地支 / 生年年支', '命主取法', 'soul-branch', 'year-branch', {
|
|
342
|
+
'soul-branch': '命宫地支(通行本)', 'year-branch': '生年年支(中州派)',
|
|
343
|
+
}),
|
|
341
344
|
ziweiSchoolSwitch('zuoyaoSchool', '杂曜:49 颗简盘 / 61 颗全表', '杂曜全表', 'minimal', 'full', {
|
|
342
345
|
minimal: '49 颗(简盘)', full: '61 颗(加十二颗杂曜)',
|
|
343
346
|
}),
|
|
347
|
+
ziweiSchoolSwitch('liunianSihua', '流年四化取干:流年天干 / 流年命宫宫干', '流年四化取干', 'year-stem', 'life-palace-stem', {
|
|
348
|
+
'year-stem': '流年天干', 'life-palace-stem': '流年命宫宫干',
|
|
349
|
+
}),
|
|
350
|
+
// 十干四化变体有十一档,口径卡只拿「甲干廉破曲阳」当对照样本:
|
|
351
|
+
// 甲年换成文曲化科、太阳化忌这一档,与本插件默认的武曲化科最近、最能看出整表在动。
|
|
352
|
+
ziweiSchoolSwitch('sihuaVariant', '十干四化:通行表 / 变体整表替换', '十干四化变体', 'default', '廉破曲阳', {
|
|
353
|
+
default: '各干通行表', 廉破曲阳: '甲干 廉破曲阳',
|
|
354
|
+
贪阴阳机: '戊干 贪阴阳机', 阳武同阴: '庚干 阳武同阴', 阳武府同: '庚干 阳武府同',
|
|
355
|
+
阳武府相: '庚干 阳武府相', 阳武同相: '庚干 阳武同相', 巨阳武昌: '辛干 巨阳武昌',
|
|
356
|
+
梁紫府武: '壬干 梁紫府武', 梁紫相武: '壬干 梁紫相武', 破巨阳贪: '癸干 破巨阳贪',
|
|
357
|
+
}),
|
|
344
358
|
],
|
|
345
359
|
qimen: [
|
|
346
360
|
{
|
package/engine/index.js
CHANGED
|
@@ -78,7 +78,7 @@ function requireGender(value, who = '') {
|
|
|
78
78
|
const ZIWEI_SCHOOL_KEYS = [
|
|
79
79
|
'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool',
|
|
80
80
|
'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool',
|
|
81
|
-
'zuoyaoSchool',
|
|
81
|
+
'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua', 'sihuaVariant',
|
|
82
82
|
];
|
|
83
83
|
|
|
84
84
|
/** 紫微流派参数原样透传;非法值交给引擎按默认口径回退 */
|
|
@@ -211,8 +211,8 @@ function ziweiText(r) {
|
|
|
211
211
|
const labels = {
|
|
212
212
|
brightnessSchool: '亮度', gengYearSihua: '庚干四化', tianmaSchool: '天马', tiankongSchool: '天空',
|
|
213
213
|
jiekongSchool: '截空', kuiyueSchool: '魁钺', tianshiTianshang: '天伤天使',
|
|
214
|
-
changshengSchool: '长生', lateZishi: '晚子时', shenzhuSchool: '身主',
|
|
215
|
-
zuoyaoSchool: '杂曜全表',
|
|
214
|
+
changshengSchool: '长生', lateZishi: '晚子时', shenzhuSchool: '身主', mingzhuSchool: '命主取法',
|
|
215
|
+
zuoyaoSchool: '杂曜全表', liunianSihua: '流年四化取干', sihuaVariant: '十干四化变体',
|
|
216
216
|
};
|
|
217
217
|
const diff = Object.entries(labels)
|
|
218
218
|
.filter(([key]) => r.schools[key] && r.schools[key] !== ZIWEI_SCHOOL_DEFAULTS[key])
|
|
@@ -267,7 +267,7 @@ function ziweiText(r) {
|
|
|
267
267
|
`【农历】${lunarText}(月首 ${r.lunar.monthStart}) 时支:${r.hourBranch} 年干支:${r.yearGanzhi}`,
|
|
268
268
|
`【时刻】${r.solarTime ? `${r.solarTime.civilText} → 真太阳时 ${r.solarTime.trueSolarText}${r.input.geo ? '(' + r.input.geo.note + ')' : ''}` : ''}`,
|
|
269
269
|
`【命宫】${r.soul.branch}(${r.soul.ganzhi}·${r.soul.nayin}) 【身宫】${r.body.branch}(落${r.body.lands}) 【五行局】${r.bureau.name}`,
|
|
270
|
-
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}${r.bodyMasterNote ? `(${r.bodyMasterSchool === 'common' ? '子午皆火星' : '子铃午火'})` : ''}`,
|
|
270
|
+
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}${r.bodyMasterNote ? `(${r.bodyMasterSchool === 'common' ? '子午皆火星' : '子铃午火'})` : ''}${r.lifeMasterNote ? `(${r.lifeMasterNote})` : ''}`,
|
|
271
271
|
`【大限】${r.daxian.rule},${r.daxian.startAge}岁起 【小限】${r.xiaoxianRule.direction}`,
|
|
272
272
|
schoolLine,
|
|
273
273
|
`【昌曲】文昌${r.changqu.wenchang.branch}(${r.changqu.wenchang.palace}${r.changqu.wenchang.mutagen ? '·化' + r.changqu.wenchang.mutagen : ''}) 文曲${r.changqu.wenqu.branch}(${r.changqu.wenqu.palace}${r.changqu.wenqu.mutagen ? '·化' + r.changqu.wenqu.mutagen : ''})`,
|
package/engine/interpret.js
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
LIUREN_JIANG, TAROT_ELEMENT_FOCUS, DISCLAIMER,
|
|
13
13
|
} from './interpret-data.js';
|
|
14
14
|
// 生年四化要按年干反查四颗星,四化表只在紫微引擎里定义了一份,这里直接复用,避免两处维护打架
|
|
15
|
-
import {
|
|
15
|
+
import { natalSihuaTableOf } from './ziwei.js';
|
|
16
16
|
// 紫微的词库单列一处:宫位取象、主星细节、双星、煞星辅星、四化措辞、庙旺语气、格局读法
|
|
17
17
|
import {
|
|
18
18
|
palaceFieldOf, starExtraOf, starPairOf, brightRead, huaInLine,
|
|
@@ -666,9 +666,10 @@ function zwNatalSihua(r) {
|
|
|
666
666
|
}
|
|
667
667
|
|
|
668
668
|
// 年干四化表:用来补齐「盘上没有落点」的那几颗,以及保证输出顺序
|
|
669
|
+
// 该盘若选了十干四化变体,这张表也要跟着换,否则文案里的四化与盘面标的不是同一张
|
|
669
670
|
const ganzhi = pick(r, 'yearGanzhi', '');
|
|
670
671
|
const yearStem = typeof ganzhi === 'string' ? ganzhi.slice(0, 1) : '';
|
|
671
|
-
const table =
|
|
672
|
+
const table = natalSihuaTableOf(yearStem, r?.schools);
|
|
672
673
|
const starOfType = {};
|
|
673
674
|
for (const [star, type] of Object.entries(table)) starOfType[type] = star;
|
|
674
675
|
|
|
@@ -870,7 +871,7 @@ function ziweiInterpret(r) {
|
|
|
870
871
|
soulPair ? `${soulPair.gist};要留意的是${soulPair.watch}。` : '',
|
|
871
872
|
bodyLands ? `身宫寄在${bodyLands}——${bodyField ? `${bodyField.field}是后天更容易使上劲的地方` : '这是后天着力点'},中年以后会越来越明显。` : '',
|
|
872
873
|
`五行局为${pick(r.bureau, 'name', '—')},${pick(r.daxian, 'startAge', '—')}岁起运:局定的是节奏(几步起、十年一换),不是好坏。`,
|
|
873
|
-
`命主${pick(r, 'lifeMaster', '—')}、身主${pick(r, 'bodyMaster', '—')}
|
|
874
|
+
`命主${pick(r, 'lifeMaster', '—')}、身主${pick(r, 'bodyMaster', '—')}:传统把这两颗当作整张盘的定调星,命主看底色,身主看后半程的着力点。${r.lifeMasterNote ? '(本盘' + r.lifeMasterNote + '。)' : ''}`,
|
|
874
875
|
].filter(Boolean).join('\n');
|
|
875
876
|
|
|
876
877
|
// ── 逐宫分析:十二宫各一行清单 + 一句读法 ────────────────────
|
package/engine/ziwei.js
CHANGED
|
@@ -95,7 +95,10 @@ export const ZIWEI_SCHOOL_DEFAULTS = Object.freeze({
|
|
|
95
95
|
changshengSchool: 'yin-yang-shun-ni',
|
|
96
96
|
lateZishi: 'current-day',
|
|
97
97
|
shenzhuSchool: 'common',
|
|
98
|
+
mingzhuSchool: 'soul-branch',
|
|
98
99
|
zuoyaoSchool: 'minimal',
|
|
100
|
+
liunianSihua: 'year-stem',
|
|
101
|
+
sihuaVariant: 'default',
|
|
99
102
|
});
|
|
100
103
|
|
|
101
104
|
export const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
|
|
@@ -109,7 +112,18 @@ export const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
|
|
|
109
112
|
changshengSchool: ['yin-yang-shun-ni', 'shui-tu', 'huo-tu'],
|
|
110
113
|
lateZishi: ['current-day', 'next-day', 'all-current', 'day-cur-time-next'],
|
|
111
114
|
shenzhuSchool: ['common', 'verse'],
|
|
115
|
+
// 命主取法:两派共用同一张十二支→命主星的表(贪狼子、巨门丑亥、禄存寅戌、文曲卯酉、
|
|
116
|
+
// 廉贞辰申、武曲巳未、破军午),分歧只在「拿哪个地支去查」——
|
|
117
|
+
// soul-branch(默认,通行本 /《紫微斗数全书》卷二「安命主」):按命宫地支
|
|
118
|
+
// year-branch(中州派,王亭之整理):按生年年支
|
|
119
|
+
// 实测命宫地支与生年年支重合的只占约 8%,两派约九成的人的命主不同。
|
|
120
|
+
mingzhuSchool: ['soul-branch', 'year-branch'],
|
|
112
121
|
zuoyaoSchool: ['minimal', 'full'],
|
|
122
|
+
liunianSihua: ['year-stem', 'life-palace-stem'],
|
|
123
|
+
// 十干四化变体:default 表示各干用本插件原有通行表;其余按文墨变体名整表替换。
|
|
124
|
+
// 只列与 default 不同的那一档(default 之外全是「换掉某一干」的显式选择)。
|
|
125
|
+
sihuaVariant: ['default', '廉破曲阳', '贪阴阳机', '阳武同阴', '阳武府同', '阳武府相',
|
|
126
|
+
'阳武同相', '巨阳武昌', '梁紫府武', '梁紫相武', '破巨阳贪'],
|
|
113
127
|
});
|
|
114
128
|
|
|
115
129
|
export function ziweiSchoolsOf(input = {}) {
|
|
@@ -221,11 +235,67 @@ const GENG_MUTAGEN = {
|
|
|
221
235
|
GYWTX: { 太阳: '禄', 武曲: '权', 天同: '科', 天相: '忌' },
|
|
222
236
|
};
|
|
223
237
|
|
|
238
|
+
// 十干四化变体全表(文墨天机「十干四化」,2026-11 从 WMTJ-Pro64-2.5.26 的 App.swf 常量表挖出)。
|
|
239
|
+
// 变体名一律取文墨原文四字,按「禄 权 科 忌」的顺序念,所以名字本身就是这张表:
|
|
240
|
+
// 「廉破曲阳」= 廉贞化禄、破军化权、文曲化科、太阳化忌。
|
|
241
|
+
// 每干第一个是与本插件原有默认表完全一致的那一档,乙丙丁己四干文墨没有变体。
|
|
242
|
+
// 这张表和 gengYearSihua 不是一回事:gengYearSihua 只换生年四化里庚年那一支,
|
|
243
|
+
// sihuaVariant 换的是整张十干四化表(生年、宫干自化、大限宫干、飞星、流年一起走)。
|
|
244
|
+
export const SIHUA_VARIANTS = Object.freeze({
|
|
245
|
+
廉破武阳: { stem: '甲', table: MUTAGEN.甲 },
|
|
246
|
+
廉破曲阳: { stem: '甲', table: Object.freeze({ 廉贞: '禄', 破军: '权', 文曲: '科', 太阳: '忌' }) },
|
|
247
|
+
贪阴右机: { stem: '戊', table: MUTAGEN.戊 },
|
|
248
|
+
贪阴阳机: { stem: '戊', table: Object.freeze({ 贪狼: '禄', 太阴: '权', 太阳: '科', 天机: '忌' }) },
|
|
249
|
+
阳武阴同: { stem: '庚', table: GENG_MUTAGEN.GYWYT },
|
|
250
|
+
阳武同阴: { stem: '庚', table: GENG_MUTAGEN.GYWTY },
|
|
251
|
+
阳武府同: { stem: '庚', table: GENG_MUTAGEN.GYWFT },
|
|
252
|
+
阳武府相: { stem: '庚', table: GENG_MUTAGEN.GYWFX },
|
|
253
|
+
阳武同相: { stem: '庚', table: GENG_MUTAGEN.GYWTX },
|
|
254
|
+
巨阳曲昌: { stem: '辛', table: MUTAGEN.辛 },
|
|
255
|
+
巨阳武昌: { stem: '辛', table: Object.freeze({ 巨门: '禄', 太阳: '权', 武曲: '科', 文昌: '忌' }) },
|
|
256
|
+
梁紫辅武: { stem: '壬', table: MUTAGEN.壬 },
|
|
257
|
+
梁紫府武: { stem: '壬', table: Object.freeze({ 天梁: '禄', 紫微: '权', 天府: '科', 武曲: '忌' }) },
|
|
258
|
+
梁紫相武: { stem: '壬', table: Object.freeze({ 天梁: '禄', 紫微: '权', 天相: '科', 武曲: '忌' }) },
|
|
259
|
+
破巨阴贪: { stem: '癸', table: MUTAGEN.癸 },
|
|
260
|
+
破巨阳贪: { stem: '癸', table: Object.freeze({ 破军: '禄', 巨门: '权', 太阳: '科', 贪狼: '忌' }) },
|
|
261
|
+
});
|
|
262
|
+
|
|
224
263
|
function mutagenOf(stem, schools) {
|
|
225
264
|
if (stem === '庚') return GENG_MUTAGEN[schools.gengYearSihua] || MUTAGEN.庚;
|
|
226
265
|
return MUTAGEN[stem] ?? {};
|
|
227
266
|
}
|
|
228
267
|
|
|
268
|
+
/**
|
|
269
|
+
* 取某一干的四化表(宫干自化、大限宫干、飞星、流年都用这张)。
|
|
270
|
+
* 只认 `sihuaVariant`——`gengYearSihua` 按既有约定只管生年四化那一支,
|
|
271
|
+
* 不能让它顺带改掉宫干自化(那是另一套断法,混了就是两派口径串味)。
|
|
272
|
+
* 变体名所属天干对不上这一干时不生效,直接落回该干通行表,不会把甲的表套到乙上。
|
|
273
|
+
* @param {string} stem 天干
|
|
274
|
+
* @param {object} [schools] 流派开关
|
|
275
|
+
* @returns {Record<string,string>} 星名 → 禄/权/科/忌
|
|
276
|
+
*/
|
|
277
|
+
export function sihuaTableOf(stem, schools) {
|
|
278
|
+
const variant = schools && schools.sihuaVariant;
|
|
279
|
+
if (variant && variant !== 'default') {
|
|
280
|
+
const v = SIHUA_VARIANTS[variant];
|
|
281
|
+
if (v && v.stem === stem) return v.table;
|
|
282
|
+
}
|
|
283
|
+
return MUTAGEN[stem] ?? {};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* 生年四化专用的取表:先看 `sihuaVariant`,没命中该干再让 `gengYearSihua` 生效。
|
|
288
|
+
* 两项同时指向庚干时以 `sihuaVariant` 为准——它说的是「整张表长这样」,比单点覆盖更明确。
|
|
289
|
+
* @param {string} stem 年干
|
|
290
|
+
* @param {object} [schools] 流派开关
|
|
291
|
+
* @returns {Record<string,string>} 星名 → 禄/权/科/忌
|
|
292
|
+
*/
|
|
293
|
+
export function natalSihuaTableOf(stem, schools) {
|
|
294
|
+
const table = sihuaTableOf(stem, schools);
|
|
295
|
+
if (table === MUTAGEN[stem]) return mutagenOf(stem, schools || {});
|
|
296
|
+
return table;
|
|
297
|
+
}
|
|
298
|
+
|
|
229
299
|
// 安魁钺三派:差异集中在庚辛壬癸年(「网络派」与 qs1 同表,不单列)
|
|
230
300
|
export const KUI_YUE_SCHOOLS = {
|
|
231
301
|
qs2: {
|
|
@@ -256,7 +326,7 @@ export const KUI_YUE = {
|
|
|
256
326
|
};
|
|
257
327
|
KUI_YUE_SCHOOLS.qs1 = KUI_YUE;
|
|
258
328
|
|
|
259
|
-
/**
|
|
329
|
+
/** 命主:按地支查表。两派共用这张表,分歧在拿哪个地支 —— 见 mingzhuSchool。 */
|
|
260
330
|
export const MING_ZHU = {
|
|
261
331
|
子: '贪狼', 丑: '巨门', 寅: '禄存', 卯: '文曲', 辰: '廉贞', 巳: '武曲',
|
|
262
332
|
午: '破军', 未: '武曲', 申: '廉贞', 酉: '文曲', 戌: '禄存', 亥: '巨门',
|
|
@@ -564,7 +634,7 @@ export function buildZiwei(input) {
|
|
|
564
634
|
}
|
|
565
635
|
|
|
566
636
|
// 生年四化(庚干按所选变体)
|
|
567
|
-
const mutagenMap =
|
|
637
|
+
const mutagenMap = natalSihuaTableOf(yearStem, schools);
|
|
568
638
|
for (const list of starsByBranch) {
|
|
569
639
|
for (const star of list) {
|
|
570
640
|
if (mutagenMap[star.name]) star.mutagen = mutagenMap[star.name];
|
|
@@ -600,7 +670,7 @@ export function buildZiwei(input) {
|
|
|
600
670
|
const stepIndex = forward ? fix(branch - soulIndex) : fix(soulIndex - branch);
|
|
601
671
|
const dxStart = startAge + stepIndex * 10;
|
|
602
672
|
const gz = STEMS[stem] + BRANCHES[branch];
|
|
603
|
-
const pal =
|
|
673
|
+
const pal = sihuaTableOf(STEMS[stem], schools);
|
|
604
674
|
const selfHua = starsByBranch[branch]
|
|
605
675
|
.filter((s) => pal[s.name])
|
|
606
676
|
.map((s) => ({ star: s.name, type: pal[s.name] }));
|
|
@@ -618,7 +688,7 @@ export function buildZiwei(input) {
|
|
|
618
688
|
start: dxStart,
|
|
619
689
|
end: dxStart + 9,
|
|
620
690
|
stem: STEMS[stem],
|
|
621
|
-
mutagen: Object.entries(
|
|
691
|
+
mutagen: Object.entries(sihuaTableOf(STEMS[stem], schools)).map(([s, k]) => `${s}化${k}`),
|
|
622
692
|
},
|
|
623
693
|
xiaoxian: { age: xiaoxianAge(branch, triad, gender) },
|
|
624
694
|
sanfang: [branch, branch + 4, branch + 8, branch + 6]
|
|
@@ -682,10 +752,21 @@ export function buildZiwei(input) {
|
|
|
682
752
|
const xxAge = ((age - 1) % 12) + 1;
|
|
683
753
|
const xxPalace = palaces.find((p) => p.xiaoxian.age === xxAge);
|
|
684
754
|
const dxPalace = palaces.find((p) => age >= p.daxian.start && age <= p.daxian.end);
|
|
755
|
+
// 流年四化取干:默认按流年天干;liunianSihua: life-palace-stem 改按该年命宫
|
|
756
|
+
// 的宫干(文墨设置树里的「依据流年命宫天干」)。这两干各依不同的表:年干随年份走,
|
|
757
|
+
// 命宫宫干由五虎遁从出生年干起,所以实测十二年会换掉十二次,不是只差个别年。
|
|
758
|
+
// 取哪一干必须随盘回显,否则用户看不出四颗化星是被哪张表定的。
|
|
759
|
+
const lnStemOf = (() => {
|
|
760
|
+
if (schools.liunianSihua !== 'life-palace-stem') return gz.stem;
|
|
761
|
+
const lp = palaces.find((p) => p.branch === gz.branch);
|
|
762
|
+
return lp ? lp.stem : gz.stem;
|
|
763
|
+
})();
|
|
685
764
|
liunian.push({
|
|
686
765
|
year: y,
|
|
687
766
|
ganzhi: gz.name,
|
|
688
767
|
age,
|
|
768
|
+
sihuaStem: lnStemOf,
|
|
769
|
+
sihuaStemFrom: schools.liunianSihua === 'life-palace-stem' ? '流年命宫天干' : '流年天干',
|
|
689
770
|
lifePalace: { branch: gz.branch, palace: palaceNames[b] },
|
|
690
771
|
doujun: BRANCHES[fix(b - (lunarMonth - 1) + hb)],
|
|
691
772
|
sanfang: [fix(b), fix(b + 4), fix(b + 8), fix(b + 6)].map((x) => palaceNames[x]),
|
|
@@ -694,7 +775,7 @@ export function buildZiwei(input) {
|
|
|
694
775
|
liutuo: BRANCHES[fix(lu - 1)],
|
|
695
776
|
liukui: BRANCHES[kuiyueTable[gz.stem][0]],
|
|
696
777
|
liuyue: BRANCHES[kuiyueTable[gz.stem][1]],
|
|
697
|
-
mutagen: Object.entries(
|
|
778
|
+
mutagen: Object.entries(sihuaTableOf(lnStemOf, schools)).map(([s, k]) => `${s}化${k}`),
|
|
698
779
|
daxian: dxPalace
|
|
699
780
|
? { palace: dxPalace.palace, start: dxPalace.daxian.start, end: dxPalace.daxian.end }
|
|
700
781
|
: null,
|
|
@@ -747,7 +828,20 @@ export function buildZiwei(input) {
|
|
|
747
828
|
nayin: soulNayin.name,
|
|
748
829
|
},
|
|
749
830
|
body: { palace: '身宫', branch: BRANCHES[bodyIndex], lands: palaceNames[bodyIndex] },
|
|
750
|
-
lifeMaster: MING_ZHU[BRANCHES[soulIndex]],
|
|
831
|
+
lifeMaster: MING_ZHU[schools.mingzhuSchool === 'year-branch' ? BRANCHES[yb] : BRANCHES[soulIndex]],
|
|
832
|
+
lifeMasterSchool: schools.mingzhuSchool,
|
|
833
|
+
...((() => {
|
|
834
|
+
// 两派取的地支不同时,把另一派的结果一并回显——不然用户切档后只看到命主变了一个字,
|
|
835
|
+
// 无从判断是取法变了还是排盘出了问题。
|
|
836
|
+
const bySoul = MING_ZHU[BRANCHES[soulIndex]];
|
|
837
|
+
const byYear = MING_ZHU[BRANCHES[yb]];
|
|
838
|
+
if (bySoul === byYear) return {};
|
|
839
|
+
return {
|
|
840
|
+
lifeMasterNote: schools.mingzhuSchool === 'year-branch'
|
|
841
|
+
? `中州派按生年年支${BRANCHES[yb]}取${byYear};通行本按命宫地支${BRANCHES[soulIndex]}取${bySoul}`
|
|
842
|
+
: `通行本按命宫地支${BRANCHES[soulIndex]}取${bySoul};中州派按生年年支${BRANCHES[yb]}取${byYear}`,
|
|
843
|
+
};
|
|
844
|
+
})()),
|
|
751
845
|
bodyMaster: SHEN_ZHU[schools.shenzhuSchool][BRANCHES[yb]],
|
|
752
846
|
bodyMasterSchool: schools.shenzhuSchool,
|
|
753
847
|
...((yb === 0 || yb === 6) ? {
|
|
@@ -794,15 +888,15 @@ export function buildZiwei(input) {
|
|
|
794
888
|
rules: {
|
|
795
889
|
ziweiPlacement: '借数法:局数除日数取商,商数自寅宫顺行,借数奇逆偶顺',
|
|
796
890
|
mutagen: '生年四化用中州派常用表;庚干可按流派切换(默认阳武阴同,另有同科阴忌、府科、府科相忌、同科相忌)',
|
|
797
|
-
schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse
|
|
891
|
+
schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse 子铃午火)、命主 ${schools.mingzhuSchool}(soul-branch 按命宫地支 / year-branch 按生年年支)、杂曜 ${schools.zuoyaoSchool}(minimal 49 颗 / full 61 颗)、流年四化取干 ${schools.liunianSihua}(year-stem 按流年天干 / life-palace-stem 按流年命宫宫干)、十干四化 ${schools.sihuaVariant}(default 各干通行表,其余为文墨变体整表替换);庚干四化只作用于生年四化,sihuaVariant 换的是宫干自化、大限宫干、飞星与流年共用的那张表`,
|
|
798
892
|
zuoyao: schools.zuoyaoSchool === 'full'
|
|
799
893
|
? `全表十二颗已安:生月 解神、天巫、天月、阴煞;生年干 天官、天福、天厨;生年支 蜚廉、天德、年解;命宫+生年支 天才、身宫+生年支 天寿。蜚廉与博士十二神的飞廉同名异星,年解与月解(解神)分列,天德与岁前十二神的天德同名异宫。`
|
|
800
894
|
: `本盘按 49 颗的通行简盘安星,未排全表杂曜。开 zuoyaoSchool: "full" 追加十二颗:解神、天巫、天月、阴煞(生月)、天官、天福、天厨(生年干)、蜚廉、天德、年解(生年支)、天才(命宫+生年支)、天寿(身宫+生年支),每颗都带安星诀。`,
|
|
801
895
|
leapMonth: '闰月默认按日切分(1–15 归本月、16 起归次月,主流排盘口径);可传 leapMonth: next(整月归次月)或 prev(整月归本月),leapAsNext: true 等同 next',
|
|
802
896
|
auxStars: '火铃按年支三合起点顺数至生时;羊陀夹禄存;魁钺按年干;地空亥起子时逆行、地劫顺行;三台八座随辅弼;恩光天贵随昌曲退一位;台辅封诰按时支',
|
|
803
897
|
shensha: '长生、博士随大限顺逆;将前、岁前恒顺行;天伤恒在交友、天使恒在疾厄',
|
|
804
|
-
masters: '
|
|
805
|
-
liunian: '流年命宫取该年地支宫;三方四正为本宫与 +4/+8/+6
|
|
898
|
+
masters: '命主按 mingzhuSchool 取地支再查表(soul-branch 命宫地支 / year-branch 生年年支),身主按生年地支;两派共用同一张十二支命主表,只换查表用的地支',
|
|
899
|
+
liunian: '流年命宫取该年地支宫;三方四正为本宫与 +4/+8/+6;并给该年所属大限与小限;四化取干按 liunianSihua 口径,sihuaStem 回显实际用的那一干',
|
|
806
900
|
flyComposite: '三方四正取本宫、对宫与两个三合宫共四宫,四宫宫干各化禄权科忌共 16 条,按落宫归堆标会聚(双忌会、禄忌同宫、三化会、自化);只描会照,不折吉凶',
|
|
807
901
|
changqu: '昌曲落宫只由时支决定,故与丑未的关系(夹/三合/同宫/无关)是结构性结论;absorb 的「清/杂」是启发式标记,依据昌曲化忌与会煞,不是断语',
|
|
808
902
|
},
|
|
@@ -1101,7 +1195,7 @@ export function daxianList(chart) {
|
|
|
1101
1195
|
selfHua: p.selfHua,
|
|
1102
1196
|
sanfang: p.sanfang,
|
|
1103
1197
|
mainStars: mainOf(p.sanfang),
|
|
1104
|
-
mutagenHits: Object.entries(
|
|
1198
|
+
mutagenHits: Object.entries(sihuaTableOf(p.stem, chart.schools)).map(([star, type]) => {
|
|
1105
1199
|
const b = starBranchOf(chart, star);
|
|
1106
1200
|
return { star, type, branch: b >= 0 ? BRANCHES[b] : null, palace: b >= 0 ? chart.palaces.find((x) => x.branch === BRANCHES[b])?.palace ?? null : null };
|
|
1107
1201
|
}),
|
|
@@ -1118,9 +1212,10 @@ export function daxianList(chart) {
|
|
|
1118
1212
|
export const FLY_TYPES = ['禄', '权', '科', '忌'];
|
|
1119
1213
|
|
|
1120
1214
|
// 某天干下某一化的星曜;表里没有就返回 null(不会凭印象补)
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1215
|
+
// 第三参 schools 选填:给了就按该盘的十干四化变体取表,不给沿用通行表(旧调用零漂移)
|
|
1216
|
+
export function flyStarOf(stem, type, schools) {
|
|
1217
|
+
const map = sihuaTableOf(stem, schools || {});
|
|
1218
|
+
if (!map || !Object.keys(map).length) return null;
|
|
1124
1219
|
for (const [star, t] of Object.entries(map)) if (t === type) return star;
|
|
1125
1220
|
return null;
|
|
1126
1221
|
}
|
|
@@ -1133,7 +1228,7 @@ export function flyStars(chart) {
|
|
|
1133
1228
|
branch: p.branch,
|
|
1134
1229
|
stem: p.stem,
|
|
1135
1230
|
flies: FLY_TYPES.map((type) => {
|
|
1136
|
-
const star = flyStarOf(p.stem, type);
|
|
1231
|
+
const star = flyStarOf(p.stem, type, chart.schools);
|
|
1137
1232
|
const b = star ? starBranchOf(chart, star) : -1;
|
|
1138
1233
|
const target = b >= 0 ? palaces.find((x) => x.branch === BRANCHES[b]) : null;
|
|
1139
1234
|
return {
|
|
@@ -1159,7 +1254,7 @@ export function flyChain(chart, { from = '命宫', type = '忌', maxSteps = 12 }
|
|
|
1159
1254
|
let cur = start;
|
|
1160
1255
|
let ended = 'max';
|
|
1161
1256
|
for (let i = 0; i < Math.max(1, maxSteps); i++) {
|
|
1162
|
-
const star = flyStarOf(cur.stem, type);
|
|
1257
|
+
const star = flyStarOf(cur.stem, type, chart.schools);
|
|
1163
1258
|
if (!star) { ended = 'no-star'; break; }
|
|
1164
1259
|
const b = starBranchOf(chart, star);
|
|
1165
1260
|
if (b < 0) { ended = 'off-chart'; break; }
|
|
@@ -1209,7 +1304,7 @@ export function flyComposite(chart, { from = '命宫' } = {}) {
|
|
|
1209
1304
|
branch: p.branch,
|
|
1210
1305
|
stem: p.stem,
|
|
1211
1306
|
flies: FLY_TYPES.map((type) => {
|
|
1212
|
-
const star = flyStarOf(p.stem, type);
|
|
1307
|
+
const star = flyStarOf(p.stem, type, chart.schools);
|
|
1213
1308
|
const b = star ? starBranchOf(chart, star) : -1;
|
|
1214
1309
|
const target = b >= 0 ? palaces.find((x) => x.branch === BRANCHES[b]) : null;
|
|
1215
1310
|
return {
|
|
@@ -1286,8 +1381,8 @@ export function flyComposite(chart, { from = '命宫' } = {}) {
|
|
|
1286
1381
|
|
|
1287
1382
|
export function enrichLiunian(chart) {
|
|
1288
1383
|
for (const ln of chart.liunian) {
|
|
1289
|
-
const stem = ln.ganzhi[0];
|
|
1290
|
-
ln.mutagenHits = Object.entries(
|
|
1384
|
+
const stem = ln.sihuaStem || ln.ganzhi[0];
|
|
1385
|
+
ln.mutagenHits = Object.entries(sihuaTableOf(stem, chart.schools)).map(([star, type]) => {
|
|
1291
1386
|
const b = starBranchOf(chart, star);
|
|
1292
1387
|
return {
|
|
1293
1388
|
star,
|
|
@@ -1349,7 +1444,7 @@ export function flowOf(chart, asOf) {
|
|
|
1349
1444
|
const p = chart.palaces.find((x) => x.branch === br);
|
|
1350
1445
|
const stem = p ? p.stem : null;
|
|
1351
1446
|
const mutagenHits = stem
|
|
1352
|
-
? Object.entries(
|
|
1447
|
+
? Object.entries(sihuaTableOf(stem, chart.schools)).map(([star, type]) => {
|
|
1353
1448
|
const b = starBranchOf(chart, star);
|
|
1354
1449
|
return {
|
|
1355
1450
|
star,
|
package/index.js
CHANGED
|
@@ -65,7 +65,8 @@ const OPTION_KEYS = [
|
|
|
65
65
|
'upper', 'lower', 'changing', 'count',
|
|
66
66
|
'leapMonth', 'leapAsNext', 'brightnessSchool', 'gengYearSihua', 'tianmaSchool',
|
|
67
67
|
'tiankongSchool', 'jiekongSchool', 'kuiyueSchool', 'tianshiTianshang',
|
|
68
|
-
'changshengSchool', 'lateZishi', 'shenzhuSchool', 'zuoyaoSchool',
|
|
68
|
+
'changshengSchool', 'lateZishi', 'shenzhuSchool', 'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua',
|
|
69
|
+
'sihuaVariant',
|
|
69
70
|
'action', 'toAge', 'sitting', 'facing', 'fortuneYear', 'period',
|
|
70
71
|
'sittingOffset', 'sittingDegree', 'facingOffset', 'facingDegree',
|
|
71
72
|
'fortuneDate', 'fortuneTime', 'surname', 'givenName', 'limit',
|
|
@@ -109,7 +110,10 @@ const OPTION_HINTS = {
|
|
|
109
110
|
changshengSchool: '仅 ziwei:长生十二神起点流派',
|
|
110
111
|
lateZishi: '仅 ziwei:晚子时口径 current-day / next-day',
|
|
111
112
|
shenzhuSchool: '仅 ziwei:身主安法 common / verse',
|
|
113
|
+
mingzhuSchool: '仅 ziwei:命主取法 soul-branch 按命宫地支(默认)/ year-branch 按生年年支(中州派)',
|
|
112
114
|
zuoyaoSchool: '仅 ziwei:杂曜取盘 minimal / full',
|
|
115
|
+
liunianSihua: '仅 ziwei:流年四化取干 year-stem 按流年天干(默认)/ life-palace-stem 按流年命宫宫干',
|
|
116
|
+
sihuaVariant: '仅 ziwei:十干四化变体 default 或 廉破曲阳/贪阴阳机/阳武同阴…(整表替换)',
|
|
113
117
|
action: 'fengshui:natal(默认)/ advise / xuankong 玄空;name:assess / generate',
|
|
114
118
|
toAge: '仅 trend:算到几岁 10–100,默认 100',
|
|
115
119
|
sitting: '仅 fengshui advise/xuankong 玄空:坐山(24 山之一)',
|
|
@@ -140,7 +144,7 @@ const READ_KEYS = ['withInterpret', 'detail', 'ask', 'question', 'direction', 's
|
|
|
140
144
|
/** 每个体系实际会读的参数:help 按这张表展开,避免「有这个键但该体系不看」 */
|
|
141
145
|
const SYSTEM_PARAMS = {
|
|
142
146
|
bazi: [...BIRTH_KEYS, 'hourUnknown', 'verifyPast', 'rectify', 'events', 'rectifyHours', 'cross', 'diff', 'trace', ...READ_KEYS],
|
|
143
|
-
ziwei: [...BIRTH_KEYS, 'leapMonth', 'leapAsNext', 'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool', 'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool', 'zuoyaoSchool', 'cross', 'diff', 'trace', ...READ_KEYS],
|
|
147
|
+
ziwei: [...BIRTH_KEYS, 'leapMonth', 'leapAsNext', 'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool', 'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool', 'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua', 'sihuaVariant', 'cross', 'diff', 'trace', ...READ_KEYS],
|
|
144
148
|
liuyao: ['datetime', 'lines', 'seed', 'trace', ...READ_KEYS],
|
|
145
149
|
tarot: ['count', 'seed', ...READ_KEYS],
|
|
146
150
|
meihua: ['datetime', 'mode', 'upper', 'lower', 'changing', ...READ_KEYS],
|
|
@@ -826,11 +830,27 @@ export function apply(ctx) {
|
|
|
826
830
|
enum: ['common', 'verse'],
|
|
827
831
|
description: '紫微斗数:身主安法(只影响子/午年生人)。common(默认,通行表)子午皆火星;verse 按安身主诀「子午安身铃火宿」逐字取子铃星、午火星。',
|
|
828
832
|
},
|
|
833
|
+
mingzhuSchool: {
|
|
834
|
+
type: 'string',
|
|
835
|
+
enum: ['soul-branch', 'year-branch'],
|
|
836
|
+
description: '紫微斗数:命主取法。两派共用同一张十二支→命主星的表(子贪狼、丑亥巨门、寅戌禄存、卯酉文曲、辰申廉贞、巳未武曲、午破军),分歧只在拿哪个地支去查:soul-branch(默认,通行本 /《紫微斗数全书》卷二「安命主」)用命宫地支,year-branch(中州派,文墨「安命主 - 依据中州派理论」)用生年年支。命主的定义是「依地支指定的一颗星」,命宫里不一定有它,换取法不改任何宫位与星曜落宫。实测命宫地支与生年年支重合的只占约 8%,两派约九成的人结果不同。',
|
|
837
|
+
},
|
|
829
838
|
zuoyaoSchool: {
|
|
830
839
|
type: 'string',
|
|
831
840
|
enum: ['minimal', 'full'],
|
|
832
841
|
description: '紫微斗数:杂曜取盘。minimal(默认,通行简盘 49 颗,与旧盘和存档一致);full 另按安星诀补入十二颗杂曜(解神、天巫、天月、阴煞、天官、天福、天厨、蜚廉、天德、年解、天才、天寿),共 61 颗。诀文属近代通行辑本并核,非《紫微斗数全书》原文。',
|
|
833
842
|
},
|
|
843
|
+
liunianSihua: {
|
|
844
|
+
type: 'string',
|
|
845
|
+
enum: ['year-stem', 'life-palace-stem'],
|
|
846
|
+
description: '紫微斗数:流年四化的取干口径。year-stem(默认)用该年干支的天干,life-palace-stem 改用该年流年命宫那一宫的宫干(文墨「依据流年命宫天干」)。年干随年份走,命宫宫干由五虎遁从生年干起,两者是两张表,实测十二年会换十二次,四颗化星全变。每年回显 sihuaStem / sihuaStemFrom 说明实际用了哪一干。',
|
|
847
|
+
},
|
|
848
|
+
sihuaVariant: {
|
|
849
|
+
type: 'string',
|
|
850
|
+
enum: ['default', '廉破曲阳', '贪阴阳机', '阳武同阴', '阳武府同', '阳武府相',
|
|
851
|
+
'阳武同相', '巨阳武昌', '梁紫府武', '梁紫相武', '破巨阳贪'],
|
|
852
|
+
description: '紫微斗数:十干四化变体,整表替换生年、宫干自化、大限宫干、飞星与流年所查的那张表。default(默认)各干取通行表;其余取值按文墨天机「十干四化」原文四字命名,依禄权科忌顺序念,如 廉破曲阳 = 廉贞禄破军权文曲科太阳忌。可选:廉破曲阳(甲)、贪阴阳机(戊)、阳武同阴/阳武府同/阳武府相/阳武同相(庚)、巨阳武昌(辛)、梁紫府武/梁紫相武(壬)、破巨阳贪(癸);乙丙丁己四干无变体。变体天干与所查该干不符时不生效,不会串表。与庚干那一项重叠时以本参数为准。',
|
|
853
|
+
},
|
|
834
854
|
action: {
|
|
835
855
|
type: 'string',
|
|
836
856
|
enum: ['natal', 'advise', 'xuankong', 'assess', 'generate'],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-metaphysics",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.64.0",
|
|
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": [
|