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
@@ -3,67 +3,125 @@
3
3
  * 時間歸一化工具
4
4
  *
5
5
  * 設計原則:
6
- * 1. 當前階段統一使用北京時間(UTC+8),不對外暴露時區參數
7
- * 2. 農曆輸入在入口層即轉換為公曆,內部計算統一走公曆
8
- *
9
- * TODO: 多時區支持(M4 里程碑)
10
- * - 新增 timezone 參數
11
- * - 引入 date-fns-tz 或 @js-temporal/polyfill
6
+ * 1. 可複現性優先:內部規範表示為北京時間(UTC+8)壁鐘時間,
7
+ * 所有曆法計算(農曆、節氣、干支)均基於北京時間壁鐘分量
8
+ * 2. 輸入層負責歸一化:農曆轉公曆、時區換算都在入口層一次完成
9
+ * 3. 多時區支持(M4):timezone 為 IANA 時區名(如 America/New_York),
10
+ * 僅對公曆輸入生效;農曆輸入為曆法日期(無時區語義),忽略 timezone
11
+ * 4. 零額外依賴:時區換算基於 Intl.DateTimeFormat(宿主環境無關,跨機器確定性)
12
12
  */
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.BEIJING_TZ = void 0;
15
+ exports.validateTimezone = validateTimezone;
16
+ exports.convertToBeijingWallClock = convertToBeijingWallClock;
15
17
  exports.normalizeBirthDateTime = normalizeBirthDateTime;
16
18
  const lunar_javascript_1 = require("lunar-javascript");
17
19
  // ============================================
18
20
  // Constants
19
21
  // ============================================
20
- /** 北京時區 IANA 標識(內部使用) */
22
+ /** 北京時區 IANA 標識(內部規範時區) */
21
23
  exports.BEIJING_TZ = 'Asia/Shanghai';
22
24
  // ============================================
23
- // Functions
25
+ // Timezone conversion (Intl-based, no deps)
24
26
  // ============================================
