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.
Files changed (194) hide show
  1. package/README.md +120 -47
  2. package/dist/core/bazi/BaziCore.d.ts +7 -1
  3. package/dist/core/bazi/BaziCore.d.ts.map +1 -1
  4. package/dist/core/bazi/BaziCore.js +37 -11
  5. package/dist/core/bazi/BaziCore.js.map +1 -1
  6. package/dist/core/bazi/types.d.ts +4 -0
  7. package/dist/core/bazi/types.d.ts.map +1 -1
  8. package/dist/core/qimen/FlyingRule.d.ts +60 -0
  9. package/dist/core/qimen/FlyingRule.d.ts.map +1 -0
  10. package/dist/core/qimen/FlyingRule.js +94 -0
  11. package/dist/core/qimen/FlyingRule.js.map +1 -0
  12. package/dist/core/qimen/GongMapping.d.ts +29 -0
  13. package/dist/core/qimen/GongMapping.d.ts.map +1 -0
  14. package/dist/core/qimen/GongMapping.js +83 -0
  15. package/dist/core/qimen/GongMapping.js.map +1 -0
  16. package/dist/core/qimen/RotatingRule.d.ts +76 -0
  17. package/dist/core/qimen/RotatingRule.d.ts.map +1 -0
  18. package/dist/core/qimen/RotatingRule.js +126 -0
  19. package/dist/core/qimen/RotatingRule.js.map +1 -0
  20. package/dist/core/qimen/YinYangDunCalculator.d.ts +28 -0
  21. package/dist/core/qimen/YinYangDunCalculator.d.ts.map +1 -0
  22. package/dist/core/qimen/YinYangDunCalculator.js +79 -0
  23. package/dist/core/qimen/YinYangDunCalculator.js.map +1 -0
  24. package/dist/core/qimen/index.d.ts +10 -0
  25. package/dist/core/qimen/index.d.ts.map +1 -0
  26. package/dist/core/qimen/index.js +58 -0
  27. package/dist/core/qimen/index.js.map +1 -0
  28. package/dist/core/qimen/types.d.ts +19 -0
  29. package/dist/core/qimen/types.d.ts.map +1 -0
  30. package/dist/core/qimen/types.js +7 -0
  31. package/dist/core/qimen/types.js.map +1 -0
  32. package/dist/index.d.ts +10 -5
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +14 -1311
  35. package/dist/index.js.map +1 -1
  36. package/dist/output/fortuneTextRenderer.d.ts +8 -7
  37. package/dist/output/fortuneTextRenderer.d.ts.map +1 -1
  38. package/dist/output/fortuneTextRenderer.js +83 -21
  39. package/dist/output/fortuneTextRenderer.js.map +1 -1
  40. package/dist/output/qimenTextRenderer.d.ts +36 -0
  41. package/dist/output/qimenTextRenderer.d.ts.map +1 -0
  42. package/dist/output/qimenTextRenderer.js +230 -0
  43. package/dist/output/qimenTextRenderer.js.map +1 -0
  44. package/dist/server.d.ts +11 -0
  45. package/dist/server.d.ts.map +1 -0
  46. package/dist/server.js +33 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/services/bazi/BaziService.d.ts +1 -17
  49. package/dist/services/bazi/BaziService.d.ts.map +1 -1
  50. package/dist/services/bazi/BaziService.js +9 -194
  51. package/dist/services/bazi/BaziService.js.map +1 -1
  52. package/dist/services/bazi/analyzers/TenGodsAnalyzer.js +12 -12
  53. package/dist/services/bazi/analyzers/TenGodsAnalyzer.js.map +1 -1
  54. package/dist/services/bazi/index.d.ts +0 -2
  55. package/dist/services/bazi/index.d.ts.map +1 -1
  56. package/dist/services/bazi/index.js +1 -5
  57. package/dist/services/bazi/index.js.map +1 -1
  58. package/dist/services/bazi/types.d.ts +4 -112
  59. package/dist/services/bazi/types.d.ts.map +1 -1
  60. package/dist/services/bazi/types.js +3 -102
  61. package/dist/services/bazi/types.js.map +1 -1
  62. package/dist/services/daliuren/DaliurenService.d.ts +11 -1
  63. package/dist/services/daliuren/DaliurenService.d.ts.map +1 -1
  64. package/dist/services/daliuren/DaliurenService.js +30 -0
  65. package/dist/services/daliuren/DaliurenService.js.map +1 -1
  66. package/dist/services/daliuren/calculators/TianDiPanCalculator.d.ts.map +1 -1
  67. package/dist/services/daliuren/calculators/TianDiPanCalculator.js +3 -4
  68. package/dist/services/daliuren/calculators/TianDiPanCalculator.js.map +1 -1
  69. package/dist/services/daliuren/data/constants.d.ts +7 -0
  70. package/dist/services/daliuren/data/constants.d.ts.map +1 -1
  71. package/dist/services/daliuren/data/constants.js +17 -1
  72. package/dist/services/daliuren/data/constants.js.map +1 -1
  73. package/dist/services/daliuren/types.d.ts +13 -0
  74. package/dist/services/daliuren/types.d.ts.map +1 -1
  75. package/dist/services/meihua/calculators/TiyongCalculator.d.ts.map +1 -1
  76. package/dist/services/meihua/calculators/TiyongCalculator.js +6 -5
  77. package/dist/services/meihua/calculators/TiyongCalculator.js.map +1 -1
  78. package/dist/services/qimen/QimenService.d.ts +76 -0
  79. package/dist/services/qimen/QimenService.d.ts.map +1 -0
  80. package/dist/services/qimen/QimenService.js +393 -0
  81. package/dist/services/qimen/QimenService.js.map +1 -0
  82. package/dist/services/qimen/calculators/BaMenCalculator.d.ts +45 -0
  83. package/dist/services/qimen/calculators/BaMenCalculator.d.ts.map +1 -0
  84. package/dist/services/qimen/calculators/BaMenCalculator.js +87 -0
  85. package/dist/services/qimen/calculators/BaMenCalculator.js.map +1 -0
  86. package/dist/services/qimen/calculators/BaShenCalculator.d.ts +34 -0
  87. package/dist/services/qimen/calculators/BaShenCalculator.d.ts.map +1 -0
  88. package/dist/services/qimen/calculators/BaShenCalculator.js +57 -0
  89. package/dist/services/qimen/calculators/BaShenCalculator.js.map +1 -0
  90. package/dist/services/qimen/calculators/GeJuCalculator.d.ts +141 -0
  91. package/dist/services/qimen/calculators/GeJuCalculator.d.ts.map +1 -0
  92. package/dist/services/qimen/calculators/GeJuCalculator.js +711 -0
  93. package/dist/services/qimen/calculators/GeJuCalculator.js.map +1 -0
  94. package/dist/services/qimen/calculators/JiuGongCalculator.d.ts +49 -0
  95. package/dist/services/qimen/calculators/JiuGongCalculator.d.ts.map +1 -0
  96. package/dist/services/qimen/calculators/JiuGongCalculator.js +68 -0
  97. package/dist/services/qimen/calculators/JiuGongCalculator.js.map +1 -0
  98. package/dist/services/qimen/calculators/JiuXingCalculator.d.ts +44 -0
  99. package/dist/services/qimen/calculators/JiuXingCalculator.d.ts.map +1 -0
  100. package/dist/services/qimen/calculators/JiuXingCalculator.js +72 -0
  101. package/dist/services/qimen/calculators/JiuXingCalculator.js.map +1 -0
  102. package/dist/services/qimen/calculators/JuShuCalculator.d.ts +60 -0
  103. package/dist/services/qimen/calculators/JuShuCalculator.d.ts.map +1 -0
  104. package/dist/services/qimen/calculators/JuShuCalculator.js +110 -0
  105. package/dist/services/qimen/calculators/JuShuCalculator.js.map +1 -0
  106. package/dist/services/qimen/calculators/PanTypeCalculator.d.ts +117 -0
  107. package/dist/services/qimen/calculators/PanTypeCalculator.d.ts.map +1 -0
  108. package/dist/services/qimen/calculators/PanTypeCalculator.js +237 -0
  109. package/dist/services/qimen/calculators/PanTypeCalculator.js.map +1 -0
  110. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts +41 -0
  111. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts.map +1 -0
  112. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js +73 -0
  113. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js.map +1 -0
  114. package/dist/services/qimen/calculators/ShenShaCalculator.d.ts +80 -0
  115. package/dist/services/qimen/calculators/ShenShaCalculator.d.ts.map +1 -0
  116. package/dist/services/qimen/calculators/ShenShaCalculator.js +300 -0
  117. package/dist/services/qimen/calculators/ShenShaCalculator.js.map +1 -0
  118. package/dist/services/qimen/calculators/YongShenCalculator.d.ts +78 -0
  119. package/dist/services/qimen/calculators/YongShenCalculator.d.ts.map +1 -0
  120. package/dist/services/qimen/calculators/YongShenCalculator.js +497 -0
  121. package/dist/services/qimen/calculators/YongShenCalculator.js.map +1 -0
  122. package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts +111 -0
  123. package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts.map +1 -0
  124. package/dist/services/qimen/calculators/ZhuanPanCalculator.js +232 -0
  125. package/dist/services/qimen/calculators/ZhuanPanCalculator.js.map +1 -0
  126. package/dist/services/qimen/data/constants.d.ts +105 -0
  127. package/dist/services/qimen/data/constants.d.ts.map +1 -0
  128. package/dist/services/qimen/data/constants.js +295 -0
  129. package/dist/services/qimen/data/constants.js.map +1 -0
  130. package/dist/services/qimen/data/shensha-rules.d.ts +177 -0
  131. package/dist/services/qimen/data/shensha-rules.d.ts.map +1 -0
  132. package/dist/services/qimen/data/shensha-rules.js +397 -0
  133. package/dist/services/qimen/data/shensha-rules.js.map +1 -0
  134. package/dist/services/qimen/data/yongshen-rules.d.ts +115 -0
  135. package/dist/services/qimen/data/yongshen-rules.d.ts.map +1 -0
  136. package/dist/services/qimen/data/yongshen-rules.js +365 -0
  137. package/dist/services/qimen/data/yongshen-rules.js.map +1 -0
  138. package/dist/services/qimen/index.d.ts +20 -0
  139. package/dist/services/qimen/index.d.ts.map +1 -0
  140. package/dist/services/qimen/index.js +43 -0
  141. package/dist/services/qimen/index.js.map +1 -0
  142. package/dist/services/qimen/types.d.ts +316 -0
  143. package/dist/services/qimen/types.d.ts.map +1 -0
  144. package/dist/services/qimen/types.js +21 -0
  145. package/dist/services/qimen/types.js.map +1 -0
  146. package/dist/services/qimen/utils/gongUtils.d.ts +80 -0
  147. package/dist/services/qimen/utils/gongUtils.d.ts.map +1 -0
  148. package/dist/services/qimen/utils/gongUtils.js +164 -0
  149. package/dist/services/qimen/utils/gongUtils.js.map +1 -0
  150. package/dist/shared/logger.d.ts +5 -0
  151. package/dist/shared/logger.d.ts.map +1 -1
  152. package/dist/shared/logger.js +11 -4
  153. package/dist/shared/logger.js.map +1 -1
  154. package/dist/tools/baziTools.d.ts +13 -0
  155. package/dist/tools/baziTools.d.ts.map +1 -0
  156. package/dist/tools/baziTools.js +331 -0
  157. package/dist/tools/baziTools.js.map +1 -0
  158. package/dist/tools/divinationTools.d.ts +9 -0
  159. package/dist/tools/divinationTools.d.ts.map +1 -0
  160. package/dist/tools/divinationTools.js +209 -0
  161. package/dist/tools/divinationTools.js.map +1 -0
  162. package/dist/tools/qimenTools.d.ts +10 -0
  163. package/dist/tools/qimenTools.d.ts.map +1 -0
  164. package/dist/tools/qimenTools.js +132 -0
  165. package/dist/tools/qimenTools.js.map +1 -0
  166. package/dist/tools/schemas.d.ts +99 -0
  167. package/dist/tools/schemas.d.ts.map +1 -0
  168. package/dist/tools/schemas.js +162 -0
  169. package/dist/tools/schemas.js.map +1 -0
  170. package/dist/tools/ziweiTools.d.ts +14 -0
  171. package/dist/tools/ziweiTools.d.ts.map +1 -0
  172. package/dist/tools/ziweiTools.js +483 -0
  173. package/dist/tools/ziweiTools.js.map +1 -0
  174. package/dist/utils/timeNormalization.d.ts +42 -17
  175. package/dist/utils/timeNormalization.d.ts.map +1 -1
  176. package/dist/utils/timeNormalization.js +99 -41
  177. package/dist/utils/timeNormalization.js.map +1 -1
  178. package/package.json +15 -9
  179. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts +0 -16
  180. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts.map +0 -1
  181. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js +0 -60
  182. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js.map +0 -1
  183. package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts +0 -33
  184. package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts.map +0 -1
  185. package/dist/services/bazi/analyzers/NaYinAnalyzer.js +0 -209
  186. package/dist/services/bazi/analyzers/NaYinAnalyzer.js.map +0 -1
  187. package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts +0 -236
  188. package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts.map +0 -1
  189. package/dist/services/bazi/analyzers/ShenShaAnalyzer.js +0 -2079
  190. package/dist/services/bazi/analyzers/ShenShaAnalyzer.js.map +0 -1
  191. package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts +0 -46
  192. package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts.map +0 -1
  193. package/dist/services/bazi/analyzers/TraditionalAnalyzer.js +0 -260
  194. 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":"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"}
@@ -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, BaziChart, DaYun, LiuNian, LiuYueInfo, LiuRiInfo } from './types';
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,EAEjB,SAAS,EACT,KAAK,EACL,OAAO,EAGP,UAAU,EACV,SAAS,EAMV,MAAM,SAAS,CAAC;AA0BjB,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;IAmbtD;;;OAGG;IACG,OAAO,CACX,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAoC/B;;OAEG;IACG,QAAQ,CACZ,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,EAAE,CAAC;IAUnB;;OAEG;IACG,UAAU,CACd,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,OAAO,EAAE,CAAC;IAOrB;;OAEG;IACG,SAAS,CACb,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,EAAE,CAAC;IA4BxB;;OAEG;IACG,QAAQ,CACZ,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,EAAE,CAAC;IA4BvB;;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"}
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, hiddenStems, twelveGrowthStages, voidBranches, climate, monthStrength] = await Promise.all([
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
- // Use basic traditional analyzer for GeJu
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: yongShenAnalysis,
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
- * Get Da Yun for specific age range
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
  */