dsh-metaphysics 0.14.3 → 0.16.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.
@@ -0,0 +1,277 @@
1
+ // 规则知识库:「为什么这样断」
2
+ //
3
+ // 每条给四样东西:一句话白话(gist)、机制解释(detail)、出处(source),
4
+ // 以及「这条有多稳」的状态标注 —— 这是本项目「可验证」承诺在文案层的落点:
5
+ //
6
+ // settled 传统诸家说法基本一致,可直接作为断法依据
7
+ // variant 各家有异说,本插件取其中一派,文中必须点明分歧
8
+ // todo 本插件尚未完整实现,或需以原始典籍核对后再用
9
+ //
10
+ // dims 决定挂在哪个维度下(对应 interpret.js 的维度 key),system 决定归属体系。
11
+
12
+ export const KNOWLEDGE = [
13
+ // ── 八字 ──────────────────────────────────────────────
14
+ {
15
+ id: 'bazi-yueling-siquan',
16
+ system: 'bazi', dims: ['overall', 'career'],
17
+ gist: '月令不是「一个月」,是当月最有权的那一个字。',
18
+ detail: '月令藏干按本气、中气、余气分日用事,本气当权的时间最长。所以判旺衰先看日主在月令是得令还是失令——得令者未看全局,已有三分底气。',
19
+ source: '《子平真诠》论用神;人元司权分日之说见《渊海子平》',
20
+ status: 'variant',
21
+ note: '各家对中气、余气各主几日分法不同(有 7/7/16、9/3/18 等多说),本插件只取「本气当权」这一层,未细分日数。',
22
+ },
23
+ {
24
+ id: 'bazi-tonggen-tougan',
25
+ system: 'bazi', dims: ['overall', 'career'],
26
+ gist: '天干是露在外面的样子,地支是藏在地下的根。',
27
+ detail: '同一个五行,透在天干叫「显」,扎在地支叫「有根」。只有天干没有地支,是看着有、使不上劲;只有地支不通天干,是有实力、不显眼。判断一个人能不能扛事,看的就是根有多深。',
28
+ source: '《滴天髓》「天干得一比肩,不如得支中一墓库」一路的取象',
29
+ status: 'settled',
30
+ },
31
+ {
32
+ id: 'bazi-wangxiang',
33
+ system: 'bazi', dims: ['overall', 'health'],
34
+ gist: '旺相休囚死是五行在当月的五种状态,不是吉凶等级。',
35
+ detail: '以月令五行为基准:当令者旺、我生者相、生我者休、克我者囚、我克者死。它是「此刻谁说话有分量」的相对排序,换个季节就整体重排,不能当固定评价。',
36
+ source: '《五行大义》旺相休囚死;历代命书沿用',
37
+ status: 'settled',
38
+ },
39
+ {
40
+ id: 'bazi-shensha',
41
+ system: 'bazi', dims: ['overall', 'love'],
42
+ gist: '神煞是标签,不是判决。',
43
+ detail: '神煞给盘面加注脚(如「这个组合常被叫作天乙贵人」),吉凶仍要看格局、旺衰、行运三件事。单见一颗凶煞不足以断凶,单见一颗吉星也不足以断吉——这是历代命书反复强调、而市面软件常忽略的一条。',
44
+ source: '《三命通会》神煞篇;《子平真诠》力主「神煞不主吉凶」',
45
+ status: 'settled',
46
+ },
47
+ {
48
+ id: 'bazi-geju',
49
+ system: 'bazi', dims: ['career'],
50
+ gist: '先看月令能不能取格,取不到才论从格、化气。',
51
+ detail: '月令有可用之神(透干或会支有力),按正格论;月令无用、全局一边倒,才考虑从格;日干与相邻天干五合、且月令有化神之气,才论化气格。顺序颠倒会把普通格局误判成特殊格局。',
52
+ source: '《子平真诠》「论用神」;从化条件见《滴天髓》',
53
+ status: 'variant',
54
+ note: '化气格成立条件各家宽严不一(是否要求月令为化神、是否允许有根),本插件按「有合且月令得化神之气」从严处理。',
55
+ },
56
+ {
57
+ id: 'bazi-tiaohou',
58
+ system: 'bazi', dims: ['overall', 'health'],
59
+ gist: '冬夏生人先调温,其余先看扶抑。',
60
+ detail: '调候是针对出生季节的温度校正:冬生水冷木寒,先要火来解冻;夏生火炎土燥,先要水来润泽。调候与扶抑冲突时,多数命书主张先调候,因为寒暖失衡时,再怎么补强弱也难受。',
61
+ source: '《穷通宝鉴》(拦江网)调候用神体系',
62
+ status: 'variant',
63
+ note: '调候与扶抑的优先级各家有争论,也有主张以扶抑为主、调候为辅的。本插件同时给出两者,不替你定谁优先。',
64
+ },
65
+ {
66
+ id: 'bazi-suiyun',
67
+ system: 'bazi', dims: ['overall', 'career'],
68
+ gist: '大运管十年基调,流年管当年触发。',
69
+ detail: '大运像换了条路,流年像这条路上某一段的天气。岁运并临(大运与流年干支相同)与伏吟反吟(干支重复或与原局对冲)是传统上标记「变动较大」的年份,属于提示而非断语。',
70
+ source: '岁运并临、伏吟反吟见《三命通会》《渊海子平》',
71
+ status: 'variant',
72
+ note: '「岁运并临主大凶」是流传最广也最被滥用的说法,本插件只作变动提示,不断吉凶。',
73
+ },
74
+ {
75
+ id: 'bazi-liuqin',
76
+ system: 'bazi', dims: ['love'],
77
+ gist: '六亲有「星」也有「宫」,两处一起看才立体。',
78
+ detail: '星是十神(男命财为妻、女命官杀为夫、印为母一类),宫是四柱位置(年月日时对应祖上、父母、配偶、子女)。星宫同参:星现而宫破,缘分有但过程有阻;宫稳而星不现,关系平淡而少波折。',
79
+ source: '星宫同参见《子平真诠》《滴天髓》',
80
+ status: 'variant',
81
+ note: '女命以官杀为夫是主流,亦有以日支为主、官杀为辅的取法;本插件按主流取,并在文案中说明。',
82
+ },
83
+ {
84
+ id: 'bazi-kongwang',
85
+ system: 'bazi', dims: ['overall'],
86
+ gist: '空亡不是「没有」,是力道打折、抓不实。',
87
+ detail: '日柱所在旬之外的两个地支为旬空。落空之支力量减弱,但逢冲、逢合、逢填实之期可以「出空」,届时又恢复作用。所以空亡要看它是否被救,不宜一见到空就断无。',
88
+ source: '旬空出空之说见《渊海子平》;六爻《卜筮正宗》用法相通',
89
+ status: 'variant',
90
+ note: '空亡是否逢空即空,各家分歧较大,本插件只标注空亡,不做吉凶推断。',
91
+ },
92
+ {
93
+ id: 'bazi-xingchong',
94
+ system: 'bazi', dims: ['overall', 'love'],
95
+ gist: '合能解冲,冲也能破合——关系不是单向的。',
96
+ detail: '刑冲合害要按力的大小与先后比:两支相冲,若有第三支与其中一支相合,冲力被牵制;反之先合后冲,合局也会被冲散。三合成局通常要求月令或日主参与,否则只是拱合,力量有限。',
97
+ source: '《三命通会》论刑冲合害',
98
+ status: 'settled',
99
+ },
100
+
101
+ // ── 紫微 ──────────────────────────────────────────────
102
+ {
103
+ id: 'ziwei-sanfang',
104
+ system: 'ziwei', dims: ['overall', 'career'],
105
+ gist: '看一个宫,要看它对面和左右三个宫。',
106
+ detail: '三方四正=本宫加对宫、三合两宫。命宫的三方是财帛、官禄、迁移,代表钱、事、外出的环境;只看本宫会漏掉一半信息,因为紫微断的是宫与宫之间的互动,不是单宫星曜的堆叠。',
107
+ source: '《紫微斗数全书》三方四正说',
108
+ status: 'settled',
109
+ },
110
+ {
111
+ id: 'ziwei-sihua',
112
+ system: 'ziwei', dims: ['overall', 'career'],
113
+ gist: '四化是变化的方向,不是吉凶等级。',
114
+ detail: '生年四化定先天基调(禄主得、权主掌、科主名、忌主执),宫干四化定后天演变;自化是宫干化出的星就在本宫,主此宫之事自己会起变化。同一个忌,落在六亲宫与落在财帛宫,含义完全不同。',
115
+ source: '《紫微斗数全书》四化篇;宫干飞化见飞星派',
116
+ status: 'variant',
117
+ note: '三合派重星情与格局、飞星派重宫干飞化,两派读法差异明显。本插件给出生年四化与宫干自化,未做完整飞星串连。',
118
+ },
119
+ {
120
+ id: 'ziwei-miaowang',
121
+ system: 'ziwei', dims: ['overall'],
122
+ gist: '庙旺得利平不陷,说的是星在这个宫舒不舒服。',
123
+ detail: '同一颗星落在不同宫位,发挥程度差别很大。庙旺是得地,平陷是不得地;不得地不等于不好,只是这颗星的长处不容易发挥,需要借三方吉星来补。',
124
+ source: '《紫微斗数全书》诸星庙旺表',
125
+ status: 'variant',
126
+ note: '太阳、太阴在少数宫位的庙旺标注各家有出入;本插件只标十四主星,不硬标辅星。',
127
+ },
128
+ {
129
+ id: 'ziwei-daxian',
130
+ system: 'ziwei', dims: ['career'],
131
+ gist: '大限定十年主题,流年定当年事件。',
132
+ detail: '大限看这十年主要在忙什么,流年看其中某一年被什么触发。两者的四化会叠在同一些宫位上,叠加处就是这十年里的关键点——只看流年而不看大限,容易把小事放大。',
133
+ source: '《紫微斗数全书》大限流年篇',
134
+ status: 'settled',
135
+ },
136
+ {
137
+ id: 'ziwei-shengong',
138
+ system: 'ziwei', dims: ['overall'],
139
+ gist: '命宫是「你本来是谁」,身宫是「你后来把力气放在哪」。',
140
+ detail: '身宫不独立成宫,而是寄在某一宫里(如寄财帛、寄官禄)。它标出中年之后的着力点:命宫强而身宫弱,多为主观强但落地慢;身宫得地,做事更容易见效。',
141
+ source: '《紫微斗数全书》命身宫说',
142
+ status: 'variant',
143
+ note: '身宫寄宫的取法各家一致,但身宫与命宫谁更重,各家侧重不同。',
144
+ },
145
+ {
146
+ id: 'ziwei-kongjie',
147
+ system: 'ziwei', dims: ['overall', 'career'],
148
+ gist: '空劫主计划外的变动,遇禄则财来财去。',
149
+ detail: '地空地劫在紫微里代表落空与抽离:落财帛多主钱财不易积累,落官禄多主方向反复。若与禄存、化禄同宫,常见进得快、出得也快;与忌同宫则容易因变动而受挫。',
150
+ source: '《紫微斗数全书》空劫条',
151
+ status: 'variant',
152
+ note: '空劫是否见禄反吉,各家说法不一,本插件只提示变动性质,不判吉凶。',
153
+ },
154
+
155
+ // ── 六爻 ──────────────────────────────────────────────
156
+ {
157
+ id: 'liuyao-yongshen',
158
+ system: 'liuyao', dims: ['overall'],
159
+ gist: '问什么,就以那一类六亲为用神。',
160
+ detail: '问财看妻财、问事业官位看官鬼、问文书房产看父母、问子女下属看子孙、问同辈朋友看兄弟。用神两现时,取动者、取临世者、取旺者;用神不上卦,则从本宫首卦取伏神。这一步定错,后面全盘白算。',
161
+ source: '《卜筮正宗》用神章;《增删卜易》同',
162
+ status: 'settled',
163
+ },
164
+ {
165
+ id: 'liuyao-wangshuai',
166
+ system: 'liuyao', dims: ['overall'],
167
+ gist: '月建管当令,日辰管生杀。',
168
+ detail: '月建决定这一爻在这个月有没有气;日辰能生能克能冲能合,作用更直接。月破之爻当月无力;日冲则看动静——静爻被日冲为暗动,动爻被日冲为冲散。',
169
+ source: '《卜筮正宗》月建日辰章',
170
+ status: 'settled',
171
+ },
172
+ {
173
+ id: 'liuyao-dongbian',
174
+ system: 'liuyao', dims: ['overall'],
175
+ gist: '动爻是「事情自己在动」的那一处。',
176
+ detail: '动爻能生克静爻,静爻不能反克动爻。变爻对动爻有回头生、回头克两种反作用;化进神(如寅化卯)主加强,化退神(如卯化寅)主减弱。一爻独发看此爻,多爻乱动则看用神受不受伤。',
177
+ source: '《卜筮正宗》动变章;《增删卜易》进神退神',
178
+ status: 'settled',
179
+ },
180
+ {
181
+ id: 'liuyao-fushen',
182
+ system: 'liuyao', dims: ['overall'],
183
+ gist: '伏神是藏在下面、要借力才出得来的那一爻。',
184
+ detail: '用神不上卦,就从本宫首卦的同位取伏神。伏神要得出——得日月生扶、或飞神生伏神、或伏神自身旺相,才有用;伏在忌神之下且被克,则虽有如无。',
185
+ source: '《卜筮正宗》伏神章',
186
+ status: 'settled',
187
+ },
188
+ {
189
+ id: 'liuyao-yingqi',
190
+ system: 'liuyao', dims: ['overall', 'career'],
191
+ gist: '应期是「什么时候见分晓」,不是「哪天」。',
192
+ detail: '近事以日计、远事以月计;常见取法是等用神逢值、逢冲、逢合之期,或等忌神受制之期。应期法各家互有出入,同一卦不同取法可以差出很远,所以只作时间窗口的提示。',
193
+ source: '《卜筮正宗》应期章;《增删卜易》',
194
+ status: 'variant',
195
+ note: '应期取法(值日、冲、合、填实、旬空出空)各家优先级不同,本插件不做具体日期推算。',
196
+ },
197
+ {
198
+ id: 'liuyao-liushen',
199
+ system: 'liuyao', dims: ['overall', 'love'],
200
+ gist: '六神是这件事的味道,不是主角。',
201
+ detail: '青龙主喜庆与正事、朱雀主口舌与文书、勾陈主田土与迟滞、螣蛇主虚惊与缠绕、白虎主伤损与急迫、玄武主暗昧与失脱。六神只作取象的修饰,断吉凶仍以六亲旺衰生克为主。',
202
+ source: '《卜筮正宗》六神章',
203
+ status: 'settled',
204
+ },
205
+
206
+ // ── 梅花 / 六壬 / 奇门 / 塔罗 ───────────────────────────
207
+ {
208
+ id: 'meihua-tiyong',
209
+ system: 'meihua', dims: ['overall'],
210
+ gist: '动的那一卦为用,不动的那一卦为体。',
211
+ detail: '体代表自己、用代表所问之事。体克用主可控、用克体主受制、用生体主得助、体生用主付出。再看互卦与变卦判断中段与结局——梅花只取象不排盘,落点比六爻粗。',
212
+ source: '《梅花易数》体用篇',
213
+ status: 'settled',
214
+ },
215
+ {
216
+ id: 'daliuren-sike',
217
+ system: 'daliuren', dims: ['overall'],
218
+ gist: '四课看事从哪来,三传看事往哪去。',
219
+ detail: '四课由日干日支的阴阳与天地盘相叠而得;三传依九宗门(贼克、比用、涉害、遥克等)取初传,再顺推中传末传。三传之间的生克与空亡,是判断事情走向的主线。',
220
+ source: '《大六壬大全》;九宗门取传法',
221
+ status: 'settled',
222
+ },
223
+ {
224
+ id: 'qimen-yinyang',
225
+ system: 'qimen', dims: ['overall'],
226
+ gist: '冬至后阳遁、夏至后阴遁,局数由节气与三元定。',
227
+ detail: '一年分阴阳两遁,各九局;局数取决于当前节气与上中下三元(符头定元)。取局流派有拆补、超神接气、置闰三种,同一时刻可能排出不同局数——这不是算错,是流派差异。',
228
+ source: '《烟波钓叟歌》;拆补与置闰见《奇门遁甲统宗》',
229
+ status: 'variant',
230
+ note: '三种取局法在节气交接前后差异最明显,本插件同时实现三种,可在参数里指定。',
231
+ },
232
+ {
233
+ id: 'tarot-orientation',
234
+ system: 'tarot', dims: ['overall'],
235
+ gist: '逆位常见的两种读法:削弱,或转向内。',
236
+ detail: '一派认为逆位是正位力量的减弱与阻塞;另一派主张逆位是同一原型的内向化、未表达。同一张逆位牌,两种读法给出的建议方向可能相反,所以牌阵解读要先把口径讲清楚。',
237
+ source: '韦特体系传统;逆位读法属近代流派分歧',
238
+ status: 'variant',
239
+ note: '逆位是否参与解读本身就有分歧(有牌阵传统完全不用逆位)。本插件按削弱加内向综合取象,并在开头声明。',
240
+ },
241
+ // ── 待核实:明确标出「还没做」的部分,而不是含糊带过 ──
242
+ {
243
+ id: 'liuyao-yingqi-exact',
244
+ system: 'liuyao', dims: [],
245
+ gist: '具体应期(哪一天应验)本插件尚未推算。',
246
+ detail: '应期需要综合用神旺衰、动变、旬空出空、日月冲合多层条件,且各家取法不同。当前只给时间窗口的方向性提示,不给具体日期——与其给一个看起来精确、实则拍脑袋的日子,不如留白。',
247
+ source: '待补:《卜筮正宗》应期章逐条实现 + 138 条卦例对拍',
248
+ status: 'todo',
249
+ note: '扩展方向:用《卜筮正宗》卦例里有明确应验日期的条目做回归,先验证再输出。',
250
+ },
251
+ {
252
+ id: 'bazi-dayun-jiaoqi',
253
+ system: 'bazi', dims: [],
254
+ gist: '起运时间按「三日折一年」折算,未做交运日的时辰级校正。',
255
+ detail: '传统折算为三天折一年、一天折四月、一时辰折十天。本插件按此折算到年月,不含交运当日的时辰细分,因此起运年份在边界处可能相差一年内。',
256
+ source: '《渊海子平》起运法;交运日细算各家不一',
257
+ status: 'todo',
258
+ note: '扩展方向:补交运日的时辰级推算,并用已知案例核对。',
259
+ },
260
+ ];
261
+
262
+ /** 按体系与维度取知识条目(同一条可挂多个维度,取交集) */
263
+ export function knowledgeFor(system, dimKey) {
264
+ return KNOWLEDGE.filter((k) => k.system === system && k.dims.includes(dimKey));
265
+ }
266
+
267
+ /** 该体系所有「有异说/待核实」的条目:用于文末的诚实声明 */
268
+ export function caveatsFor(system) {
269
+ return KNOWLEDGE.filter((k) => k.system === system && k.status !== 'settled');
270
+ }
271
+
272
+ /** 状态 → 展示用标签 */
273
+ export const STATUS_LABEL = {
274
+ settled: '诸家一致',
275
+ variant: '各家有异说',
276
+ todo: '待核实',
277
+ };
@@ -0,0 +1,197 @@
1
+ // 白话层:把「专业表述」翻译成「问的人能读懂的话」
2
+ //
3
+ // 设计原则:
4
+ // · 只从盘面已有字段推导,不编造盘上没有的东西;
5
+ // · 一律用倾向性措辞(避讳「一定/必然/注定」这类绝对化表述);
6
+ // · 每个字段都可能缺失(海外盘、静卦、缺资料),取不到就整句不出,绝不输出 undefined;
7
+ // · 与 interpret.js 无循环依赖:需要的外部常量(档位文案等)由调用方通过 ctx 传入。
8
+
9
+ const s = (v, fallback = '') => (v === undefined || v === null || v === '' ? fallback : String(v));
10
+ const join = (arr) => (Array.isArray(arr) ? arr.filter(Boolean).join('') : '');
11
+ const has = (v) => (Array.isArray(v) ? v.length > 0 : v !== undefined && v !== null && v !== '');
12
+
13
+ // 旺衰 → 生活化比喻(这是「说人话」的核心:把分数讲成体感)
14
+ const STRENGTH_PLAIN = {
15
+ 身强: '底子偏足、抗压能力好,但容易自己给自己加码,学会收力比使劲更重要',
16
+ 偏强: '底子略足,扛得住事,也容易把事都往自己身上揽',
17
+ 中和: '力量比较匀,属于「给什么环境就长出什么样子」的类型',
18
+ 偏弱: '底子偏薄,靠外部支援比硬扛有效,选对圈子与节奏很关键',
19
+ 身弱: '底子偏薄,先修恢复力再谈冲刺,硬撑的性价比最低',
20
+ };
21
+
22
+ // 询问方向 → 该往哪一节看
23
+ const DIR_SECTION = {
24
+ wealth: '「工作与职业选择」与「时间窗」',
25
+ career: '「事业发展」与「时间窗」',
26
+ love: '「爱情与感情」',
27
+ health: '「健康状况」',
28
+ study: '「事业发展」与「时间窗」',
29
+ travel: '「整体运势」与「时间窗」',
30
+ general: '「整体运势」与「看盘顺序」',
31
+ };
32
+
33
+ /** 一句话直答:先回答「你问的事」,再指路到具体小节 */
34
+ export function buildAnswer(r, ask, ctx = {}) {
35
+ if (!r || !r.system) return '';
36
+ const q = s(ask && ask.question).trim();
37
+ const dir = (ask && ask.direction) || 'general';
38
+ // 只有八字的维度与「时间窗」是固定名称,其余体系用中性说法,避免指向不存在的小节
39
+ const where = r.system === 'bazi'
40
+ ? (DIR_SECTION[dir] || DIR_SECTION.general)
41
+ : '下面与你的问题最贴近的那一节';
42
+ const head = q ? `你问的是「${q}」。` : '';
43
+
44
+ if (r.system === 'bazi') {
45
+ const dm = r.dayMaster || {};
46
+ const st = r.strength || {};
47
+ const ys = (r.frame && r.frame.yongshen) || {};
48
+ const favor = join(ys.favor);
49
+ const avoid = join(ys.avoid);
50
+ const ln = (r.liunian || [])[0];
51
+ const parts = [
52
+ head + `先说结论:你是${s(dm.stem)}${s(dm.element)}日主,命局${s(st.level, '待定')}` +
53
+ `${favor ? `,顺${favor}、忌${avoid}——往${favor}的方向安排事情会更省力` : ''}。`,
54
+ ln && ln.ganzhi
55
+ ? `${s(ln.year)} 年是${ln.ganzhi}年(${s(ln.luck && ln.luck.tier, '平')}),这是「大环境」这一层。`
56
+ : '',
57
+ `具体到你问的这件事,重点看${where}。`,
58
+ ];
59
+ return parts.filter(Boolean).join('');
60
+ }
61
+
62
+ if (r.system === 'ziwei') {
63
+ const soul = r.soul || {};
64
+ const body = r.body || {};
65
+ const bureau = r.bureau || {};
66
+ const md = r.lifeMaster || '';
67
+ return [
68
+ head + `先说结论:你的命宫落${s(soul.branch, '—')}宫` +
69
+ `${bureau.name ? `、${bureau.name}` : ''}${md ? `,命主${md}` : ''}` +
70
+ `${body.lands ? `,身宫落在「${body.lands}」——这张盘的重心在这件事上` : ''}。`,
71
+ `具体到你问的这件事,重点看${where}。`,
72
+ ].join('');
73
+ }
74
+
75
+ if (r.system === 'liuyao') {
76
+ const ben = r.ben || {};
77
+ const moving = (r.cast && r.cast.movingPositions) || [];
78
+ const bian = r.bian || {};
79
+ return [
80
+ head + `先说结论:本卦是${s(ben.name, '—')}` +
81
+ `${ben.palace ? `(${ben.palace})` : ''}` +
82
+ `${moving.length ? `,第 ${moving.join('、')} 爻动,变为${s(bian.name, '—')}` : ',六爻安静没有动爻'}。`,
83
+ '断卦的落点在「世爻」(代表你)和「动爻」(事情的推动点),下面「看盘顺序」就按这个次序展开。',
84
+ ].join('');
85
+ }
86
+
87
+ return head ? `${head}下面按五个维度拆开看,重点看${where}。` : `下面按五个维度拆开看,重点看${where}。`;
88
+ }
89
+
90
+ /** 说人话整段:去掉术语,用生活语言讲这张盘的整体气质 */
91
+ export function buildPlain(r, ask, ctx = {}) {
92
+ if (!r || !r.system) return '';
93
+ if (r.system === 'bazi') {
94
+ const st = r.strength || {};
95
+ const ys = (r.frame && r.frame.yongshen) || {};
96
+ const favor = join(ys.favor);
97
+ const avoid = join(ys.avoid);
98
+ const strength = STRENGTH_PLAIN[st.level] || '力量偏中性';
99
+ const tiaohou = ys.tiaohou && ys.tiaohou.note ? `另外,${ys.tiaohou.note},所以「暖一点、亮一点」的环境通常更舒服。` : '';
100
+ return `你的命局属于「${s(st.level, '中性')}」:${strength}。` +
101
+ `${favor ? `能补${favor}的环境(行业、方位、作息、相处的人)会让你省力;${avoid ? `而${avoid}偏重的场合容易空耗,能绕就绕。` : ''}` : ''}` +
102
+ tiaohou;
103
+ }
104
+ if (r.system === 'ziwei') {
105
+ const soul = r.soul || {};
106
+ const body = r.body || {};
107
+ return `紫微看的是「你与环境怎么互动」。命宫落${s(soul.branch, '—')}宫,说明你做事的第一反应是从这个宫位的气质出发` +
108
+ `${body.lands ? `;身宫在「${body.lands}」,意味着真正让你上心的,是${body.lands}这件事` : ''}。`;
109
+ }
110
+ if (r.system === 'liuyao') {
111
+ const ben = r.ben || {};
112
+ const moving = (r.cast && r.cast.movingPositions) || [];
113
+ return `${s(ben.name, '这一卦')}讲的是一个「${moving.length ? '正在动、还会变' : '暂时不动、先看清'}」的局面——` +
114
+ `${moving.length ? '有动爻,说明事情还有转圜空间,不是死局。' : '六爻安静,说明当下更该观察而不是硬推。'}`;
115
+ }
116
+ return '';
117
+ }
118
+
119
+ /** 每维一句白话(仅在有盘面数据支撑时给出,避免空话) */
120
+ export function dimensionPlain(key, r, ctx = {}) {
121
+ if (!r || r.system !== 'bazi') return '';
122
+ const ys = (r.frame && r.frame.yongshen) || {};
123
+ const favor = join(ys.favor);
124
+ const avoid = join(ys.avoid);
125
+ const st = r.strength || {};
126
+ if (key === 'overall') return `一句话:底子${s(st.level, '中性')},往${favor || '有利方向'}走省力。`;
127
+ if (key === 'work') return `一句话:挑${favor || '喜用'}属性的活儿,比硬碰${avoid || '忌神'}省力。`;
128
+ if (key === 'career') return `一句话:你的上升方式,偏向把${favor || '长处'}做成看得见的成果。`;
129
+ if (key === 'love') return '一句话:关系里先看清自己要什么,再决定推进速度。';
130
+ if (key === 'health') return '一句话:作息稳定比任何调理都优先。';
131
+ return '';
132
+ }
133
+
134
+ // 术语白话表:只解释本篇真正出现的词
135
+ const GLOSSARY = [
136
+ ['日主', '你出生那天对应的天干,代表「你自己」,整张盘都围着它转。'],
137
+ ['用神', '这张盘里最需要补的那一类力量,顺着它做事更省力。'],
138
+ ['忌神', '补得越多越别扭的那一类力量,不是坏东西,只是对你性价比低。'],
139
+ ['调候', '按出生季节调温补缺:冬天的盘怕冷,夏天的盘怕燥。'],
140
+ ['格局', '把整张盘的结构归成一个类型,用来看「你适合怎么打」。'],
141
+ ['十神', '把五行关系翻译成人事:财=资源、官杀=规则与压力、印=支持、食伤=表达、比劫=同伴。'],
142
+ ['月令', '出生的月份,是判断强弱最关键的一个位置。'],
143
+ ['日支', '日柱的地支,也叫「配偶宫」,看亲密关系的第一落点。'],
144
+ ['大运', '十年一换的大阶段,决定这十年顺不顺手。'],
145
+ ['流年', '每一年的干支,看当年的具体环境。'],
146
+ ['空亡', '落到空亡的字,力量打折,事情容易「看着有、抓不住」。'],
147
+ ['伏神', '卦里没出现的六亲,藏在同宫首卦的对应爻下,用时才看得见。'],
148
+ ['世应', '世爻代表你,应爻代表对方或外部环境。'],
149
+ ['动爻', '会变的爻,是事情「往哪走」的推动点。'],
150
+ ['纳甲', '给六个爻配上天干地支,六亲与生克才有依据。'],
151
+ ['四化', '禄权科忌四种变化,标记星曜在这一步运里扮演什么角色。'],
152
+ ['大限', '紫微里的十年阶段,作用类似八字的「大运」。'],
153
+ ];
154
+
155
+ /** 同一个术语在不同体系里含义不同,必须分体系解释,否则会给出错误定义 */
156
+ const GLOSSARY_BY_SYSTEM = {
157
+ liuyao: {
158
+ 用神: '你问的这件事对应的那一类六亲,断卦先把它找出来。',
159
+ 月令: '起卦时的月份,用来看各爻旺不旺。',
160
+ 日支: '起卦当天的地支,与月建一起决定爻的力量。',
161
+ 大运: '六爻不看大运,这里只取当前这一件事的象。',
162
+ 流年: '六爻一般不看流年,看的是眼下这一卦的时段。',
163
+ },
164
+ ziwei: {
165
+ 用神: '紫微斗数以「用神宫」的强弱看事情,不取五行喜忌那套。',
166
+ 日主: '紫微斗数不看日主,看的是命宫与星曜组合。',
167
+ 十神: '紫微斗数用四化与星情,不用十神。',
168
+ },
169
+ };
170
+
171
+ /** 术语白话:只列正文里真出现过的词;同名词按体系取对应释义 */
172
+ export function buildGlossary(texts, system) {
173
+ const body = (Array.isArray(texts) ? texts : [texts]).filter(Boolean).join('');
174
+ if (!body) return [];
175
+ const override = GLOSSARY_BY_SYSTEM[system] || {};
176
+ return GLOSSARY
177
+ .filter(([term]) => body.includes(term))
178
+ .map(([term, plain]) => ({ term, plain: override[term] || plain }))
179
+ .slice(0, 10);
180
+ }
181
+
182
+ const FOLLOWUPS = {
183
+ career: ['这份工作要不要动,明年哪几个月是窗口?', '和上级的关系该硬碰还是绕开?', '现在转方向,代价主要在哪儿?'],
184
+ wealth: ['这笔钱现在投出去合适吗?', '我的财主要来自工资还是副业?', '今年哪段时间最容易破财?'],
185
+ love: ['这段关系能走到哪一步?', '什么时候适合把关系定下来?', '我在关系里最容易忽略什么?'],
186
+ health: ['哪段时间身体最需要留意?', '作息怎么调最划算?', '查体和作息之外,还有什么是能自己控制的?'],
187
+ study: ['今年再考一次,胜算在哪、短板在哪?', '复习节奏该怎么排?', '要不要换目标院校或岗位?'],
188
+ travel: ['这次出门顺不顺,哪天走更好?', '换个城市生活,合不合适?'],
189
+ general: ['今年最该抓的一件事是什么?', '最该避开的坑在哪?', '接下来三个月,什么时间点值得留意?'],
190
+ };
191
+
192
+ /** 追问建议:把「还能问什么」具体化,降低二次提问的门槛 */
193
+ export function buildFollowups(r, ask) {
194
+ const dir = (ask && ask.direction) || 'general';
195
+ const list = FOLLOWUPS[dir] || FOLLOWUPS.general;
196
+ return list.slice(0, 3);
197
+ }