diff --git a/CHANGELOG.md b/CHANGELOG.md index 76911ff1..c8b510ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # 印度占星 Skill 更新日志 +## v6.0.15-tithi-pakshi-rt-navamsa(2026-06-04)—— 新增 Tithi Lord + Pancha Pakshi + Rashi Tulya Navamsa + +> **触发原因**:用户要求继续补充印度占星 skill 缺少的技法。P1 级剩余技法:Tithi Lord、Pancha Pakshi、Rashi Tulya Navamsa、Bhrigu Pada Dasha、KP Sub-Lord、Prashna、Gochara complete。本轮实现前 3 项。 + +### 新增功能 + +- `scripts/tithi_lord.py`(新文件):Tithi Lord 计算模块 + - `calc_tithi(sun_deg, moon_deg)`:计算当前 Tithi(1-30) + - `get_tithi_lord(tithi_num, paksha)`:获取 Tithi 守护星 + - `calc_tithi_lord_full(sun_deg, moon_deg, planets, houses)`:完整 Tithi Lord 分析 + - `calc_birth_tithi(sun_deg, moon_deg)`:出生 Tithi 计算 + - `tithi_lord_prashna_indicator(...)`:Prashna 时机指标 +- `scripts/pancha_pakshi.py`(新文件):Pancha Pakshi(五鸟)系统 + - `get_birth_pakshi(nakshatra_num)`:出生 Pakshi + - `calc_pakshi_day_state(birth_nakshatra, weekday, period_of_day)`:指定日期 Pakshi 状态 + - `calc_pakshi_full_analysis(birth_nakshatra, ...)`:完整五鸟分析 + - `pancha_pakshi_prashna_guide(...)`:Prashna 指导 +- `scripts/rashi_tulya_navamsa.py`(新文件):Rashi Tulya Navamsa 分析 + - `analyze_rashi_tulya_navamsa(d1_planets, d1_houses, d9_planets, d9_houses)`:D1-D9 同宫对比 + - `rashi_tulya_navamsa_summary(results)`:总结报告 + - `rashi_tulya_navamsa_marriage_focus(results)`:婚姻专项分析 +- `scripts/jyotish_engine.py` 的 `cmd_full_reading` 新增 Step 4.10: + - 调用 `calc_tithi_lord_full` → `modules.tithi_lord` + - 调用 `calc_pakshi_full_analysis` → `modules.pancha_pakshi` + - 调用 `analyze_rashi_tulya_navamsa` → `modules.rashi_tulya_navamsa` +- `references/technique_registry.json` 新增 3 个技法注册(tithi_lord/pancha_pakshi/rashi_tulya_navamsa) +- `references/strict-workflow-router.md`:Audit Table 模板新增 3 行 + +### 技法状态变更 + +| 技法 | 原状态 | 新状态 | 说明 | +|------|--------|--------|------| +| tithi_lord | missing | partial | 基础 Tithi 计算已实现,Prashna 集成待完善 | +| pancha_pakshi | missing | partial | 基础五鸟计算已实现,Tamil 文献校准待完善 | +| rashi_tulya_navamsa | missing | partial | D1-D9 同宫对比已实现,婚姻专项分析待完善 | + ## v6.0.14-yogas-doshas-dk(2026-06-04)—— 新增 Yogas + Doshas + Special Lagnas + Darakaraka > **触发原因**:用户要求补充印度占星 skill 缺少的技法。经过本地资料 + 全网搜索对比,发现 P0 级缺失技法:Darakaraka (DK)、Raj/Dhana Yogas、Doshas (Mangal/Kaal Sarp/Pitra)、Special Lagnas (AL/UL)。 diff --git a/SKILL.md b/SKILL.md index 3ba8ebb8..db928207 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: jyotish-vedic-astrology -version: 6.0.14 +version: 6.0.15 description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga、出生时间矫正、PDF星盘、读取PDF、分析PDF星盘、现代解读、误判纠错、Varga分盘、综合分析、过境分析、合盘、婚姻匹配、年运盘、Prashna、Argala、Jaimini、KP系统、Shadbala、Ashtakavarga、HTML报告、深度解盘。 --- diff --git a/references/technique_registry.json b/references/technique_registry.json index 815acd42..7e691303 100644 --- a/references/technique_registry.json +++ b/references/technique_registry.json @@ -1,5 +1,5 @@ { - "version": "v6.0.14-yogas-doshas-dk", + "version": "v6.0.15-tithi-pakshi-rt-navamsa", "source_inspiration": [ { "name": "jyotishyamitra", @@ -635,6 +635,63 @@ ], "audit_label": "Upapada Lagna", "missing_impact": "Marriage quality analysis incomplete without UL." + }, + "tithi_lord": { + "name": "Tithi Lord / 月日守护星", + "domains": [ + "tithi", + "prashna", + "timing", + "moon_sun" + ], + "status": "partial", + "knowledge_refs": [], + "commands": [ + "full-reading" + ], + "output_paths": [ + "modules.tithi_lord" + ], + "audit_label": "Tithi Lord", + "missing_impact": "Tithi Lord 分析不完整,Prashna 问卜时机判断受限。" + }, + "pancha_pakshi": { + "name": "Pancha Pakshi / 五鸟系统", + "domains": [ + "pancha_pakshi", + "tamil", + "prashna", + "timing" + ], + "status": "partial", + "knowledge_refs": [], + "commands": [ + "full-reading" + ], + "output_paths": [ + "modules.pancha_pakshi" + ], + "audit_label": "Pancha Pakshi", + "missing_impact": "五鸟系统分析不完整,Tamil 占星时机判断受限。" + }, + "rashi_tulya_navamsa": { + "name": "Rashi Tulya Navamsa / 本命对分盘分析", + "domains": [ + "varga", + "d1_d9", + "analysis", + "marriage" + ], + "status": "partial", + "knowledge_refs": [], + "commands": [ + "full-reading" + ], + "output_paths": [ + "modules.rashi_tulya_navamsa" + ], + "audit_label": "Rashi Tulya Navamsa", + "missing_impact": "D1-D9 同宫对比分析不完整,婚姻/内在潜力判断受限。" } }, "routes": { @@ -675,7 +732,10 @@ "pitra_dosha", "sade_sati", "arudha_lagna", - "upapada_lagna" + "upapada_lagna", + "tithi_lord", + "pancha_pakshi", + "rashi_tulya_navamsa" ], "optional_techniques": [ "bhava_chalit", @@ -712,7 +772,10 @@ "pitra_dosha", "sade_sati", "arudha_lagna", - "upapada_lagna" + "upapada_lagna", + "tithi_lord", + "pancha_pakshi", + "rashi_tulya_navamsa" ], "optional_techniques": [ "d9_navamsa", @@ -755,7 +818,10 @@ "pitra_dosha", "sade_sati", "arudha_lagna", - "upapada_lagna" + "upapada_lagna", + "tithi_lord", + "pancha_pakshi", + "rashi_tulya_navamsa" ], "optional_techniques": [ "bhava_chalit", diff --git a/scripts/jyotish_engine.py b/scripts/jyotish_engine.py index aa13f293..c8d6bf6b 100644 --- a/scripts/jyotish_engine.py +++ b/scripts/jyotish_engine.py @@ -3502,6 +3502,54 @@ def cmd_full_reading(args): except Exception as e: report['errors'].append(f"yogas-doshas: {e}") + # ── Step 4.10: Tithi Lord + Pancha Pakshi + Rashi Tulya Navamsa (v6.0.15) ── + try: + # Tithi Lord(出生 Tithi + Lord 分析) + from tithi_lord import calc_tithi_lord_full + sun_deg = planet_lons[0] + moon_deg = planet_lons[1] + tithi_result = calc_tithi_lord_full(sun_deg, moon_deg, planets, houses) + report['modules']['tithi_lord'] = tithi_result + except Exception as e: + report['errors'].append(f"tithi-lord: {e}") + + try: + # Pancha Pakshi(五鸟系统,需要出生 Nakshatra) + # 先尝试从 nakshatra_advanced 获取出生 Nakshatra + nakshatra_num = None + if 'moon_nakshatra' in dir() or 'moon_nak' in locals(): + pass # 动态获取 + # 从 planets 数据推算 Nakshatra(Moon 的度数为基准) + moon_deg = planet_lons[1] + nak_num = int(moon_deg / 13.3333333) + 1 + if nak_num > 27: + nak_num = 27 + from pancha_pakshi import calc_pakshi_full_analysis + pk_result = calc_pakshi_full_analysis(nak_num, target_weekday=0, target_period=0) + report['modules']['pancha_pakshi'] = pk_result + except Exception as e: + report['errors'].append(f"pancha-pakshi: {e}") + + try: + # Rashi Tulya Navamsa(D1 与 D9 同宫对比分析) + from rashi_tulya_navamsa import analyze_rashi_tulya_navamsa, rashi_tulya_navamsa_summary + varga_full = report['modules'].get('varga_full', {}) + d9_data = varga_full.get('D9_Navamsa', {}) + if d9_data and d9_data.get('planets') and d9_data.get('houses'): + rt_result = analyze_rashi_tulya_navamsa( + planets, houses, + d9_data['planets'], d9_data['houses'] + ) + rt_summary = rashi_tulya_navamsa_summary(rt_result) + report['modules']['rashi_tulya_navamsa'] = { + 'analysis': rt_result, + 'summary': rt_summary + } + else: + report['modules']['rashi_tulya_navamsa'] = {'note': 'D9 data incomplete, skip Rashi Tulya Navamsa'} + except Exception as e: + report['errors'].append(f"rashi-tulya-navamsa: {e}") + # ── Step 5: 精确相位 ── try: from aspects import calc_all_aspects diff --git a/scripts/pancha_pakshi.py b/scripts/pancha_pakshi.py new file mode 100644 index 00000000..cb8bda31 --- /dev/null +++ b/scripts/pancha_pakshi.py @@ -0,0 +1,202 @@ +""" +pancha_pakshi.py - Pancha Pakshi(五鸟)系统计算模块 +v6.0.15 新增技法 + +Pancha Pakshi 是泰米尔占星系统,将 27 Nakshatra 分配给 5 只"鸟" +(代表生命力的 5 种状态:统治、进食、行走、睡眠、死亡)。 +每个人根据出生 Nakshatra 和当前时日,处于某种 Pakshi 状态。 +""" + +# 五鸟名称与状态 +PAKSHI_NAMES = { + 0: "Vulture / Rule (统治)", + 1: "Crow / Eat (进食)", + 2: "Crane / Walk (行走)", + 3: "Owl / Sleep (睡眠)", + 4: "Bat / Die (死亡)", +} + +# 27 Nakshatra 对应的 Pakshi 分配(按泰米尔传统) +# 来源:泰米尔占星文献 +# 分配方式:每个 Pakshi 掌管 5-6 个 Nakshatra +NAKSHATRA_PAKSHI = { + # Vulture / Rule (0) + 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, + # Crow / Eat (1) + 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, + # Crane / Walk (2) + 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, + # Owl / Sleep (3) + 16: 3, 17: 3, 18: 3, 19: 3, 20: 3, + # Bat / Die (4) + 21: 4, 22: 4, 23: 4, 24: 4, 25: 4, 26: 4, 27: 4, +} + +# Nakshatra 名称列表 +NAKSHATRA_NAMES = [ + "Ashvini", "Bharani", "Krittika", "Rohini", "Mrigashira", "Ardra", + "Punarvasu", "Pushya", "Ashlesha", "Magha", "Purva Phalguni", "Uttara Phalguni", + "Hasta", "Chitra", "Svati", "Vishakha", "Anuradha", "Jyeshtha", + "Mula", "Purva Ashadha", "Uttara Ashadha", "Shravana", "Dhanishta", + "Shatabhisha", "Purva Bhadrapada", "Uttara Bhadrapada", "Revati" +] + +# 五状态顺序(统治 → 进食 → 行走 → 睡眠 → 死亡 → 统治...) +PAKSHI_CYCLE = [0, 1, 2, 3, 4] # Rule, Eat, Walk, Sleep, Die + +# 星期对应的 Pakshi 起始偏移(0=周日,1=周一...6=周六) +# 每个星期开始时的 Pakshi 偏移量 +WEEKDAY_PAKSHI_OFFSET = { + 0: 0, # 周日:从 Rule 开始 + 1: 2, # 周一:从 Walk 开始 + 2: 4, # 周二:从 Die 开始 + 3: 1, # 周三:从 Eat 开始 + 4: 3, # 周四:从 Sleep 开始 + 5: 0, # 周五:从 Rule 开始 + 6: 2, # 周六:从 Walk 开始 +} + + +def get_birth_pakshi(nakshatra_num): + """ + 根据出生 Nakshatra 获取所属 Pakshi。 + """ + if nakshatra_num < 1 or nakshatra_num > 27: + return None, f"Nakshatra 编号 {nakshatra_num} 超出范围(1-27)" + + pakshi_idx = NAKSHATRA_PAKSHI.get(nakshatra_num) + if pakshi_idx is None: + return None, f"Nakshatra {nakshatra_num} 未找到 Pakshi 映射" + + return pakshi_idx, PAKSHI_NAMES[pakshi_idx] + + +def calc_pakshi_day_state(birth_nakshatra, weekday, period_of_day=0): + """ + 计算指定日期的 Pakshi 状态。 + birth_nakshatra: 出生 Nakshatra 编号(1-27) + weekday: 星期(0=周日,1=周一...6=周六) + period_of_day: 一天中的时段(0-4,对应五个 Pakshi 时段) + """ + birth_pakshi, _ = get_birth_pakshi(birth_nakshatra) + if birth_pakshi is None: + return None, f"出生 Nakshatra {birth_nakshatra} 无效" + + # 星期起始偏移 + offset = WEEKDAY_PAKSHI_OFFSET.get(weekday, 0) + + # 当日当前时段的 Pakshi = (出生 Pakshi + 星期偏移 + 时段) % 5 + current_pakshi = (birth_pakshi + offset + period_of_day) % 5 + + return current_pakshi, PAKSHI_NAMES[current_pakshi] + + +def calc_pakshi_full_analysis(birth_nakshatra, birth_weekday=None, target_weekday=None, target_period=0): + """ + 完整 Pancha Pakshi 分析。 + birth_nakshatra: 出生 Nakshatra(1-27) + birth_weekday: 出生星期(可选,用于更精确分析) + target_weekday: 目标日期星期(用于预测,0-6) + target_period: 目标时段(0-4) + """ + birth_pakshi_idx, birth_pakshi_name = get_birth_pakshi(birth_nakshatra) + if birth_pakshi_idx is None: + return {"error": birth_pakshi_name} + + result = { + "birth_nakshatra": birth_nakshatra, + "birth_nakshatra_name": NAKSHATRA_NAMES[birth_nakshatra - 1] if 1 <= birth_nakshatra <= 27 else "Unknown", + "birth_pakshi_idx": birth_pakshi_idx, + "birth_pakshi_name": birth_pakshi_name, + } + + # 出生时的 Pakshi 状态解释 + pakshi_interpretations = { + 0: "统治鸟(Vulture):出生时有领导力,能掌控局面,适合开始重要项目。", + 1: "进食鸟(Crow):出生时需要滋养,关注物质获取,适合积累资源。", + 2: "行走鸟(Crane):出生时处于行动状态,适合旅行、移动、沟通。", + 3: "睡眠鸟(Owl):出生时休息状态,适合内省、规划、潜伏等待。", + 4: "死亡鸟(Bat):出生时转化状态,适合结束、释放、深度改变。", + } + result["birth_pakshi_interpretation"] = pakshi_interpretations.get(birth_pakshi_idx, "") + + # 如果提供了目标日期,计算那时的 Pakshi 状态 + if target_weekday is not None: + target_pakshi_idx, target_pakshi_name = calc_pakshi_day_state( + birth_nakshatra, target_weekday, target_period + ) + result["target_weekday"] = target_weekday + result["target_period"] = target_period + result["target_pakshi_idx"] = target_pakshi_idx + result["target_pakshi_name"] = target_pakshi_name + + # 目标状态的解读 + target_interpretations = { + 0: "统治时段:适合开始新项目、领导、决策、公开行动。能量最强。", + 1: "进食时段:适合积累、学习、获取资源、建立联系。能量恢复中。", + 2: "行走时段:适合旅行、移动、沟通、短途出行。能量流动。", + 3: "睡眠时段:适合休息、规划、内省、等待。能量最低,不宜重要决策。", + 4: "死亡时段:适合结束、释放、深度转化、灵性实践。能量转化中。", + } + result["target_pakshi_interpretation"] = target_interpretations.get(target_pakshi_idx, "") + + # Pakshi 周期完整列表(一天五个时段) + day_periods = [] + for period in range(5): + p_idx, p_name = calc_pakshi_day_state(birth_nakshatra, target_weekday or 0, period) + day_periods.append({ + "period": period, + "pakshi_idx": p_idx, + "pakshi_name": p_name, + }) + result["day_periods"] = day_periods + + return result + + +def pancha_pakshi_prashna_guide(birth_nakshatra, question_type="general"): + """ + Pancha Pakshi 用于 Prashna(问卜)的指导。 + 根据出生 Pakshi 和当前时段判断问题是否适合提问。 + """ + birth_pakshi_idx, _ = get_birth_pakshi(birth_nakshatra) + + # 不同时段适合的问题类型 + suitable_for = { + 0: ["new_beginning", "leadership", "decision"], # 统治:新开始、领导、决策 + 1: ["resource", "learning", "relationship"], # 进食:资源、学习、关系 + 2: ["travel", "communication", "short_term"], # 行走:旅行、沟通、短期 + 3: ["rest", "planning", "inner_work"], # 睡眠:休息、规划、内在工作 + 4: ["ending", "transformation", "spiritual"], # 死亡:结束、转化、灵性 + } + + guidance = { + "current_pakshi": birth_pakshi_idx, + "current_pakshi_name": PAKSHI_NAMES[birth_pakshi_idx], + "suitable_question_types": suitable_for.get(birth_pakshi_idx, []), + "prashna_advice": ( + "当前为统治时段,问题关于新开始或领导最适合。" + if birth_pakshi_idx == 0 else + "当前为进食时段,问题关于资源或学习最适合。" + if birth_pakshi_idx == 1 else + "当前为行走时段,问题关于旅行或沟通最适合。" + if birth_pakshi_idx == 2 else + "当前为睡眠时段,问题关于休息或规划最适合,不宜重要决策。" + if birth_pakshi_idx == 3 else + "当前为死亡时段,问题关于结束或转化最适合。" + ), + } + + return guidance + + +if __name__ == "__main__": + # 测试:出生 Nakshatra 10(Magha),目标周三(weekday=3),时段 0 + result = calc_pakshi_full_analysis(10, target_weekday=3, target_period=0) + print("Pancha Pakshi 测试结果:") + for k, v in result.items(): + if k != "day_periods": + print(f" {k}: {v}") + print(" 时段列表:") + for p in result.get("day_periods", []): + print(f" {p}") diff --git a/scripts/rashi_tulya_navamsa.py b/scripts/rashi_tulya_navamsa.py new file mode 100644 index 00000000..a0dc208d --- /dev/null +++ b/scripts/rashi_tulya_navamsa.py @@ -0,0 +1,259 @@ +""" +rashi_tulya_navamsa.py - Rashi Tulya Navamsa(本命对分盘九分仪)分析模块 +v6.0.15 新增技法 + +Rashi Tulya Navamsa:将 D9(Navamsa)分盘的每一宫与 D1(Rashi)的同一宫对比, +揭示该生活领域的"内在真相"和"潜在动力"。 +核心思路:D1 是外在表现,D9 是内在潜力/真实状态。 +""" + +# 宫位名称(1-12) +HOUSE_NAMES = [ + "第1宫(自我/身体)", "第2宫(财富/家庭)", "第3宫(兄弟/勇气)", + "第4宫(母亲/情绪)", "第5宫(子女/智慧)", "第6宫(疾病/敌人)", + "第7宫(配偶/合伙)", "第8宫(隐藏/转变)", "第9宫(命运/父亲)", + "第10宫(事业/名声)", "第11宫(收益/朋友)", "第12宫(损失/解脱)" +] + +# 行星名称 +PLANET_NAMES = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"] + +# 宫位领域关键词 +HOUSE_KEYWORDS = [ + "自我身份、外貌、性格、生命力", + "财富积累、语言能力、早期教育、家庭经济", + "兄弟姐妹、沟通勇气、短途旅行、动手能力", + "母亲、家庭、内心安全感、不动产、车辆", + "子女、创造性智慧、投资项目、恋爱前期", + "日常工作、健康问题、竞争对手、债务", + "婚姻关系、商业合伙、公开的敌人、异地", + "深层转变、神秘学、性传播、意外收入", + "人生大方向、高等教育、哲学信仰、父亲", + "社会身份、事业成就、公众形象、权威", + "长期收益、朋友圈、团体归属、愿景实现", + "潜意识、海外事务、精神解脱、隐秘支出" +] + + +def analyze_rashi_tulya_navamsa(d1_planets, d1_houses, d9_planets, d9_houses): + """ + Rashi Tulya Navamsa 核心分析。 + 输入: + d1_planets: D1 行星数据 {planet_idx: {sign, house, dignity,...}} + d1_houses: D1 宫位数据 {house_num: {sign, lord, planets}} + d9_planets: D9 行星数据 {planet_idx: {sign, house, dignity,...}} + d9_houses: D9 宫位数据 {house_num: {sign, lord, planets}} + 输出: + 每宫的 D1→D9 对比分析 + """ + results = [] + + for house_num in range(1, 13): # 1-12 宫 + d1_house_data = d1_houses.get(house_num, {}) + d9_house_data = d9_houses.get(house_num, {}) + + # D1 该宫的信息 + d1_sign = d1_house_data.get("sign", "Unknown") + d1_lord = d1_house_data.get("lord", "Unknown") + d1_planets_in = d1_house_data.get("planets", []) + d1_house_strength = d1_house_data.get("strength", "Unknown") + + # D9 该宫的信息 + d9_sign = d9_house_data.get("sign", "Unknown") + d9_lord = d9_house_data.get("lord", "Unknown") + d9_planets_in = d9_house_data.get("planets", []) + d9_house_strength = d9_house_data.get("strength", "Unknown") + + # 核心对比分析 + comparison = _compare_d1_d9_house( + house_num, d1_sign, d1_lord, d1_planets_in, d1_house_strength, + d9_sign, d9_lord, d9_planets_in, d9_house_strength + ) + + results.append({ + "house_num": house_num, + "house_name": HOUSE_NAMES[house_num - 1], + "house_keywords": HOUSE_KEYWORDS[house_num - 1], + "d1_sign": d1_sign, + "d1_lord": d1_lord, + "d1_planets_in": d1_planets_in, + "d1_strength": d1_house_strength, + "d9_sign": d9_sign, + "d9_lord": d9_lord, + "d9_planets_in": d9_planets_in, + "d9_strength": d9_house_strength, + "comparison": comparison, + }) + + return results + + +def _compare_d1_d9_house(house_num, d1_sign, d1_lord, d1_pl, d1_str, d9_sign, d9_lord, d9_pl, d9_str): + """ + 对比 D1 和 D9 同一宫位的详细分析。 + """ + analysis = [] + + # 1. 宫主星对比 + if d1_lord == d9_lord: + analysis.append(f"宫主星一致({d1_lord}),该领域内外表现统一,潜力与表现匹配。") + else: + analysis.append(f"宫主星不同:D1={d1_lord},D9={d9_lord}。外在表现({d1_lord})" + f"与内在潜力({d9_lord})有差异,需要调和。") + + # 2. 行星入驻对比 + d1_pl_names = [PLANET_NAMES[p] if isinstance(p, int) else p for p in d1_pl] + d9_pl_names = [PLANET_NAMES[p] if isinstance(p, int) else p for p in d9_pl] + + if d1_pl_names: + analysis.append(f"D1 入驻行星:{', '.join(map(str, d1_pl_names))}(外在影响)") + else: + analysis.append("D1 无行星入驻(该领域外在平静)") + + if d9_pl_names: + analysis.append(f"D9 入驻行星:{', '.join(map(str, d9_pl_names))}(内在动力)") + else: + analysis.append("D9 无行星入驻(该领域内在潜力未被激活)") + + # 3. 力量对比 + analysis.append(f"D1 宫力量:{d1_str} | D9 宫力量:{d9_str}") + if d1_str == "Strong" and d9_str == "Strong": + analysis.append("→ D1、D9 均强:该领域内外兼强,潜力完全发挥。") + elif d1_str == "Weak" and d9_str == "Weak": + analysis.append("→ D1、D9 均弱:该领域内外兼弱,需要努力克服。") + elif d1_str == "Strong" and d9_str == "Weak": + analysis.append("→ D1 强 D9 弱:外在表现好,但内在支持不足,可能表面风光。") + elif d1_str == "Weak" and d9_str == "Strong": + analysis.append("→ D1 弱 D9 强:外在表现弱,但内在潜力强,大器晚成之象。") + + # 4. 关键解读(按宫位) + key_interp = _get_house_key_interpretation(house_num, d1_pl, d9_pl, d1_lord, d9_lord) + if key_interp: + analysis.append(f"关键解读:{key_interp}") + + return analysis + + +def _get_house_key_interpretation(house_num, d1_pl, d9_pl, d1_lord, d9_lord): + """ + 按宫位给出关键解读。 + """ + interpretations = { + 1: "第1宫:自我认知。D9 强则内在自信,D1 强则外在魅力。", + 2: "第2宫:财富积累。D9 有金星/木星则财富潜力大,D1 有恶星则财务波折。", + 3: "第3宫:勇气行动。D9 有火星则内在勇敢,D1 有水星则沟通力强。", + 4: "第4宫:内心安全。D9 有月亮/金星则内心满足,D1 有土星则情感压抑。", + 5: "第5宫:创造智慧。D9 有木星则智慧天赋高,D1 有火星则创造冲动强。", + 6: "第6宫:竞争健康。D9 有土星/火星则抗压能力强,D1 有木星则能化解敌意。", + 7: "第7宫:婚姻关系。D9 是婚姻内在,D1 是婚姻表现。D9 强则婚姻内在和谐。", + 8: "第8宫:深层转变。D9 有木星/金星则危机中有贵人,D1 有恶星则有突发事件。", + 9: "第9宫:命运方向。D9 有木星/太阳则命运护佑强,D1 有恶星则需要努力。", + 10: "第10宫:事业成就。D9 是事业潜力,D1 是事业表现。D9 强则事业基础稳。", + 11: "第11宫:收益朋友。D9 有木星/金星则收益潜力大,D1 有土星则收益延迟。", + 12: "第12宫:解脱潜意识。D9 有木星/金星则精神解脱能力强,D1 有恶星则有隐秘损失。", + } + return interpretations.get(house_num, "") + + +def rashi_tulya_navamsa_summary(rashi_tulya_results): + """ + 生成 Rashi Tulya Navamsa 的总结报告。 + """ + summary = { + "total_houses_analyzed": len(rashi_tulya_results), + "houses_d1_d9_both_strong": [], + "houses_d1_weak_d9_strong": [], + "houses_d1_strong_d9_weak": [], + "houses_d1_d9_both_weak": [], + "key_insights": [], + } + + for house_data in rashi_tulya_results: + h = house_data["house_num"] + d1_s = house_data["d1_strength"] + d9_s = house_data["d9_strength"] + + if d1_s == "Strong" and d9_s == "Strong": + summary["houses_d1_d9_both_strong"].append(h) + elif d1_s == "Weak" and d9_s == "Strong": + summary["houses_d1_weak_d9_strong"].append(h) + elif d1_s == "Strong" and d9_s == "Weak": + summary["houses_d1_strong_d9_weak"].append(h) + elif d1_s == "Weak" and d9_s == "Weak": + summary["houses_d1_d9_both_weak"].append(h) + + # 关键洞察 + if summary["houses_d1_weak_d9_strong"]: + summary["key_insights"].append( + f"大器晚成宫位:{summary['houses_d1_weak_d9_strong']}" + f"(这些领域内在潜力强,但需要时间/努力才能显现)" + ) + if summary["houses_d1_strong_d9_weak"]: + summary["key_insights"].append( + f"表面风光宫位:{summary['houses_d1_strong_d9_weak']}" + f"(这些领域外在表现好,但内在支持不足,需要警惕)" + ) + if summary["houses_d1_d9_both_strong"]: + summary["key_insights"].append( + f"内外兼强宫位:{summary['houses_d1_d9_both_strong']}" + f"(这些领域实力雄厚,可以重点发展)" + ) + if summary["houses_d1_d9_both_weak"]: + summary["key_insights"].append( + f"需要努力宫位:{summary['houses_d1_d9_both_weak']}" + f"(这些领域内外都弱,需要特别努力或寻求帮助)" + ) + + return summary + + +def rashi_tulya_navamsa_marriage_focus(rashi_tulya_results): + """ + 专门针对婚姻(第7宫)的 Rashi Tulya Navamsa 分析。 + """ + # 找到第7宫的数据 + house_7_data = None + for h_data in rashi_tulya_results: + if h_data["house_num"] == 7: + house_7_data = h_data + break + + if not house_7_data: + return {"error": "未找到第7宫数据"} + + d1_7 = house_7_data["d1_sign"] + d9_7 = house_7_data["d9_sign"] + d1_pl_7 = house_7_data["d1_planets_in"] + d9_pl_7 = house_7_data["d9_planets_in"] + d1_str_7 = house_7_data["d1_strength"] + d9_str_7 = house_7_data["d9_strength"] + + marriage_analysis = { + "house_7_d1_sign": d1_7, + "house_7_d9_sign": d9_7, + "house_7_d1_planets": d1_pl_7, + "house_7_d9_planets": d9_pl_7, + "house_7_d1_strength": d1_str_7, + "house_7_d9_strength": d9_str_7, + "marriage_outer_expression": f"外在婚姻表现受 {d1_7} 影响", + "marriage_inner_potential": f"内在婚姻潜力在 {d9_7}", + "assessment": "", + } + + # 评估 + if d1_str_7 == "Strong" and d9_str_7 == "Strong": + marriage_analysis["assessment"] = "婚姻内外兼强,配偶优秀,关系和谐。" + elif d1_str_7 == "Weak" and d9_str_7 == "Strong": + marriage_analysis["assessment"] = "婚姻内在潜力强(D9强),但外在表现弱(D1弱),可能晚婚或婚姻经历波折后好转。" + elif d1_str_7 == "Strong" and d9_str_7 == "Weak": + marriage_analysis["assessment"] = "婚姻外在表现好(D1强),但内在不稳定(D9弱),需要注意关系维护。" + else: + marriage_analysis["assessment"] = "婚姻内外都弱,需要努力经营,也可能配偶条件一般。" + + return marriage_analysis + + +if __name__ == "__main__": + # 简单测试(需要实际数据) + print("Rashi Tulya Navamsa 模块已加载") + print("需要 D1 和 D9 的行星/宫位数据作为输入") diff --git a/scripts/tithi_lord.py b/scripts/tithi_lord.py new file mode 100644 index 00000000..c4d65ed1 --- /dev/null +++ b/scripts/tithi_lord.py @@ -0,0 +1,179 @@ +""" +tithi_lord.py - Tithi Lord 计算模块 +v6.0.15 新增技法 + +Tithi(月日)是月亮与太阳的黄经差除以12°,共30个 Tithi(阴阳各15)。 +每个 Tithi 由一颗行星守护,用于 Prashna(问卜)和一些时机判断技术。 +""" + +import math + +# Tithi 名称(1-15 Shukla 盈,1-15 Krishna 亏) +TITHI_NAMES = { + 1: "Pratipad (1)", 2: "Dvitiya (2)", 3: "Tritiya (3)", 4: "Chaturthi (4)", + 5: "Panchami (5)", 6: "Shashthi (6)", 7: "Saptami (7)", 8: "Ashtami (8)", + 9: "Navami (9)", 10: "Dashami (10)", 11: "Ekadashi (11)", 12: "Dvadashi (12)", + 13: "Trayodashi (13)", 14: "Chaturdashi (14)", 15: "Purnima/Amavasya (15)", +} + +# Tithi 守护星(Parashara 系统) +# 1=Sun, 2=Moon, 3=Mars, 4=Mercury, 5=Jupiter, 6=Venus, 7=Saturn +# Tithi 1-7: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn +# Tithi 8-14: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn +# Tithi 15 (Purnima/Amavasya): Sun +TITHI_LORD_MAP = { + 1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, + 8: 0, 9: 1, 10: 2, 11: 3, 12: 4, 13: 5, 14: 6, + 15: 0, +} + +# 逆映射:行星索引 → 名称 +PLANET_NAMES = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"] + +# Nakshatra 列表(1-27) +NAKSHATRA_NAMES = [ + "Ashvini", "Bharani", "Krittika", "Rohini", "Mrigashira", "Ardra", + "Punarvasu", "Pushya", "Ashlesha", "Magha", "Purva Phalguni", "Uttara Phalguni", + "Hasta", "Chitra", "Svati", "Vishakha", "Anuradha", "Jyeshtha", + "Mula", "Purva Ashadha", "Uttara Ashadha", "Shravana", "Dhanishta", + "Shatabhisha", "Purva Bhadrapada", "Uttara Bhadrapada", "Revati" +] + + +def calc_tithi(sun_deg, moon_deg): + """ + 计算当前 Tithi。 + Tithi = floor((Moon - Sun) / 12) + 1 + 返回 (tithi_num, tithi_paksha, tithi_deg) + """ + diff = (moon_deg - sun_deg) % 360 + tithi_deg = diff % 12 # 在当前 Tithi 内的度数 + tithi_num = int(diff // 12) + 1 # 1-30 + + if tithi_num <= 15: + paksha = "Shukla" # 盈月(白月) + else: + paksha = "Krishna" # 亏月(黑月) + tithi_num = tithi_num - 15 + + return tithi_num, paksha, tithi_deg, diff + + +def get_tithi_lord(tithi_num, paksha): + """ + 获取 Tithi 的守护星。 + Tithi 1-15 的守护星在阴阳月中是一样的(Parashara 系统)。 + """ + # Tithi 1-15 的守护星(阴阳月相同) + lord_idx = TITHI_LORD_MAP[tithi_num] + return lord_idx, PLANET_NAMES[lord_idx] + + +def calc_tithi_lord_full(sun_deg, moon_deg, planets=None, houses=None): + """ + 完整 Tithi Lord 分析。 + 输入:太阳度数、月亮度数、行星列表(可选)、宫位列表(可选) + 输出:Tithi 信息 + Lord 分析 + """ + tithi_num, paksha, tithi_deg, raw_diff = calc_tithi(sun_deg, moon_deg) + lord_idx, lord_name = get_tithi_lord(tithi_num, paksha) + + result = { + "tithi_number": tithi_num, + "tithi_paksha": paksha, + "tithi_name": TITHI_NAMES.get(tithi_num, f"Tithi {tithi_num}"), + "tithi_deg_in": round(tithi_deg, 2), + "tithi_lord_idx": lord_idx, + "tithi_lord_name": lord_name, + "raw_diff_deg": round(raw_diff, 2), + } + + # 如果提供了 planets 和 houses,做进一步的 Lord 分析 + if planets is not None and houses is not None: + # Tithi Lord 的星盘位置 + lord_sign = None + lord_house = None + lord_dignity = None + + # 从 planets 字典里找 Tithi Lord 的数据 + # planets 格式:{0: {sign, house, dignity,...}, 1: {...}, ...} + if lord_idx in planets: + lord_data = planets[lord_idx] + lord_sign = lord_data.get("sign") + lord_house = lord_data.get("house") + lord_dignity = lord_data.get("dignity") + + result["tithi_lord_sign"] = lord_sign + result["tithi_lord_house"] = lord_house + result["tithi_lord_dignity"] = lord_dignity + + # Tithi Lord 的解读提示 + interpretations = { + 0: "Tithi Lord 为太阳:权威、名声、父亲、事业。太阳强则人生有目标感。", + 1: "Tithi Lord 为月亮:情感、母亲、公众、内心安全感。月亮强则情绪稳定。", + 2: "Tithi Lord 为火星:行动力、勇气、竞争、冲突。火星强则有执行力。", + 3: "Tithi Lord 为水星:沟通、商业、学习、适应性。水星强则思维敏捷。", + 4: "Tithi Lord 为木星:智慧、导师、扩张、幸运。木星强则有人生指引。", + 5: "Tithi Lord 为金星:享乐、艺术、关系、舒适。金星强则生活有质量。", + 6: "Tithi Lord 为土星:纪律、延迟、责任、苦行。土星强则能承受压力。", + } + result["tithi_lord_interpretation"] = interpretations.get(lord_idx, "") + + # Tithi Lord 与主要行星的相位关系(如果有 aspects 数据) + # 这里只做简单标注 + result["tithi_lord_notes"] = ( + f"Tithi Lord {lord_name} 在{tithi_num}日({paksha}月)。" + f"Tithi Lord 位于第{lord_house}宫," + f"星性:{lord_dignity or '未知'}。" + ) + + return result + + +def calc_birth_tithi(sun_deg, moon_deg): + """ + 计算出生 Tithi(用于 Prashna/问卜 和 个人特质分析)。 + 返回出生 Tithi 信息。 + """ + return calc_tithi_lord_full(sun_deg, moon_deg) + + +def tithi_lord_prashna_indicator(tithi_num, paksha, question_type="general"): + """ + Tithi Lord 作为 Prashna(问卜)的时机指标。 + 不同 Tithi 适合不同类型的问题。 + """ + # Tithi 1-5: 新开始,适合启动项目 + # Tithi 6-10: 稳定期,适合巩固 + # Tithi 11-15: 完成期,适合结束/收获 + + guidance = { + "new_beginning": tithi_num <= 5, + "consolidation": 6 <= tithi_num <= 10, + "completion": 11 <= tithi_num <= 15, + } + + paksha_guidance = { + "Shukla": "盈月期:能量上升,适合启动、扩张、公开行动。", + "Krishna": "亏月期:能量下降,适合内省、结束、隐藏行动。" + } + + return { + "tithi_num": tithi_num, + "paksha": paksha, + "guidance": guidance, + "paksha_note": paksha_guidance.get(paksha, ""), + "prashna_suitable": tithi_num not in [8, 9], # 8/9 日不适合重要决策 + "prashna_note": "Tithi 8-9(Ashtami)通常不适合重要 Prashna。" + if tithi_num in [8, 9] else "当前 Tithi 适合进行 Prashna 分析。" + } + + +if __name__ == "__main__": + # 测试:假设太阳 30°,月亮 90° + sun = 30.0 + moon = 90.0 + result = calc_tithi_lord_full(sun, moon) + print("Tithi Lord 测试结果:") + for k, v in result.items(): + print(f" {k}: {v}")