mingpan 0.1.2 → 0.1.4
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/README.md +120 -47
- package/dist/core/bazi/BaziCore.d.ts +7 -1
- package/dist/core/bazi/BaziCore.d.ts.map +1 -1
- package/dist/core/bazi/BaziCore.js +37 -11
- package/dist/core/bazi/BaziCore.js.map +1 -1
- package/dist/core/bazi/types.d.ts +4 -0
- package/dist/core/bazi/types.d.ts.map +1 -1
- package/dist/core/qimen/FlyingRule.d.ts +60 -0
- package/dist/core/qimen/FlyingRule.d.ts.map +1 -0
- package/dist/core/qimen/FlyingRule.js +94 -0
- package/dist/core/qimen/FlyingRule.js.map +1 -0
- package/dist/core/qimen/GongMapping.d.ts +29 -0
- package/dist/core/qimen/GongMapping.d.ts.map +1 -0
- package/dist/core/qimen/GongMapping.js +83 -0
- package/dist/core/qimen/GongMapping.js.map +1 -0
- package/dist/core/qimen/RotatingRule.d.ts +76 -0
- package/dist/core/qimen/RotatingRule.d.ts.map +1 -0
- package/dist/core/qimen/RotatingRule.js +126 -0
- package/dist/core/qimen/RotatingRule.js.map +1 -0
- package/dist/core/qimen/YinYangDunCalculator.d.ts +28 -0
- package/dist/core/qimen/YinYangDunCalculator.d.ts.map +1 -0
- package/dist/core/qimen/YinYangDunCalculator.js +79 -0
- package/dist/core/qimen/YinYangDunCalculator.js.map +1 -0
- package/dist/core/qimen/index.d.ts +10 -0
- package/dist/core/qimen/index.d.ts.map +1 -0
- package/dist/core/qimen/index.js +58 -0
- package/dist/core/qimen/index.js.map +1 -0
- package/dist/core/qimen/types.d.ts +19 -0
- package/dist/core/qimen/types.d.ts.map +1 -0
- package/dist/core/qimen/types.js +7 -0
- package/dist/core/qimen/types.js.map +1 -0
- package/dist/index.d.ts +10 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1311
- package/dist/index.js.map +1 -1
- package/dist/output/fortuneTextRenderer.d.ts +8 -7
- package/dist/output/fortuneTextRenderer.d.ts.map +1 -1
- package/dist/output/fortuneTextRenderer.js +83 -21
- package/dist/output/fortuneTextRenderer.js.map +1 -1
- package/dist/output/qimenTextRenderer.d.ts +36 -0
- package/dist/output/qimenTextRenderer.d.ts.map +1 -0
- package/dist/output/qimenTextRenderer.js +230 -0
- package/dist/output/qimenTextRenderer.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +33 -0
- package/dist/server.js.map +1 -0
- package/dist/services/bazi/BaziService.d.ts +1 -17
- package/dist/services/bazi/BaziService.d.ts.map +1 -1
- package/dist/services/bazi/BaziService.js +9 -194
- package/dist/services/bazi/BaziService.js.map +1 -1
- package/dist/services/bazi/analyzers/TenGodsAnalyzer.js +12 -12
- package/dist/services/bazi/analyzers/TenGodsAnalyzer.js.map +1 -1
- package/dist/services/bazi/index.d.ts +0 -2
- package/dist/services/bazi/index.d.ts.map +1 -1
- package/dist/services/bazi/index.js +1 -5
- package/dist/services/bazi/index.js.map +1 -1
- package/dist/services/bazi/types.d.ts +4 -112
- package/dist/services/bazi/types.d.ts.map +1 -1
- package/dist/services/bazi/types.js +3 -102
- package/dist/services/bazi/types.js.map +1 -1
- package/dist/services/daliuren/DaliurenService.d.ts +11 -1
- package/dist/services/daliuren/DaliurenService.d.ts.map +1 -1
- package/dist/services/daliuren/DaliurenService.js +30 -0
- package/dist/services/daliuren/DaliurenService.js.map +1 -1
- package/dist/services/daliuren/calculators/TianDiPanCalculator.d.ts.map +1 -1
- package/dist/services/daliuren/calculators/TianDiPanCalculator.js +3 -4
- package/dist/services/daliuren/calculators/TianDiPanCalculator.js.map +1 -1
- package/dist/services/daliuren/data/constants.d.ts +7 -0
- package/dist/services/daliuren/data/constants.d.ts.map +1 -1
- package/dist/services/daliuren/data/constants.js +17 -1
- package/dist/services/daliuren/data/constants.js.map +1 -1
- package/dist/services/daliuren/types.d.ts +13 -0
- package/dist/services/daliuren/types.d.ts.map +1 -1
- package/dist/services/meihua/calculators/TiyongCalculator.d.ts.map +1 -1
- package/dist/services/meihua/calculators/TiyongCalculator.js +6 -5
- package/dist/services/meihua/calculators/TiyongCalculator.js.map +1 -1
- package/dist/services/qimen/QimenService.d.ts +76 -0
- package/dist/services/qimen/QimenService.d.ts.map +1 -0
- package/dist/services/qimen/QimenService.js +393 -0
- package/dist/services/qimen/QimenService.js.map +1 -0
- package/dist/services/qimen/calculators/BaMenCalculator.d.ts +45 -0
- package/dist/services/qimen/calculators/BaMenCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/BaMenCalculator.js +87 -0
- package/dist/services/qimen/calculators/BaMenCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/BaShenCalculator.d.ts +34 -0
- package/dist/services/qimen/calculators/BaShenCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/BaShenCalculator.js +57 -0
- package/dist/services/qimen/calculators/BaShenCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/GeJuCalculator.d.ts +141 -0
- package/dist/services/qimen/calculators/GeJuCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/GeJuCalculator.js +711 -0
- package/dist/services/qimen/calculators/GeJuCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.d.ts +49 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.js +68 -0
- package/dist/services/qimen/calculators/JiuGongCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.d.ts +44 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.js +72 -0
- package/dist/services/qimen/calculators/JiuXingCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/JuShuCalculator.d.ts +60 -0
- package/dist/services/qimen/calculators/JuShuCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/JuShuCalculator.js +110 -0
- package/dist/services/qimen/calculators/JuShuCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.d.ts +117 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.js +237 -0
- package/dist/services/qimen/calculators/PanTypeCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts +41 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js +73 -0
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.d.ts +80 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.js +300 -0
- package/dist/services/qimen/calculators/ShenShaCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/YongShenCalculator.d.ts +78 -0
- package/dist/services/qimen/calculators/YongShenCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/YongShenCalculator.js +497 -0
- package/dist/services/qimen/calculators/YongShenCalculator.js.map +1 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts +111 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts.map +1 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.js +232 -0
- package/dist/services/qimen/calculators/ZhuanPanCalculator.js.map +1 -0
- package/dist/services/qimen/data/constants.d.ts +105 -0
- package/dist/services/qimen/data/constants.d.ts.map +1 -0
- package/dist/services/qimen/data/constants.js +295 -0
- package/dist/services/qimen/data/constants.js.map +1 -0
- package/dist/services/qimen/data/shensha-rules.d.ts +177 -0
- package/dist/services/qimen/data/shensha-rules.d.ts.map +1 -0
- package/dist/services/qimen/data/shensha-rules.js +397 -0
- package/dist/services/qimen/data/shensha-rules.js.map +1 -0
- package/dist/services/qimen/data/yongshen-rules.d.ts +115 -0
- package/dist/services/qimen/data/yongshen-rules.d.ts.map +1 -0
- package/dist/services/qimen/data/yongshen-rules.js +365 -0
- package/dist/services/qimen/data/yongshen-rules.js.map +1 -0
- package/dist/services/qimen/index.d.ts +20 -0
- package/dist/services/qimen/index.d.ts.map +1 -0
- package/dist/services/qimen/index.js +43 -0
- package/dist/services/qimen/index.js.map +1 -0
- package/dist/services/qimen/types.d.ts +316 -0
- package/dist/services/qimen/types.d.ts.map +1 -0
- package/dist/services/qimen/types.js +21 -0
- package/dist/services/qimen/types.js.map +1 -0
- package/dist/services/qimen/utils/gongUtils.d.ts +80 -0
- package/dist/services/qimen/utils/gongUtils.d.ts.map +1 -0
- package/dist/services/qimen/utils/gongUtils.js +164 -0
- package/dist/services/qimen/utils/gongUtils.js.map +1 -0
- package/dist/shared/logger.d.ts +5 -0
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/logger.js +11 -4
- package/dist/shared/logger.js.map +1 -1
- package/dist/tools/baziTools.d.ts +13 -0
- package/dist/tools/baziTools.d.ts.map +1 -0
- package/dist/tools/baziTools.js +331 -0
- package/dist/tools/baziTools.js.map +1 -0
- package/dist/tools/divinationTools.d.ts +9 -0
- package/dist/tools/divinationTools.d.ts.map +1 -0
- package/dist/tools/divinationTools.js +209 -0
- package/dist/tools/divinationTools.js.map +1 -0
- package/dist/tools/qimenTools.d.ts +10 -0
- package/dist/tools/qimenTools.d.ts.map +1 -0
- package/dist/tools/qimenTools.js +132 -0
- package/dist/tools/qimenTools.js.map +1 -0
- package/dist/tools/schemas.d.ts +99 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +162 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/ziweiTools.d.ts +14 -0
- package/dist/tools/ziweiTools.d.ts.map +1 -0
- package/dist/tools/ziweiTools.js +483 -0
- package/dist/tools/ziweiTools.js.map +1 -0
- package/dist/utils/timeNormalization.d.ts +42 -17
- package/dist/utils/timeNormalization.d.ts.map +1 -1
- package/dist/utils/timeNormalization.js +99 -41
- package/dist/utils/timeNormalization.js.map +1 -1
- package/package.json +15 -9
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts +0 -16
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts.map +0 -1
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js +0 -60
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js.map +0 -1
- package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts +0 -33
- package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts.map +0 -1
- package/dist/services/bazi/analyzers/NaYinAnalyzer.js +0 -209
- package/dist/services/bazi/analyzers/NaYinAnalyzer.js.map +0 -1
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts +0 -236
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts.map +0 -1
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.js +0 -2079
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.js.map +0 -1
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts +0 -46
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts.map +0 -1
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.js +0 -260
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.js.map +0 -1
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 奇门遁甲盘面 Markdown 渲染器
|
|
4
|
+
*
|
|
5
|
+
* 输出格式设计原则:
|
|
6
|
+
* - 第一屏就让人/agent 看懂
|
|
7
|
+
* - ASCII 艺术保持九宫格的直观性
|
|
8
|
+
* - 统一使用简体中文
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.renderQimenText = renderQimenText;
|
|
12
|
+
exports.renderJiuGongGrid = renderJiuGongGrid;
|
|
13
|
+
exports.getGongName = getGongName;
|
|
14
|
+
exports.renderQimenYongShenText = renderQimenYongShenText;
|
|
15
|
+
exports.renderYongShenText = renderYongShenText;
|
|
16
|
+
exports.renderShenShaText = renderShenShaText;
|
|
17
|
+
const constants_1 = require("../services/qimen/data/constants");
|
|
18
|
+
/**
|
|
19
|
+
* 渲染奇门遁甲盘面为 Markdown 文本
|
|
20
|
+
*/
|
|
21
|
+
function renderQimenText(result) {
|
|
22
|
+
const lines = [];
|
|
23
|
+
// 标题
|
|
24
|
+
lines.push('## 奇门遁甲排盘');
|
|
25
|
+
lines.push('');
|
|
26
|
+
// 基本信息
|
|
27
|
+
const panStyleText = result.panStyle === '飞盘' ? '飞盘式' : '转盘式';
|
|
28
|
+
lines.push(`**${result.yinYangDun}${result.juShu}局** | ${result.panType} | ${panStyleText} | ${result.yuan} | ${result.zhiRunMethod === 'chaibu' ? '拆补法' : '茅山法'}`);
|
|
29
|
+
lines.push('');
|
|
30
|
+
// 时间信息
|
|
31
|
+
lines.push(`**公历**:${result.timeInfo.solarDate} | **农历**:${result.timeInfo.lunarDate}`);
|
|
32
|
+
lines.push(`**节气**:${result.timeInfo.jieQi}`);
|
|
33
|
+
lines.push(`**四柱**:${result.timeInfo.siZhu.yearGanZhi}年 ${result.timeInfo.siZhu.monthGanZhi}月 ${result.timeInfo.siZhu.dayGanZhi}日 ${result.timeInfo.siZhu.hourGanZhi}时`);
|
|
34
|
+
lines.push('');
|
|
35
|
+
// 旬首信息
|
|
36
|
+
lines.push(`**旬首**:${result.xunShou.xunShou} | **空亡**:${result.xunShou.kongWang[0]}${result.xunShou.kongWang[1]}`);
|
|
37
|
+
lines.push(`**值符**:${constants_1.JIU_XING_FULL[result.xunShou.zhiFuXing]}(原${getGongName(result.xunShou.zhiFuGong)}→${getGongName(result.xunShou.zhiFuLuoGong)})`);
|
|
38
|
+
lines.push(`**值使**:${constants_1.BA_MEN_FULL[result.xunShou.zhiShiMen]}(原${getGongName(result.xunShou.zhiShiGong)}→${getGongName(result.xunShou.zhiShiLuoGong)})`);
|
|
39
|
+
lines.push('');
|
|
40
|
+
// 日时落宫
|
|
41
|
+
lines.push(`**日干${result.timeInfo.siZhu.dayGan}落宫**:${getGongName(result.dayGanGong)} | **时干${result.timeInfo.siZhu.hourGan}落宫**:${getGongName(result.hourGanGong)}`);
|
|
42
|
+
lines.push('');
|
|
43
|
+
// 九宫盘
|
|
44
|
+
lines.push('### 九宫盘');
|
|
45
|
+
lines.push('');
|
|
46
|
+
lines.push(renderJiuGongGrid(result.gongs));
|
|
47
|
+
lines.push('');
|
|
48
|
+
// 格局(僅輸出檢測到的結構性格局名,吉凶屬解讀層,由 AI 依學派自行判斷)
|
|
49
|
+
if (result.geJu.length > 0) {
|
|
50
|
+
lines.push('### 格局檢測');
|
|
51
|
+
lines.push('');
|
|
52
|
+
lines.push(`**檢測到的格局**:${result.geJu.map(g => g.name).join('、')}`);
|
|
53
|
+
lines.push('');
|
|
54
|
+
}
|
|
55
|
+
// 九宫详表
|
|
56
|
+
lines.push('### 九宫详表');
|
|
57
|
+
lines.push('');
|
|
58
|
+
lines.push('| 宫位 | 地盘 | 天盘 | 八门 | 九星 | 八神 | 空亡 | 马星 |');
|
|
59
|
+
lines.push('|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|');
|
|
60
|
+
// 按洛书顺序排列:巽4 离9 坤2 / 震3 中5 兑7 / 艮8 坎1 乾6
|
|
61
|
+
const displayOrder = [4, 9, 2, 3, 5, 7, 8, 1, 6];
|
|
62
|
+
for (const gongWei of displayOrder) {
|
|
63
|
+
const gong = result.gongs[gongWei];
|
|
64
|
+
const kongMark = gong.isKong ? '○' : '';
|
|
65
|
+
const maMark = gong.isMa ? '○' : '';
|
|
66
|
+
lines.push(`| ${gong.gongName}${gong.gong} | ${gong.diPanGan} | ${gong.tianPanGan} | ${constants_1.BA_MEN_FULL[gong.men]} | ${constants_1.JIU_XING_FULL[gong.xing]} | ${constants_1.BA_SHEN_FULL[gong.shen]} | ${kongMark} | ${maMark} |`);
|
|
67
|
+
}
|
|
68
|
+
lines.push('');
|
|
69
|
+
return lines.join('\n');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 渲染九宫格 ASCII 艺术
|
|
73
|
+
*/
|
|
74
|
+
function renderJiuGongGrid(gongs) {
|
|
75
|
+
const lines = [];
|
|
76
|
+
// 获取每个宫位的显示信息
|
|
77
|
+
const getGongDisplay = (gongWei) => {
|
|
78
|
+
const gong = gongs[gongWei];
|
|
79
|
+
const line1 = `${gong.gongName}${gong.gong}宫`;
|
|
80
|
+
const line2 = `${gong.diPanGan}+${gong.tianPanGan}`;
|
|
81
|
+
const line3 = `${constants_1.JIU_XING_FULL[gong.xing]} ${constants_1.BA_MEN_FULL[gong.men]}`;
|
|
82
|
+
const line4 = constants_1.BA_SHEN_FULL[gong.shen];
|
|
83
|
+
return [line1, line2, line3, line4];
|
|
84
|
+
};
|
|
85
|
+
// 填充到固定宽度
|
|
86
|
+
const pad = (s, width) => {
|
|
87
|
+
const len = [...s].length; // 处理中文字符
|
|
88
|
+
const padding = width - len;
|
|
89
|
+
const left = Math.floor(padding / 2);
|
|
90
|
+
const right = padding - left;
|
|
91
|
+
return ' '.repeat(left) + s + ' '.repeat(right);
|
|
92
|
+
};
|
|
93
|
+
const cellWidth = 12;
|
|
94
|
+
lines.push('```');
|
|
95
|
+
// 第一行:巽4 离9 坤2
|
|
96
|
+
const row1 = [getGongDisplay(4), getGongDisplay(9), getGongDisplay(2)];
|
|
97
|
+
lines.push('┌' + '─'.repeat(cellWidth) + '┬' + '─'.repeat(cellWidth) + '┬' + '─'.repeat(cellWidth) + '┐');
|
|
98
|
+
for (let i = 0; i < 4; i++) {
|
|
99
|
+
lines.push('│' + pad(row1[0][i], cellWidth) + '│' + pad(row1[1][i], cellWidth) + '│' + pad(row1[2][i], cellWidth) + '│');
|
|
100
|
+
}
|
|
101
|
+
// 第二行:震3 中5 兑7
|
|
102
|
+
const row2 = [getGongDisplay(3), getGongDisplay(5), getGongDisplay(7)];
|
|
103
|
+
lines.push('├' + '─'.repeat(cellWidth) + '┼' + '─'.repeat(cellWidth) + '┼' + '─'.repeat(cellWidth) + '┤');
|
|
104
|
+
for (let i = 0; i < 4; i++) {
|
|
105
|
+
lines.push('│' + pad(row2[0][i], cellWidth) + '│' + pad(row2[1][i], cellWidth) + '│' + pad(row2[2][i], cellWidth) + '│');
|
|
106
|
+
}
|
|
107
|
+
// 第三行:艮8 坎1 乾6
|
|
108
|
+
const row3 = [getGongDisplay(8), getGongDisplay(1), getGongDisplay(6)];
|
|
109
|
+
lines.push('├' + '─'.repeat(cellWidth) + '┼' + '─'.repeat(cellWidth) + '┼' + '─'.repeat(cellWidth) + '┤');
|
|
110
|
+
for (let i = 0; i < 4; i++) {
|
|
111
|
+
lines.push('│' + pad(row3[0][i], cellWidth) + '│' + pad(row3[1][i], cellWidth) + '│' + pad(row3[2][i], cellWidth) + '│');
|
|
112
|
+
}
|
|
113
|
+
lines.push('└' + '─'.repeat(cellWidth) + '┴' + '─'.repeat(cellWidth) + '┴' + '─'.repeat(cellWidth) + '┘');
|
|
114
|
+
lines.push('```');
|
|
115
|
+
return lines.join('\n');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 获取宫位名称
|
|
119
|
+
*/
|
|
120
|
+
function getGongName(gong) {
|
|
121
|
+
const names = {
|
|
122
|
+
1: '坎一',
|
|
123
|
+
2: '坤二',
|
|
124
|
+
3: '震三',
|
|
125
|
+
4: '巽四',
|
|
126
|
+
5: '中五',
|
|
127
|
+
6: '乾六',
|
|
128
|
+
7: '兑七',
|
|
129
|
+
8: '艮八',
|
|
130
|
+
9: '离九',
|
|
131
|
+
};
|
|
132
|
+
return names[gong];
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 渲染带用神分析的奇门盘
|
|
136
|
+
*/
|
|
137
|
+
function renderQimenYongShenText(result) {
|
|
138
|
+
const lines = [];
|
|
139
|
+
// 首先渲染基础盘面
|
|
140
|
+
lines.push(renderQimenText(result));
|
|
141
|
+
// 如果有用神分析
|
|
142
|
+
if (result.yongShen) {
|
|
143
|
+
lines.push('');
|
|
144
|
+
lines.push(renderYongShenText(result.yongShen));
|
|
145
|
+
}
|
|
146
|
+
// 如果各宫有神煞信息,单独汇总
|
|
147
|
+
const allShenSha = [];
|
|
148
|
+
for (const gong of [1, 2, 3, 4, 5, 6, 7, 8, 9]) {
|
|
149
|
+
if (result.gongs[gong].shenSha) {
|
|
150
|
+
allShenSha.push(...result.gongs[gong].shenSha);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (allShenSha.length > 0) {
|
|
154
|
+
lines.push('');
|
|
155
|
+
lines.push(renderShenShaText(allShenSha));
|
|
156
|
+
}
|
|
157
|
+
return lines.join('\n');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 渲染用神分析
|
|
161
|
+
*/
|
|
162
|
+
function renderYongShenText(yongShen) {
|
|
163
|
+
const lines = [];
|
|
164
|
+
lines.push('### 用神分析');
|
|
165
|
+
lines.push('');
|
|
166
|
+
lines.push(`**事类**:${yongShen.shiLei}`);
|
|
167
|
+
lines.push('');
|
|
168
|
+
// 主用神
|
|
169
|
+
if (yongShen.zhuyong.length > 0) {
|
|
170
|
+
lines.push('**主用神**:');
|
|
171
|
+
for (const item of yongShen.zhuyong) {
|
|
172
|
+
lines.push(`- ${item.name}:落${getGongName(item.gong)}(${item.state})`);
|
|
173
|
+
}
|
|
174
|
+
lines.push('');
|
|
175
|
+
}
|
|
176
|
+
// 辅用神
|
|
177
|
+
if (yongShen.fuyong.length > 0) {
|
|
178
|
+
lines.push('**辅用神**:');
|
|
179
|
+
for (const item of yongShen.fuyong) {
|
|
180
|
+
lines.push(`- ${item.name}:落${getGongName(item.gong)}(${item.state})`);
|
|
181
|
+
}
|
|
182
|
+
lines.push('');
|
|
183
|
+
}
|
|
184
|
+
// 用神狀態(只輸出確定性事實:空亡/入墓/擊刑/與日干生克;評分與吉凶屬解讀層,由 AI 判斷)
|
|
185
|
+
if (yongShen.analysis.length > 0) {
|
|
186
|
+
lines.push('**用神狀態**:');
|
|
187
|
+
lines.push('');
|
|
188
|
+
lines.push('| 用神 | 落宮 | 狀態 |');
|
|
189
|
+
lines.push('|:----:|:----:|:-----|');
|
|
190
|
+
for (const a of yongShen.analysis) {
|
|
191
|
+
const statusParts = [];
|
|
192
|
+
if (a.isKong)
|
|
193
|
+
statusParts.push('空亡');
|
|
194
|
+
if (a.isRuMu)
|
|
195
|
+
statusParts.push('入墓');
|
|
196
|
+
if (a.isJiXing)
|
|
197
|
+
statusParts.push('擊刑');
|
|
198
|
+
statusParts.push(`${a.relationToDay}日干`);
|
|
199
|
+
lines.push(`| ${a.yongshen} | ${getGongName(a.gong)} | ${statusParts.join('、')} |`);
|
|
200
|
+
}
|
|
201
|
+
lines.push('');
|
|
202
|
+
}
|
|
203
|
+
// 主客分析(落宮與生克關係為確定性事實;結論屬解讀層)
|
|
204
|
+
if (yongShen.zhuKe) {
|
|
205
|
+
lines.push('**主客分析**:');
|
|
206
|
+
lines.push(`- 我方(日干):落${getGongName(yongShen.zhuKe.zhu.gong)}(${yongShen.zhuKe.zhu.state})`);
|
|
207
|
+
lines.push(`- 对方(时干):落${getGongName(yongShen.zhuKe.ke.gong)}(${yongShen.zhuKe.ke.state})`);
|
|
208
|
+
lines.push(`- 主客关系:${yongShen.zhuKe.relation}`);
|
|
209
|
+
lines.push('');
|
|
210
|
+
}
|
|
211
|
+
// 年命分析
|
|
212
|
+
if (yongShen.nianMing) {
|
|
213
|
+
lines.push('**年命分析**:');
|
|
214
|
+
lines.push(`- 年干${yongShen.nianMing.nianGan}落${getGongName(yongShen.nianMing.gong)}(${yongShen.nianMing.state})`);
|
|
215
|
+
lines.push('');
|
|
216
|
+
}
|
|
217
|
+
return lines.join('\n');
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* 渲染神煞信息(平列名稱與落宮;吉凶屬解讀層)
|
|
221
|
+
*/
|
|
222
|
+
function renderShenShaText(shenShaList) {
|
|
223
|
+
const lines = [];
|
|
224
|
+
lines.push('### 神煞信息');
|
|
225
|
+
lines.push('');
|
|
226
|
+
lines.push(shenShaList.map(s => `${s.name}@${getGongName(s.gong)}`).join('、'));
|
|
227
|
+
lines.push('');
|
|
228
|
+
return lines.join('\n');
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=qimenTextRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qimenTextRenderer.js","sourceRoot":"","sources":["../../src/output/qimenTextRenderer.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAYH,0CA2DC;AA8EQ,8CAAiB;AAAE,kCAAW;AAiBvC,0DAyBC;AAKD,gDA8DC;AAKD,8CASC;AA7QD,gEAI0C;AAE1C;;GAEG;AACH,SAAgB,eAAe,CAAC,MAAmB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK;IACL,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO;IACP,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,SAAS,MAAM,CAAC,OAAO,MAAM,YAAY,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACpK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO;IACP,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,QAAQ,CAAC,SAAS,aAAa,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;IACzK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO;IACP,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,OAAO,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnH,KAAK,CAAC,IAAI,CAAC,UAAU,yBAAa,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACvJ,KAAK,CAAC,IAAI,CAAC,UAAU,uBAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvJ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO;IACP,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,QAAQ,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACtK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM;IACN,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,wCAAwC;IACxC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO;IACP,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAExE,yCAAyC;IACzC,MAAM,YAAY,GAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,UAAU,MAAM,uBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,yBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,wBAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,CAAC;IACzM,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAgC;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,cAAc;IACd,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAY,EAAE;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;QAC9C,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,GAAG,yBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,uBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,wBAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,UAAU;IACV,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,KAAa,EAAU,EAAE;QAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS;QACpC,MAAM,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;QAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,EAAE,CAAC;IAErB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElB,eAAe;IACf,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3H,CAAC;IAED,eAAe;IACf,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3H,CAAC;IAED,eAAe;IACf,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3H,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAE1G,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,KAAK,GAA4B;QACrC,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;KACR,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAiBD;;GAEG;AACH,SAAgB,uBAAuB,CAAC,MAAmB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,WAAW;IACX,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpC,UAAU;IACV,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,iBAAiB;IACjB,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAc,EAAE,CAAC;QAC5D,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,QAAsB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM;IACN,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM;IACN,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAErC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,MAAM;gBAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,MAAM;gBAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,QAAQ;gBAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;YAEzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,6BAA6B;IAC7B,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7F,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO;IACP,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QAClH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,WAA0B;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 服務器工廠
|
|
3
|
+
*
|
|
4
|
+
* 構建並註冊全部術數工具(八字/紫微/六爻/梅花/大六壬/奇門)。
|
|
5
|
+
* 入口(index.ts)連接 stdio 傳輸;測試可連接 InMemoryTransport。
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
export declare const SERVER_NAME = "mingpan";
|
|
9
|
+
export declare const SERVER_VERSION = "0.1.4";
|
|
10
|
+
export declare function createMingpanServer(): McpServer;
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,wBAAgB,mBAAmB,IAAI,SAAS,CAmB/C"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP 服務器工廠
|
|
4
|
+
*
|
|
5
|
+
* 構建並註冊全部術數工具(八字/紫微/六爻/梅花/大六壬/奇門)。
|
|
6
|
+
* 入口(index.ts)連接 stdio 傳輸;測試可連接 InMemoryTransport。
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SERVER_VERSION = exports.SERVER_NAME = void 0;
|
|
10
|
+
exports.createMingpanServer = createMingpanServer;
|
|
11
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
12
|
+
const baziTools_1 = require("./tools/baziTools");
|
|
13
|
+
const ziweiTools_1 = require("./tools/ziweiTools");
|
|
14
|
+
const divinationTools_1 = require("./tools/divinationTools");
|
|
15
|
+
const qimenTools_1 = require("./tools/qimenTools");
|
|
16
|
+
exports.SERVER_NAME = "mingpan";
|
|
17
|
+
exports.SERVER_VERSION = "0.1.4";
|
|
18
|
+
function createMingpanServer() {
|
|
19
|
+
const server = new mcp_js_1.McpServer({
|
|
20
|
+
name: exports.SERVER_NAME,
|
|
21
|
+
version: exports.SERVER_VERSION,
|
|
22
|
+
}, {
|
|
23
|
+
capabilities: {
|
|
24
|
+
tools: {},
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
(0, baziTools_1.registerBaziTools)(server);
|
|
28
|
+
(0, ziweiTools_1.registerZiweiTools)(server);
|
|
29
|
+
(0, divinationTools_1.registerDivinationTools)(server);
|
|
30
|
+
(0, qimenTools_1.registerQimenTools)(server);
|
|
31
|
+
return server;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAWH,kDAmBC;AA5BD,oEAAoE;AACpE,iDAAsD;AACtD,mDAAwD;AACxD,6DAAkE;AAClE,mDAAwD;AAE3C,QAAA,WAAW,GAAG,SAAS,CAAC;AACxB,QAAA,cAAc,GAAG,OAAO,CAAC;AAEtC,SAAgB,mBAAmB;IACjC,MAAM,MAAM,GAAG,IAAI,kBAAS,CAC1B;QACE,IAAI,EAAE,mBAAW;QACjB,OAAO,EAAE,sBAAc;KACxB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,IAAA,6BAAiB,EAAC,MAAM,CAAC,CAAC;IAC1B,IAAA,+BAAkB,EAAC,MAAM,CAAC,CAAC;IAC3B,IAAA,yCAAuB,EAAC,MAAM,CAAC,CAAC;IAChC,IAAA,+BAAkB,EAAC,MAAM,CAAC,CAAC;IAE3B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BaZi Service Main Class
|
|
3
3
|
* Unified entry point for all BaZi calculations
|
|
4
4
|
*/
|
|
5
|
-
import { BaziInput, BaziResult, BaziServiceConfig
|
|
5
|
+
import { BaziInput, BaziResult, BaziServiceConfig } from './types';
|
|
6
6
|
export declare class BaziService {
|
|
7
7
|
/**
|
|
8
8
|
* Map numeric strength to rating string
|
|
@@ -27,22 +27,6 @@ export declare class BaziService {
|
|
|
27
27
|
* Allows selective analysis for performance optimization
|
|
28
28
|
*/
|
|
29
29
|
analyze(input: BaziInput, features: string[]): Promise<Partial<BaziResult>>;
|
|
30
|
-
/**
|
|
31
|
-
* Get Da Yun for specific age range
|
|
32
|
-
*/
|
|
33
|
-
getDaYun(chart: BaziChart, birthYear: number, gender: 'male' | 'female', startAge: number, endAge: number): Promise<DaYun[]>;
|
|
34
|
-
/**
|
|
35
|
-
* Get Liu Nian for specific years
|
|
36
|
-
*/
|
|
37
|
-
getLiuNian(chart: BaziChart, birthYear: number, targetYears: number[]): Promise<LiuNian[]>;
|
|
38
|
-
/**
|
|
39
|
-
* Get Liu Yue (monthly fortune) for a specific year
|
|
40
|
-
*/
|
|
41
|
-
getLiuYue(input: BaziInput, year: number): Promise<LiuYueInfo[]>;
|
|
42
|
-
/**
|
|
43
|
-
* Get Liu Ri (daily fortune) for a specific month
|
|
44
|
-
*/
|
|
45
|
-
getLiuRi(input: BaziInput, year: number, month: number): Promise<LiuRiInfo[]>;
|
|
46
30
|
/**
|
|
47
31
|
* Clear cache
|
|
48
32
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaziService.d.ts","sourceRoot":"","sources":["../../../src/services/bazi/BaziService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,SAAS,EACT,UAAU,EAEV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"BaziService.d.ts","sourceRoot":"","sources":["../../../src/services/bazi/BaziService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,SAAS,EACT,UAAU,EAEV,iBAAiB,EAclB,MAAM,SAAS,CAAC;AAsBjB,qBAAa,WAAW;IACtB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAOlC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,iBAAsB;IAY1C;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAwStD;;;OAGG;IACG,OAAO,CACX,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAuC/B;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE;IAsBlD;;OAEG;IACH,SAAS,IAAI,iBAAiB;IAI9B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;CAmC3B;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -9,20 +9,14 @@ const types_1 = require("./types");
|
|
|
9
9
|
const bazi_1 = require("../../core/bazi");
|
|
10
10
|
const bazi_2 = require("../../core/constants/bazi");
|
|
11
11
|
const StrengthAnalyzer_1 = require("./analyzers/StrengthAnalyzer");
|
|
12
|
-
const HiddenStemsAnalyzer_1 = require("./analyzers/HiddenStemsAnalyzer");
|
|
13
12
|
const ClimateAnalyzer_1 = require("./analyzers/ClimateAnalyzer");
|
|
14
13
|
const LuckCycleCalculator_1 = require("./calculators/LuckCycleCalculator");
|
|
15
14
|
const TenGodsAnalyzer_1 = require("./analyzers/TenGodsAnalyzer");
|
|
16
|
-
const ShenShaAnalyzer_1 = require("./analyzers/ShenShaAnalyzer");
|
|
17
|
-
const TraditionalAnalyzer_1 = require("./analyzers/TraditionalAnalyzer");
|
|
18
15
|
const YongShenAnalyzer_1 = require("./analyzers/YongShenAnalyzer");
|
|
19
16
|
const PatternAnalyzer_1 = require("./analyzers/PatternAnalyzer");
|
|
20
17
|
const RelationsAnalyzer_1 = require("./analyzers/RelationsAnalyzer");
|
|
21
18
|
const DaYunCalculator_1 = require("./calculators/DaYunCalculator");
|
|
22
19
|
const LiuNianCalculator_1 = require("./calculators/LiuNianCalculator");
|
|
23
|
-
const LiuYueCalculator_1 = require("./calculators/LiuYueCalculator");
|
|
24
|
-
const LiuRiCalculator_1 = require("./calculators/LiuRiCalculator");
|
|
25
|
-
const NaYinAnalyzer_1 = require("./analyzers/NaYinAnalyzer");
|
|
26
20
|
const logger_1 = require("../../shared/logger");
|
|
27
21
|
// Create stem-element mapping
|
|
28
22
|
const STEM_ELEMENTS = bazi_2.HEAVENLY_STEMS.reduce((acc, stem) => {
|
|
@@ -95,7 +89,6 @@ class BaziService {
|
|
|
95
89
|
// Merge options with defaults
|
|
96
90
|
const options = {
|
|
97
91
|
includeEnhanced: true,
|
|
98
|
-
includeShenSha: true,
|
|
99
92
|
includeTraditional: true,
|
|
100
93
|
...input.options
|
|
101
94
|
};
|
|
@@ -116,30 +109,22 @@ class BaziService {
|
|
|
116
109
|
dayMasterElement: coreResult.dayMasterElement
|
|
117
110
|
});
|
|
118
111
|
// Step 2: Basic analysis (always included)
|
|
119
|
-
const naYinAnalysis = NaYinAnalyzer_1.NaYinAnalyzer.analyze(coreResult.chart);
|
|
120
112
|
const basic = {
|
|
121
113
|
zodiac: coreResult.zodiac || '',
|
|
114
|
+
mingGong: coreResult.mingGong,
|
|
115
|
+
taiYuan: coreResult.taiYuan,
|
|
122
116
|
dayMaster: coreResult.chart.day.stem,
|
|
123
117
|
dayMasterElement: coreResult.dayMasterElement || '',
|
|
124
|
-
naYin: coreResult.naYin,
|
|
125
|
-
naYinAnalysis, // Add detailed NaYin analysis
|
|
126
118
|
fiveElements: coreResult.fiveElements,
|
|
127
|
-
tenGods: TenGodsAnalyzer_1.TenGodsAnalyzer.analyze(coreResult.chart, coreResult.chart.day.stem)
|
|
128
|
-
shenSha: options.includeShenSha
|
|
129
|
-
? (() => {
|
|
130
|
-
const shenShaResult = ShenShaAnalyzer_1.ShenShaAnalyzer.analyze(coreResult.chart, input.gender || 'male');
|
|
131
|
-
return shenShaResult;
|
|
132
|
-
})()
|
|
133
|
-
: undefined
|
|
119
|
+
tenGods: TenGodsAnalyzer_1.TenGodsAnalyzer.analyze(coreResult.chart, coreResult.chart.day.stem)
|
|
134
120
|
};
|
|
135
121
|
// Step 3: Enhanced analysis (optional but needed for traditional)
|
|
136
122
|
let enhanced;
|
|
137
123
|
let advancedRelations;
|
|
138
124
|
let patternAnalysis;
|
|
139
125
|
if (options.includeEnhanced || options.includeTraditional) {
|
|
140
|
-
const [strengthAnalysis,
|
|
126
|
+
const [strengthAnalysis, twelveGrowthStages, voidBranches, climate, monthStrength] = await Promise.all([
|
|
141
127
|
StrengthAnalyzer_1.StrengthAnalyzer.analyze(coreResult.chart, coreResult.birthInfo),
|
|
142
|
-
HiddenStemsAnalyzer_1.HiddenStemsAnalyzer.analyze(coreResult.chart),
|
|
143
128
|
this.core.calculateTwelveGrowthStages(coreResult.chart),
|
|
144
129
|
this.core.calculateVoidBranches(coreResult.chart.day),
|
|
145
130
|
ClimateAnalyzer_1.ClimateAnalyzer.analyze(coreResult.chart, coreResult.birthInfo),
|
|
@@ -189,7 +174,6 @@ class BaziService {
|
|
|
189
174
|
}
|
|
190
175
|
enhanced = {
|
|
191
176
|
strengthAnalysis,
|
|
192
|
-
hiddenStems,
|
|
193
177
|
twelveGrowthStages,
|
|
194
178
|
voidBranches,
|
|
195
179
|
branchRelations: advancedRelations,
|
|
@@ -201,15 +185,9 @@ class BaziService {
|
|
|
201
185
|
// Step 4: Traditional analysis with enhanced YongShen (optional)
|
|
202
186
|
let traditional;
|
|
203
187
|
if (options.includeTraditional && coreResult.dayMasterElement && enhanced) {
|
|
204
|
-
//
|
|
205
|
-
const basicTraditional = TraditionalAnalyzer_1.TraditionalAnalyzer.analyze(coreResult.chart, coreResult.fiveElements, coreResult.dayMasterElement);
|
|
206
|
-
// Use enhanced YongShen analyzer
|
|
207
|
-
const yongShenAnalysis = YongShenAnalyzer_1.YongShenAnalyzer.analyze(coreResult.chart, enhanced.strengthAnalysis, patternAnalysis, enhanced.climate);
|
|
208
|
-
// Keep pattern analysis and yongShen analysis separate as the component expects
|
|
188
|
+
// 用神分析(流月/流日列表工具的内部输入)
|
|
209
189
|
traditional = {
|
|
210
|
-
yongShen:
|
|
211
|
-
geJu: basicTraditional.geJu,
|
|
212
|
-
strength: basicTraditional.strength
|
|
190
|
+
yongShen: YongShenAnalyzer_1.YongShenAnalyzer.analyze(coreResult.chart, enhanced.strengthAnalysis, patternAnalysis, enhanced.climate),
|
|
213
191
|
};
|
|
214
192
|
}
|
|
215
193
|
// Step 5: Time-based analysis
|
|
@@ -268,110 +246,6 @@ class BaziService {
|
|
|
268
246
|
currentLiuNian = undefined;
|
|
269
247
|
}
|
|
270
248
|
}
|
|
271
|
-
// Step 5b: Liu Yue (Monthly) calculations
|
|
272
|
-
let liuYue;
|
|
273
|
-
let currentLiuYue;
|
|
274
|
-
if (options.includeLiuYue && options.liuYueOptions) {
|
|
275
|
-
const liuYueYear = options.liuYueOptions.year || currentYear;
|
|
276
|
-
// Use the getLiuYue method we created
|
|
277
|
-
const liuYueResults = await this.getLiuYue(input, liuYueYear);
|
|
278
|
-
liuYue = liuYueResults.map(ly => ({
|
|
279
|
-
year: liuYueYear,
|
|
280
|
-
month: ly.month,
|
|
281
|
-
stem: ly.stem,
|
|
282
|
-
branch: ly.branch,
|
|
283
|
-
tenGod: '', // To be calculated if needed
|
|
284
|
-
element: STEM_ELEMENTS[ly.stem],
|
|
285
|
-
season: '', // To be calculated based on month
|
|
286
|
-
analysis: {
|
|
287
|
-
overall: ly.fortune,
|
|
288
|
-
career: { rating: ly.rating / 10, trend: '稳定', description: '' },
|
|
289
|
-
wealth: { rating: ly.rating / 10, trend: '稳定', description: '' },
|
|
290
|
-
relationships: { rating: ly.rating / 10, trend: '稳定', description: '' },
|
|
291
|
-
health: {
|
|
292
|
-
stressLevel: (ly.rating < 40 ? 'high' : ly.rating < 70 ? 'moderate' : 'low'),
|
|
293
|
-
vulnerableAreas: ly.healthFocus,
|
|
294
|
-
preventiveMeasures: ly.recommendations,
|
|
295
|
-
energyLevel: ly.rating / 10
|
|
296
|
-
},
|
|
297
|
-
luckyDays: ly.luckyDays,
|
|
298
|
-
unluckyDays: [],
|
|
299
|
-
activities: [],
|
|
300
|
-
elementBalance: {
|
|
301
|
-
dominant: STEM_ELEMENTS[ly.stem],
|
|
302
|
-
trend: '稳定',
|
|
303
|
-
impact: ''
|
|
304
|
-
},
|
|
305
|
-
monthlyTheme: ly.mainInfluences[0] || ''
|
|
306
|
-
}
|
|
307
|
-
}));
|
|
308
|
-
// Find current month if calculating for current year
|
|
309
|
-
if (liuYueYear === currentYear) {
|
|
310
|
-
const currentMonth = new Date().getMonth() + 1;
|
|
311
|
-
currentLiuYue = liuYue.find(m => m.month === currentMonth);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
// Step 5c: Liu Ri (Daily) calculations
|
|
315
|
-
let liuRi;
|
|
316
|
-
let todayLiuRi;
|
|
317
|
-
if (options.includeLiuRi && options.liuRiOptions) {
|
|
318
|
-
const liuRiYear = options.liuRiOptions.year || currentYear;
|
|
319
|
-
const liuRiMonth = options.liuRiOptions.month || new Date().getMonth() + 1;
|
|
320
|
-
if (options.liuRiOptions.singleDate) {
|
|
321
|
-
// Calculate for single date only - we'll implement this later
|
|
322
|
-
todayLiuRi = undefined;
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
// Calculate for entire month
|
|
326
|
-
const liuRiResults = await this.getLiuRi(input, liuRiYear, liuRiMonth);
|
|
327
|
-
liuRi = liuRiResults.map(lr => ({
|
|
328
|
-
date: lr.date,
|
|
329
|
-
stem: lr.stem,
|
|
330
|
-
branch: lr.branch,
|
|
331
|
-
tenGod: '', // To be calculated if needed
|
|
332
|
-
element: STEM_ELEMENTS[lr.stem],
|
|
333
|
-
analysis: {
|
|
334
|
-
rating: lr.rating,
|
|
335
|
-
quality: lr.fortune,
|
|
336
|
-
activities: lr.activities.favorable.map(a => ({
|
|
337
|
-
activity: a,
|
|
338
|
-
suitability: '宜',
|
|
339
|
-
reason: ''
|
|
340
|
-
})),
|
|
341
|
-
hourlyAnalysis: lr.hourlyFortunes.map((hf, idx) => ({
|
|
342
|
-
hour: idx,
|
|
343
|
-
stem: '',
|
|
344
|
-
branch: hf.branch,
|
|
345
|
-
quality: hf.rating >= 70 ? '优秀' : hf.rating >= 50 ? '良好' : hf.rating >= 30 ? '中性' : '较差',
|
|
346
|
-
activities: [hf.activity]
|
|
347
|
-
})),
|
|
348
|
-
almanacInfo: {
|
|
349
|
-
suitable: lr.activities.favorable,
|
|
350
|
-
avoid: lr.activities.avoid,
|
|
351
|
-
auspiciousHours: lr.luckyHours,
|
|
352
|
-
inauspiciousHours: []
|
|
353
|
-
},
|
|
354
|
-
quickTips: lr.opportunities,
|
|
355
|
-
elementalFlow: {
|
|
356
|
-
dominant: STEM_ELEMENTS[lr.stem],
|
|
357
|
-
interaction: '中性',
|
|
358
|
-
advice: ''
|
|
359
|
-
},
|
|
360
|
-
biorhythm: {
|
|
361
|
-
physical: lr.rating / 10,
|
|
362
|
-
emotional: lr.rating / 10,
|
|
363
|
-
intellectual: lr.rating / 10,
|
|
364
|
-
overall: lr.rating / 10
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}));
|
|
368
|
-
// Find today if calculating for current month
|
|
369
|
-
const today = new Date();
|
|
370
|
-
if (liuRiYear === today.getFullYear() && liuRiMonth === today.getMonth() + 1) {
|
|
371
|
-
todayLiuRi = liuRi.find(d => d.date.getDate() === today.getDate());
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
249
|
// Step 6: Assemble result
|
|
376
250
|
const result = {
|
|
377
251
|
chart: coreResult.chart,
|
|
@@ -389,11 +263,7 @@ class BaziService {
|
|
|
389
263
|
daYun,
|
|
390
264
|
currentDaYun,
|
|
391
265
|
liuNian,
|
|
392
|
-
currentLiuNian
|
|
393
|
-
liuYue,
|
|
394
|
-
currentLiuYue,
|
|
395
|
-
liuRi,
|
|
396
|
-
todayLiuRi
|
|
266
|
+
currentLiuNian
|
|
397
267
|
},
|
|
398
268
|
meta: {
|
|
399
269
|
calculatedAt: new Date(),
|
|
@@ -412,7 +282,6 @@ class BaziService {
|
|
|
412
282
|
this.logger.info('八字计算完成', {
|
|
413
283
|
duration: Date.now() - startTime,
|
|
414
284
|
complexity: {
|
|
415
|
-
shenShaCount: finalResult.basic?.shenSha?.length || 0,
|
|
416
285
|
tenGodsCount: finalResult.basic?.tenGods?.length || 0
|
|
417
286
|
}
|
|
418
287
|
});
|
|
@@ -443,7 +312,6 @@ class BaziService {
|
|
|
443
312
|
options: {
|
|
444
313
|
...input.options,
|
|
445
314
|
includeEnhanced: features.includes('enhanced'),
|
|
446
|
-
includeShenSha: features.includes('shenSha'),
|
|
447
315
|
includeTraditional: features.includes('traditional')
|
|
448
316
|
}
|
|
449
317
|
});
|
|
@@ -467,61 +335,8 @@ class BaziService {
|
|
|
467
335
|
}
|
|
468
336
|
return result;
|
|
469
337
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
*/
|
|
473
|
-
async getDaYun(chart, birthYear, gender, startAge, endAge) {
|
|
474
|
-
const birthInfo = await this.core.getBirthInfo(birthYear, 1, 1, 0); // Simplified
|
|
475
|
-
return DaYunCalculator_1.DaYunCalculator.calculate(chart, birthInfo, gender, { startYear: birthYear + startAge, endYear: birthYear + endAge });
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* Get Liu Nian for specific years
|
|
479
|
-
*/
|
|
480
|
-
async getLiuNian(chart, birthYear, targetYears) {
|
|
481
|
-
const startYear = Math.min(...targetYears);
|
|
482
|
-
const endYear = Math.max(...targetYears);
|
|
483
|
-
const allLiuNian = LiuNianCalculator_1.LiuNianCalculator.calculate(chart, birthYear, startYear, endYear);
|
|
484
|
-
return allLiuNian.filter(ln => targetYears.includes(ln.year));
|
|
485
|
-
}
|
|
486
|
-
/**
|
|
487
|
-
* Get Liu Yue (monthly fortune) for a specific year
|
|
488
|
-
*/
|
|
489
|
-
async getLiuYue(input, year) {
|
|
490
|
-
const result = await this.calculate({
|
|
491
|
-
...input,
|
|
492
|
-
options: {
|
|
493
|
-
...input.options,
|
|
494
|
-
includeTraditional: true // Need yongShen analysis
|
|
495
|
-
}
|
|
496
|
-
});
|
|
497
|
-
const yearStemBranch = this.getYearStemBranch(year);
|
|
498
|
-
const calculator = new LiuYueCalculator_1.LiuYueCalculator();
|
|
499
|
-
return calculator.calculateLiuYue(yearStemBranch.stem, yearStemBranch.branch, result.basic.dayMasterElement, result.traditional?.yongShen.yongShen || [], {
|
|
500
|
-
year: input.year,
|
|
501
|
-
month: input.month,
|
|
502
|
-
day: input.day,
|
|
503
|
-
hour: input.hour,
|
|
504
|
-
minute: input.minute
|
|
505
|
-
}, year);
|
|
506
|
-
}
|
|
507
|
-
/**
|
|
508
|
-
* Get Liu Ri (daily fortune) for a specific month
|
|
509
|
-
*/
|
|
510
|
-
async getLiuRi(input, year, month) {
|
|
511
|
-
const result = await this.calculate({
|
|
512
|
-
...input,
|
|
513
|
-
options: {
|
|
514
|
-
...input.options,
|
|
515
|
-
includeTraditional: true // Need yongShen analysis
|
|
516
|
-
}
|
|
517
|
-
});
|
|
518
|
-
const yearStemBranch = this.getYearStemBranch(year);
|
|
519
|
-
const monthStemBranch = this.getMonthStemBranch(year, month);
|
|
520
|
-
const calculator = new LiuRiCalculator_1.LiuRiCalculator();
|
|
521
|
-
return calculator.calculateLiuRi(monthStemBranch.stem, monthStemBranch.branch, yearStemBranch.stem, yearStemBranch.branch, result.basic.dayMasterElement, result.traditional?.yongShen.yongShen || [], year, month);
|
|
522
|
-
}
|
|
523
|
-
// TODO: Implement getTodayFortune and getMonthlyOverview using new calculators
|
|
524
|
-
// These methods are temporarily disabled during refactoring
|
|
338
|
+
// 註:便捷封裝(getDaYun/getLiuNian/getLiuYue/getLiuRi 及未實現的今日運勢樁)
|
|
339
|
+
// 為 baziwei 血統遺留、零調用方,已於 0.1.4 移除;MCP 工具直接使用各 Calculator。
|
|
525
340
|
/**
|
|
526
341
|
* Clear cache
|
|
527
342
|
*/
|