27
+ /** 校驗 IANA 時區名,非法時拋出明確錯誤 */
28
+ function validateTimezone(timeZone) {
29
+ try {
30
+ new Intl.DateTimeFormat('en-US', { timeZone });
31
+ }
32
+ catch {
33
+ throw new Error(`無效的時區標識: ${timeZone}(需為 IANA 名稱,如 America/New_York)`);
34
+ }
35
+ }
36
+ /** 取某時刻在指定時區的 UTC 偏移量(毫秒,東八區為 +8h) */
37
+ function tzOffsetMs(instant, timeZone) {
38
+ const dtf = new Intl.DateTimeFormat('en-US', {
39
+ timeZone,
40
+ hour12: false,
41
+ year: 'numeric',
42
+ month: '2-digit',
43
+ day: '2-digit',
44
+ hour: '2-digit',
45
+ minute: '2-digit',
46
+ second: '2-digit',
47
+ });
48
+ const parts = dtf.formatToParts(instant);
49
+ const get = (type) => {
50
+ const p = parts.find(x => x.type === type);
51
+ if (!p)
52
+ throw new Error(`時區偏移解析失敗: ${timeZone}`);
53
+ return Number(p.value);
54
+ };
55
+ const asUTC = Date.UTC(get('year'), get('month') - 1, get('day'), get('hour') % 24, get('minute'), get('second'));
56
+ return asUTC - instant.getTime();
57
+ }
58
+ /**
59
+ * 取某時刻的北京標準時間(UTC+8 平太陽時)壁鐘分量
60
+ *
61
+ * 命理口徑說明:內部規範表示採用固定 UTC+8,而非 Intl 的 Asia/Shanghai 顯示時間。
62
+ * 中國在 1986-1991 年實行過夏令時(夏季 UTC+9),主流排盤實務對夏令時期間的
63
+ * 出生時刻回撥一小時按標準時排盤;固定 +8 算術即這一口徑,且與
64
+ * lunar-javascript 的曆法換算假設一致。
65
+ */
66
+ function beijingStandardWallClock(instant) {
67
+ const t = new Date(instant.getTime() + 8 * 3600 * 1000);
68
+ return {
69
+ year: t.getUTCFullYear(),
70
+ month: t.getUTCMonth() + 1,
71
+ day: t.getUTCDate(),
72
+ hour: t.getUTCHours(),
73
+ minute: t.getUTCMinutes(),
74
+ };
75
+ }
25
76
  /**
26
- * 歸一化出生日期時間
77
+ * 將指定時區的壁鐘時間換算為北京標準時間(UTC+8)壁鐘分量
27
78
  *
28
- * 處理邏輯:
79
+ * 演算法:先假設輸入為 UTC 得到猜測時刻,再用該時刻的實際偏移量迭代修正
80
+ * (兩輪即可收斂至秒級偏移,第三輪兜底 DST 邊界)。
81
+ * 輸入側使用 Intl(正確處理各國歷史夏令時,如 1986-1991 中國夏令時),
82
+ * 輸出側使用固定 +8(命理標準時口徑),全程與宿主機時區無關。
83
+ */
84
+ function convertToBeijingWallClock(input, timeZone) {
85
+ validateTimezone(timeZone);
86
+ const asUTC = Date.UTC(input.year, input.month - 1, input.day, input.hour, input.minute);
87
+ let guess = asUTC;
88
+ for (let i = 0; i < 3; i++) {
89
+ guess = asUTC - tzOffsetMs(new Date(guess), timeZone);
90
+ }
91
+ return beijingStandardWallClock(new Date(guess));
92
+ }
93
+ // ============================================
94
+ // Normalization
95
+ // ============================================
96
+ /**
97
+ * 歸一化出生(起卦)日期時間至北京時間規範表示
98
+ *
99
+ * 處理順序:
29
100
  * 1. 補齊 minute 默認值
30
- * 2. 如果是農曆輸入,轉換為公曆
101
+ * 2. 農曆輸入:轉換為公曆(農曆為曆法日期,忽略 timezone)
102
+ * 3. 公曆輸入且提供 timezone:換算為北京時間壁鐘
31
103
  *
32
104
  * @example
33
- * // 公曆輸入
34
- * normalizeBirthDateTime({ year: 1990, month: 5, day: 15, hour: 10 })
35
- * // { year: 1990, month: 5, day: 15, hour: 10, minute: 0, isLunarInput: false }
36
- *
37
- * // 農曆輸入
38
- * normalizeBirthDateTime({ year: 1990, month: 4, day: 21, hour: 10, isLunar: true })
39
- * // { year: 1990, month: 5, day: 15, hour: 10, minute: 0, isLunarInput: true }
105
+ * // 紐約出生,真實出生時刻 1990-06-15 20:30 EDT
106
+ * normalizeBirthDateTime({ year: 1990, month: 6, day: 15, hour: 20, minute: 30, timezone: 'America/New_York' })
107
+ * // => 北京時間 1990-06-16 08:30(次日),用於排盤
40
108
  */
