dsh-metaphysics 0.34.0 → 0.46.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.
- package/CHANGELOG.md +310 -3
- package/README.md +65 -26
- package/client.js +3293 -288
- package/docs/assets/dsh-metaphysics-group.png +0 -0
- package/engine/bazi-words.js +174 -0
- package/engine/bazi.js +48 -2
- package/engine/classics.js +256 -11
- package/engine/fengshui.js +197 -11
- package/engine/followup.js +82 -0
- package/engine/geju.js +41 -0
- package/engine/index.js +149 -22
- package/engine/interpret-knowledge.js +79 -6
- package/engine/interpret-plain.js +367 -279
- package/engine/interpret.js +365 -32
- package/engine/liuyao.js +230 -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 +373 -39
- package/index.js +65 -9
- package/locale/zh.json +1 -1
- package/package.json +16 -14
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +4097 -605
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 } from './liuyao.js';
|
|
4
|
-
import { buildZiwei, BRIGHTNESS, flowOf, asOfParts } from './ziwei.js';
|
|
3
|
+
import { buildLiuyao, tossLines, bodyLabels, yongshenOf, yongshenStrength, fushenAccess, hexagramStrength, jinTuiPower } 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';
|
|
@@ -12,7 +12,7 @@ import { geocodeAddress, resolveAddress } from './geo.js';
|
|
|
12
12
|
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
|
-
import { followup } from './followup.js';
|
|
15
|
+
import { followup, askPrompt } from './followup.js';
|
|
16
16
|
import { crossCheck, crossText } from './crosscheck.js';
|
|
17
17
|
import { pastSignals, verifyFit } from './verify.js';
|
|
18
18
|
import { rectifyBirth } from './rectify.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()) {
|
|
@@ -136,12 +151,35 @@ function baziText(r) {
|
|
|
136
151
|
`大运:${r.dayun.rule}(${r.dayun.direction}),${r.dayun.startAge.years}岁${r.dayun.startAge.months}个月起运${jiao}`,
|
|
137
152
|
` ${dayun}`,
|
|
138
153
|
`流年:${r.liunian.slice(0, 10).map((l) => `${l.year}${l.ganzhi}(${l.stemTenGod})${l.luck ? `·${l.luck.tier}` : ''}`).join(' ')}`,
|
|
154
|
+
(() => {
|
|
155
|
+
const hits = r.liunian.filter((l) => l.suiyun && l.suiyun.signals && l.suiyun.signals.length);
|
|
156
|
+
if (!hits.length) return '岁运提示:近十年无岁运并临、运年反吟或流年伏吟/反吟(只标干支,不判吉凶)';
|
|
157
|
+
const label = (s) => `${s.type}${s.type.startsWith('流年') && s.target ? `(${s.target})` : ''}`;
|
|
158
|
+
return '岁运提示(只标干支变动,不判吉凶):' + hits
|
|
159
|
+
.map((l) => `${l.year}${l.ganzhi} ${l.suiyun.signals.map(label).join('/')}`).join(';');
|
|
160
|
+
})(),
|
|
139
161
|
'(格局、用神、行运吉凶为扶抑+简化调候的量化提示,非断语。)',
|
|
140
162
|
].join('\n') + near;
|
|
141
163
|
}
|
|
142
164
|
|
|
143
165
|
function ziweiText(r) {
|
|
144
|
-
|
|
166
|
+
// 闰月:日期按「闰X月」原样写;换算过起盘月时再附一句,免得把 21 日写成「闰5月21日」
|
|
167
|
+
const rawMonth = r.lunar.monthRaw || r.lunar.month;
|
|
168
|
+
const lunarText = `${r.lunar.year}年${r.lunar.isLeap ? `闰${rawMonth}` : r.lunar.month}月${r.lunar.day}日`
|
|
169
|
+
+ (r.lunar.isLeap && r.lunar.month !== rawMonth ? `(按${r.lunar.month}月起盘)` : '');
|
|
170
|
+
// 只在显式改动流派时补一行,默认盘不增加噪音
|
|
171
|
+
const schoolLine = (() => {
|
|
172
|
+
if (!r.schools) return '';
|
|
173
|
+
const labels = {
|
|
174
|
+
brightnessSchool: '亮度', gengYearSihua: '庚干四化', tianmaSchool: '天马', tiankongSchool: '天空',
|
|
175
|
+
jiekongSchool: '截空', kuiyueSchool: '魁钺', tianshiTianshang: '天伤天使',
|
|
176
|
+
changshengSchool: '长生', lateZishi: '晚子时',
|
|
177
|
+
};
|
|
178
|
+
const diff = Object.entries(labels)
|
|
179
|
+
.filter(([key]) => r.schools[key] && r.schools[key] !== ZIWEI_SCHOOL_DEFAULTS[key])
|
|
180
|
+
.map(([key, label]) => `${label} ${r.schools[key]}`);
|
|
181
|
+
return diff.length ? `【流派】${diff.join(' ')}` : '';
|
|
182
|
+
})();
|
|
145
183
|
const starText = (stars) => (stars.length
|
|
146
184
|
? stars.map((s) => `${s.name}${s.mutagen ? `化${s.mutagen}` : ''}`).join(' ')
|
|
147
185
|
: '—');
|
|
@@ -174,15 +212,29 @@ function ziweiText(r) {
|
|
|
174
212
|
const text = ['禄', '权', '科', '忌'].map(one).filter(Boolean).join(' ');
|
|
175
213
|
return text ? `【命宫飞星】${text}` : '';
|
|
176
214
|
})();
|
|
215
|
+
// 三方四正一起飞:四宫的 16 条飞化按落宫归堆,只看会聚
|
|
216
|
+
const flyCompositeLine = (() => {
|
|
217
|
+
const fc = r.flyComposite;
|
|
218
|
+
if (!fc || !Array.isArray(fc.sources) || !fc.sources.length) return '';
|
|
219
|
+
const groups = fc.labels.length ? fc.labels.join(' · ') : '无同宫会聚';
|
|
220
|
+
const detail = ['禄', '权', '科', '忌'].map((t) => {
|
|
221
|
+
const list = ((fc.byType && fc.byType[t]) || []).filter((x) => !x.self);
|
|
222
|
+
const tos = [...new Set(list.map((x) => String(x.to).replace(/宫$/, '')))];
|
|
223
|
+
return tos.length ? `${t}→${tos.join('/')}` : '';
|
|
224
|
+
}).filter(Boolean).join(' ');
|
|
225
|
+
return `【三方四正飞化】${fc.sanfang.join('·')}:${groups}${detail ? ` ${detail}` : ''}`;
|
|
226
|
+
})();
|
|
177
227
|
return [
|
|
178
228
|
`【农历】${lunarText}(月首 ${r.lunar.monthStart}) 时支:${r.hourBranch} 年干支:${r.yearGanzhi}`,
|
|
179
229
|
`【时刻】${r.solarTime ? `${r.solarTime.civilText} → 真太阳时 ${r.solarTime.trueSolarText}${r.input.geo ? '(' + r.input.geo.note + ')' : ''}` : ''}`,
|
|
180
230
|
`【命宫】${r.soul.branch}(${r.soul.ganzhi}·${r.soul.nayin}) 【身宫】${r.body.branch}(落${r.body.lands}) 【五行局】${r.bureau.name}`,
|
|
181
231
|
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}`,
|
|
182
232
|
`【大限】${r.daxian.rule},${r.daxian.startAge}岁起 【小限】${r.xiaoxianRule.direction}`,
|
|
233
|
+
schoolLine,
|
|
183
234
|
`【昌曲】文昌${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 : ''})`,
|
|
184
235
|
` ${r.changqu.relation} 入命三方:${r.changqu.inSoulSanfang ? '是' : '否'} 吸收面:${r.changqu.absorb.label}(${r.changqu.absorb.reason})`,
|
|
185
236
|
flyLine,
|
|
237
|
+
flyCompositeLine,
|
|
186
238
|
'十二宫:',
|
|
187
239
|
...rows,
|
|
188
240
|
'大限(按起运年龄排序,前 8 限,宫干四化落宫):',
|
|
@@ -190,7 +242,7 @@ function ziweiText(r) {
|
|
|
190
242
|
'流年(前 6 年,完整 12 年在结构化数据里):',
|
|
191
243
|
...liunian,
|
|
192
244
|
`【格局】${patterns}`,
|
|
193
|
-
r.patternSummary ? `【结构统计】吉格 ${r.patternSummary.good.length}、忌格 ${r.patternSummary.bad.length};${r.patternSummary.note}` : '',
|
|
245
|
+
r.patternSummary ? `【结构统计】吉格 ${r.patternSummary.good.length}、中性 ${r.patternSummary.neutral.length}、忌格 ${r.patternSummary.bad.length};${r.patternSummary.note}` : '',
|
|
194
246
|
r.lunar.note ? `注:${r.lunar.note}` : '',
|
|
195
247
|
].filter(Boolean).join('\n');
|
|
196
248
|
}
|
|
@@ -335,9 +387,27 @@ function liuyaoText(r) {
|
|
|
335
387
|
const m = strength.month && strength.month.branch ? `月建 ${strength.month.branch}(${strength.month.element}) ` : '';
|
|
336
388
|
out.push(`用神旺衰:${m}${strength.labels.join(' · ')}`);
|
|
337
389
|
}
|
|
390
|
+
// 伏神出伏条件:只在用神不上卦时出现;只归条件档,不给应期
|
|
391
|
+
const chufu = r.fushenAccess;
|
|
392
|
+
if (chufu && Array.isArray(chufu.labels) && chufu.labels.length) {
|
|
393
|
+
out.push(`伏神出伏:${chufu.labels.join(' · ')}`);
|
|
394
|
+
}
|
|
338
395
|
} else {
|
|
339
396
|
out.push('用神:未取(未指明所问之事;用「询问方向」指定后即按六亲取用)');
|
|
340
397
|
}
|
|
398
|
+
// 全卦逐爻旺衰:不挑用神,六爻都给状态,世应、动爻、旬空另标
|
|
399
|
+
const hexSt = r.hexStrength;
|
|
400
|
+
if (hexSt && Array.isArray(hexSt.labels) && hexSt.labels.length) {
|
|
401
|
+
const m = hexSt.month && hexSt.month.branch
|
|
402
|
+
? `月建 ${hexSt.month.branch}(${hexSt.month.element}) `
|
|
403
|
+
: '无月建(未给起卦时间) ';
|
|
404
|
+
out.push(`全卦旺衰:${m}${hexSt.labels.join(' · ')}`);
|
|
405
|
+
}
|
|
406
|
+
// 化进/化退的力重:单列一行,免得跟卦体标签混着读
|
|
407
|
+
const jt = r.jinTuiPower;
|
|
408
|
+
if (jt && Array.isArray(jt.lines) && jt.lines.length) {
|
|
409
|
+
out.push(`进退力重:${jt.lines.map((l) => `${l.position}爻${l.from}→${l.to}${l.type}·${l.verdict}`).join(' · ')}`);
|
|
410
|
+
}
|
|
341
411
|
return out.filter(Boolean).join('\n');
|
|
342
412
|
}
|
|
343
413
|
|
|
@@ -388,7 +458,7 @@ export function compute(args = {}) {
|
|
|
388
458
|
};
|
|
389
459
|
const asOf = checkAsOf(args.asOf);
|
|
390
460
|
const other = r.system === 'bazi'
|
|
391
|
-
? buildZiwei({ ...common, leapAsNext: args.leapAsNext === true, asOf })
|
|
461
|
+
? buildZiwei({ ...common, leapMonth: args.leapMonth, leapAsNext: args.leapAsNext === true, ...ziweiSchoolArgs(args), asOf })
|
|
392
462
|
: buildBazi({ ...common, lateZi: args.lateZi !== false, nowYear: asOf ? asOf.year : undefined });
|
|
393
463
|
r.cross = crossCheck(r.system === 'bazi' ? r : other, r.system === 'ziwei' ? r : other);
|
|
394
464
|
if (r.interpret) {
|
|
@@ -441,8 +511,9 @@ export function compute(args = {}) {
|
|
|
441
511
|
export function interpretText(i) {
|
|
442
512
|
if (!i) return '';
|
|
443
513
|
const out = [`【${i.title || '解析与详解'}】${i.ask && i.ask.echo ? i.ask.echo : ''}`];
|
|
444
|
-
//
|
|
445
|
-
|
|
514
|
+
// 直答放在最前:先回答「你问的事」,再说依据,避免读者读到最后才知道结论;
|
|
515
|
+
// 没填问题时就不该喊「答所问」——改为「先看结论」,否则是一句假话
|
|
516
|
+
if (i.answer) out.push(`▶ ${i.ask && i.ask.question ? '先答所问' : '先看结论'}:${i.answer}`);
|
|
446
517
|
if (i.plain) out.push(`▶ 说人话:${i.plain}`);
|
|
447
518
|
if (i.lead) out.push(i.lead);
|
|
448
519
|
// 一页读懂:报告顶部的五条结论,先给读的人一个「整体形状」
|
|
@@ -518,7 +589,9 @@ function computeRaw(args = {}) {
|
|
|
518
589
|
const result = buildZiwei({
|
|
519
590
|
...dt,
|
|
520
591
|
gender: requireGender(args.gender),
|
|
592
|
+
leapMonth: args.leapMonth,
|
|
521
593
|
leapAsNext: args.leapAsNext === true,
|
|
594
|
+
...ziweiSchoolArgs(args),
|
|
522
595
|
longitude: typeof args.longitude === 'number' ? args.longitude : undefined,
|
|
523
596
|
address: typeof args.address === 'string' ? args.address : undefined,
|
|
524
597
|
geo: args.geo && typeof args.geo === 'object' ? args.geo : undefined,
|
|
@@ -649,20 +722,29 @@ function computeRaw(args = {}) {
|
|
|
649
722
|
}
|
|
650
723
|
// 用神挂在结果上:摘要、面板、解析三层读同一份,避免各自取一次走散
|
|
651
724
|
const ug = yongshenOf(result, { direction: args.direction, gender: args.gender });
|
|
652
|
-
if (ug.liuqin)
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
monthBranch = null;
|
|
662
|
-
}
|
|
725
|
+
if (ug.liuqin) result.useGod = ug;
|
|
726
|
+
// 月建按节气换月、与八字同源:从同一个 snapshot 取月支,取不到就只按日辰算
|
|
727
|
+
let monthBranch = null;
|
|
728
|
+
if (stamp) {
|
|
729
|
+
try {
|
|
730
|
+
const snap = buildSnapshot({ year: stamp.year, month: stamp.month, day: stamp.day, hour: stamp.hour, minute: stamp.minute });
|
|
731
|
+
monthBranch = (snap.monthGanZhi || '')[1] || null;
|
|
732
|
+
} catch {
|
|
733
|
+
monthBranch = null;
|
|
663
734
|
}
|
|
735
|
+
}
|
|
736
|
+
// 全卦逐爻旺衰不依赖用神:没指定所问之事也要能看整张卦的气
|
|
737
|
+
const hexStrength = hexagramStrength(result, { monthBranch, dayBranch: result.dayGanZhi.branch });
|
|
738
|
+
if (hexStrength) result.hexStrength = hexStrength;
|
|
739
|
+
// 化进/化退的力重:与旺衰同一套五态/五关系,只说走不走得动
|
|
740
|
+
const jtPower = jinTuiPower(result, { monthBranch, dayBranch: result.dayGanZhi.branch });
|
|
741
|
+
if (jtPower) result.jinTuiPower = jtPower;
|
|
742
|
+
if (ug.liuqin) {
|
|
664
743
|
const strength = yongshenStrength(result, ug, { monthBranch, dayBranch: result.dayGanZhi.branch });
|
|
665
744
|
if (strength) result.useGodStrength = strength;
|
|
745
|
+
// 伏神出伏条件:飞伏生克叠月建日辰,只判条件、不出应期
|
|
746
|
+
const chufu = fushenAccess(result, ug, { monthBranch, dayBranch: result.dayGanZhi.branch });
|
|
747
|
+
if (chufu) result.fushenAccess = chufu;
|
|
666
748
|
}
|
|
667
749
|
if (args.seed !== undefined && args.seed !== null && args.seed !== '') result.seed = Number(args.seed);
|
|
668
750
|
return { ...result, ...(asOf ? { asOf } : {}), summary: liuyaoText(result) };
|
|
@@ -763,7 +845,17 @@ function computeRaw(args = {}) {
|
|
|
763
845
|
return { ...result, precision: dt.precision, summary: trendText(result) };
|
|
764
846
|
}
|
|
765
847
|
if (system === 'fengshui') {
|
|
766
|
-
const action = args.action === 'advise' ? 'advise' : 'natal';
|
|
848
|
+
const action = args.action === 'advise' ? 'advise' : args.action === 'xuankong' ? 'xuankong' : 'natal';
|
|
849
|
+
if (action === 'xuankong') {
|
|
850
|
+
const result = buildFengshui({
|
|
851
|
+
action,
|
|
852
|
+
sitting: args.sitting,
|
|
853
|
+
facing: args.facing,
|
|
854
|
+
...(args.period !== undefined ? { period: args.period } : {}),
|
|
855
|
+
...(Number.isInteger(args.fortuneYear) ? { fortuneYear: args.fortuneYear } : {}),
|
|
856
|
+
});
|
|
857
|
+
return { ...result, summary: fengshuiText(result) };
|
|
858
|
+
}
|
|
767
859
|
if (action === 'advise') {
|
|
768
860
|
const result = buildFengshui({
|
|
769
861
|
action,
|
|
@@ -802,6 +894,8 @@ function computeRaw(args = {}) {
|
|
|
802
894
|
givenName: args.givenName,
|
|
803
895
|
limit: args.limit,
|
|
804
896
|
charElements: args.charElements && typeof args.charElements === 'object' ? args.charElements : undefined,
|
|
897
|
+
strokeOverrides: args.strokeOverrides && typeof args.strokeOverrides === 'object' ? args.strokeOverrides : undefined,
|
|
898
|
+
surnameStrokes: args.surnameStrokes && typeof args.surnameStrokes === 'object' ? args.surnameStrokes : undefined,
|
|
805
899
|
...birth,
|
|
806
900
|
...(args.gender === 'male' || args.gender === 'female' ? { gender: args.gender } : {}),
|
|
807
901
|
...(args.datetime ? {
|
|
@@ -980,6 +1074,25 @@ function trendText(r) {
|
|
|
980
1074
|
|
|
981
1075
|
/** 风水文本 */
|
|
982
1076
|
function fengshuiText(r) {
|
|
1077
|
+
if (r.meta.action === 'xuankong') {
|
|
1078
|
+
const p = r.meta.period;
|
|
1079
|
+
const cell = (palace) => {
|
|
1080
|
+
const x = r.palaces.find((y) => y.palace === palace);
|
|
1081
|
+
return `${palace}${x.yun}/${x.shan}/${x.xiang}`;
|
|
1082
|
+
};
|
|
1083
|
+
const row = (names) => names.map(cell).join(' ');
|
|
1084
|
+
const w = r.wangShanWangXiang;
|
|
1085
|
+
return [
|
|
1086
|
+
`【玄空】${r.meta.periodLabel} 坐 ${r.meta.sitting} 向 ${r.meta.facing}`,
|
|
1087
|
+
`【入中】山盘 ${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})`,
|
|
1088
|
+
`【九宫】${row(['巽', '离', '坤'])}|${row(['震', '中', '兑'])}|${row(['艮', '坎', '乾'])}`,
|
|
1089
|
+
`【当运】山星${p}到${r.dangYun.shan.text};向星${p}到${r.dangYun.xiang.text}`,
|
|
1090
|
+
`【表法】${w.table.length ? w.table.join('、') : '无'};${w.note}`,
|
|
1091
|
+
`【合十】山星合十 ${r.heshi.shan.join('、') || '无'};向星合十 ${r.heshi.xiang.join('、') || '无'}`,
|
|
1092
|
+
...(r.meta.note ? [`※ ${r.meta.note}`] : []),
|
|
1093
|
+
`※ ${r.disclaimer}`,
|
|
1094
|
+
].join('\n');
|
|
1095
|
+
}
|
|
983
1096
|
if (r.meta.action === 'advise') {
|
|
984
1097
|
const match = r.mingMatch
|
|
985
1098
|
? [`【命宅配】${r.mingMatch.text}`]
|
|
@@ -1012,7 +1125,11 @@ function nameText(r) {
|
|
|
1012
1125
|
if (r.action === 'generate') {
|
|
1013
1126
|
return [
|
|
1014
1127
|
`【候选名】姓 ${r.surname}(${r.gender},喜用 ${r.bazi.favorable.join('、')})${r.bazi.basis}`,
|
|
1015
|
-
...r.candidates.map((c) =>
|
|
1128
|
+
...r.candidates.map((c) => {
|
|
1129
|
+
const wu = c.wuge && c.wuge.available ? ` 五格 ${c.wuge.summary}` : '';
|
|
1130
|
+
const ph = c.phonetics && c.phonetics.available ? ` 音韵 ${c.phonetics.level}(${c.phonetics.tonePattern})` : '';
|
|
1131
|
+
return `${c.rank}. ${c.name} ${c.chars.map((x) => `${x.char}(${x.element})${x.meaning}`).join(' ')}${wu}${ph}`;
|
|
1132
|
+
}),
|
|
1016
1133
|
...r.notes.map((n) => `※ ${n}`),
|
|
1017
1134
|
].join('\n');
|
|
1018
1135
|
}
|
|
@@ -1025,10 +1142,20 @@ function nameText(r) {
|
|
|
1025
1142
|
: '';
|
|
1026
1143
|
return `· ${c.char}:${el}|${fit}|${c.meaning}${sug}`;
|
|
1027
1144
|
};
|
|
1145
|
+
const wu = r.wuge;
|
|
1146
|
+
const wugeLine = wu && wu.available
|
|
1147
|
+
? `【五格】${wu.strokes.map((x) => `${x.char}${x.strokes}画`).join('+')}|${wu.summary}|三才 ${wu.sancai.text}`
|
|
1148
|
+
: `【五格】${wu ? wu.reason : '未算'}`;
|
|
1149
|
+
const ph = r.phonetics;
|
|
1150
|
+
const phLine = ph && ph.available
|
|
1151
|
+
? `【音韵】${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(';')}` : ''}`
|
|
1152
|
+
: `【音韵】${ph ? ph.reason : '未算'}`;
|
|
1028
1153
|
return [
|
|
1029
1154
|
`【名字评估】${r.fullName}`,
|
|
1030
1155
|
...r.chars.map(charLine),
|
|
1031
1156
|
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}` : '',
|
|
1157
|
+
wugeLine,
|
|
1158
|
+
phLine,
|
|
1032
1159
|
`【结论】${r.verdict}`,
|
|
1033
1160
|
...r.notes.map((n) => `※ ${n}`),
|
|
1034
1161
|
].filter(Boolean).join('\n');
|
|
@@ -1067,7 +1194,7 @@ export function renderText(result) {
|
|
|
1067
1194
|
export { geocodeAddress, resolveAddress };
|
|
1068
1195
|
|
|
1069
1196
|
export { buildBazi, buildLiuyao, tossLines };
|
|
1070
|
-
export { followup };
|
|
1197
|
+
export { followup, askPrompt };
|
|
1071
1198
|
export { pastSignals, verifyFit, rectifyBirth };
|
|
1072
1199
|
export { crossCheck, crossText };
|
|
1073
1200
|
export { buildAlmanac, buildZeri, buildChenggu, buildXiaoliuren, buildStar, buildNumerology, buildConvert };
|
|
@@ -66,10 +66,10 @@ export const KNOWLEDGE = [
|
|
|
66
66
|
id: 'bazi-suiyun',
|
|
67
67
|
system: 'bazi', dims: ['overall', 'career'],
|
|
68
68
|
gist: '大运管十年基调,流年管当年触发。',
|
|
69
|
-
detail: '
|
|
69
|
+
detail: '大运像换了条路,流年像这条路上某一段的天气。岁运并临(当值大运与流年干支相同)、运年反吟(大运与流年天克地冲)、流年伏吟(流年与原局某柱干支相同)与流年反吟(流年与原局某柱天克地冲),是传统上标记「变动较大」的年份,属于提示而非断语。本插件逐年标出四类信号:当值大运按该年立春到次年立春的区间取,交运落在年内时前后两步并列;只标干支重复与对冲,不折分数。',
|
|
70
70
|
source: '岁运并临、伏吟反吟见《三命通会》《渊海子平》',
|
|
71
71
|
status: 'variant',
|
|
72
|
-
note: '
|
|
72
|
+
note: '「岁运并临主大凶」是流传最广也最被滥用的说法,本插件只作变动提示,不断吉凶;大运与原局之间的伏吟反吟未逐年标注,四柱十神层面的引化也未叠入。',
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
75
|
id: 'bazi-liuqin',
|
|
@@ -98,6 +98,61 @@ export const KNOWLEDGE = [
|
|
|
98
98
|
status: 'settled',
|
|
99
99
|
},
|
|
100
100
|
|
|
101
|
+
{
|
|
102
|
+
id: 'bazi-sanming-duizhao',
|
|
103
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
104
|
+
gist: '同一个格,子平真诠讲怎么用,三命通会讲怎么取。',
|
|
105
|
+
detail: '两书不是谁替代谁:子平真诠以月令取用神、论顺逆成败,重「用」;三命通会按十神逐格立论,重「取」与「忌」。同看正官格,前者问财印护官、伤煞混杂,后者先说「止许一位,多则不宜」。此本正财、偏财分章,两格各取本格一条;七杀没有单列「论偏官」,取卷五「官煞去留杂论」讲混杂时的去留。本插件把两条并列,不合并成一句断语。',
|
|
106
|
+
source: '《子平真诠》论正官等篇;《三命通会》卷五、卷六论十神与官煞去留',
|
|
107
|
+
status: 'variant',
|
|
108
|
+
note: '两书成书年代与流派不同,用语有出入;本插件照录通行本,不做校勘改字,也不替两家调和。',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: 'bazi-geju-chengbai',
|
|
112
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
113
|
+
gist: '格有成有败:成中带忌会打折,败中有救还能转成。',
|
|
114
|
+
detail: '月令取到格只是起点。成格要看有没有带忌——官逢财又逢伤、官透而被合、财旺生官又逢伤,都会把成格打折;败格也看有没有救应——印来解伤、合来清煞、劫来解财,败中可转。所以判格不能只报一个格名。',
|
|
115
|
+
source: '《子平真诠》九、论用神成败救应',
|
|
116
|
+
status: 'variant',
|
|
117
|
+
note: '各家对成格条件与带忌轻重的排序不同(有先看刑冲、有先看合化),本插件只把原文与成败方向并列摆出,不逐盘判成破。',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: 'bazi-huagi-bianhua',
|
|
121
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
122
|
+
gist: '月令用神会因合化而变:同一个起点,取用可以不同。',
|
|
123
|
+
detail: '用神本从月令取,但月令藏干不一,透出的字不同、支会合局不同,取用就跟着变:丁生亥月本为正官,支全卯未化为印;己生申月本属伤官,藏庚透壬化为财。所以看到化气格,要回头核对月令与合局,不能只按本气定格。',
|
|
124
|
+
source: '《子平真诠》十、论用神变化;化气条件各家另论',
|
|
125
|
+
status: 'variant',
|
|
126
|
+
note: '化气格成立条件各家宽严不一(是否要求月令为化神、日主是否允许有根),本插件只列条件、附原文,不据此断定化气已成。',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: 'bazi-zhuanwang-yuanwen',
|
|
130
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
131
|
+
gist: '专旺五格各有专章:成格要看局全带印,不只看身强。',
|
|
132
|
+
detail: '三命通会卷六曲直、炎上、从革、润下、稼穑五篇各立一格:曲直须亥卯未带亥,炎上须寅午戌带寅,从革须巳酉丑带丙丁巳午,润下须申子辰全,稼穑取四季土。原文的条件都比「身强」细:要局全、要带印或带火炼金,还要防冲刑死绝。本插件把命中的那一篇附在结果里,只作结构说明。',
|
|
133
|
+
source: '《三命通会》卷六·曲直、炎上、从革、润下、稼穑',
|
|
134
|
+
status: 'variant',
|
|
135
|
+
note: '专旺是否必须成方局、是否允许一点官杀财,各家宽严不一;原文五篇之间条件也不齐(润下重忌冲刑、稼穑重四季土)。本插件只按「同类+印 ≥5、官杀财皆弱」列出并附原文,不据此断贵贱,也不补专旺的破格条件。',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: 'bazi-congge-yuanwen',
|
|
139
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
140
|
+
gist: '从格是身无归处才「弃命」相从:一见根气就破格。',
|
|
141
|
+
detail: '三命通会卷五弃命从煞、卷六弃命从财各有一篇:从煞要煞重身柔、四柱无一点比肩印绶;从财要财会成局、日干无气,原文说「若逢根气,命损无猜」。两篇都说行运喜财煞旺地、忌扶身。本插件只在盘面出现从财格或从杀格时附上对应原文;从儿、从强没有单章,不硬凑。',
|
|
142
|
+
source: '《三命通会》卷五·弃命从煞;卷六·弃命从财',
|
|
143
|
+
status: 'variant',
|
|
144
|
+
note: '从格成立条件各家分歧很大:是否允许日主有微根、阴阳干从与不从(原文说阳木不能从)、从儿与从强算不算正从,说法不一。本插件只列结构与原文,不据此断吉凶,也不补从儿、从强的原文。',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 'bazi-tongguan',
|
|
148
|
+
system: 'bazi', dims: ['overall', 'career'],
|
|
149
|
+
gist: '两神相战要有中间一行接上,对峙才化成相生。',
|
|
150
|
+
detail: '用神与忌神两行在局中各 ≥1.5 分、又正好相克时,五行里只有一行能接上:克方生它、它再生被克方(金克木则以水为关,土克水则以金为关)。滴天髓用织女、牛郎隔关相望作比,说「此关若通也,相邀入洞房」。本插件只按局中分量点出这一行,并写明它是不是忌神。',
|
|
151
|
+
source: '《滴天髓》通神论·通关;五行生克为通行说',
|
|
152
|
+
status: 'variant',
|
|
153
|
+
note: '各家对「两神相战」取哪两神不一(有取日主与官杀、有取用神与忌神、有取局中最旺两行),本插件固定取「用神与克它的忌神,且两行各 ≥1.5 分」;通关一行只按五行生克唯一确定,不据此断吉凶,也不判通关之力是否够用。',
|
|
154
|
+
},
|
|
155
|
+
|
|
101
156
|
// ── 紫微 ──────────────────────────────────────────────
|
|
102
157
|
{
|
|
103
158
|
id: 'ziwei-sanfang',
|
|
@@ -158,7 +213,16 @@ export const KNOWLEDGE = [
|
|
|
158
213
|
detail: '生年四化是先天带的,飞星四化是宫位自己去找的:每一宫的宫干定出禄权科忌四颗星,那几颗星落在哪一宫,就是这一宫的力气往哪边使。所以同一个「化忌」,从命宫飞出去和从财帛飞出去,说的是两件事。',
|
|
159
214
|
source: '《紫微斗数全书》四化篇;中州派宫干四化传法',
|
|
160
215
|
status: 'variant',
|
|
161
|
-
note: '
|
|
216
|
+
note: '飞星派(如钦天四化)把宫干四化当主线,三合派只作辅助;庚干四化各派另有异说,本插件取中州派常用表。飞星串连与三方四正复合飞化现已给出,但未叠大限流年四化。',
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
id: 'ziwei-sanfang-fei',
|
|
220
|
+
system: 'ziwei', dims: ['overall', 'career'],
|
|
221
|
+
gist: '三方四正一起飞,看四股力会到哪一宫。',
|
|
222
|
+
detail: '单宫飞化只看本宫宫干把四化送去哪里;三方四正复合飞化把本宫、对宫与两个三合宫共四宫的宫干四化同时摊开,约 16 条,按落宫归堆,落到同一宫的就是会照。会在一处的化越多,那一宫被牵动的力道越集中;两忌以上会宫、禄忌同宫、三化以上会宫、宫干化出又落回本宫(自化),是这一层最常取的几种情形。',
|
|
223
|
+
source: '《紫微斗数全书》四化篇;飞星派三方四正同飞说',
|
|
224
|
+
status: 'variant',
|
|
225
|
+
note: '飞星派对「三方四正一起飞」是否成立、会照要不要折成分数,各家口径不一;本插件只做落宫归堆与会照标记,不折分数,也未叠大限流年四化。',
|
|
162
226
|
},
|
|
163
227
|
{
|
|
164
228
|
id: 'ziwei-jichuanji',
|
|
@@ -199,10 +263,10 @@ export const KNOWLEDGE = [
|
|
|
199
263
|
id: 'liuyao-fushen',
|
|
200
264
|
system: 'liuyao', dims: ['overall'],
|
|
201
265
|
gist: '用神不上卦,就去本宫首卦的同位取伏神。',
|
|
202
|
-
detail: '
|
|
266
|
+
detail: '本卦六爻里没有用神那一类六亲,就叫用神不上卦。取法是回到本卦所属宫的首卦(八纯卦),找出该六亲所在的爻位,那一爻即伏神,本卦同一爻位上的爻叫飞神。伏神要「得出」才有用:飞神生伏神、伏神克飞神、日月生扶都算得力;飞神克伏神则受压难出。本插件给出伏神爻位、干支五行、飞伏生克,并按月建日辰归成四档出伏条件(可出 / 有助有压 / 受压难出 / 未得助);只判条件,不出应期日期。',
|
|
203
267
|
source: '《卜筮正宗》伏神章;《增删卜易》伏神篇',
|
|
204
268
|
status: 'variant',
|
|
205
|
-
note: '
|
|
269
|
+
note: '首卦里同一六亲也可能出现两次(如乾宫乾为天的父母在三爻与上爻),此时取哪一爻为伏神各家不一;本插件把候选都列出并标「伏神两现」,不代选。出伏条件的归并口径:飞生伏、伏克飞、日辰生/比和、月建旺/相算助,飞克伏、日辰克、月破算压;有助无压为「可出」,有助有压为「有助有压」,有压无助为「受压难出」,两者都无为「未得助」。四档只并列条件、不排各家优先级;旬空只标出,不并入档位。应期各家分歧更大,仍不输出日期。',
|
|
206
270
|
},
|
|
207
271
|
{
|
|
208
272
|
id: 'liuyao-yongshen-shuai',
|
|
@@ -213,6 +277,15 @@ export const KNOWLEDGE = [
|
|
|
213
277
|
status: 'variant',
|
|
214
278
|
note: '月破、暗动、冲空三者各家取法不完全一致(有派别把日冲动爻也叫暗动,有派别只认旺相之爻暗动);本插件按「月建冲=月破、日冲静爻=暗动、日冲旬空=冲空」这一套给标签,并注明用了哪一支月建。',
|
|
215
279
|
},
|
|
280
|
+
{
|
|
281
|
+
id: 'liuyao-quanggu-shuai',
|
|
282
|
+
system: 'liuyao', dims: ['overall', 'work'],
|
|
283
|
+
gist: '全卦逐爻看月建,才看得出气聚在哪一头。',
|
|
284
|
+
detail: '月建管这一段时令的旺衰、日辰管当天的扶克,落到全部六爻逐爻判定:每爻都出月令五态(旺相休囚死)与日辰五关系,并标月破、暗动、冲空。世爻、应爻、动爻与旬空另标,五态分布能看出气是聚在世应还是散在旁爻——用神只是其中一处落点,不看全卦容易把一处当全局。',
|
|
285
|
+
source: '《增删卜易》月建章、日辰章;《卜筮正宗》六爻旺衰论',
|
|
286
|
+
status: 'variant',
|
|
287
|
+
note: '各家对月破、暗动、冲空的取法不完全一致,是否给六爻折力重(分数)分歧更大;本插件只给状态标签与五态分布,不折分数。',
|
|
288
|
+
},
|
|
216
289
|
{
|
|
217
290
|
id: 'liuyao-yingqi',
|
|
218
291
|
system: 'liuyao', dims: ['overall', 'career'],
|
|
@@ -278,7 +351,7 @@ export const KNOWLEDGE = [
|
|
|
278
351
|
id: 'liuyao-jintui-yong',
|
|
279
352
|
system: 'liuyao', dims: ['overall', 'work'],
|
|
280
353
|
gist: '化进化退要看是用神还是忌神,还要叠月建日辰。',
|
|
281
|
-
detail: '
|
|
354
|
+
detail: '进神退神本身只说明这一爻的向外趋势:用神化进为得力,忌神化进则为患加剧;用神化退是力衰,忌神化退反而是解脱。传统还要看它在本月令衰旺、有没有日辰生扶,空亡或受克时进者未必能进。本插件把进退与爻位标出来,再按月建五态给一档力重——得令则进得动、退得慢,失令则进得虚、退得实,月破压过一切;只给档位,不折成加权分数,吉凶仍落在用神与忌神那一层判。',
|
|
282
355
|
source: '《增删卜易》进神退神章、用神章',
|
|
283
356
|
status: 'variant',
|
|
284
357
|
note: '土之进退次序各家说法不完全一致,有以丑→辰→未→戌为进、也有只取辰戌丑未相对者;本插件按丑辰未戌成环处理,并用《增删卜易》卦例中「未土化戌土为进」「戌土化未土为退」对拍。',
|