mingpan 0.1.3 → 0.1.5
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.en.md +64 -0
- package/README.ja.md +64 -0
- package/README.md +80 -11
- 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 +41 -15
- package/dist/core/bazi/BaziCore.js.map +1 -1
- package/dist/core/bazi/TrueSolarTime.js +8 -8
- package/dist/core/bazi/TrueSolarTime.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/calendar/SolarTermsCalculator.js +2 -2
- package/dist/core/calendar/SolarTermsCalculator.js.map +1 -1
- package/dist/core/calendar/astronomicalCalendar.d.ts +0 -13
- package/dist/core/calendar/astronomicalCalendar.d.ts.map +1 -1
- package/dist/core/calendar/astronomicalCalendar.js +0 -56
- package/dist/core/calendar/astronomicalCalendar.js.map +1 -1
- package/dist/core/calendar/calendar.d.ts.map +1 -1
- package/dist/core/calendar/calendar.js +11 -11
- package/dist/core/calendar/calendar.js.map +1 -1
- package/dist/core/calendar/lunarCalendar.js +1 -1
- package/dist/core/calendar/lunarCalendar.js.map +1 -1
- package/dist/core/calendar/solarTerms.js +10 -10
- package/dist/core/calendar/solarTerms.js.map +1 -1
- package/dist/core/ziwei/IztroAdapter.d.ts.map +1 -1
- package/dist/core/ziwei/IztroAdapter.js +11 -4
- package/dist/core/ziwei/IztroAdapter.js.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1582
- 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 +89 -25
- package/dist/output/fortuneTextRenderer.js.map +1 -1
- package/dist/output/listTextRenderer.js +7 -7
- package/dist/output/listTextRenderer.js.map +1 -1
- package/dist/output/qimenTextRenderer.d.ts +2 -6
- package/dist/output/qimenTextRenderer.d.ts.map +1 -1
- package/dist/output/qimenTextRenderer.js +12 -145
- package/dist/output/qimenTextRenderer.js.map +1 -1
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +35 -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 +11 -195
- package/dist/services/bazi/BaziService.js.map +1 -1
- package/dist/services/bazi/analyzers/StrengthAnalyzer.js +1 -1
- package/dist/services/bazi/analyzers/StrengthAnalyzer.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/calculators/DaYunCalculator.js +1 -1
- package/dist/services/bazi/calculators/DaYunCalculator.js.map +1 -1
- package/dist/services/bazi/calculators/LiuRiCalculator.js +2 -2
- package/dist/services/bazi/calculators/LiuRiCalculator.js.map +1 -1
- package/dist/services/bazi/calculators/LiuYueCalculator.js +2 -2
- package/dist/services/bazi/calculators/LiuYueCalculator.js.map +1 -1
- package/dist/services/bazi/calculators/LuckCycleCalculator.d.ts.map +1 -1
- package/dist/services/bazi/calculators/LuckCycleCalculator.js +55 -43
- package/dist/services/bazi/calculators/LuckCycleCalculator.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 +11 -2
- package/dist/services/daliuren/types.d.ts.map +1 -1
- package/dist/services/liuyao/LiuyaoService.d.ts.map +1 -1
- package/dist/services/liuyao/LiuyaoService.js +1 -0
- package/dist/services/liuyao/LiuyaoService.js.map +1 -1
- package/dist/services/meihua/MeihuaService.d.ts.map +1 -1
- package/dist/services/meihua/MeihuaService.js +4 -3
- package/dist/services/meihua/MeihuaService.js.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 +1 -18
- package/dist/services/qimen/QimenService.d.ts.map +1 -1
- package/dist/services/qimen/QimenService.js +13 -45
- package/dist/services/qimen/QimenService.js.map +1 -1
- package/dist/services/qimen/calculators/BaMenCalculator.d.ts +14 -22
- package/dist/services/qimen/calculators/BaMenCalculator.d.ts.map +1 -1
- package/dist/services/qimen/calculators/BaMenCalculator.js +41 -59
- package/dist/services/qimen/calculators/BaMenCalculator.js.map +1 -1
- package/dist/services/qimen/calculators/JiuGongCalculator.d.ts +6 -13
- package/dist/services/qimen/calculators/JiuGongCalculator.d.ts.map +1 -1
- package/dist/services/qimen/calculators/JiuGongCalculator.js +11 -41
- package/dist/services/qimen/calculators/JiuGongCalculator.js.map +1 -1
- package/dist/services/qimen/calculators/JiuXingCalculator.d.ts +13 -23
- package/dist/services/qimen/calculators/JiuXingCalculator.d.ts.map +1 -1
- package/dist/services/qimen/calculators/JiuXingCalculator.js +23 -68
- package/dist/services/qimen/calculators/JiuXingCalculator.js.map +1 -1
- package/dist/services/qimen/calculators/JuShuCalculator.d.ts +8 -5
- package/dist/services/qimen/calculators/JuShuCalculator.d.ts.map +1 -1
- package/dist/services/qimen/calculators/JuShuCalculator.js +16 -21
- package/dist/services/qimen/calculators/JuShuCalculator.js.map +1 -1
- package/dist/services/qimen/calculators/PanTypeCalculator.d.ts +19 -14
- package/dist/services/qimen/calculators/PanTypeCalculator.d.ts.map +1 -1
- package/dist/services/qimen/calculators/PanTypeCalculator.js +34 -36
- package/dist/services/qimen/calculators/PanTypeCalculator.js.map +1 -1
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts +11 -20
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts.map +1 -1
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js +29 -42
- package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js.map +1 -1
- package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts +34 -41
- package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts.map +1 -1
- package/dist/services/qimen/calculators/ZhuanPanCalculator.js +102 -130
- package/dist/services/qimen/calculators/ZhuanPanCalculator.js.map +1 -1
- package/dist/services/qimen/types.d.ts +3 -77
- package/dist/services/qimen/types.d.ts.map +1 -1
- package/dist/services/qimen/types.js +3 -2
- package/dist/services/qimen/types.js.map +1 -1
- package/dist/services/ziwei/ZiweiService.d.ts.map +1 -1
- package/dist/services/ziwei/ZiweiService.js +4 -3
- package/dist/services/ziwei/ZiweiService.js.map +1 -1
- package/dist/services/ziwei/calculators/DecadeCalculator.d.ts.map +1 -1
- package/dist/services/ziwei/calculators/DecadeCalculator.js +2 -1
- package/dist/services/ziwei/calculators/DecadeCalculator.js.map +1 -1
- package/dist/shared/logger.d.ts +5 -0
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/logger.js +16 -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/calendarTools.d.ts +12 -0
- package/dist/tools/calendarTools.d.ts.map +1 -0
- package/dist/tools/calendarTools.js +121 -0
- package/dist/tools/calendarTools.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 +205 -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 +163 -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 +484 -0
- package/dist/tools/ziweiTools.js.map +1 -0
- package/dist/utils/ageCalculator.d.ts +1 -1
- package/dist/utils/ageCalculator.d.ts.map +1 -1
- package/dist/utils/ageCalculator.js +10 -6
- package/dist/utils/ageCalculator.js.map +1 -1
- 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/dist/utils/wallTime.d.ts +25 -0
- package/dist/utils/wallTime.d.ts.map +1 -0
- package/dist/utils/wallTime.js +33 -0
- package/dist/utils/wallTime.js.map +1 -0
- package/dist/worker.d.ts +23 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +47 -0
- package/dist/worker.js.map +1 -0
- package/package.json +21 -11
- 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
- package/dist/services/qimen/calculators/ZeRiCalculator.d.ts +0 -78
- package/dist/services/qimen/calculators/ZeRiCalculator.d.ts.map +0 -1
- package/dist/services/qimen/calculators/ZeRiCalculator.js +0 -431
- package/dist/services/qimen/calculators/ZeRiCalculator.js.map +0 -1
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
* 時間歸一化工具
|
|
3
3
|
*
|
|
4
4
|
* 設計原則:
|
|
5
|
-
* 1.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* 1. 可複現性優先:內部規範表示為北京時間(UTC+8)壁鐘時間,
|
|
6
|
+
* 所有曆法計算(農曆、節氣、干支)均基於北京時間壁鐘分量
|
|
7
|
+
* 2. 輸入層負責歸一化:農曆轉公曆、時區換算都在入口層一次完成
|
|
8
|
+
* 3. 多時區支持(M4):timezone 為 IANA 時區名(如 America/New_York),
|
|
9
|
+
* 僅對公曆輸入生效;農曆輸入為曆法日期(無時區語義),忽略 timezone
|
|
10
|
+
* 4. 零額外依賴:時區換算基於 Intl.DateTimeFormat(宿主環境無關,跨機器確定性)
|
|
11
11
|
*/
|
|
12
|
-
/** 北京時區 IANA
|
|
12
|
+
/** 北京時區 IANA 標識(內部規範時區) */
|
|
13
13
|
export declare const BEIJING_TZ = "Asia/Shanghai";
|
|
14
14
|
export interface BirthDateTimeInput {
|
|
15
15
|
year: number;
|
|
@@ -18,8 +18,11 @@ export interface BirthDateTimeInput {
|
|
|
18
18
|
hour: number;
|
|
19
19
|
minute?: number;
|
|
20
20
|
isLunar?: boolean;
|
|
21
|
+
/** IANA 時區名(公曆輸入的所在時區),默認北京時間 */
|
|
22
|
+
timezone?: string;
|
|
21
23
|
}
|
|
22
24
|
export interface NormalizedBirthDateTime {
|
|
25
|
+
/** 北京時間(內部規範表示)分量 */
|
|
23
26
|
year: number;
|
|
24
27
|
month: number;
|
|
25
28
|
day: number;
|
|
@@ -27,22 +30,44 @@ export interface NormalizedBirthDateTime {
|
|
|
27
30
|
minute: number;
|
|
28
31
|
/** 標記原始輸入是否為農曆(用於輸出顯示) */
|
|
29
32
|
isLunarInput: boolean;
|
|
33
|
+
/** 原始輸入時區(僅當發生時區換算時存在) */
|
|
34
|
+
sourceTimezone?: string;
|
|
30
35
|
}
|
|
36
|
+
/** 校驗 IANA 時區名,非法時拋出明確錯誤 */
|
|
37
|
+
export declare function validateTimezone(timeZone: string): void;
|
|
31
38
|
/**
|
|
32
|
-
*
|
|
39
|
+
* 將指定時區的壁鐘時間換算為北京標準時間(UTC+8)壁鐘分量
|
|
33
40
|
*
|
|
34
|
-
*
|
|
41
|
+
* 演算法:先假設輸入為 UTC 得到猜測時刻,再用該時刻的實際偏移量迭代修正
|
|
42
|
+
* (兩輪即可收斂至秒級偏移,第三輪兜底 DST 邊界)。
|
|
43
|
+
* 輸入側使用 Intl(正確處理各國歷史夏令時,如 1986-1991 中國夏令時),
|
|
44
|
+
* 輸出側使用固定 +8(命理標準時口徑),全程與宿主機時區無關。
|
|
45
|
+
*/
|
|
46
|
+
export declare function convertToBeijingWallClock(input: {
|
|
47
|
+
year: number;
|
|
48
|
+
month: number;
|
|
49
|
+
day: number;
|
|
50
|
+
hour: number;
|
|
51
|
+
minute: number;
|
|
52
|
+
}, timeZone: string): {
|
|
53
|
+
year: number;
|
|
54
|
+
month: number;
|
|
55
|
+
day: number;
|
|
56
|
+
hour: number;
|
|
57
|
+
minute: number;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* 歸一化出生(起卦)日期時間至北京時間規範表示
|
|
61
|
+
*
|
|
62
|
+
* 處理順序:
|
|
35
63
|
* 1. 補齊 minute 默認值
|
|
36
|
-
* 2.
|
|
64
|
+
* 2. 農曆輸入:轉換為公曆(農曆為曆法日期,忽略 timezone)
|
|
65
|
+
* 3. 公曆輸入且提供 timezone:換算為北京時間壁鐘
|
|
37
66
|
*
|
|
38
67
|
* @example
|
|
39
|
-
* //
|
|
40
|
-
* normalizeBirthDateTime({ year: 1990, month:
|
|
41
|
-
* //
|
|
42
|
-
*
|
|
43
|
-
* // 農曆輸入
|
|
44
|
-
* normalizeBirthDateTime({ year: 1990, month: 4, day: 21, hour: 10, isLunar: true })
|
|
45
|
-
* // { year: 1990, month: 5, day: 15, hour: 10, minute: 0, isLunarInput: true }
|
|
68
|
+
* // 紐約出生,真實出生時刻 1990-06-15 20:30 EDT
|
|
69
|
+
* normalizeBirthDateTime({ year: 1990, month: 6, day: 15, hour: 20, minute: 30, timezone: 'America/New_York' })
|
|
70
|
+
* // => 北京時間 1990-06-16 08:30(次日),用於排盤
|
|
46
71
|
*/
|
|
47
72
|
export declare function normalizeBirthDateTime(input: BirthDateTimeInput): NormalizedBirthDateTime;
|
|
48
73
|
//# sourceMappingURL=timeNormalization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeNormalization.d.ts","sourceRoot":"","sources":["../../src/utils/timeNormalization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,
|
|
1
|
+
{"version":3,"file":"timeNormalization.d.ts","sourceRoot":"","sources":["../../src/utils/timeNormalization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,2BAA2B;AAC3B,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAM1C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,4BAA4B;AAC5B,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMvD;AA8CD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACjF,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAU5E;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,uBAAuB,CAqBzF"}
|
|
@@ -3,67 +3,125 @@
|
|
|
3
3
|
* 時間歸一化工具
|
|
4
4
|
*
|
|
5
5
|
* 設計原則:
|
|
6
|
-
* 1.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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
|
-
//
|
|
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:
|
|
35
|
-
* //
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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;;;
|
|
1
|
+
{"version":3,"file":"timeNormalization.js","sourceRoot":"","sources":["../../src/utils/timeNormalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 北京墙钟时间载体(wall-clock carrier)
|
|
3
|
+
*
|
|
4
|
+
* 约定:凡在内部承载「北京墙钟时间」的 Date 对象,一律以 Date.UTC(...) 构造、
|
|
5
|
+
* 以 getUTC*() 读取。这样的 Date 只是一个「分量容器」,其本地时区解释被完全
|
|
6
|
+
* 绕开——在任何宿主时区(含 Cloudflare Workers 恒为 UTC 的运行时)读写都
|
|
7
|
+
* 得到同一组北京墙钟分量。
|
|
8
|
+
*
|
|
9
|
+
* 背景:此前依赖入口处 process.env.TZ = 'Asia/Shanghai' 保证本地构造与本地
|
|
10
|
+
* 读取配对一致;Workers 等运行时无法设置 TZ,故全面改为 UTC 载体约定。
|
|
11
|
+
*/
|
|
12
|
+
export interface WallParts {
|
|
13
|
+
year: number;
|
|
14
|
+
month: number;
|
|
15
|
+
day: number;
|
|
16
|
+
hour: number;
|
|
17
|
+
minute: number;
|
|
18
|
+
second?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 当前时刻的北京墙钟分量(用于「now」语义)
|
|
22
|
+
* 真实时刻(UTC 瞬间)+8h 后取 UTC 分量,即北京墙钟
|
|
23
|
+
*/
|
|
24
|
+
export declare function nowBeijingParts(): WallParts;
|
|
25
|
+
//# sourceMappingURL=wallTime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallTime.d.ts","sourceRoot":"","sources":["../../src/utils/wallTime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAcD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAE3C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 北京墙钟时间载体(wall-clock carrier)
|
|
4
|
+
*
|
|
5
|
+
* 约定:凡在内部承载「北京墙钟时间」的 Date 对象,一律以 Date.UTC(...) 构造、
|
|
6
|
+
* 以 getUTC*() 读取。这样的 Date 只是一个「分量容器」,其本地时区解释被完全
|
|
7
|
+
* 绕开——在任何宿主时区(含 Cloudflare Workers 恒为 UTC 的运行时)读写都
|
|
8
|
+
* 得到同一组北京墙钟分量。
|
|
9
|
+
*
|
|
10
|
+
* 背景:此前依赖入口处 process.env.TZ = 'Asia/Shanghai' 保证本地构造与本地
|
|
11
|
+
* 读取配对一致;Workers 等运行时无法设置 TZ,故全面改为 UTC 载体约定。
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.nowBeijingParts = nowBeijingParts;
|
|
15
|
+
/** 读取载体的北京墙钟分量 */
|
|
16
|
+
function wallParts(date) {
|
|
17
|
+
return {
|
|
18
|
+
year: date.getUTCFullYear(),
|
|
19
|
+
month: date.getUTCMonth() + 1,
|
|
20
|
+
day: date.getUTCDate(),
|
|
21
|
+
hour: date.getUTCHours(),
|
|
22
|
+
minute: date.getUTCMinutes(),
|
|
23
|
+
second: date.getUTCSeconds(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 当前时刻的北京墙钟分量(用于「now」语义)
|
|
28
|
+
* 真实时刻(UTC 瞬间)+8h 后取 UTC 分量,即北京墙钟
|
|
29
|
+
*/
|
|
30
|
+
function nowBeijingParts() {
|
|
31
|
+
return wallParts(new Date(Date.now() + 8 * 3600 * 1000));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=wallTime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallTime.js","sourceRoot":"","sources":["../../src/utils/wallTime.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AA2BH,0CAEC;AAlBD,kBAAkB;AAClB,SAAS,SAAS,CAAC,IAAU;IAC3B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE;QAC3B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QAC7B,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE;QACtB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;QACxB,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE;QAC5B,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE;KAC7B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe;IAC7B,OAAO,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers 入口(远程 MCP,Streamable HTTP 无状态模式)
|
|
3
|
+
*
|
|
4
|
+
* 部署:`npx wrangler deploy`(wrangler 配置见 wrangler.toml)。
|
|
5
|
+
* 客户端:Claude 网页版/桌面版「自定义连接器」直接填部署后的
|
|
6
|
+
* `https://<worker域名>/mcp` 即可,无需任何本地安装。
|
|
7
|
+
*
|
|
8
|
+
* 说明:
|
|
9
|
+
* - 无状态模式(sessionIdGenerator: undefined):每个请求独立处理,
|
|
10
|
+
* 正适合本项目无会话的纯计算特性,且无需 Durable Objects。
|
|
11
|
+
* - 引擎与 stdio 形态共用 createMingpanServer(),输出逐字节一致。
|
|
12
|
+
* - 代码已去本地时区化(Date.UTC 载体约定),Workers 恒 UTC 运行时下
|
|
13
|
+
* 排盘结果与本地形态一致(三时区 CI 矩阵看守)。
|
|
14
|
+
*/
|
|
15
|
+
export interface Env {
|
|
16
|
+
}
|
|
17
|
+
/** 可测试的请求处理函数(Node 测试与 Workers 共用) */
|
|
18
|
+
export declare function handleMcpRequest(request: Request, _env?: Env): Promise<Response>;
|
|
19
|
+
declare const _default: {
|
|
20
|
+
fetch(request: Request, env: Env): Promise<Response>;
|
|
21
|
+
};
|
|
22
|
+
export default _default;
|
|
23
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,GAAG;CAEnB;AAED,sCAAsC;AACtC,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyBtF;;mBAGgB,OAAO,OAAO,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;;AADtD,wBAIE"}
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cloudflare Workers 入口(远程 MCP,Streamable HTTP 无状态模式)
|
|
4
|
+
*
|
|
5
|
+
* 部署:`npx wrangler deploy`(wrangler 配置见 wrangler.toml)。
|
|
6
|
+
* 客户端:Claude 网页版/桌面版「自定义连接器」直接填部署后的
|
|
7
|
+
* `https://<worker域名>/mcp` 即可,无需任何本地安装。
|
|
8
|
+
*
|
|
9
|
+
* 说明:
|
|
10
|
+
* - 无状态模式(sessionIdGenerator: undefined):每个请求独立处理,
|
|
11
|
+
* 正适合本项目无会话的纯计算特性,且无需 Durable Objects。
|
|
12
|
+
* - 引擎与 stdio 形态共用 createMingpanServer(),输出逐字节一致。
|
|
13
|
+
* - 代码已去本地时区化(Date.UTC 载体约定),Workers 恒 UTC 运行时下
|
|
14
|
+
* 排盘结果与本地形态一致(三时区 CI 矩阵看守)。
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.handleMcpRequest = handleMcpRequest;
|
|
18
|
+
const webStandardStreamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js");
|
|
19
|
+
const server_1 = require("./server");
|
|
20
|
+
/** 可测试的请求处理函数(Node 测试与 Workers 共用) */
|
|
21
|
+
async function handleMcpRequest(request, _env) {
|
|
22
|
+
const url = new URL(request.url);
|
|
23
|
+
if (url.pathname !== "/mcp") {
|
|
24
|
+
return new Response("Not Found", { status: 404 });
|
|
25
|
+
}
|
|
26
|
+
if (request.method === "GET" || request.method === "DELETE") {
|
|
27
|
+
// 无状态模式不支持 SSE 长连接与会话删除
|
|
28
|
+
return new Response("Method Not Allowed", { status: 405 });
|
|
29
|
+
}
|
|
30
|
+
if (request.method !== "POST") {
|
|
31
|
+
return new Response("Method Not Allowed", { status: 405, headers: { Allow: "POST" } });
|
|
32
|
+
}
|
|
33
|
+
// 无状态:每请求一组 server+transport
|
|
34
|
+
const server = (0, server_1.createMingpanServer)();
|
|
35
|
+
const transport = new webStandardStreamableHttp_js_1.WebStandardStreamableHTTPServerTransport({
|
|
36
|
+
sessionIdGenerator: undefined,
|
|
37
|
+
});
|
|
38
|
+
await server.connect(transport);
|
|
39
|
+
// Web 标准 transport:Request → Response,Workers/Node 通用
|
|
40
|
+
return transport.handleRequest(request);
|
|
41
|
+
}
|
|
42
|
+
exports.default = {
|
|
43
|
+
fetch(request, env) {
|
|
44
|
+
return handleMcpRequest(request, env);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAUH,4CAyBC;AAjCD,gHAAyH;AACzH,qCAA+C;AAM/C,sCAAsC;AAC/B,KAAK,UAAU,gBAAgB,CAAC,OAAgB,EAAE,IAAU;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5D,wBAAwB;QACxB,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAA,4BAAmB,GAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,uEAAwC,CAAC;QAC7D,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,sDAAsD;IACtD,OAAO,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,kBAAe;IACb,KAAK,CAAC,OAAgB,EAAE,GAAQ;QAC9B,OAAO,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mingpan",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "MCP service for
|
|
3
|
+
"version": "0.1.5",
|
|
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": {
|
|
@@ -24,24 +24,34 @@
|
|
|
24
24
|
"start": "node dist/index.js",
|
|
25
25
|
"test": "vitest run",
|
|
26
26
|
"test:watch": "vitest",
|
|
27
|
-
"prepare": "npm run build"
|
|
27
|
+
"prepare": "npm run build",
|
|
28
|
+
"deploy:worker": "npm run build && npx wrangler deploy"
|
|
28
29
|
},
|
|
29
30
|
"keywords": [
|
|
30
31
|
"mcp",
|
|
31
32
|
"bazi",
|
|
32
33
|
"ziwei",
|
|
34
|
+
"liuyao",
|
|
35
|
+
"meihua",
|
|
36
|
+
"daliuren",
|
|
37
|
+
"qimen",
|
|
38
|
+
"qimen-dunjia",
|
|
33
39
|
"fortune-telling",
|
|
34
40
|
"chinese-astrology",
|
|
35
|
-
"
|
|
41
|
+
"i-ching",
|
|
42
|
+
"divination",
|
|
43
|
+
"model-context-protocol",
|
|
44
|
+
"八字",
|
|
45
|
+
"紫微斗数",
|
|
46
|
+
"奇门遁甲"
|
|
36
47
|
],
|
|
37
|
-
"author": "",
|
|
48
|
+
"author": "ChesterRa",
|
|
38
49
|
"license": "Apache-2.0",
|
|
39
50
|
"dependencies": {
|
|
40
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
41
|
-
"iztro": "^2.
|
|
42
|
-
"lunar-javascript": "^1.7.
|
|
43
|
-
"zod": "^
|
|
44
|
-
"zod-to-json-schema": "^3.25.0"
|
|
51
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
52
|
+
"iztro": "^2.6.0",
|
|
53
|
+
"lunar-javascript": "^1.7.7",
|
|
54
|
+
"zod": "^4.4.3"
|
|
45
55
|
},
|
|
46
56
|
"devDependencies": {
|
|
47
57
|
"@types/node": "^20.11.17",
|
|
@@ -49,6 +59,6 @@
|
|
|
49
59
|
"vitest": "^1.6.1"
|
|
50
60
|
},
|
|
51
61
|
"engines": {
|
|
52
|
-
"node": ">=
|
|
62
|
+
"node": ">=20.0.0"
|
|
53
63
|
}
|
|
54
64
|
}
|
|
@@ -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"}
|