41
109
  function normalizeBirthDateTime(input) {
42
110
  const minute = input.minute ?? 0;
43
111
  const isLunarInput = !!input.isLunar;
44
- // 公曆輸入:直接返回
45
- if (!isLunarInput) {
46
- return {
47
- year: input.year,
48
- month: input.month,
49
- day: input.day,
50
- hour: input.hour,
51
- minute,
52
- isLunarInput,
53
- };
112
+ let solar = { year: input.year, month: input.month, day: input.day, hour: input.hour, minute };
113
+ // 農曆輸入:轉換為公曆(曆法日期無時區語義)
114
+ if (isLunarInput) {
115
+ const lunar = lunar_javascript_1.Lunar.fromYmd(input.year, input.month, input.day);
116
+ const s = lunar.getSolar();
117
+ solar = { year: s.getYear(), month: s.getMonth(), day: s.getDay(), hour: input.hour, minute };
118
+ return { ...solar, isLunarInput };
54
119
  }
55
- // 農曆輸入:轉換為公曆
56
- // 注意:lunar-javascript 的 fromYmd 不處理閏月,閏月需要用 fromYmdHms 的第二個參數
57
- // 當前簡化處理,閏月按本月算(與梅花易數口徑一致)
58
- const lunar = lunar_javascript_1.Lunar.fromYmd(input.year, input.month, input.day);
59
- const solar = lunar.getSolar();
60
- return {
61
- year: solar.getYear(),
62
- month: solar.getMonth(),
63
- day: solar.getDay(),
64
- hour: input.hour,
65
- minute,
66
- isLunarInput,
67
- };
120
+ // 公曆輸入:時區換算(含北京時區歷史夏令時的歸一化)
121
+ if (input.timezone) {
122
+ solar = convertToBeijingWallClock(solar, input.timezone);
123
+ return { ...solar, isLunarInput, sourceTimezone: input.timezone };
124
+ }
125
+ return { ...solar, isLunarInput };
68
126
  }
69
127
  //# sourceMappingURL=timeNormalization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeNormalization.js","sourceRoot":"","sources":["../../src/utils/timeNormalization.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAsDH,wDA8BC;AAlFD,uDAAyC;AAEzC,+CAA+C;AAC/C,YAAY;AACZ,+CAA+C;AAE/C,yBAAyB;AACZ,QAAA,UAAU,GAAG,eAAe,CAAC;AAyB1C,+CAA+C;AAC/C,YAAY;AACZ,+CAA+C;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,sBAAsB,CAAC,KAAyB;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAErC,YAAY;IACZ,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM;YACN,YAAY;SACb,CAAC;IACJ,CAAC;IAED,aAAa;IACb,8DAA8D;IAC9D,2BAA2B;IAC3B,MAAM,KAAK,GAAG,wBAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAE/B,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;QACrB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;QACvB,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM;QACN,YAAY;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"timeNormalization.js","sourceRoot":"","sources":["../../src/utils/timeNormalization.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA4CH,4CAMC;AAsDD,8DAaC;AAmBD,wDAqBC;AA3JD,uDAAyC;AAEzC,+CAA+C;AAC/C,YAAY;AACZ,+CAA+C;AAE/C,2BAA2B;AACd,QAAA,UAAU,GAAG,eAAe,CAAC;AA8B1C,+CAA+C;AAC/C,4CAA4C;AAC5C,+CAA+C;AAE/C,4BAA4B;AAC5B,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,iCAAiC,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,sCAAsC;AACtC,SAAS,UAAU,CAAC,OAAa,EAAE,QAAgB;IACjD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC3C,QAAQ;QACR,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAU,EAAE;QACnC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EACzC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAC/C,CAAC;IACF,OAAO,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAAC,OAAa;IAC7C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE;QACxB,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC;QAC1B,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE;QACnB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QACrB,MAAM,EAAE,CAAC,CAAC,aAAa,EAAE;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,yBAAyB,CACvC,KAAiF,EACjF,QAAgB;IAEhB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzF,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,wBAAwB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,+CAA+C;AAC/C,gBAAgB;AAChB,+CAA+C;AAE/C;;;;;;;;;;;;GAYG;AACH,SAAgB,sBAAsB,CAAC,KAAyB;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAErC,IAAI,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAE/F,wBAAwB;IACxB,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,wBAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9F,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,CAAC;IACpC,CAAC;IAED,4BAA4B;IAC5B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,GAAG,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzD,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC;IAED,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mingpan",
3
- "version": "0.1.2",
4
- "description": "MCP service for accurate Bazi and Ziwei chart calculations",
3
+ "version": "0.1.4",
4
+ "description": "MCP service for Chinese metaphysics chart calculations: BaZi, ZiWei Dou Shu, LiuYao, MeiHua YiShu, DaLiuRen, and QiMen DunJia",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
@@ -30,18 +30,24 @@
30
30
  "mcp",
31
31
  "bazi",
32
32
  "ziwei",
33
+ "liuyao",
34
+ "meihua",
35
+ "daliuren",
36
+ "qimen",
37
+ "qimen-dunjia",
33
38
  "fortune-telling",
34
39
  "chinese-astrology",
40
+ "i-ching",
41
+ "divination",
35
42
  "model-context-protocol"
36
43
  ],
37
- "author": "",
44
+ "author": "ChesterRa",
38
45
  "license": "Apache-2.0",
39
46
  "dependencies": {
40
- "@modelcontextprotocol/sdk": "^1.0.0",
41
- "iztro": "^2.5.0",
42
- "lunar-javascript": "^1.7.3",
43
- "zod": "^3.23.0",
44
- "zod-to-json-schema": "^3.25.0"
47
+ "@modelcontextprotocol/sdk": "^1.30.0",
48
+ "iztro": "^2.6.0",
49
+ "lunar-javascript": "^1.7.7",
50
+ "zod": "^4.4.3"
45
51
  },
