dsh-metaphysics 0.38.2 → 0.50.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/CHANGELOG.md +315 -8
- package/README.md +353 -342
- package/client.js +2699 -177
- package/engine/almanac.js +7 -6
- package/engine/bazi-words.js +174 -0
- package/engine/bazi.js +62 -0
- package/engine/classics.js +175 -9
- package/engine/crosscheck.js +29 -3
- package/engine/fengshui.js +197 -11
- package/engine/followup.js +29 -5
- package/engine/geju.js +90 -5
- package/engine/index.js +119 -13
- package/engine/interpret-knowledge.js +48 -12
- package/engine/interpret-plain.js +380 -322
- package/engine/interpret.js +328 -35
- package/engine/liuyao.js +185 -0
- package/engine/name-data.js +229 -0
- package/engine/name.js +234 -9
- package/engine/ziwei-words.js +245 -0
- package/engine/ziwei.js +254 -26
- package/index.js +65 -9
- package/package.json +2 -2
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +3419 -527
package/engine/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// 统一入口:解析参数、分派到各体系、生成可读摘要
|
|
2
2
|
import { buildBazi } from './bazi.js';
|
|
3
|
-
import { buildLiuyao, tossLines, bodyLabels, yongshenOf, yongshenStrength, hexagramStrength, jinTuiPower } from './liuyao.js';
|
|
4
|
-
import { buildZiwei, BRIGHTNESS, flowOf, asOfParts } from './ziwei.js';
|
|
3
|
+
import { buildLiuyao, tossLines, bodyLabels, yongshenOf, yongshenStrength, fushenAccess, hexagramStrength, jinTuiPower, yingqiWindow } from './liuyao.js';
|
|
4
|
+
import { buildZiwei, BRIGHTNESS, flowOf, asOfParts, ZIWEI_SCHOOL_DEFAULTS } from './ziwei.js';
|
|
5
5
|
import { drawTarot } from './tarot.js';
|
|
6
6
|
import { buildMeihua } from './meihua.js';
|
|
7
7
|
import { buildDaliuren } from './daliuren.js';
|
|
@@ -13,7 +13,7 @@ import { toJDN, ganzhiName, dayGanzhiIndex } from './calendar.js';
|
|
|
13
13
|
import { randomOf, isSeed } from './random.js';
|
|
14
14
|
import { interpret, DIRECTIONS, DIRECTION_DEFAULT } from './interpret.js';
|
|
15
15
|
import { followup, askPrompt } from './followup.js';
|
|
16
|
-
import { crossCheck, crossText } from './crosscheck.js';
|
|
16
|
+
import { crossCheck, crossText, crossSection } from './crosscheck.js';
|
|
17
17
|
import { pastSignals, verifyFit } from './verify.js';
|
|
18
18
|
import { rectifyBirth } from './rectify.js';
|
|
19
19
|
import { buildAlmanac } from './almanac.js';
|
|
@@ -24,7 +24,7 @@ import { buildStar } from './star.js';
|
|
|
24
24
|
import { buildNumerology } from './numerology.js';
|
|
25
25
|
import { buildMbti, mbtiPaper } from './mbti.js';
|
|
26
26
|
import { buildConvert } from './convert.js';
|
|
27
|
-
import { classicsFor, classicsText } from './classics.js';
|
|
27
|
+
import { classicsFor, classicsText, suiyunClassicOf, CLASSIC_BOOKS } from './classics.js';
|
|
28
28
|
import { buildTrend } from './trend.js';
|
|
29
29
|
import { buildFengshui } from './fengshui.js';
|
|
30
30
|
import { buildName } from './name.js';
|
|
@@ -55,6 +55,21 @@ function requireGender(value, who = '') {
|
|
|
55
55
|
throw fail('E_INPUT', `${who ? who + '的' : ''}gender 必须是 male 或 female${got};性别决定大运/大限顺逆,不能靠默认值`);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
const ZIWEI_SCHOOL_KEYS = [
|
|
59
|
+
'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool',
|
|
60
|
+
'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi',
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
/** 紫微流派参数原样透传;非法值交给引擎按默认口径回退 */
|
|
64
|
+
function ziweiSchoolArgs(args) {
|
|
65
|
+
const out = {};
|
|
66
|
+
for (const key of ZIWEI_SCHOOL_KEYS) {
|
|
67
|
+
if (args[key] !== undefined) out[key] = args[key];
|
|
68
|
+
}
|
|
69
|
+
if (args.schools && typeof args.schools === 'object') out.schools = args.schools;
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
|
|
58
73
|
/** 解析 'YYYY-MM-DDTHH:mm' / 'YYYY-MM-DD HH:mm' / 'YYYY-MM-DD' */
|
|
59
74
|
export function parseDateTime(text) {
|
|
60
75
|
if (typeof text !== 'string' || !text.trim()) {
|
|
@@ -111,6 +126,10 @@ function baziText(r) {
|
|
|
111
126
|
? `神煞(${r.shensha.count} 见):` + r.shensha.groups.map((g) =>
|
|
112
127
|
`${g.cat}|` + g.items.map((i) => `${i.name}(${i.pillars.map((k) => SHORT[k]).join('')})`).join('、')).join(';')
|
|
113
128
|
: '神煞:—';
|
|
129
|
+
const ry = r.renyuan;
|
|
130
|
+
const renyuanLine = ry
|
|
131
|
+
? `人元:${ry.month}月第${ry.day}日,${ry.active}${ry.activeElement}司权(${ry.segments.map((s) => `${s.stem}${s.from}–${s.to}`).join(' ')})${ry.beyond ? ';已过 30 日表,按本气算' : ''}`
|
|
132
|
+
: '';
|
|
114
133
|
const gejuLine = r.frame ? [
|
|
115
134
|
`格局:${r.frame.primary ? `${r.frame.primary.name}(${r.frame.primary.evidence})` : '—'}`,
|
|
116
135
|
` ${r.frame.geju.map((g) => `${g.name}[${g.kind}]`).join(' ')}`,
|
|
@@ -133,6 +152,7 @@ function baziText(r) {
|
|
|
133
152
|
shenshaLine,
|
|
134
153
|
`真太阳时:${r.solarTime.trueSolarText}(${r.input.geo ? r.input.geo.note + ';' : ''}${r.solarTime.note}) 晚子时:${r.input.lateZi ? '23:00 后算次日' : '23:00 后仍算当日'}`,
|
|
135
154
|
`节气:上一节 ${r.jieqi.previous.name} ${r.jieqi.previous.time} 下一节 ${r.jieqi.next.name} ${r.jieqi.next.time}`,
|
|
155
|
+
...(renyuanLine ? [renyuanLine] : []),
|
|
136
156
|
`大运:${r.dayun.rule}(${r.dayun.direction}),${r.dayun.startAge.years}岁${r.dayun.startAge.months}个月起运${jiao}`,
|
|
137
157
|
` ${dayun}`,
|
|
138
158
|
`流年:${r.liunian.slice(0, 10).map((l) => `${l.year}${l.ganzhi}(${l.stemTenGod})${l.luck ? `·${l.luck.tier}` : ''}`).join(' ')}`,
|
|
@@ -140,15 +160,33 @@ function baziText(r) {
|
|
|
140
160
|
const hits = r.liunian.filter((l) => l.suiyun && l.suiyun.signals && l.suiyun.signals.length);
|
|
141
161
|
if (!hits.length) return '岁运提示:近十年无岁运并临、运年反吟或流年伏吟/反吟(只标干支,不判吉凶)';
|
|
142
162
|
const label = (s) => `${s.type}${s.type.startsWith('流年') && s.target ? `(${s.target})` : ''}`;
|
|
163
|
+
const e = suiyunClassicOf(r);
|
|
164
|
+
const src = e ? `|古籍见《${CLASSIC_BOOKS[e.book].name}·${e.chapter}》` : '';
|
|
143
165
|
return '岁运提示(只标干支变动,不判吉凶):' + hits
|
|
144
|
-
.map((l) => `${l.year}${l.ganzhi} ${l.suiyun.signals.map(label).join('/')}`).join(';');
|
|
166
|
+
.map((l) => `${l.year}${l.ganzhi} ${l.suiyun.signals.map(label).join('/')}`).join(';') + src;
|
|
145
167
|
})(),
|
|
146
168
|
'(格局、用神、行运吉凶为扶抑+简化调候的量化提示,非断语。)',
|
|
147
169
|
].join('\n') + near;
|
|
148
170
|
}
|
|
149
171
|
|
|
150
172
|
function ziweiText(r) {
|
|
151
|
-
|
|
173
|
+
// 闰月:日期按「闰X月」原样写;换算过起盘月时再附一句,免得把 21 日写成「闰5月21日」
|
|
174
|
+
const rawMonth = r.lunar.monthRaw || r.lunar.month;
|
|
175
|
+
const lunarText = `${r.lunar.year}年${r.lunar.isLeap ? `闰${rawMonth}` : r.lunar.month}月${r.lunar.day}日`
|
|
176
|
+
+ (r.lunar.isLeap && r.lunar.month !== rawMonth ? `(按${r.lunar.month}月起盘)` : '');
|
|
177
|
+
// 只在显式改动流派时补一行,默认盘不增加噪音
|
|
178
|
+
const schoolLine = (() => {
|
|
179
|
+
if (!r.schools) return '';
|
|
180
|
+
const labels = {
|
|
181
|
+
brightnessSchool: '亮度', gengYearSihua: '庚干四化', tianmaSchool: '天马', tiankongSchool: '天空',
|
|
182
|
+
jiekongSchool: '截空', kuiyueSchool: '魁钺', tianshiTianshang: '天伤天使',
|
|
183
|
+
changshengSchool: '长生', lateZishi: '晚子时',
|
|
184
|
+
};
|
|
185
|
+
const diff = Object.entries(labels)
|
|
186
|
+
.filter(([key]) => r.schools[key] && r.schools[key] !== ZIWEI_SCHOOL_DEFAULTS[key])
|
|
187
|
+
.map(([key, label]) => `${label} ${r.schools[key]}`);
|
|
188
|
+
return diff.length ? `【流派】${diff.join(' ')}` : '';
|
|
189
|
+
})();
|
|
152
190
|
const starText = (stars) => (stars.length
|
|
153
191
|
? stars.map((s) => `${s.name}${s.mutagen ? `化${s.mutagen}` : ''}`).join(' ')
|
|
154
192
|
: '—');
|
|
@@ -199,6 +237,7 @@ function ziweiText(r) {
|
|
|
199
237
|
`【命宫】${r.soul.branch}(${r.soul.ganzhi}·${r.soul.nayin}) 【身宫】${r.body.branch}(落${r.body.lands}) 【五行局】${r.bureau.name}`,
|
|
200
238
|
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}`,
|
|
201
239
|
`【大限】${r.daxian.rule},${r.daxian.startAge}岁起 【小限】${r.xiaoxianRule.direction}`,
|
|
240
|
+
schoolLine,
|
|
202
241
|
`【昌曲】文昌${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 : ''})`,
|
|
203
242
|
` ${r.changqu.relation} 入命三方:${r.changqu.inSoulSanfang ? '是' : '否'} 吸收面:${r.changqu.absorb.label}(${r.changqu.absorb.reason})`,
|
|
204
243
|
flyLine,
|
|
@@ -355,6 +394,11 @@ function liuyaoText(r) {
|
|
|
355
394
|
const m = strength.month && strength.month.branch ? `月建 ${strength.month.branch}(${strength.month.element}) ` : '';
|
|
356
395
|
out.push(`用神旺衰:${m}${strength.labels.join(' · ')}`);
|
|
357
396
|
}
|
|
397
|
+
// 伏神出伏条件:只在用神不上卦时出现;只归条件档,不给应期
|
|
398
|
+
const chufu = r.fushenAccess;
|
|
399
|
+
if (chufu && Array.isArray(chufu.labels) && chufu.labels.length) {
|
|
400
|
+
out.push(`伏神出伏:${chufu.labels.join(' · ')}`);
|
|
401
|
+
}
|
|
358
402
|
} else {
|
|
359
403
|
out.push('用神:未取(未指明所问之事;用「询问方向」指定后即按六亲取用)');
|
|
360
404
|
}
|
|
@@ -371,6 +415,11 @@ function liuyaoText(r) {
|
|
|
371
415
|
if (jt && Array.isArray(jt.lines) && jt.lines.length) {
|
|
372
416
|
out.push(`进退力重:${jt.lines.map((l) => `${l.position}爻${l.from}→${l.to}${l.type}·${l.verdict}`).join(' · ')}`);
|
|
373
417
|
}
|
|
418
|
+
// 应期线索:只列地支与快慢,不给日期
|
|
419
|
+
const yq = r.yingqi;
|
|
420
|
+
if (yq && Array.isArray(yq.triggers) && yq.triggers.length) {
|
|
421
|
+
out.push(`应期线索:${yq.tempo} · ${yq.triggers.map((t) => `${t.labels.join('/')}${t.branch}`).join(' · ')}(只列地支,不出日期)`);
|
|
422
|
+
}
|
|
374
423
|
return out.filter(Boolean).join('\n');
|
|
375
424
|
}
|
|
376
425
|
|
|
@@ -391,6 +440,9 @@ export function compute(args = {}) {
|
|
|
391
440
|
r.classics = classicsFor(r);
|
|
392
441
|
const ct = classicsText(r.classics);
|
|
393
442
|
if (ct) r.summary = `${r.summary}\n【古籍】\n${ct}`;
|
|
443
|
+
// 岁运提示的原文不占五条上限:只在盘面真有岁运信号时挂到结果上,摘要、解析层与面板各自取用
|
|
444
|
+
const syc = suiyunClassicOf(r);
|
|
445
|
+
if (syc) r.suiyunClassic = { ...syc, bookName: CLASSIC_BOOKS[syc.book].name };
|
|
394
446
|
}
|
|
395
447
|
// 超出 ΔT 覆盖范围时把精度提示顶到摘要最前,别让远期盘悄悄出错
|
|
396
448
|
if (r && r.precision && r.precision.level === 'approx' && r.summary) {
|
|
@@ -421,11 +473,11 @@ export function compute(args = {}) {
|
|
|
421
473
|
};
|
|
422
474
|
const asOf = checkAsOf(args.asOf);
|
|
423
475
|
const other = r.system === 'bazi'
|
|
424
|
-
? buildZiwei({ ...common, leapAsNext: args.leapAsNext === true, asOf })
|
|
476
|
+
? buildZiwei({ ...common, leapMonth: args.leapMonth, leapAsNext: args.leapAsNext === true, ...ziweiSchoolArgs(args), asOf })
|
|
425
477
|
: buildBazi({ ...common, lateZi: args.lateZi !== false, nowYear: asOf ? asOf.year : undefined });
|
|
426
478
|
r.cross = crossCheck(r.system === 'bazi' ? r : other, r.system === 'ziwei' ? r : other);
|
|
427
479
|
if (r.interpret) {
|
|
428
|
-
r.interpret.sections.push(
|
|
480
|
+
r.interpret.sections.push(crossSection(r.cross));
|
|
429
481
|
}
|
|
430
482
|
}
|
|
431
483
|
// 验前事:把过去若干年的流年信号摊开(只读,不改盘)
|
|
@@ -474,8 +526,9 @@ export function compute(args = {}) {
|
|
|
474
526
|
export function interpretText(i) {
|
|
475
527
|
if (!i) return '';
|
|
476
528
|
const out = [`【${i.title || '解析与详解'}】${i.ask && i.ask.echo ? i.ask.echo : ''}`];
|
|
477
|
-
//
|
|
478
|
-
|
|
529
|
+
// 直答放在最前:先回答「你问的事」,再说依据,避免读者读到最后才知道结论;
|
|
530
|
+
// 没填问题时就不该喊「答所问」——改为「先看结论」,否则是一句假话
|
|
531
|
+
if (i.answer) out.push(`▶ ${i.ask && i.ask.question ? '先答所问' : '先看结论'}:${i.answer}`);
|
|
479
532
|
if (i.plain) out.push(`▶ 说人话:${i.plain}`);
|
|
480
533
|
if (i.lead) out.push(i.lead);
|
|
481
534
|
// 一页读懂:报告顶部的五条结论,先给读的人一个「整体形状」
|
|
@@ -551,7 +604,9 @@ function computeRaw(args = {}) {
|
|
|
551
604
|
const result = buildZiwei({
|
|
552
605
|
...dt,
|
|
553
606
|
gender: requireGender(args.gender),
|
|
607
|
+
leapMonth: args.leapMonth,
|
|
554
608
|
leapAsNext: args.leapAsNext === true,
|
|
609
|
+
...ziweiSchoolArgs(args),
|
|
555
610
|
longitude: typeof args.longitude === 'number' ? args.longitude : undefined,
|
|
556
611
|
address: typeof args.address === 'string' ? args.address : undefined,
|
|
557
612
|
geo: args.geo && typeof args.geo === 'object' ? args.geo : undefined,
|
|
@@ -702,6 +757,12 @@ function computeRaw(args = {}) {
|
|
|
702
757
|
if (ug.liuqin) {
|
|
703
758
|
const strength = yongshenStrength(result, ug, { monthBranch, dayBranch: result.dayGanZhi.branch });
|
|
704
759
|
if (strength) result.useGodStrength = strength;
|
|
760
|
+
// 伏神出伏条件:飞伏生克叠月建日辰,只判条件、不出应期
|
|
761
|
+
const chufu = fushenAccess(result, ug, { monthBranch, dayBranch: result.dayGanZhi.branch });
|
|
762
|
+
if (chufu) result.fushenAccess = chufu;
|
|
763
|
+
// 应期线索:只列逢值/逢冲/逢合与旬空的出空/冲空,再给快慢方向,不换算日期
|
|
764
|
+
const yq = yingqiWindow(result, ug, { monthBranch });
|
|
765
|
+
if (yq) result.yingqi = yq;
|
|
705
766
|
}
|
|
706
767
|
if (args.seed !== undefined && args.seed !== null && args.seed !== '') result.seed = Number(args.seed);
|
|
707
768
|
return { ...result, ...(asOf ? { asOf } : {}), summary: liuyaoText(result) };
|
|
@@ -802,7 +863,17 @@ function computeRaw(args = {}) {
|
|
|
802
863
|
return { ...result, precision: dt.precision, summary: trendText(result) };
|
|
803
864
|
}
|
|
804
865
|
if (system === 'fengshui') {
|
|
805
|
-
const action = args.action === 'advise' ? 'advise' : 'natal';
|
|
866
|
+
const action = args.action === 'advise' ? 'advise' : args.action === 'xuankong' ? 'xuankong' : 'natal';
|
|
867
|
+
if (action === 'xuankong') {
|
|
868
|
+
const result = buildFengshui({
|
|
869
|
+
action,
|
|
870
|
+
sitting: args.sitting,
|
|
871
|
+
facing: args.facing,
|
|
872
|
+
...(args.period !== undefined ? { period: args.period } : {}),
|
|
873
|
+
...(Number.isInteger(args.fortuneYear) ? { fortuneYear: args.fortuneYear } : {}),
|
|
874
|
+
});
|
|
875
|
+
return { ...result, summary: fengshuiText(result) };
|
|
876
|
+
}
|
|
806
877
|
if (action === 'advise') {
|
|
807
878
|
const result = buildFengshui({
|
|
808
879
|
action,
|
|
@@ -841,6 +912,8 @@ function computeRaw(args = {}) {
|
|
|
841
912
|
givenName: args.givenName,
|
|
842
913
|
limit: args.limit,
|
|
843
914
|
charElements: args.charElements && typeof args.charElements === 'object' ? args.charElements : undefined,
|
|
915
|
+
strokeOverrides: args.strokeOverrides && typeof args.strokeOverrides === 'object' ? args.strokeOverrides : undefined,
|
|
916
|
+
surnameStrokes: args.surnameStrokes && typeof args.surnameStrokes === 'object' ? args.surnameStrokes : undefined,
|
|
844
917
|
...birth,
|
|
845
918
|
...(args.gender === 'male' || args.gender === 'female' ? { gender: args.gender } : {}),
|
|
846
919
|
...(args.datetime ? {
|
|
@@ -1019,6 +1092,25 @@ function trendText(r) {
|
|
|
1019
1092
|
|
|
1020
1093
|
/** 风水文本 */
|
|
1021
1094
|
function fengshuiText(r) {
|
|
1095
|
+
if (r.meta.action === 'xuankong') {
|
|
1096
|
+
const p = r.meta.period;
|
|
1097
|
+
const cell = (palace) => {
|
|
1098
|
+
const x = r.palaces.find((y) => y.palace === palace);
|
|
1099
|
+
return `${palace}${x.yun}/${x.shan}/${x.xiang}`;
|
|
1100
|
+
};
|
|
1101
|
+
const row = (names) => names.map(cell).join(' ');
|
|
1102
|
+
const w = r.wangShanWangXiang;
|
|
1103
|
+
return [
|
|
1104
|
+
`【玄空】${r.meta.periodLabel} 坐 ${r.meta.sitting} 向 ${r.meta.facing}`,
|
|
1105
|
+
`【入中】山盘 ${r.meta.shanCenter.star}${r.meta.shanCenter.name}(${r.meta.shanCenter.fly},${r.meta.shanCenter.basis});向盘 ${r.meta.xiangCenter.star}${r.meta.xiangCenter.name}(${r.meta.xiangCenter.fly},${r.meta.xiangCenter.basis})`,
|
|
1106
|
+
`【九宫】${row(['巽', '离', '坤'])}|${row(['震', '中', '兑'])}|${row(['艮', '坎', '乾'])}`,
|
|
1107
|
+
`【当运】山星${p}到${r.dangYun.shan.text};向星${p}到${r.dangYun.xiang.text}`,
|
|
1108
|
+
`【表法】${w.table.length ? w.table.join('、') : '无'};${w.note}`,
|
|
1109
|
+
`【合十】山星合十 ${r.heshi.shan.join('、') || '无'};向星合十 ${r.heshi.xiang.join('、') || '无'}`,
|
|
1110
|
+
...(r.meta.note ? [`※ ${r.meta.note}`] : []),
|
|
1111
|
+
`※ ${r.disclaimer}`,
|
|
1112
|
+
].join('\n');
|
|
1113
|
+
}
|
|
1022
1114
|
if (r.meta.action === 'advise') {
|
|
1023
1115
|
const match = r.mingMatch
|
|
1024
1116
|
? [`【命宅配】${r.mingMatch.text}`]
|
|
@@ -1051,7 +1143,11 @@ function nameText(r) {
|
|
|
1051
1143
|
if (r.action === 'generate') {
|
|
1052
1144
|
return [
|
|
1053
1145
|
`【候选名】姓 ${r.surname}(${r.gender},喜用 ${r.bazi.favorable.join('、')})${r.bazi.basis}`,
|
|
1054
|
-
...r.candidates.map((c) =>
|
|
1146
|
+
...r.candidates.map((c) => {
|
|
1147
|
+
const wu = c.wuge && c.wuge.available ? ` 五格 ${c.wuge.summary}` : '';
|
|
1148
|
+
const ph = c.phonetics && c.phonetics.available ? ` 音韵 ${c.phonetics.level}(${c.phonetics.tonePattern})` : '';
|
|
1149
|
+
return `${c.rank}. ${c.name} ${c.chars.map((x) => `${x.char}(${x.element})${x.meaning}`).join(' ')}${wu}${ph}`;
|
|
1150
|
+
}),
|
|
1055
1151
|
...r.notes.map((n) => `※ ${n}`),
|
|
1056
1152
|
].join('\n');
|
|
1057
1153
|
}
|
|
@@ -1064,10 +1160,20 @@ function nameText(r) {
|
|
|
1064
1160
|
: '';
|
|
1065
1161
|
return `· ${c.char}:${el}|${fit}|${c.meaning}${sug}`;
|
|
1066
1162
|
};
|
|
1163
|
+
const wu = r.wuge;
|
|
1164
|
+
const wugeLine = wu && wu.available
|
|
1165
|
+
? `【五格】${wu.strokes.map((x) => `${x.char}${x.strokes}画`).join('+')}|${wu.summary}|三才 ${wu.sancai.text}`
|
|
1166
|
+
: `【五格】${wu ? wu.reason : '未算'}`;
|
|
1167
|
+
const ph = r.phonetics;
|
|
1168
|
+
const phLine = ph && ph.available
|
|
1169
|
+
? `【音韵】${ph.chars.map((x) => `${x.char}${x.py}${x.tone}`).join(' ')}|声调 ${ph.tonePattern}|${ph.level}${ph.issues.length ? `:${ph.issues.map((i) => i.text).join(';')}` : ''}`
|
|
1170
|
+
: `【音韵】${ph ? ph.reason : '未算'}`;
|
|
1067
1171
|
return [
|
|
1068
1172
|
`【名字评估】${r.fullName}`,
|
|
1069
1173
|
...r.chars.map(charLine),
|
|
1070
1174
|
r.bazi ? `【八字】日主 ${r.bazi.dayMaster && r.bazi.dayMaster.stem ? `${r.bazi.dayMaster.stem}(${r.bazi.dayMaster.element})` : r.bazi.dayMaster},旺衰 ${r.bazi.strength.level}(${r.bazi.strength.score}),${r.bazi.basis}` : '',
|
|
1175
|
+
wugeLine,
|
|
1176
|
+
phLine,
|
|
1071
1177
|
`【结论】${r.verdict}`,
|
|
1072
1178
|
...r.notes.map((n) => `※ ${n}`),
|
|
1073
1179
|
].filter(Boolean).join('\n');
|
|
@@ -1108,7 +1214,7 @@ export { geocodeAddress, resolveAddress };
|
|
|
1108
1214
|
export { buildBazi, buildLiuyao, tossLines };
|
|
1109
1215
|
export { followup, askPrompt };
|
|
1110
1216
|
export { pastSignals, verifyFit, rectifyBirth };
|
|
1111
|
-
export { crossCheck, crossText };
|
|
1217
|
+
export { crossCheck, crossText, crossSection };
|
|
1112
1218
|
export { buildAlmanac, buildZeri, buildChenggu, buildXiaoliuren, buildStar, buildNumerology, buildConvert };
|
|
1113
1219
|
export { buildTrend, buildFengshui, buildName };
|
|
1114
1220
|
|
|
@@ -15,10 +15,10 @@ export const KNOWLEDGE = [
|
|
|
15
15
|
id: 'bazi-yueling-siquan',
|
|
16
16
|
system: 'bazi', dims: ['overall', 'career'],
|
|
17
17
|
gist: '月令不是「一个月」,是当月最有权的那一个字。',
|
|
18
|
-
detail: '
|
|
18
|
+
detail: '月令藏干按本气、中气、余气分日用事,本气当权的时间最长。所以判旺衰先看日主在月令是得令还是失令——得令者未看全局,已有三分底气。本插件按 30 日表算出「生在本月第几日、哪一干当权」,给的是月内轮值这一层细节;旺衰与取格仍以月令本气、透干与会支为主,不随轮值改判。',
|
|
19
19
|
source: '《子平真诠》论用神;人元司权分日之说见《渊海子平》',
|
|
20
20
|
status: 'variant',
|
|
21
|
-
note: '各家对中气、余气各主几日分法不同(有 7/7/16、9/3/18
|
|
21
|
+
note: '各家对中气、余气各主几日分法不同(有 7/7/16、9/3/18 等多说);本插件固定通行 30 日表(如寅月戊7丙7甲16),节当日为第 1 日,第 31 日以后按本气算、不硬分摊。司权表与本柱藏干表口径不同(子月壬、卯月甲、午月丙、酉月庚、亥月戊只出现在司权表里),两表各照原样;取格不随轮值改判。',
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
id: 'bazi-tonggen-tougan',
|
|
@@ -66,8 +66,8 @@ export const KNOWLEDGE = [
|
|
|
66
66
|
id: 'bazi-suiyun',
|
|
67
67
|
system: 'bazi', dims: ['overall', 'career'],
|
|
68
68
|
gist: '大运管十年基调,流年管当年触发。',
|
|
69
|
-
detail: '
|
|
70
|
-
source: '
|
|
69
|
+
detail: '大运像换了条路,流年像这条路上某一段的天气。岁运并临(当值大运与流年干支相同)、运年反吟(大运与流年天克地冲)、流年伏吟(流年与原局某柱干支相同)与流年反吟(流年与原局某柱天克地冲),是传统上标记「变动较大」的年份,属于提示而非断语。本插件逐年标出四类信号:当值大运按该年立春到次年立春的区间取,交运落在年内时前后两步并列;只标干支重复与对冲,不折分数。原文里「返吟」指岁运与日柱相对、「伏吟」指岁运压日,与本插件「干支相同为伏吟、天克地冲为反吟」不是同一套定义,两者并列、不合并。',
|
|
70
|
+
source: '《三命通会》卷二·总论岁运(https://www.diancang.xyz/xuanxuewushu/sanmingtonghui/7539.html);岁运并临之说出自《渊海子平》',
|
|
71
71
|
status: 'variant',
|
|
72
72
|
note: '「岁运并临主大凶」是流传最广也最被滥用的说法,本插件只作变动提示,不断吉凶;大运与原局之间的伏吟反吟未逐年标注,四柱十神层面的引化也未叠入。',
|
|
73
73
|
},
|
|
@@ -102,8 +102,8 @@ export const KNOWLEDGE = [
|
|
|
102
102
|
id: 'bazi-sanming-duizhao',
|
|
103
103
|
system: 'bazi', dims: ['overall', 'career'],
|
|
104
104
|
gist: '同一个格,子平真诠讲怎么用,三命通会讲怎么取。',
|
|
105
|
-
detail: '
|
|
106
|
-
source: '
|
|
105
|
+
detail: '两书不是谁替代谁:子平真诠以月令取用神、论顺逆成败,重「用」;三命通会按十神逐格立论,重「取」与「忌」。同看正官格,前者问财印护官、伤煞混杂,后者先说「止许一位,多则不宜」。此本正财、偏财分章,两格各取本格一条;七杀没有单列「论偏官」,取卷五「官煞去留杂论」讲混杂时的去留。本插件把两条并列,不合并成一句断语。',
|
|
106
|
+
source: '《子平真诠》论正官等篇;《三命通会》卷五、卷六论十神与官煞去留',
|
|
107
107
|
status: 'variant',
|
|
108
108
|
note: '两书成书年代与流派不同,用语有出入;本插件照录通行本,不做校勘改字,也不替两家调和。',
|
|
109
109
|
},
|
|
@@ -125,6 +125,42 @@ export const KNOWLEDGE = [
|
|
|
125
125
|
status: 'variant',
|
|
126
126
|
note: '化气格成立条件各家宽严不一(是否要求月令为化神、日主是否允许有根),本插件只列条件、附原文,不据此断定化气已成。',
|
|
127
127
|
},
|
|
128
|
+
{
|
|
129
|
+
id: 'bazi-zaji-quyong',
|
|
130
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
131
|
+
gist: '辰戌丑未是杂气月:先看透干,再看会支。',
|
|
132
|
+
detail: '四墓(辰戌丑未)每个字都藏着不止一气,用神不一,所以叫杂气。子平真诠的取法是:藏干透到天干的先用(甲生辰月,透戊用偏财、透癸用正印、透乙用月劫);没有透干,再看地支有没有与月支会成三合局(辰月逢申子会水,就取水印)。本插件按「透干 → 三合会支 → 本气」的次序取格,依据里写明走的是哪一条,并把《论杂气如何取用》附在结果里。',
|
|
133
|
+
source: '《子平真诠》十六、论杂气如何取用',
|
|
134
|
+
status: 'variant',
|
|
135
|
+
note: '原文说「兼透则兼用」,但只给一个格名时总要落到一个藏干;本插件只取最先透出的那一干,会支也只认三合、不认三会方,且不判原文所说的「有情 / 无情」,取舍次序各家另有说法。',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: 'bazi-zhuanwang-yuanwen',
|
|
139
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
140
|
+
gist: '专旺五格各有专章:成格要看局全带印,不只看身强。',
|
|
141
|
+
detail: '三命通会卷六曲直、炎上、从革、润下、稼穑五篇各立一格:曲直须亥卯未带亥,炎上须寅午戌带寅,从革须巳酉丑带丙丁巳午,润下须申子辰全,稼穑取四季土。原文的条件都比「身强」细:要局全、要带印或带火炼金,还要防冲刑死绝。本插件把命中的那一篇附在结果里,只作结构说明。',
|
|
142
|
+
source: '《三命通会》卷六·曲直、炎上、从革、润下、稼穑',
|
|
143
|
+
status: 'variant',
|
|
144
|
+
note: '专旺是否必须成方局、是否允许一点官杀财,各家宽严不一;原文五篇之间条件也不齐(润下重忌冲刑、稼穑重四季土)。本插件只按「同类+印 ≥5、官杀财皆弱」列出并附原文,不据此断贵贱,也不补专旺的破格条件。',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 'bazi-congge-yuanwen',
|
|
148
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
149
|
+
gist: '从格是身无归处才「弃命」相从:一见根气就破格。',
|
|
150
|
+
detail: '三命通会卷五弃命从煞、卷六弃命从财各有一篇:从煞要煞重身柔、四柱无一点比肩印绶;从财要财会成局、日干无气,原文说「若逢根气,命损无猜」。两篇都说行运喜财煞旺地、忌扶身。本插件只在盘面出现从财格或从杀格时附上对应原文;从儿、从强没有单章,不硬凑。',
|
|
151
|
+
source: '《三命通会》卷五·弃命从煞;卷六·弃命从财',
|
|
152
|
+
status: 'variant',
|
|
153
|
+
note: '从格成立条件各家分歧很大:是否允许日主有微根、阴阳干从与不从(原文说阳木不能从)、从儿与从强算不算正从,说法不一。本插件只列结构与原文,不据此断吉凶,也不补从儿、从强的原文。',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: 'bazi-tongguan',
|
|
157
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
158
|
+
gist: '两神相战要有中间一行接上,对峙才化成相生。',
|
|
159
|
+
detail: '用神与忌神两行在局中各 ≥1.5 分、又正好相克时,五行里只有一行能接上:克方生它、它再生被克方(金克木则以水为关,土克水则以金为关)。滴天髓用织女、牛郎隔关相望作比,说「此关若通也,相邀入洞房」。本插件只按局中分量点出这一行,并写明它是不是忌神。',
|
|
160
|
+
source: '《滴天髓》通神论·通关;五行生克为通行说',
|
|
161
|
+
status: 'variant',
|
|
162
|
+
note: '各家对「两神相战」取哪两神不一(有取日主与官杀、有取用神与忌神、有取局中最旺两行),本插件固定取「用神与克它的忌神,且两行各 ≥1.5 分」;通关一行只按五行生克唯一确定,不据此断吉凶,也不判通关之力是否够用。',
|
|
163
|
+
},
|
|
128
164
|
|
|
129
165
|
// ── 紫微 ──────────────────────────────────────────────
|
|
130
166
|
{
|
|
@@ -236,10 +272,10 @@ export const KNOWLEDGE = [
|
|
|
236
272
|
id: 'liuyao-fushen',
|
|
237
273
|
system: 'liuyao', dims: ['overall'],
|
|
238
274
|
gist: '用神不上卦,就去本宫首卦的同位取伏神。',
|
|
239
|
-
detail: '
|
|
275
|
+
detail: '本卦六爻里没有用神那一类六亲,就叫用神不上卦。取法是回到本卦所属宫的首卦(八纯卦),找出该六亲所在的爻位,那一爻即伏神,本卦同一爻位上的爻叫飞神。伏神要「得出」才有用:飞神生伏神、伏神克飞神、日月生扶都算得力;飞神克伏神则受压难出。本插件给出伏神爻位、干支五行、飞伏生克,并按月建日辰归成四档出伏条件(可出 / 有助有压 / 受压难出 / 未得助);只判条件,不出应期日期。',
|
|
240
276
|
source: '《卜筮正宗》伏神章;《增删卜易》伏神篇',
|
|
241
277
|
status: 'variant',
|
|
242
|
-
note: '
|
|
278
|
+
note: '首卦里同一六亲也可能出现两次(如乾宫乾为天的父母在三爻与上爻),此时取哪一爻为伏神各家不一;本插件把候选都列出并标「伏神两现」,不代选。出伏条件的归并口径:飞生伏、伏克飞、日辰生/比和、月建旺/相算助,飞克伏、日辰克、月破算压;有助无压为「可出」,有助有压为「有助有压」,有压无助为「受压难出」,两者都无为「未得助」。四档只并列条件、不排各家优先级;旬空只标出,不并入档位。应期各家分歧更大,仍不输出日期。',
|
|
243
279
|
},
|
|
244
280
|
{
|
|
245
281
|
id: 'liuyao-yongshen-shuai',
|
|
@@ -263,10 +299,10 @@ export const KNOWLEDGE = [
|
|
|
263
299
|
id: 'liuyao-yingqi',
|
|
264
300
|
system: 'liuyao', dims: ['overall', 'career'],
|
|
265
301
|
gist: '应期是「什么时候见分晓」,不是「哪天」。',
|
|
266
|
-
detail: '
|
|
302
|
+
detail: '近事以日计、远事以月计;常见取法是等用神逢值、逢冲、逢合之期,或等忌神受制之期。本插件只做前一半:把用神(不上卦则取伏神)的逢值、逢冲、逢合三支列出,旬空另标出空与冲空,再按月建五态给「偏速 / 偏缓 / 待解 / 未定」一个快慢方向;忌神受制与具体日期仍未做。应期法各家互有出入,同一卦不同取法可以差出很远,所以只作时间窗口的提示。',
|
|
267
303
|
source: '《卜筮正宗》应期章;《增删卜易》',
|
|
268
304
|
status: 'variant',
|
|
269
|
-
note: '
|
|
305
|
+
note: '应期取法(值日、冲、合、填实、旬空出空)各家优先级不同,本插件只并列触发支、不排先后,也不换算日期;近事以日计、远事以月计,用哪把尺由事情远近决定,不代选。',
|
|
270
306
|
},
|
|
271
307
|
{
|
|
272
308
|
id: 'liuyao-liushen',
|
|
@@ -423,10 +459,10 @@ export const KNOWLEDGE = [
|
|
|
423
459
|
id: 'liuyao-yingqi-exact',
|
|
424
460
|
system: 'liuyao', dims: [],
|
|
425
461
|
gist: '具体应期(哪一天应验)本插件尚未推算。',
|
|
426
|
-
detail: '
|
|
462
|
+
detail: '应期需要综合用神旺衰、动变、旬空出空、日月冲合多层条件,且各家取法不同。当前只给时间窗口的方向性提示(逢值 / 逢冲 / 逢合的触发支,加一个快慢方向),不给具体日期——与其给一个看起来精确、实则拍脑袋的日子,不如留白。',
|
|
427
463
|
source: '待补:《卜筮正宗》应期章逐条实现 + 已录 128 条卦例对拍(源 138 条)',
|
|
428
464
|
status: 'todo',
|
|
429
|
-
note: '扩展方向:用《卜筮正宗》卦例里有明确应验日期的条目做回归,先验证再输出。',
|
|
465
|
+
note: '扩展方向:用《卜筮正宗》卦例里有明确应验日期的条目做回归,先验证再输出。0.50.0 已给出触发支与快慢方向,仍不输出日期。',
|
|
430
466
|
},
|
|
431
467
|
];
|
|
432
468
|
|