dsh-metaphysics 0.58.0 → 0.59.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.
@@ -482,6 +482,52 @@ export const CITATIONS = [
482
482
  // 在滴天髓底本(干支总论)里能逐字对上,所以才是「通根透干」可核的原文。
483
483
  note: '《子平真诠》卷一论十干十二支注文引作《滴天髓》语,底本干支总论原文可核。',
484
484
  },
485
+ // ── 滴天髓·下篇六亲论(2026-11-01 从底本逐字录入,同一页:153092.html)
486
+ {
487
+ id: 'dt-liuqin-fuqi',
488
+ book: 'ditian',
489
+ chapter: '六亲论·夫妻',
490
+ quote: '夫妻因缘宿世来,喜神有意傍天财。',
491
+ plain: '看夫妻,落点在「喜神」与「财星」的相对位置:财是妻星,喜神是能护住用神的那一位。配偶这件事,看的是财星有没有被喜神照到,不是看盘里有没有财。',
492
+ url: 'https://www.diancang.xyz/xuanxuewushu/ditiansui/153092.html',
493
+ // 底本此篇为韵语提纲,各家注解分歧很大;这里只录原文,不把某家注解当原文引用。
494
+ note: '本句是六亲论的提纲韵语,正文各家用注解发挥,取义不一,故只作「有这一说」的原文凭据。',
495
+ },
496
+ {
497
+ id: 'dt-liuqin-zinv',
498
+ book: 'ditian',
499
+ chapter: '六亲论·子女',
500
+ quote: '子女根枝一世传,喜神看与杀相连。',
501
+ plain: '子女星取官杀,但成不成器要看喜神与杀的关系:有杀无喜,是压力;有喜有杀,才谈得上传承。单见官杀不作吉断。',
502
+ url: 'https://www.diancang.xyz/xuanxuewushu/ditiansui/153092.html',
503
+ },
504
+ {
505
+ id: 'dt-liuqin-fumu',
506
+ book: 'ditian',
507
+ chapter: '六亲论·父母',
508
+ quote: '父母或降与或替,岁月所关果非细。',
509
+ plain: '父母看年月两柱:位置定了,还要看这两柱是「降」(受制)还是「替」(得代),差别不小。这是把六亲落到宫位上,而不是只看印星。',
510
+ url: 'https://www.diancang.xyz/xuanxuewushu/ditiansui/153092.html',
511
+ },
512
+ {
513
+ id: 'dt-nvming-shensha',
514
+ book: 'ditian',
515
+ chapter: '六亲论·女命章',
516
+ quote: '论夫论子要安详,气静平和妇道章,三奇二德虚好语,咸池驿马半推详。',
517
+ plain: '这句是古籍自己在批神煞:三奇、二德这类吉神被叫作「虚好语」(空口说好话),咸池(桃花)、驿马只能「半推详」(顶多参考一半)。反对滥用神煞不是今人的意见,原文里就有。',
518
+ url: 'https://www.diancang.xyz/xuanxuewushu/ditiansui/153092.html',
519
+ // 2026-11-01 录入:这句是本插件「神煞显示但不参与判断」最直接的原文依据,
520
+ // 而且是《滴天髓》自己说的,比后人转述有力。注意「三奇二德」指三奇、天德月德一类吉神。
521
+ note: '「三奇二德虚好语,咸池驿马半推详」是滴天髓原文对神煞的贬语,可直接支撑「神煞不主吉凶」。',
522
+ },
523
+ {
524
+ id: 'dt-hezhi-fugui',
525
+ book: 'ditian',
526
+ chapter: '六亲论·何知章',
527
+ quote: '何知其人富,财气通门户。何知其人贵,官星有理会。何知其人贫,财神反不真。何知其人贱,官星还不见。',
528
+ plain: '富看财有没有「通门户」(财能流通到日主),贵看官星有没有「理会」(有制有化、有人承接)。反过来,贫是财星不真(有财而无用),贱是官星不见或不理。判词是四个可查的条件,不是形容词。',
529
+ url: 'https://www.diancang.xyz/xuanxuewushu/ditiansui/153092.html',
530
+ },
485
531
  ];
486
532
 
487
533
  const BOOK_OF = {
@@ -507,7 +553,7 @@ export const CARD_CITATIONS = {
507
553
  'bazi-geju': { refs: ['zp-yongshen'] },
508
554
  'bazi-suiyun': { refs: ['smt-suiyun'] },
509
555
  'bazi-sanming-duizhao': { refs: ['zp-zhenguan', 'smt-guansha-liu'] },
510
- 'bazi-geju-chengbai': { refs: ['zp-chengbai'] },
556
+ 'bazi-geju-chengbai': { refs: ['zp-chengbai', 'dt-hezhi-fugui'] },
511
557
  'bazi-huagi-bianhua': { refs: ['zp-bianhua'] },
512
558
  'bazi-zaji-quyong': { refs: ['zp-zaji'] },
513
559
  'bazi-zhuanwang-yuanwen': { refs: ['smt-quzhi', 'smt-yanshang', 'smt-congge', 'smt-runxia', 'smt-jiasi'] },
@@ -523,9 +569,12 @@ export const CARD_CITATIONS = {
523
569
  note: '通行说两句出自《子平真诠》卷一注文,非《滴天髓》正文;注文所引的滴天髓句见本条。',
524
570
  },
525
571
  'bazi-wangxiang': { refs: ['smt-wangxiang'] },
526
- 'bazi-shensha': { refs: ['smt-shensha'] },
572
+ // 神煞:三命通会条列名目,滴天髓女命章直接贬为「虚好语」「半推详」——两书合看才是全貌:
573
+ // 神煞是有的,只是不主吉凶。只引三命通会会让人以为本插件在给神煞背书。
574
+ 'bazi-shensha': { refs: ['smt-shensha', 'dt-nvming-shensha'] },
527
575
  'bazi-tiaohou': { refs: ['qt-tiaohou'] },
528
- 'bazi-liuqin': { refs: ['smt-liuqin'] },
576
+ // 六亲:星宫同参,落点分别是夫妻(财与喜神)、子女(杀与喜神)、父母(年月宫位)
577
+ 'bazi-liuqin': { refs: ['smt-liuqin', 'dt-liuqin-fuqi', 'dt-liuqin-zinv', 'dt-liuqin-fumu'] },
529
578
  'bazi-kongwang': { refs: ['smt-kongwang'] },
530
579
  'bazi-xingchong': { refs: ['smt-xingchong'] },
531
580
  'bazi-dayun-jiaoqi': { refs: ['smt-dayun-qiyun'] },
package/engine/diff.js CHANGED
@@ -26,6 +26,9 @@ const IGNORE_KEYS = new Set([
26
26
  'handle', 'handleError',
27
27
  // 一句话改参的回显:换口径时它必然不同(等于另一次请求),不是盘面差异
28
28
  'revision',
29
+ // 顶部「人话总结」是从盘面派生出来的叙述,不是盘面本身:换一档口径,
30
+ // 它必然跟着改写(句子会重排),但要看的是星位、日柱这些有没有动。
31
+ 'brief', 'briefError',
29
32
  ]);
30
33
 
31
34
  const isObject = (v) => v !== null && typeof v === 'object';
@@ -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
+ }