dsh-metaphysics 0.57.0 → 0.59.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 +171 -0
- package/README.md +415 -372
- package/client.almanac.js +60 -58
- package/client.bazi.js +113 -103
- package/client.chenggu.js +60 -58
- package/client.convert.js +60 -58
- package/client.daliuren.js +121 -102
- package/client.fengshui.js +59 -57
- package/client.hepan.js +112 -102
- package/client.js +412 -288
- package/client.liuyao.js +121 -102
- package/client.mbti.js +60 -58
- package/client.name.js +46 -44
- package/client.numerology.js +60 -58
- package/client.qimen.js +119 -100
- package/client.star.js +60 -58
- package/client.tarot.js +113 -94
- package/client.trend.js +109 -99
- package/client.xiaoliuren.js +67 -56
- package/client.zeri.js +60 -58
- package/client.ziwei.js +113 -103
- package/engine/bridge.js +211 -0
- package/engine/citations.js +109 -6
- package/engine/diff.js +54 -0
- package/engine/event-prompt.js +238 -0
- package/engine/guide.js +53 -0
- package/engine/hepan.js +43 -0
- package/engine/index.js +1736 -1659
- package/engine/interpret-knowledge.js +20 -8
- package/engine/interpret.js +1904 -1889
- package/engine/limits.js +118 -0
- package/engine/liuyao.js +4 -0
- package/engine/qimen-prompt.js +303 -0
- package/engine/trace.js +18 -18
- package/engine/yingqi.js +208 -0
- package/engine/zeri.js +89 -13
- package/index.js +18 -2
- package/package.json +7 -2
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +11035 -9304
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// 问事解读提示:把「先问清事 → 取用神 → 看状态与关系 → 回到现实核对」推广到全部问事体系。
|
|
2
|
+
//
|
|
3
|
+
// 起点是奇门那套要求(engine/qimen-prompt.js),但问题不在奇门——六爻、梅花、六壬、塔罗、小六壬
|
|
4
|
+
// 一样会被读成「符号念一遍」:世应旺相所以好、用生体所以吉、这张牌是死神所以完蛋。
|
|
5
|
+
// 差别只在「哪一位符号代表我、代表事」,所以骨架共用,取用神各体系自己给。
|
|
6
|
+
//
|
|
7
|
+
// 三件事写死在这个文件里:
|
|
8
|
+
// 1. 时间不明先问,不默认拿现在起局(问事体系全靠起课那一刻定盘);
|
|
9
|
+
// 2. 每个符号都要说出「为什么取它」,答不出就不许下结论;
|
|
10
|
+
// 3. 最后必须拉回现实核对——盘面只给方向,给不了证据。
|
|
11
|
+
import { buildQimenPrompt } from './qimen-prompt.js';
|
|
12
|
+
|
|
13
|
+
export const EVENT_PROMPT_VERSION = 'event-1';
|
|
14
|
+
|
|
15
|
+
/** 问事类型:解读时要先落到这五类里的一类,笼统问「运势」不在此列 */
|
|
16
|
+
export const ASK_KINDS = {
|
|
17
|
+
career: {
|
|
18
|
+
label: '工作 / 事业',
|
|
19
|
+
reality: ['有没有书面邀约或正式通知?(口头承诺不算)', '岗位职责、汇报对象、试用期写清楚了吗?', '薪酬范围、发放方式有没有落到纸面?', '最坏情况:试用不过或岗位撤销,你损失多少?'],
|
|
20
|
+
},
|
|
21
|
+
love: {
|
|
22
|
+
label: '感情 / 关系',
|
|
23
|
+
reality: ['对方有没有具体行动:约见、介绍给朋友、共同计划?', '这种投入持续了多久,还是一阵热?', '有没有第三方牵涉(前任、家人、异地)?', '你愿意让渡什么,底线在哪?'],
|
|
24
|
+
},
|
|
25
|
+
business: {
|
|
26
|
+
label: '生意 / 合作',
|
|
27
|
+
reality: ['资源能落到具体人、具体钱、具体渠道吗?', '合同条款:出资、分账、违约、退出,哪条没写?', '谁执行?执行人是全职还是顺手帮忙?', '如果对方撤了,你一个人能不能收场?'],
|
|
28
|
+
},
|
|
29
|
+
action: {
|
|
30
|
+
label: '某件事能不能推进',
|
|
31
|
+
reality: ['这件事有没有截止日期?谁定的?', '实际成本:钱、时间、人情,各多少?', '做错了能不能退回去?', '成功的样子能不能用一句话说清?'],
|
|
32
|
+
},
|
|
33
|
+
day: {
|
|
34
|
+
label: '挑日子 / 看时机',
|
|
35
|
+
reality: ['当天必须到场的人确认了吗?', '场地、材料、审批这些硬约束排除了吗?', '有备选日期吗?排在第几位?', '这一天之前的准备来得及吗?'],
|
|
36
|
+
},
|
|
37
|
+
other: {
|
|
38
|
+
label: '其他具体事',
|
|
39
|
+
reality: ['成功的样子,能用一件可观察的事描述吗?', '有没有一个明确的时间点可以验证?', '如果没成,你会先怀疑哪一环?', '现在最该做的一件小事是什么?'],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const kindOf = (k) => (ASK_KINDS[k] ? k : 'other');
|
|
44
|
+
|
|
45
|
+
// ── 各体系:谁是「我」、谁是「事」、用神怎么取 ──────────────────
|
|
46
|
+
// 每一项都要能回答「为什么是它」——这是三追问里的第一问,含糊就等于没取。
|
|
47
|
+
|
|
48
|
+
const LIUYAO_USE = {
|
|
49
|
+
career: { liuqin: '官鬼', why: '六爻问工作职位、上级压力,以官鬼为用神:官鬼既是管你的人,也是名位所在。' },
|
|
50
|
+
love: { liuqinByGender: { male: '妻财', female: '官鬼' }, why: '感情看配偶星:男命以妻财为妻,女命以官鬼为夫;再看世应两家是否相生相合。' },
|
|
51
|
+
business: { liuqin: '妻财', why: '合作看财:妻财代表可分的钱与利;同时看兄弟爻,兄弟动主分我之财。' },
|
|
52
|
+
action: { liuqin: '父母', why: '问一件事能不能推进,看父母:父母主文书、消息、答复,事之成否常落在一纸回话上。' },
|
|
53
|
+
day: { liuqin: '父母', why: '择日问的是「那一天办这件事顺不顺」,仍以所办之事的类象为主,先看日月建与世爻。' },
|
|
54
|
+
other: { liuqin: '官鬼', why: '事类不明时先以官鬼统摄「所问之事」,但必须请他确认事属哪一类,不要硬断。' },
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const liuyaoShi = (r) => {
|
|
58
|
+
const shi = r.ben && r.ben.shi;
|
|
59
|
+
const ying = r.ben && r.ben.ying;
|
|
60
|
+
const line = (n) => (r.ben && r.ben.lines ? r.ben.lines.find((l) => l.position === n) : null);
|
|
61
|
+
return { shi: line(shi), ying: line(ying) };
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const lineFact = (l) => (l
|
|
65
|
+
? `${l.position}爻 ${l.ganzhi}(${l.liuqin || ''}${l.moving ? '·动' : ''}${l.liushen ? '·' + l.liushen : ''})`
|
|
66
|
+
: '(本盘定位不到)');
|
|
67
|
+
|
|
68
|
+
function liuyaoUse(r, kind, gender) {
|
|
69
|
+
const cfg = LIUYAO_USE[kind] || LIUYAO_USE.other;
|
|
70
|
+
const liuqin = cfg.liuqin || (cfg.liuqinByGender && (cfg.liuqinByGender[gender] || cfg.liuqinByGender.male)) || '官鬼';
|
|
71
|
+
const hits = (r.ben && r.ben.lines ? r.ben.lines : []).filter((l) => l.liuqin === liuqin);
|
|
72
|
+
const { shi, ying } = liuyaoShi(r);
|
|
73
|
+
const out = [
|
|
74
|
+
{ name: '我', symbol: `世爻 ${lineFact(shi)}`, why: '世爻代表求测者本人:你的态度、你的处境,都从这一爻看。', fact: lineFact(shi) },
|
|
75
|
+
{ name: '对方 / 事体', symbol: `应爻 ${lineFact(ying)}`, why: '应爻代表对方或所问之事:世应相生相合是能接上头,相冲相克是对不上。', fact: lineFact(ying) },
|
|
76
|
+
{
|
|
77
|
+
name: `用神(${liuqin})`,
|
|
78
|
+
symbol: hits.length ? hits.map((l) => lineFact(l)).join(';') : `本盘无${liuqin}(可能伏藏)`,
|
|
79
|
+
why: cfg.why,
|
|
80
|
+
fact: hits.length ? hits.map((l) => lineFact(l)).join(';') : `没有${liuqin}明现,须看伏神或另取,不要假装有`,
|
|
81
|
+
warn: hits.length > 1 ? `用神两现(${hits.length}处):不能随手挑一个。先看持世、临日月、发动者,挑不出来就明说「两现未定」。` : '',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function meihuaUse(r) {
|
|
88
|
+
const bu = r.bodyUse || {};
|
|
89
|
+
const b = bu.body || {};
|
|
90
|
+
const u = bu.use || {};
|
|
91
|
+
return [
|
|
92
|
+
{ name: '我(体卦)', symbol: `${b.trigram || '—'}(${b.element || ''})`, why: '梅花以体卦为我:不动的那一卦是求测者自身。', fact: `${b.trigram || '—'} ${b.element || ''}` },
|
|
93
|
+
{ name: '事(用卦)', symbol: `${u.trigram || '—'}(${u.element || ''})`, why: '动爻所在为用卦,代表所问之事;体用之间的关系就是人与事的处境。', fact: `${u.trigram || '—'} ${u.element || ''}` },
|
|
94
|
+
{ name: '体用关系', symbol: bu.relation || '—', why: '只看生克方向,不直接把「大吉」当结论——吉是条件好,不是结果已经发生。', fact: bu.level ? `本盘标为「${bu.level}」` : '' },
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function daliurenUse(r) {
|
|
99
|
+
const sc = r.sanChuan || {};
|
|
100
|
+
const gan = r.dayGanZhi ? String(r.dayGanZhi).charAt(0) : '';
|
|
101
|
+
const zhi = r.dayGanZhi ? String(r.dayGanZhi).slice(-1) : '';
|
|
102
|
+
return [
|
|
103
|
+
{ name: '我(日干)', symbol: `日干 ${gan}`, why: '大六壬以日干为求测者本人,日支为对方或所问之事。', fact: `日干 ${gan}` },
|
|
104
|
+
{ name: '对方 / 事(日支)', symbol: `日支 ${zhi}`, why: '日支是事情的落点,干上神与支上神的关系就是人与事的接口。', fact: `日支 ${zhi}` },
|
|
105
|
+
{ name: '事之始(初传)', symbol: sc.chu ? `${sc.chu.zhi}(${sc.chu.liuQin || ''}·${sc.chu.jiangFull || ''})` : '—', why: '三传看过程:初传是起因,中传是中途,末传是收尾,末传比初传更接近结果。', fact: sc.chu ? `${sc.chu.zhi} ${sc.chu.liuQin || ''}` : '' },
|
|
106
|
+
{ name: '事之终(末传)', symbol: sc.mo ? `${sc.mo.zhi}(${sc.mo.liuQin || ''}·${sc.mo.jiangFull || ''})` : '—', why: '末传落处是这件事最后停在哪儿,看它落在哪一类六亲上。', fact: sc.mo ? `${sc.mo.zhi} ${sc.mo.liuQin || ''}` : '' },
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function tarotUse(r) {
|
|
111
|
+
const cards = (r.cards || []).map((c) => ({
|
|
112
|
+
name: c.position || '牌位',
|
|
113
|
+
symbol: `${c.name}(${c.orientation || (c.upright ? '正位' : '逆位')})`,
|
|
114
|
+
why: `${c.positionHint || '这一位代表它所标的那个阶段'};牌位决定它代表什么,牌面只说明它是什么样子。`,
|
|
115
|
+
fact: `${c.core || ''}${(c.keywords && c.keywords.length) ? ` 关键词:${c.keywords.join('、')}` : ''}`,
|
|
116
|
+
}));
|
|
117
|
+
return cards.length ? cards : [{ name: '牌面', symbol: '—', why: '没有抽到牌', fact: '' }];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function xiaoliurenUse(r) {
|
|
121
|
+
const res = r.result || {};
|
|
122
|
+
return [
|
|
123
|
+
{ name: '所问之事', symbol: res.palace || '—', why: '小六壬只有一宫落位,它同时代表事与势:落宫决定这件事处在哪一类状态。', fact: res.text || '' },
|
|
124
|
+
{ name: '我', symbol: '(本体系不单列)', why: '小六壬没有「我」的独立符号,所以它只能给势,给不了「我 vs 对方」的对比——这是它的口径,别硬补。', fact: '' },
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const PICK = { liuyao: liuyaoUse, meihua: meihuaUse, daliuren: daliurenUse, tarot: tarotUse, xiaoliuren: xiaoliurenUse };
|
|
129
|
+
|
|
130
|
+
const STYLE = [
|
|
131
|
+
'开头先用三到五句话回答他问的那件事,全用日常说法:不出现「用神、世应、体用、落宫」这些词。',
|
|
132
|
+
'每个术语第一次出现时,紧跟一句人话解释(例:「用神,就是这件事在盘上对应哪一个符号」)。',
|
|
133
|
+
'不写「吉/凶」二字当结论,改成能执行的话:能推进 / 卡在谁那里 / 还缺什么 / 大概什么条件下会有信号。',
|
|
134
|
+
'盘面给不出的东西(具体金额、对方心里怎么想、某天几点),直接说给不出。',
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
const HARD = [
|
|
138
|
+
'只使用下面「盘面事实」里出现的符号;没给的,一律不许自己补。',
|
|
139
|
+
'不许「旺相所以好」「死神所以完蛋」这种一句话结论:符号只说明形态,好坏要看它与「我」这一位的关系。',
|
|
140
|
+
'不给医疗、法律、投资的具体结论;这些只能建议去找对应专业人士。',
|
|
141
|
+
'不给公历日期。应期只谈「什么条件下会出现信号」。',
|
|
142
|
+
'不确定就写不确定,并说明缺哪条信息才能确定。',
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
const THREE = [
|
|
146
|
+
'你说「我」是哪个符号?为什么是它?',
|
|
147
|
+
'机会、阻碍、对方态度各落在盘上哪一处?各自依据哪条关系(生、克、合、冲、空、墓)?',
|
|
148
|
+
'有没有相反提示?你为什么采信这一边?',
|
|
149
|
+
];
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 生成一段可直接交给模型的问事解读提示。
|
|
153
|
+
* @param {object} r compute() 的结果(含各体系盘面)
|
|
154
|
+
* @param {{question?:string, kind?:string, gender?:'male'|'female', timeKnown?:boolean}} opts
|
|
155
|
+
*/
|
|
156
|
+
export function buildEventPrompt(r, opts = {}) {
|
|
157
|
+
const system = (r && r.system) || 'other';
|
|
158
|
+
// 奇门有自己的取用神表(门/宫/干),复用它的实现,避免两套说法打架
|
|
159
|
+
if (system === 'qimen') return buildQimenPrompt(r, opts);
|
|
160
|
+
|
|
161
|
+
const k = kindOf(opts.kind);
|
|
162
|
+
const kind = ASK_KINDS[k];
|
|
163
|
+
const question = String(opts.question || (r && r.question) || '').replace(/\s+/g, ' ').trim().slice(0, 200);
|
|
164
|
+
|
|
165
|
+
if (opts.timeKnown === false) {
|
|
166
|
+
return {
|
|
167
|
+
version: EVENT_PROMPT_VERSION,
|
|
168
|
+
system,
|
|
169
|
+
kind: k,
|
|
170
|
+
blocked: true,
|
|
171
|
+
subjects: [],
|
|
172
|
+
text: [
|
|
173
|
+
'先别起课——时间还不确定。',
|
|
174
|
+
'',
|
|
175
|
+
'问事体系全靠「起课那一刻」定盘:差一个时辰,日辰、旬空、月建全换,盘就不是这张盘了。先确认:',
|
|
176
|
+
'1)是按现在这一刻起,还是按你打算行动的那一刻起?',
|
|
177
|
+
'2)你给的是钟表时间还是农历?在哪个城市(真太阳时会差几分钟到十几分钟)?',
|
|
178
|
+
'',
|
|
179
|
+
'确认之后,把要问的事说成「主语 + 时间 + 可验证的结果」,例如「下周三之前这份工作能不能拿到书面 offer」。',
|
|
180
|
+
'在那之前,我不排盘,也不猜。',
|
|
181
|
+
].join('\n'),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const pick = PICK[system];
|
|
186
|
+
if (!pick) {
|
|
187
|
+
return {
|
|
188
|
+
version: EVENT_PROMPT_VERSION,
|
|
189
|
+
system,
|
|
190
|
+
kind: k,
|
|
191
|
+
blocked: true,
|
|
192
|
+
subjects: [],
|
|
193
|
+
text: `「${system}」不是问事体系(或暂未接入取用神规则),用它对具体事下结论就是硬套。请改用六爻、梅花、大六壬、奇门或塔罗。`,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const subjects = pick(r, k, opts.gender);
|
|
198
|
+
const lines = [
|
|
199
|
+
`# 问事解读(提示版本 ${EVENT_PROMPT_VERSION}|体系:${system})`,
|
|
200
|
+
'',
|
|
201
|
+
'## 你要做的',
|
|
202
|
+
'先把这张盘翻译成「他明天能拿去用的话」,再给依据。顺序不能反:人话结论 → 盘面依据 → 现实核对 → 不确定处。',
|
|
203
|
+
'',
|
|
204
|
+
'## 一、先确认问的是哪一件事',
|
|
205
|
+
question ? `他的问题是:「${question}」` : '他还没说清要问什么。第一句先问清:要问的是哪一件具体的事,以及他希望看到什么结果。不要笼统答「运势如何」。',
|
|
206
|
+
`已按「${kind.label}」取用神。若实际问的是别的事,先纠正类型再解读,不要硬套。`,
|
|
207
|
+
'',
|
|
208
|
+
'## 二、取哪个符号代表什么(每一项都要能说出「为什么是它」)',
|
|
209
|
+
...subjects.map((s, i) => `${i + 1}. ${s.name} → ${s.symbol}\n - 取法理由:${s.why}${s.fact ? `\n - 盘面:${s.fact}` : ''}${s.warn ? `\n - 注意:${s.warn}` : ''}`),
|
|
210
|
+
'',
|
|
211
|
+
'## 三、怎么读状态(最容易偷懒的地方)',
|
|
212
|
+
'- 先说明这一位落在什么处境(旺/衰、空/实、动/静、被制/得助),再说这对他意味着什么。',
|
|
213
|
+
'- 关系只认四种,且都要指到具体两位符号:生(谁生谁)、克(谁克谁)、合(连在一起,合住也可能是拴住)、冲(变动、对立、打破)。',
|
|
214
|
+
'- 空亡、入墓、伏藏、用神两现这些「减分项」,要么说清压低了什么,要么别提——不要念一遍名字就过去。',
|
|
215
|
+
'',
|
|
216
|
+
'## 四、开口之前先自检这三问',
|
|
217
|
+
...THREE.map((x, i) => `${i + 1}. ${x}`),
|
|
218
|
+
'三问答不全,就还没到能下结论的程度,先把答不出的那条写出来。',
|
|
219
|
+
'',
|
|
220
|
+
'## 五、最后必须回到现实核对',
|
|
221
|
+
...kind.reality.map((x, i) => `${i + 1}. ${x}`),
|
|
222
|
+
'盘面只给方向;上面这些是他明天可以去查、去问、去要的东西。核对完再回来谈结论。',
|
|
223
|
+
'',
|
|
224
|
+
'## 六、表达要求',
|
|
225
|
+
...STYLE.map((x) => `- ${x}`),
|
|
226
|
+
'',
|
|
227
|
+
'## 七、禁止',
|
|
228
|
+
...HARD.map((x) => `- ${x}`),
|
|
229
|
+
'',
|
|
230
|
+
'## 八、输出格式',
|
|
231
|
+
'1. **先给你要的答案**:三到五句人话,直接回答他问的那件事。',
|
|
232
|
+
'2. **盘上依据**:按「我 / 对方或事体 / 环境」三块列,每块一句符号 + 一句人话。',
|
|
233
|
+
'3. **现实里该去核对什么**:抄第五节里适用的,不要全抄。',
|
|
234
|
+
'4. **相反提示与不确定处**:盘上哪里指向另一头,你为什么这样权衡。',
|
|
235
|
+
'5. **一句提醒**:这是参考,不替代你自己去核实和决定。',
|
|
236
|
+
];
|
|
237
|
+
return { version: EVENT_PROMPT_VERSION, system, kind: k, blocked: false, subjects, text: lines.join('\n') };
|
|
238
|
+
}
|
package/engine/guide.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// 报告顶部的三层导读:数 → 象 → 辞。
|
|
2
|
+
//
|
|
3
|
+
// 为什么放在报告里、而不是写进 README:读不懂命盘的人不会去翻文档,他只会在结果页
|
|
4
|
+
// 上划两下就关掉。所以导读必须是「一进来就看见、但不挡路」——折叠,默认收起。
|
|
5
|
+
//
|
|
6
|
+
// 内容只讲一件事:这份报告里哪部分是算出来的(可复核)、哪部分是命名(可商量)、
|
|
7
|
+
// 哪部分是判断(要自己拿主意)。不讲技法细节,细节在各体系的正文里。
|
|
8
|
+
export const GUIDE = {
|
|
9
|
+
title: '第一次看?先分清「数」「象」「辞」',
|
|
10
|
+
lead: '这份报告分三层。分清之后,你就知道哪一部分可以信、哪一部分要留个心眼。',
|
|
11
|
+
layers: [
|
|
12
|
+
{
|
|
13
|
+
key: 'shu',
|
|
14
|
+
name: '数',
|
|
15
|
+
sub: '坐标',
|
|
16
|
+
text: '干支、节气、纳甲、十神、宫位——这些是算出来的坐标。换个人、换台机器算,结果应该一模一样。',
|
|
17
|
+
hint: '报告里每个干支、每个宫位、每个局数都属于这一层:可复算,也可复查。这一层错了就是硬错。',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
key: 'xiang',
|
|
21
|
+
name: '象',
|
|
22
|
+
sub: '关系',
|
|
23
|
+
text: '合、冲、伏、墓、当位、承乘——坐标之间形成的形状。关系看得见,但「这段关系在人生里叫什么」是命名,各家会有分歧。',
|
|
24
|
+
hint: '点开每条「依据」,看到的就是这一层:盘面上的事实,还没加解释。',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: 'ci',
|
|
28
|
+
name: '辞',
|
|
29
|
+
sub: '判断',
|
|
30
|
+
text: '吉凶、顺逆、应期——一句话的结论。自由度最高,也最需要你保留怀疑。',
|
|
31
|
+
hint: '下面所有的结论都在这一层。它的效度未经检验:当参考,别当判决。',
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
check: {
|
|
35
|
+
title: '看到任何一句断语,先问三句',
|
|
36
|
+
items: [
|
|
37
|
+
'它落在哪个坐标上(哪一柱、哪一爻、哪一宫)?',
|
|
38
|
+
'关系是什么(生、克、合、冲、伏、墓)?',
|
|
39
|
+
'这个说法是唯一读法吗?',
|
|
40
|
+
],
|
|
41
|
+
tail: '三问答不全,那句话就只是在给结论,没有给依据——包括本插件自己给的。',
|
|
42
|
+
},
|
|
43
|
+
parts: {
|
|
44
|
+
title: '纳甲、十神、宫位,各自在干什么',
|
|
45
|
+
rows: [
|
|
46
|
+
['纳甲', '给每一爻装上地支坐标,让卦能和日辰比较(数)'],
|
|
47
|
+
['十神', '把「生我克我」翻译成人伦关系(象到辞的接口)'],
|
|
48
|
+
['宫位', '把关系分到位置上:年月日时、十二宫(象的空间化)'],
|
|
49
|
+
],
|
|
50
|
+
tail: '三个都是中间件,不是知识本身:背熟十神只等于背熟一本词典,会不会读象是另一件事。',
|
|
51
|
+
},
|
|
52
|
+
closing: '一句话收尾:数当镜子,象当语言,辞当别人的意见——可以听,不必签收。',
|
|
53
|
+
};
|
package/engine/hepan.js
CHANGED
|
@@ -61,6 +61,49 @@ function yearBranchRelation(a, b) {
|
|
|
61
61
|
return { name: '无直接关系', score: 0, text: '属相之间没有合冲刑害,表层影响小,以日柱为主' };
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
/**
|
|
65
|
+
* 三方合盘:把三对两两结果并列,不合成「三人总分」。
|
|
66
|
+
* 任何两两关系都独立成立,合成一个数会把「和谁相处」混为一谈;
|
|
67
|
+
* 这里只做三件事:列出每对的分数与三维度、指出最顺/最需磨合的一对、找出差异最大的一维。
|
|
68
|
+
* @param {{key:string,a:string,b:string,result:object}[]} pairs 三对结果(顺序固定为 a-b、a-c、b-c)
|
|
69
|
+
*/
|
|
70
|
+
export function tripleOf(pairs) {
|
|
71
|
+
const brief = (r) => {
|
|
72
|
+
const s = (r && r.score) || {};
|
|
73
|
+
return {
|
|
74
|
+
total: typeof s.total === 'number' ? s.total : null,
|
|
75
|
+
level: s.level || '',
|
|
76
|
+
dimensions: (Array.isArray(r && r.dimensions) ? r.dimensions : [])
|
|
77
|
+
.map((d) => ({ key: d.key, label: d.label, score: typeof d.score === 'number' ? d.score : 0 })),
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
const rows = pairs.map((p) => ({ key: p.key, a: p.a, b: p.b, ...brief(p.result) }));
|
|
81
|
+
const sorted = rows.filter((x) => typeof x.total === 'number').sort((x, y) => y.total - x.total);
|
|
82
|
+
const best = sorted[0] || null;
|
|
83
|
+
const hardest = sorted[sorted.length - 1] || null;
|
|
84
|
+
// 同一维度在三对里差得最多的一维:三方之间最敏感的地方
|
|
85
|
+
let focus = null;
|
|
86
|
+
const keys = rows[0] ? rows[0].dimensions.map((d) => d.key) : [];
|
|
87
|
+
for (const key of keys) {
|
|
88
|
+
const vals = rows.map((r) => (r.dimensions.find((d) => d.key === key) || {}));
|
|
89
|
+
const scores = vals.map((d) => (typeof d.score === 'number' ? d.score : 0));
|
|
90
|
+
const spread = Math.max(...scores) - Math.min(...scores);
|
|
91
|
+
if (!focus || spread > focus.spread) {
|
|
92
|
+
focus = { key, label: (vals[0] && vals[0].label) || key, spread };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
pairs: rows,
|
|
97
|
+
best: best ? { key: best.key, a: best.a, b: best.b, total: best.total, level: best.level } : null,
|
|
98
|
+
hardest: hardest && hardest !== best
|
|
99
|
+
? { key: hardest.key, a: hardest.a, b: hardest.b, total: hardest.total, level: hardest.level }
|
|
100
|
+
: null,
|
|
101
|
+
spread: best && hardest ? best.total - hardest.total : 0,
|
|
102
|
+
focus,
|
|
103
|
+
note: '三方只把三对两两关系并列,不合成「三人总分」:和不同的人相处是不同的事,合成一个数会把差异抹平。',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
64
107
|
/** 合盘主函数 */
|
|
65
108
|
export function buildHepan(input) {
|
|
66
109
|
assertCivil(input && input.a, 'a');
|