46
52
  "devDependencies": {
47
53
  "@types/node": "^20.11.17",
@@ -49,6 +55,6 @@
49
55
  "vitest": "^1.6.1"
50
56
  },
51
57
  "engines": {
52
- "node": ">=18.0.0"
58
+ "node": ">=20.0.0"
53
59
  }
54
60
  }
@@ -1,16 +0,0 @@
1
- /**
2
- * Hidden Stems Analyzer
3
- * Analyzes hidden stems (藏干) in earthly branches
4
- */
5
- import { BaziChart, HiddenStemsAnalysis } from '../types';
6
- export declare class HiddenStemsAnalyzer {
7
- /**
8
- * Analyze hidden stems in the BaZi chart
9
- */
10
- static analyze(chart: BaziChart): HiddenStemsAnalysis;
11
- /**
12
- * Get element of a stem
13
- */
14
- private static getStemElement;
15
- }
16
- //# sourceMappingURL=HiddenStemsAnalyzer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HiddenStemsAnalyzer.d.ts","sourceRoot":"","sources":["../../../../src/services/bazi/analyzers/HiddenStemsAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG1D,qBAAa,mBAAmB;IAC9B;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,mBAAmB;IA2CrD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;CAI9B"}
@@ -1,60 +0,0 @@
1
- "use strict";
2
- /**
3
- * Hidden Stems Analyzer
4
- * Analyzes hidden stems (藏干) in earthly branches
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.HiddenStemsAnalyzer = void 0;
8
- const bazi_1 = require("../../../core/constants/bazi");
9
- class HiddenStemsAnalyzer {
10
- /**
11
- * Analyze hidden stems in the BaZi chart
12
- */
13
- static analyze(chart) {
14
- const byElement = {
15
- [bazi_1.FIVE_ELEMENTS_ARRAY[0]]: 0, // 木 (wood)
16
- [bazi_1.FIVE_ELEMENTS_ARRAY[1]]: 0, // 火 (fire)
17
- [bazi_1.FIVE_ELEMENTS_ARRAY[2]]: 0, // 土 (earth)
18
- [bazi_1.FIVE_ELEMENTS_ARRAY[3]]: 0, // 金 (metal)
19
- [bazi_1.FIVE_ELEMENTS_ARRAY[4]]: 0 // 水 (water)
20
- };
21
- const mainQi = [];
22
- const residualQi = [];
23
- let total = 0;
24
- // Analyze each pillar
25
- const pillars = [chart.year, chart.month, chart.day, chart.hour];
26
- pillars.forEach(pillar => {
27
- if (pillar.hiddenStems && pillar.hiddenStems.length > 0) {
28
- pillar.hiddenStems.forEach((hidden, index) => {
29
- const element = this.getStemElement(hidden.stem);
30
- if (element) {
31
- byElement[element] += hidden.power;
32
- total += hidden.power;
33
- }
34
- // First hidden stem is main qi (本氣)
35
- if (index === 0) {
36
- mainQi.push(hidden.stem);
37
- }
38
- else {
39
- residualQi.push(hidden.stem);
40
- }
41
- });
42
- }
43
- });
44
- return {
45
- total,
46
- byElement,
47
- mainQi,
48
- residualQi
49
- };
50
- }
51
- /**
52
- * Get element of a stem
53
- */
54
- static getStemElement(stem) {
55
- const stemData = bazi_1.HEAVENLY_STEMS.find(s => s.name === stem);
56
- return stemData?.element || '';
57
- }
58
- }
59
- exports.HiddenStemsAnalyzer = HiddenStemsAnalyzer;
60
- //# sourceMappingURL=HiddenStemsAnalyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HiddenStemsAnalyzer.js","sourceRoot":"","sources":["../../../../src/services/bazi/analyzers/HiddenStemsAnalyzer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,uDAAmF;AAEnF,MAAa,mBAAmB;IAC9B;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAgB;QAC7B,MAAM,SAAS,GAA2B;YACxC,CAAC,0BAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAG,WAAW;YACzC,CAAC,0BAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAG,WAAW;YACzC,CAAC,0BAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAG,YAAY;YAC1C,CAAC,0BAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAG,YAAY;YAC1C,CAAC,0BAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAG,YAAY;SAC3C,CAAC;QAEF,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,sBAAsB;QACtB,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEjE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvB,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACjD,IAAI,OAAO,EAAE,CAAC;wBACZ,SAAS,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC;wBACnC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;oBACxB,CAAC;oBAED,oCAAoC;oBACpC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;wBAChB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,SAAS;YACT,MAAM;YACN,UAAU;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,IAAY;QACxC,MAAM,QAAQ,GAAG,qBAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3D,OAAO,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;CACF;AAtDD,kDAsDC"}
@@ -1,33 +0,0 @@
1
- import { BaziChart } from '../types';
2
- export interface NaYinElement {
3
- name: string;
4
- element: string;
5
- quality: string;
6
- description: string;
7
- }
8
- export interface NaYinAnalysis {
9
- year: NaYinElement;
10
- month: NaYinElement;
11
- day: NaYinElement;
12
- hour: NaYinElement | null;
13
- summary: {
14
- dominantElement: string;
15
- characteristics: string[];
16
- interactions: string[];
17
- };
18
- }
19
- export declare class NaYinAnalyzer {
20
- /**
21
- * Get NaYin element for a stem-branch combination
22
- */
23
- private static getNaYin;
24
- /**
25
- * Analyze element interactions between NaYin elements
26
- */
27
- private static analyzeInteractions;
28
- /**
29
- * Analyze NaYin elements for a BaZi chart
30
- */
31
- static analyze(chart: BaziChart): NaYinAnalysis;
32
- }
33
- //# sourceMappingURL=NaYinAnalyzer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NaYinAnalyzer.d.ts","sourceRoot":"","sources":["../../../../src/services/bazi/analyzers/NaYinAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA6GrC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,YAAY,CAAC;IAClB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAED,qBAAa,aAAa;IACxB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;IAevB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAwDlC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa;CAqChD"}
@@ -1,209 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NaYinAnalyzer = void 0;
4
- /**
5
- * 六十甲子纳音五行表
6
- * Each pair of stems and branches has a specific NaYin element
7
- */
8
- const NAYIN_MAP = {
9
- // 甲子乙丑海中金
10
- '甲子': '海中金', '乙丑': '海中金',
11
- // 丙寅丁卯炉中火
12
- '丙寅': '炉中火', '丁卯': '炉中火',
13
- // 戊辰己巳大林木
14
- '戊辰': '大林木', '己巳': '大林木',
15
- // 庚午辛未路旁土
16
- '庚午': '路旁土', '辛未': '路旁土',
17
- // 壬申癸酉剑锋金
18
- '壬申': '剑锋金', '癸酉': '剑锋金',
19
- // 甲戌乙亥山头火
20
- '甲戌': '山头火', '乙亥': '山头火',
21
- // 丙子丁丑涧下水
22
- '丙子': '涧下水', '丁丑': '涧下水',
23
- // 戊寅己卯城头土
24
- '戊寅': '城头土', '己卯': '城头土',
25
- // 庚辰辛巳白蜡金
26
- '庚辰': '白蜡金', '辛巳': '白蜡金',
27
- // 壬午癸未杨柳木
28
- '壬午': '杨柳木', '癸未': '杨柳木',
29
- // 甲申乙酉泉中水
30
- '甲申': '泉中水', '乙酉': '泉中水',
31
- // 丙戌丁亥屋上土
32
- '丙戌': '屋上土', '丁亥': '屋上土',
33
- // 戊子己丑霹雳火
34
- '戊子': '霹雳火', '己丑': '霹雳火',
35
- // 庚寅辛卯松柏木
36
- '庚寅': '松柏木', '辛卯': '松柏木',
37
- // 壬辰癸巳长流水
38
- '壬辰': '长流水', '癸巳': '长流水',
39
- // 甲午乙未沙中金
40
- '甲午': '沙中金', '乙未': '沙中金',
41
- // 丙申丁酉山下火
42
- '丙申': '山下火', '丁酉': '山下火',
43
- // 戊戌己亥平地木
44
- '戊戌': '平地木', '己亥': '平地木',
45
- // 庚子辛丑壁上土
46
- '庚子': '壁上土', '辛丑': '壁上土',
47
- // 壬寅癸卯金箔金
48
- '壬寅': '金箔金', '癸卯': '金箔金',
49
- // 甲辰乙巳覆灯火
50
- '甲辰': '覆灯火', '乙巳': '覆灯火',
51
- // 丙午丁未天河水
52
- '丙午': '天河水', '丁未': '天河水',
53
- // 戊申己酉大驿土
54
- '戊申': '大驿土', '己酉': '大驿土',
55
- // 庚戌辛亥钗钏金
56
- '庚戌': '钗钏金', '辛亥': '钗钏金',
57
- // 壬子癸丑桑柘木
58
- '壬子': '桑柘木', '癸丑': '桑柘木',
59
- // 甲寅乙卯大溪水
60
- '甲寅': '大溪水', '乙卯': '大溪水',
61
- // 丙辰丁巳沙中土
62
- '丙辰': '沙中土', '丁巳': '沙中土',
63
- // 戊午己未天上火
64
- '戊午': '天上火', '己未': '天上火',
65
- // 庚申辛酉石榴木
66
- '庚申': '石榴木', '辛酉': '石榴木',
67
- // 壬戌癸亥大海水
68
- '壬戌': '大海水', '癸亥': '大海水'
69
- };
70
- /**
71
- * NaYin element characteristics
72
- */
73
- const NAYIN_CHARACTERISTICS = {
74
- '海中金': { element: '金', quality: '深藏', description: '金在海中,宝藏深藏,需要挖掘' },
75
- '炉中火': { element: '火', quality: '炼化', description: '炉中之火,可炼金成器' },
76
- '大林木': { element: '木', quality: '茂盛', description: '大林之木,枝繁叶茂' },
77
- '路旁土': { element: '土', quality: '承载', description: '路旁之土,承载万物' },
78
- '剑锋金': { element: '金', quality: '锋利', description: '剑锋之金,锋芒毕露' },
79
- '山头火': { element: '火', quality: '光明', description: '山头之火,照亮四方' },
80
- '涧下水': { element: '水', quality: '清澈', description: '涧下之水,清澈见底' },
81
- '城头土': { element: '土', quality: '坚固', description: '城头之土,固若金汤' },
82
- '白蜡金': { element: '金', quality: '精纯', description: '白蜡之金,纯净精致' },
83
- '杨柳木': { element: '木', quality: '柔韧', description: '杨柳之木,柔韧多姿' },
84
- '泉中水': { element: '水', quality: '涌动', description: '泉中之水,源源不断' },
85
- '屋上土': { element: '土', quality: '庇护', description: '屋上之土,遮风挡雨' },
86
- '霹雳火': { element: '火', quality: '迅猛', description: '霹雳之火,雷厉风行' },
87
- '松柏木': { element: '木', quality: '坚韧', description: '松柏之木,傲雪凌霜' },
88
- '长流水': { element: '水', quality: '绵延', description: '长流之水,绵延不绝' },
89
- '沙中金': { element: '金', quality: '散布', description: '沙中之金,需要淘洗' },
90
- '山下火': { element: '火', quality: '温暖', description: '山下之火,温暖如春' },
91
- '平地木': { element: '木', quality: '平稳', description: '平地之木,根基稳固' },
92
- '壁上土': { element: '土', quality: '装饰', description: '壁上之土,美化环境' },
93
- '金箔金': { element: '金', quality: '华丽', description: '金箔之金,华丽装饰' },
94
- '覆灯火': { element: '火', quality: '照明', description: '覆灯之火,照亮前程' },
95
- '天河水': { element: '水', quality: '浩瀚', description: '天河之水,浩瀚无垠' },
96
- '大驿土': { element: '土', quality: '通达', description: '大驿之土,四通八达' },
97
- '钗钏金': { element: '金', quality: '精美', description: '钗钏之金,精美饰品' },
98
- '桑柘木': { element: '木', quality: '实用', description: '桑柘之木,养蚕织布' },
99
- '大溪水': { element: '水', quality: '汇聚', description: '大溪之水,百川汇聚' },
100
- '沙中土': { element: '土', quality: '松软', description: '沙中之土,松软易变' },
101
- '天上火': { element: '火', quality: '崇高', description: '天上之火,高不可攀' },
102
- '石榴木': { element: '木', quality: '多子', description: '石榴之木,多子多福' },
103
- '大海水': { element: '水', quality: '包容', description: '大海之水,包容万物' }
104
- };
105
- class NaYinAnalyzer {
106
- /**
107
- * Get NaYin element for a stem-branch combination
108
- */
109
- static getNaYin(stem, branch) {
110
- const key = stem + branch;
111
- const nayin = NAYIN_MAP[key];
112
- if (!nayin)
113
- return null;
114
- const characteristics = NAYIN_CHARACTERISTICS[nayin];
115
- return {
116
- name: nayin,
117
- element: characteristics.element,
118
- quality: characteristics.quality,
119
- description: characteristics.description
120
- };
121
- }
122
- /**
123
- * Analyze element interactions between NaYin elements
124
- */
125
- static analyzeInteractions(elements) {
126
- const interactions = [];
127
- const validElements = elements.filter(e => e !== null);
128
- // Check for same element reinforcement
129
- const elementCounts = {};
130
- validElements.forEach(e => {
131
- elementCounts[e.element] = (elementCounts[e.element] || 0) + 1;
132
- });
133
- Object.entries(elementCounts).forEach(([element, count]) => {
134
- if (count >= 3) {
135
- interactions.push(`strong_${element}_convergence`);
136
- }
137
- else if (count === 2) {
138
- interactions.push(`${element}_reinforcement`);
139
- }
140
- });
141
- // Check generation cycles
142
- const generationMap = {
143
- '木': '火',
144
- '火': '土',
145
- '土': '金',
146
- '金': '水',
147
- '水': '木'
148
- };
149
- for (let i = 0; i < validElements.length - 1; i++) {
150
- const current = validElements[i];
151
- const next = validElements[i + 1];
152
- if (generationMap[current.element] === next.element) {
153
- interactions.push(`${current.element}_generates_${next.element}`);
154
- }
155
- }
156
- // Check control cycles
157
- const controlMap = {
158
- '木': '土',
159
- '土': '水',
160
- '水': '火',
161
- '火': '金',
162
- '金': '木'
163
- };
164
- for (let i = 0; i < validElements.length; i++) {
165
- for (let j = i + 1; j < validElements.length; j++) {
166
- if (controlMap[validElements[i].element] === validElements[j].element) {
167
- interactions.push(`${validElements[i].element}_controls_${validElements[j].element}`);
168
- }
169
- }
170
- }
171
- return interactions;
172
- }
173
- /**
174
- * Analyze NaYin elements for a BaZi chart
175
- */
176
- static analyze(chart) {
177
- const yearNaYin = this.getNaYin(chart.year.stem, chart.year.branch);
178
- const monthNaYin = this.getNaYin(chart.month.stem, chart.month.branch);
179
- const dayNaYin = this.getNaYin(chart.day.stem, chart.day.branch);
180
- const hourNaYin = chart.hour ?
181
- this.getNaYin(chart.hour.stem, chart.hour.branch) : null;
182
- const allElements = [yearNaYin, monthNaYin, dayNaYin, hourNaYin];
183
- const validElements = allElements.filter(e => e !== null);
184
- // Find dominant element
185
- const elementCounts = {};
186
- validElements.forEach(e => {
187
- elementCounts[e.element] = (elementCounts[e.element] || 0) + 1;
188
- });
189
- const dominantElement = Object.entries(elementCounts)
190
- .sort(([, a], [, b]) => b - a)[0][0];
191
- // Collect unique characteristics
192
- const characteristics = [...new Set(validElements.map(e => e.quality))];
193
- // Analyze interactions
194
- const interactions = this.analyzeInteractions(allElements);
195
- return {
196
- year: yearNaYin,
197
- month: monthNaYin,
198
- day: dayNaYin,
199
- hour: hourNaYin,
200
- summary: {
201
- dominantElement,
202
- characteristics,
203
- interactions
204
- }
205
- };
206
- }
207
- }
208
- exports.NaYinAnalyzer = NaYinAnalyzer;
209
- //# sourceMappingURL=NaYinAnalyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NaYinAnalyzer.js","sourceRoot":"","sources":["../../../../src/services/bazi/analyzers/NaYinAnalyzer.ts"],"names":[],"mappings":"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E,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;IAChE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAA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"}