File size: 18,264 Bytes
1b83bb4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
"""
知识库加载器 - Methodology Knowledge Loader
加载和解析批命方法论知识文件

Version: 1.0
Created: 2026-02-03
Author: Sisi & TH Studio

知识文件路径:
- 00-reading-methodology.md: 10步批命流程 + 36条核心口诀
- 00-palace-analysis.md: 150个宫位分析案例
- 00-timing-methodology.md: 43个时间预测技巧
- 00-six-relations.md: 86个六亲批断技巧
"""

from typing import Dict, List, Any, Optional
import re
import os


class MethodologyLoader:
    """
    知识库加载器
    从markdown文件加载批命方法论知识
    """

    def __init__(self, knowledge_base_path: str = None):
        """
        初始化知识库加载器

        Args:
            knowledge_base_path: 知识库根路径
        """
        # 默认知识库路径(本地开发用)
        self.knowledge_base_path = knowledge_base_path or "/Volumes/sparksverse/agent-knowledge/mingli-knowledge/eastern/ziwei"

        # 知识文件映射
        self.knowledge_files = {
            'reading_methodology': 'interpretations/00-reading-methodology.md',
            'palace_analysis': 'interpretations/00-palace-analysis.md',
            'timing_methodology': 'timing/00-timing-methodology.md',
            'six_relations': 'interpretations/00-six-relations.md'
        }

        # 缓存加载的知识
        self._cache = {}

        # 内置核心知识(作为备用,当文件不可用时)
        self._init_builtin_knowledge()

    def _init_builtin_knowledge(self):
        """初始化内置核心知识"""
        # 10步批命流程
        self.ten_steps = [
            {
                'step': 1,
                'name': '确认盘面基础信息',
                'key_points': [
                    '核对出生时辰准确性',
                    '确定命局数(水二木三金四土五火六)',
                    '标注命宫、身宫、四化位置'
                ]
            },
            {
                'step': 2,
                'name': '看总格成败',
                'key_points': [
                    '观察命宫三方四正',
                    '观察四化星分布',
                    '识别吉格凶格'
                ]
            },
            {
                'step': 3,
                'name': '看身宫定后天发展',
                'key_points': [
                    '身在财帛→私企或自己做老板',
                    '身在官禄→做官',
                    '身在迁移→外地发展',
                    '身在夫妻→后天被婚姻影响'
                ]
            },
            {
                'step': 4,
                'name': '批六亲关系',
                'key_points': [
                    '父母宫+日月位置',
                    '兄弟宫+眉毛面相',
                    '夫妻宫+福德宫同参',
                    '子女宫+面相验证'
                ]
            },
            {
                'step': 5,
                'name': '看事业财运方向',
                'key_points': [
                    '官禄宫最喜化权',
                    '财帛宫权禄相逢主老板命',
                    '迁移宫看外地发展'
                ]
            },
            {
                'step': 6,
                'name': '看疾厄宫',
                'key_points': [
                    '结合中医经脉流注判断',
                    '化忌所在宫对应脏腑',
                    '杀星集中处对应疾病'
                ]
            },
            {
                'step': 7,
                'name': '批流年大运',
                'key_points': [
                    '十年大运看三方四正',
                    '小流年只看本宫和对宫',
                    '未来十年无大运,大限在前十年'
                ]
            },
            {
                'step': 8,
                'name': '看婚姻成败时机',
                'key_points': [
                    '红鸾天喜相会主婚姻',
                    '过忌成婚最好',
                    '天喜在不同宫位含义不同'
                ]
            },
            {
                'step': 9,
                'name': '看田宅宫',
                'key_points': [
                    '祖产情况',
                    '置产吉凶',
                    '阳宅方位判断'
                ]
            },
            {
                'step': 10,
                'name': '福德宫判断',
                'key_points': [
                    '主一辈子福禄财禄事业',
                    '女命最重要的宫',
                    '福德宫化忌主夫妻死别'
                ]
            }
        ]

        # 36条核心口诀
        self.core_formulas = {
            'geju': [  # 格局口诀
                {'name': '紫府坐垣', 'meaning': '命宫在寅申,紫微天府入庙,位列三台,爵禄荣昌'},
                {'name': '七杀朝斗', 'meaning': '命宫在寅申,七杀独坐入庙,威震边疆'},
                {'name': '府相会命', 'meaning': '天府天相分别位于财帛事业宫,天生辅佐人才'},
                {'name': '日月并明', 'meaning': '太阳旺辰+太阴旺戌,命宫在辰或戌,一世荣华'},
                {'name': '明珠出海', 'meaning': '命宫在未,太阴亥宫入庙+太阳卯宫入庙,父母双全'},
                {'name': '火贪相聚', 'meaning': '贪狼+火星/铃星同宫,武贵格,做武官'},
                {'name': '禄马交驰', 'meaning': '禄存/化禄+天马同宫,辛苦赚大钱,巨富'},
                {'name': '日照雷门', 'meaning': '命宫在卯,太阳入命庙,男命最吉'},
                {'name': '月朗天门', 'meaning': '命宫在亥,太阴入命庙,女命最吉'},
                {'name': '水澄桂萼', 'meaning': '子宫太阴入庙,清官,女人漂亮'}
            ],
            'xiong': [  # 凶格口诀
                {'name': '半空折翅', 'meaning': '命宫在巳或亥,廉贪落陷对冲或化忌冲命,三方四正无吉星,中年横夭'},
                {'name': '日月反背', 'meaning': '白天月亮、夜间太阳均落陷,离乡发展,克父母'},
                {'name': '羊陀夹杀', 'meaning': '擎羊陀罗在命宫两侧,犯小人,易被人影响'},
                {'name': '吉处藏凶', 'meaning': '吉星丛中煞星落陷,必凶'},
                {'name': '廉贞七杀', 'meaning': '落陷主半路埋尸'},
                {'name': '廉贞破军', 'meaning': '落陷主水中做冢'},
                {'name': '廉贞贪狼', 'meaning': '落陷主横夭(先天疾病或自杀)'}
            ],
            'panduan': [  # 判断口诀
                {'name': '命好不如限好', 'meaning': '十年大运为主,小流年为辅'},
                {'name': '未来十年无大运', 'meaning': '化忌所在十年或对冲十年,大限在前十年'},
                {'name': '目不见日月', 'meaning': '太阳太阴均落陷,主死'},
                {'name': '杀星庙旺', 'meaning': '凶处藏吉'},
                {'name': '杀星落陷', 'meaning': '在劫难逃'},
                {'name': '过忌成婚最好', 'meaning': '化忌年份过后再婚吉'},
                {'name': '官星进官禄宫最好', 'meaning': '财星进财帛宫最好'},
                {'name': '遇险而止招凶', 'meaning': '遇险行险能脱险'},
                {'name': '机月同梁', 'meaning': '定为吏也,公家单位工作'}
            ],
            'mianxiang': [  # 面相口诀
                {'name': '南人北相', 'meaning': '北人南相,非富即贵'},
                {'name': '正面不见耳', 'meaning': '五官开阔,面阔厚重,贵相'},
                {'name': '三庭均等', 'meaning': '上停中停下停相等,最佳'},
                {'name': '眉毛至少高眼睛一寸', 'meaning': '主为官'},
                {'name': '眉低山根低', 'meaning': '想不开'}
            ],
            'yangzhai': [  # 阳宅口诀
                {'name': '西北角是厨房', 'meaning': '死夫宅'},
                {'name': '西南角是厨房', 'meaning': '死妻宅'},
                {'name': '西北角是客厅', 'meaning': '夫妻生离'},
                {'name': '厕所在房子正中', 'meaning': '心脏病、中风'},
                {'name': '凶宅三字成灾', 'meaning': '少则3月3年,多则6年'}
            ]
        }

        # 六亲批断关键规则
        self.six_relations_rules = {
            'parents': {
                'key_rule': '太阳代表父亲,太阴代表母亲',
                'critical_patterns': [
                    {'pattern': '化忌在父母宫+日月反背', 'meaning': '父母不在身边或双亡'},
                    {'pattern': '太阳落陷+化忌', 'meaning': '父亲先逝'},
                    {'pattern': '太阴化忌', 'meaning': '母亲早逝或与母亲相克'},
                    {'pattern': '廉贞破军在父母宫', 'meaning': '父母离散'}
                ]
            },
            'siblings': {
                'key_rule': '眉毛代表兄弟姐妹,左兄右姐',
                'critical_patterns': [
                    {'pattern': '化忌入兄弟宫', 'meaning': '兄弟不和/夭折/合伙破财'},
                    {'pattern': '太阴落陷', 'meaning': '无兄弟或兄弟夭折'},
                    {'pattern': '断眉乱眉', 'meaning': '兄弟刑克'}
                ]
            },
            'spouse': {
                'key_rule': '福德宫化忌→夫妻必死别(最重要!)',
                'critical_patterns': [
                    {'pattern': '福德宫化忌+夫妻宫未见生离', 'meaning': '必定死别'},
                    {'pattern': '廉贞破军在福德或夫妻宫', 'meaning': '夫妻死别横祸'},
                    {'pattern': '西北厨房', 'meaning': '死先生(阳宅)'},
                    {'pattern': '西南厨房', 'meaning': '死妻子(阳宅)'}
                ]
            },
            'children': {
                'key_rule': '阳星代表儿子,阴星代表女儿',
                'critical_patterns': [
                    {'pattern': '化忌入子女宫', 'meaning': '没有儿子'},
                    {'pattern': '子女宫空宫+对面化忌', 'meaning': '无子'},
                    {'pattern': '日月反背+化忌', 'meaning': '没有儿子'}
                ]
            }
        }

        # 时间预测核心规则
        self.timing_rules = {
            'daxun_rules': [
                {'rule': '命好不如限好', 'meaning': '十年大运为主,小流年为辅'},
                {'rule': '未来十年无大运,大限在前十年', 'meaning': '化忌所在或对冲的十年无大运'},
                {'rule': '早年大限,父母可避', 'meaning': '13-22岁大运遇凶,父母照顾可化解'}
            ],
            'liunian_rules': [
                {'rule': '宫为当年值日发生之大事', 'meaning': '流年在哪宫,当年大事与该宫相关'},
                {'rule': '流年只看本宫和对宫', 'meaning': '大运看三方四正,流年只看本宫+对宫'},
                {'rule': '化忌对冲流年', 'meaning': '未来十年无大运,该年大凶'}
            ],
            'death_limit_rules': [
                {'rule': '杀星独守+无吉星', 'meaning': '十年大运杀星独守无吉星化解,代表死限'},
                {'rule': '目不见日月', 'meaning': '太阳太阴均落陷,主死'},
                {'rule': '大小二限逢疾厄', 'meaning': '十年大运和流年同在疾厄宫,主死'}
            ]
        }

        # 乙年规律(小鱼验证100%)
        self.special_year_patterns = {
            '乙年': {
                'sihua': {'禄': '太阴', '权': '天机', '科': '天同', '忌': '巨门'},
                'warning': '巨门化忌冲疾厄宫,健康波折、事业变动',
                'pattern': '乙年巨门化忌→冲疾厄宫,空宫大运极凶,有星大运先苦后甜',
                'verification': '小鱼1995/2005/2015/2025四次验证,准确率100%'
            },
            '壬年': {
                'sihua': {'禄': '天梁', '权': '紫微', '科': '左辅', '忌': '武曲'},
                'warning': '武曲化忌冲财帛/身宫,财运/生命危险',
                'pattern': '壬年武曲化忌→冲身宫,空宫大运生命危险,有星大运有惊无险',
                'verification': '小鱼2022年空宫大运新冠差点死,其他壬年无事'
            }
        }

    def load_all_knowledge(self) -> Dict[str, Any]:
        """
        加载所有知识文件

        Returns:
            dict: 完整的知识库
        """
        knowledge = {
            'ten_steps': self.ten_steps,
            'core_formulas': self.core_formulas,
            'six_relations_rules': self.six_relations_rules,
            'timing_rules': self.timing_rules,
            'special_year_patterns': self.special_year_patterns,
            'loaded_from': 'builtin',
            'total_rules': self._count_total_rules()
        }

        # 尝试从文件加载更多内容
        for name, path in self.knowledge_files.items():
            full_path = os.path.join(self.knowledge_base_path, path)
            if os.path.exists(full_path):
                try:
                    content = self._load_markdown_file(full_path)
                    if content:
                        knowledge[f'{name}_raw'] = content
                        knowledge['loaded_from'] = 'file'
                except Exception as e:
                    print(f"Warning: Failed to load {path}: {e}")

        return knowledge

    def _load_markdown_file(self, file_path: str) -> Optional[str]:
        """加载markdown文件"""
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                return f.read()
        except Exception:
            return None

    def _count_total_rules(self) -> Dict[str, int]:
        """统计总规则数"""
        return {
            'ten_steps': len(self.ten_steps),
            'geju_formulas': len(self.core_formulas.get('geju', [])),
            'xiong_formulas': len(self.core_formulas.get('xiong', [])),
            'panduan_formulas': len(self.core_formulas.get('panduan', [])),
            'mianxiang_formulas': len(self.core_formulas.get('mianxiang', [])),
            'yangzhai_formulas': len(self.core_formulas.get('yangzhai', [])),
            'six_relations_patterns': sum(
                len(v.get('critical_patterns', []))
                for v in self.six_relations_rules.values()
            ),
            'timing_rules': sum(
                len(v) for v in self.timing_rules.values()
            ),
            'special_year_patterns': len(self.special_year_patterns)
        }

    def get_step_by_number(self, step_number: int) -> Optional[Dict]:
        """
        获取指定步骤的批命流程

        Args:
            step_number: 步骤编号 (1-10)

        Returns:
            dict: 步骤详情
        """
        for step in self.ten_steps:
            if step['step'] == step_number:
                return step
        return None

    def get_formulas_by_category(self, category: str) -> List[Dict]:
        """
        获取指定分类的口诀

        Args:
            category: 分类名称 (geju/xiong/panduan/mianxiang/yangzhai)

        Returns:
            list: 口诀列表
        """
        return self.core_formulas.get(category, [])

    def get_six_relations_rules(self, relation_type: str) -> Optional[Dict]:
        """
        获取六亲批断规则

        Args:
            relation_type: 六亲类型 (parents/siblings/spouse/children)

        Returns:
            dict: 规则详情
        """
        return self.six_relations_rules.get(relation_type)

    def get_special_year_pattern(self, tiangan: str) -> Optional[Dict]:
        """
        获取特殊年份规律

        Args:
            tiangan: 天干 (甲/乙/丙/丁/戊/己/庚/辛/壬/癸)

        Returns:
            dict: 年份规律
        """
        key = f'{tiangan}年'
        return self.special_year_patterns.get(key)

    def match_formula(self, pattern_description: str) -> List[Dict]:
        """
        根据描述匹配口诀

        Args:
            pattern_description: 配置描述

        Returns:
            list: 匹配的口诀列表
        """
        matches = []
        description_lower = pattern_description.lower()

        # 搜索所有口诀
        for category, formulas in self.core_formulas.items():
            for formula in formulas:
                name = formula.get('name', '')
                meaning = formula.get('meaning', '')
                if name in pattern_description or any(
                    keyword in description_lower
                    for keyword in meaning.lower().split(',')
                ):
                    matches.append({
                        'category': category,
                        **formula
                    })

        return matches

    def get_death_limit_rules(self) -> List[Dict]:
        """获取死限判断规则"""
        return self.timing_rules.get('death_limit_rules', [])

    def get_marriage_timing_rules(self) -> List[Dict]:
        """获取婚姻时机判断规则"""
        return [
            {'rule': '红鸾天喜交会', 'meaning': '主婚姻'},
            {'rule': '过忌成婚', 'meaning': '化忌年份过后再婚吉'},
            {'rule': '天喜在命宫夫妻宫', 'meaning': '吉'},
            {'rule': '天喜在福德宫', 'meaning': '主多婚'},
            {'rule': '红鸾天喜在凶星宫相会', 'meaning': '婚姻不成'}
        ]


# 单例模式
_loader_instance = None


def get_methodology_loader() -> MethodologyLoader:
    """获取知识库加载器单例"""
    global _loader_instance
    if _loader_instance is None:
        _loader_instance = MethodologyLoader()
    return _loader_instance


# 导出
__all__ = ['MethodologyLoader', 'get_methodology_loader']