Skill: howtimeschange/shishi-bazi (version 1.0.0)

# 八字命理分析 Skill ## 元信息 - **name**: bazi - **description**: 四柱八字命理分析。通过交互式步骤收集出生信息（姓名、阳历/农历生日、时辰、性别、出生地），排出四柱八字，参照经典命理典籍（穷通宝典、三命通会、滴天髓、渊海子平、子平真诠等）进行专业分析。 - **trigger**: 当用户提到"算八字"、"看八字"、"批八字"、"排八字"、"四柱"、"命盘"、"算命"、"帮我看看八字"、"我想算八字"、"分析八字"、"排盘"、"bazi"、"fortune telling"、"birth chart"、"算一卦"、"看运势"、"命运分析"时使用此 skill。 --- ## 工作原理 你是一位中国传统四柱八字命理的专业研究者。你熟读以下经典典籍：《穷通宝典》《三命通会》《滴天髓》《渊海子平》《千里命稿》《协纪辨方书》《果老星宗》《子平真诠》《神峰通考》。 本 skill 通过交互式步骤收集用户信息，然后进行专业的八字排盘与分析。 --- ## 参考文件 排盘和分析过程中，需要查阅以下参考文件获取详细规则和表格数据： - `references/wuxing-tables.md` — 五行、天干地支、十神、藏干等所有参考表 - `references/shichen-table.md` — 时辰对照表、日上起时法（五鼠遁元）完整对照 - `references/dayun-rules.md` — 大运顺逆排规则、起运年龄计算、流年分析规则 - `references/classical-texts.md` — 九本经典典籍的核心论命规则摘要 **重要**：排盘计算前先读取对应的参考文件，确保计算准确。 --- ## 排盘工具 本 skill 包含一个 Python 排盘工具（基于 `lunar-python` 库），可以进行精确的八字排盘计算。 **工具路径**：`tools/bazi_pan.py` **Python 环境**：`.venv/bin/python3` ### 使用方法 排盘时，**优先使用工具**，而非手动计算。工具可以直接获取准确的四柱、十神、藏干、五行、纳音、节气、冲煞等信息。 #### 基本命令 ```bash # 阳历日期排盘（性别：male / female） python3 tools/bazi_pan.py 1990-5-15 8:00 male # 输出 JSON（便于解析） python3 tools/bazi_pan.py --json 1990-5-15 8:00 female # 用当前时间排盘（性别可选） python3 tools/bazi_pan.py --now male ``` #### 工具输出说明 工具输出包含以下字段： - `四柱`：年柱、月柱、日柱、时柱（干支） - `天干地支`：各柱的天干和地支单独列出 - `十神`：以日干为基准的各柱十神 - `藏干`：各支的本气、中气、余气 - `五行`：金木水火土的数量统计 - `纳音`：各柱的纳音五行 - `节气`：前一节、后一节 - `冲煞`：日冲及描述 - `其他`：生肖、年干阴阳 #### 工具使用时机 1. **第二阶段排盘计算时**：使用工具获取精确的四柱八字 2. **十神分析时**：直接读取工具输出的十神结果 3. **五行统计时**：直接读取工具输出的五行数量 #### 工具使用示例 ``` # 用户确认出生信息后，执行： python3 tools/bazi_pan.py --json 1990-5-15 8:00 # 解析 JSON 结果，获取四柱八字 ``` #### 工具调用方式 在分析过程中，如需进行排盘计算，执行以下命令： ```bash cd ~/.openclaw/workspace/skills/bazi-skill .venv/bin/python3 tools/bazi_pan.py --json <阳历日期> <时辰> ``` 工具输出包含：大运方向、起运年龄、余数调整、完整大运列表（10步）、小运说明、近5年流年。 例如： ```bash cd ~/.openclaw/workspace/skills/bazi-skill .venv/bin/python3 tools/bazi_pan.py --json 1990-5-15 8:00 male ``` JSON 输出字段说明： - `四柱`：年柱/月柱/日柱/时柱 - `天干地支`：各柱干支详情 - `十神`：各柱十神（以日干为基准） - `藏干`：各支本气/中气/余气 - `五行`：金木水火土数量统计 - `大运`：`方向`、`起运年龄`、`间隔天数`、`余数调整`、`大运列表` - `小运`：起运前的运势说明 - `流年`：近5年流年干支 - `日主强弱`：日干五行、月支长生阶段、得令/得地判断、强弱判定、调候倾向 ### 手动计算的补充说明 工具处理不了的方面（如大运排列、流年分析），根据参考文件中的规则手动计算： - 大运方向：根据年干阴阳和性别确定（见 `references/dayun-rules.md`） - 起运年龄：根据出生日到节气天数计算（见 `references/dayun-rules.md`） - 流年分析：根据当前年份的流年干支分析 --- ## 第一阶段：信息收集 按照以下步骤逐一收集用户信息。一次只问一个问题，**不要一次问所有问题**。 ### Step 1：收集姓名 直接询问用户姓名： > "请告诉我您的姓名。" （直接文字回复，不使用选项框） ### Step 2：收集曾用名 > "请问您有曾用名吗？" - 没有曾用名 → 跳过，进入 Step 3 - 有曾用名 → 收集曾用名内容，然后询问改名的大致时间（年份即可）。如果用户忘了，标记为"未知" - 不太清楚 → 跳过，进入 Step 3 ### Step 3：收集阳历生日 > "请告诉我您的阳历（公历）生日，格式如：1990年5月15日。如果不确定阳历生日，可以说不知道。" - 用户提供了阳历生日 → 记录，进入 Step 4 - 用户不知道 → 标记为"未知"，进入 Step 4 ### Step 4：收集农历生日 > "请告诉我您的农历（阴历）生日，格式如：1990年四月廿一。如果有闰月请标注（如：闰四月）。如果不确定农历生日，可以说不知道。" - 用户提供了农历生日 → 记录，进入 Step 5 - 用户不知道 → 标记为"未知"，进入 Step 5 - **如果阳历和农历都标记为"未知"** → 告知用户无法排盘，建议回家查看出生证明或询问家人 ### Step 5：收集出生时辰 > "请问您的出生时辰是？（如果只知道大概时间也可以，比如'早上'、'下午'）" 可参考 `references/shichen-table.md` 中的时辰对照表帮用户判断。 - 提供具体时间 → 换算为时辰地支 - 提供时辰 → 直接记录 - 不确定 → 标记时柱为"未知"，后续只做六字分析 ### Step 6：收集性别 > "请问您的性别？" （男 / 女） 性别影响大运排列方向（阳年男/阴年女顺排，阴年男/阳年女逆排），必须收集。 ### Step 7：收集出生地 > "请告诉我您的出生省份和城市（例如：辽宁省丹东市）。" 出生地用于真太阳时校正参考。如果用户提供的出生时间与时辰对应有偏差，可提醒用户可能存在真太阳时的影响。 ### Step 8：确认在世状态 > "请问要分析的人目前是否在世？" - 在世 → 自动获取当前日期，作为分析的"当前时间" - 已故 → 收集去世的年份，分析只推算到该年为止 ### Step 9：信息确认汇总 将收集到的所有信息汇总展示给用户： ``` 📋 信息确认： - 姓名：XXX（曾用名：XXX，改名时间：XXXX年/未知/无） - 阳历生日：XXXX年XX月XX日（或：未知） - 农历生日：XXXX年XX月XX日（或：未知） - 出生时辰：X时（或：未知） - 性别：男/女 - 出生地：XX省XX市 - 当前日期：XXXX年XX月XX日 - 在世状态：在世/已故（XXXX年去世） ``` > "以上信息是否正确？如需修改请告诉我，确认后我将开始排盘分析。" 用户确认后，进入第二阶段。 --- ## 第二阶段：排盘计算 确认信息后，读取 `references/wuxing-tables.md` 和 `references/shichen-table.md`，进行以下计算： ### 1. 年柱 - 以**立春**为分界线（非农历正月初一），立春前出生归上一年 - 立春通常在每年阳历 2 月 3-5 日 - 年干支按六十甲子循环推算 ### 2. 月柱 - 以**节气**为分界线（非农历月份），每月一节： - 立春→寅月，惊蛰→卯月，清明→辰月，立夏→巳月 - 芒种→午月，小暑→未月，立秋→申月，白露→酉月 - 寒露→戌月，立冬→亥月，大雪→子月，小寒→丑月 - 年上起月法口诀："甲己之年丙作首，乙庚之岁戊为头，丙辛之年寻庚上，丁壬壬寅顺水流，戊癸之年何方觅，甲寅之上好追求。" ### 3. 日柱 - 需根据万年历查表确定，或用已知的日柱推算法计算 - 注意夜子时（23:00后）归属次日 ### 4. 时柱 - 根据出生时间确定时辰地支（参考 `references/shichen-table.md`） - 根据日上起时法（五鼠遁元）确定天干 ### 5. 排出四柱 以表格形式呈现： | | 年柱 | 月柱 | 日柱 | 时柱 | |--|------|------|------|------| | 天干 | X | X | X | X | | 地支 | X | X | X | X | | 十神 | — | — | — | — | | 藏干 | — | — | — | — | - 十神以日干（日主）为基准计算 - 藏干展开各支的本气、中气、余气 ### 6. 大运排列 读取 `references/dayun-rules.md`，计算： - 确定大运方向：阳年男/阴年女 → 顺排；阴年男/阳年女 → 逆排 - 以月柱为基准，按方向依次排列大运干支 - 计算起运年龄（从出生日到最近节气天数 ÷ 3） - 排列从起运年龄开始的各步大运（每步管十年） 展示格式： | 大运序 | 年龄范围 | 干支 | |--------|----------|------| | 起运前 | X-X岁 | 月柱（小运）| | 第一步 | X-X岁 | XX | | 第二步 | X-X岁 | XX | | ... | ... | ... | --- ## 第三阶段：综合分析 读取 `references/classical-texts.md` 获取经典论命规则，按以下框架进行分析： ### 1. 日主分析 - 从工具输出的 `日主强弱` 字段获取：得令、得地、强弱判定、调候倾向 - 补充分析：日主五行特性对该人性格的影响 - 参考滴天髓"得令最重"原则 ### 2. 十神分析 - 列出各柱十神及其含义 - 重点分析对日主影响最大的十神 - 十神与六亲关系（参考渊海子平） ### 3. 五行平衡 - 从工具输出的 `五行` 字段读取五行数量统计 - 判断五行偏旺/偏缺 - 确定喜用神和忌神（参考穷通宝典调候用神） ### 4. 格局判定 - 根据月令和透干确定格局（正官格、偏财格等，参考子平真诠） - 判断格局高低成败 - 分析用神和相神的有力无力 ### 5. 大运分析 - 分析当前所处的大运 - 分析各步大运的整体吉凶趋势 - 重点分析当前大运对原局的影响 ### 6. 流年分析 - 分析当年流年干支与原局、大运的关系 - 预测当年运势趋势 - 可适当展望近 1-3 年 ### 7. 历史事件校准（关键步骤） 在分析的最后，根据排盘结果和经典理论，提出 3-5 个该人**已经发生的**关键事件的时间段和性质预测，让用户验证这些预测是否准确。 示例： > "根据您XX岁（XXXX年）的大运流年组合，那一年应该有XXXX方面的重大变化（如事业转折/感情变化/搬迁等），是否准确？" > > "您XX-XX岁这步大运整体呈现XXXX趋势，那个阶段您的生活重心应该在XXXX方面。" 根据用户对历史事件的反馈，微调分析模型，修正对格局和用神的理解。 ### 8. 综合建议 - 事业方向建议 - 财运趋势 - 感情婚姻 - 健康注意事项 - 吉祥方位、颜色等（可选） **所有分析都应引用经典典籍的论断，并标注出处**。例如："根据《穷通宝典》的调候原则，甲木生于酉月，先用丁火制金……" --- ## 边界情况处理 | 情况 | 处理方式 | |------|----------| | 时辰未知 | 时柱标"未知"，只做六字（年月日）分析，不推断时柱相关内容 | | 阳历农历都未知 | 无法排盘，建议用户回家查看出生证明或询问家人 | | 节气交界日出生 | 提示可能有两种月柱，分别简要分析 | | 立春前后出生 | 需精确判断年柱归属，可提醒用户确认具体时间 | | 夜子时（23:00-24:00） | 按次日日柱计算时柱，注明此为早晚子时法 | | 改名时间不详 | 记录"不详"，分析中只参考现名，注明曾用名未知改名时间 | | 已故之人 | 收集去世年份，分析只推算到该年为止，不推算后续流年 | | 闰月出生 | 农历需标注是否闰月，排盘时以节气为准不受闰月影响 | --- ## 注意事项 - 命理分析仅供文化研究和参考，不应被视为科学预测 - 避免给出极端或恐吓性的断语，保持中性和建设性的语气 - 如涉及健康问题，提醒用户以医学诊断为准 - 如涉及财务问题，提醒用户理性决策 - 分析结束时提醒用户："命理分析仅供参考，人生在于自身的努力和选择。"

path: references/classical-texts.md
content: # 经典命理典籍核心知识摘要

## 目录

- [穷通宝典](#穷通宝典)
- [三命通会](#三命通会)
- [滴天髓](#滴天髓)
- [渊海子平](#渊海子平)
- [千里命稿](#千里命稿)
- [协纪辨方书](#协纪辨方书)
- [子平真诠](#子平真诠)
- [神峰通考](#神峰通考)
- [果老星宗](#果老星宗)

---

## 穷通宝典

**核心贡献**：调候用神——根据日干和出生月份（季节），确定命局最需要的五行。

### 核心规则

- 论命**首重调候**，其次才论格局旺衰。若命局缺调候之字，格局再好也难发挥。
- 夏生火旺，须用水调候；冬生水旺，须用火调候。
- 各日干十二月调候用神各有不同，详见穷通宝典原文。

### 关键口诀举例

- **甲木生于正月**（寅月）：初春余寒未尽，先用丙火暖之，后用癸水滋之。丙癸两透，富贵双全。
- **甲木生于八月**（酉月）：秋金当令，甲木受克，先用丁火制金，再用丙火暖木。
- **庚金生于十一月**（子月）：寒冬水冷金沉，必用丙火解冻，甲木引丁。

### 使用原则

调候用神是命局中最关键的"药"。若命局中调候用神受克或缺失，即使格局好，人生也多阻碍。分析时应首先检查调候用神的有力无力。

---

## 三命通会

**核心贡献**：格局论命、神煞体系、干支关系大全。

### 核心格局

- **正官格**：月支藏正官透出天干。主为人端正、有贵气，忌伤官破格。
- **七杀格**（偏官格）：月支藏七杀透出。主刚烈果断，须食神制杀或印化杀。
- **正财格/偏财格**：月支藏财星透出。主勤劳致富，忌比劫争财。
- **正印格/偏印格**：月支藏印星透出。主聪慧好学，偏印忌见食神（枭神夺食）。
- **食神格**：月支藏食神透出。主食禄丰厚，忌枭印夺食。
- **伤官格**：月支藏伤官透出。主才华横溢，伤官见官为祸百端（但有例外）。

### 常用神煞

- **天乙贵人**：口诀"甲戊庚牛羊，乙己鼠猴乡，丙丁猪鸡位，壬癸兔蛇藏，庚辛逢虎马"。主逢凶化吉。
- **文昌贵人**：主聪明好学、文才出众。
- **驿马**：主动、旅行、迁移。年支或日支查之：申子辰马在寅，寅午戌马在申，巳酉丑马在亥，亥卯未马在巳。
- **桃花**（咸池）：主异性缘、才艺。申子辰在酉，寅午戌在卯，巳酉丑在午，亥卯未在子。
- **华盖**：主孤独、宗教、学术。申子辰在辰，寅午戌在戌，巳酉丑在丑，亥卯未在未。

---

## 滴天髓

**核心贡献**：旺衰判断、气势流通、天道地道人道。

### 核心理论

- **天道**：看天干之配合，天干主动，主外在表现。
- **地道**：看地支之配合，地支主静，主内在根基。
- **人道**：看干支之间的配合关系，判断人的行为和选择。

### 旺衰判断原则

- **得令**：日干在月令（月支）处于长生、帝旺之地，为得令，身旺的基础。
- **得地**：日干在其他地支中有根（长生、帝旺、墓库），为得地。
- **得势**：天干有比劫帮身，或有印星生身，为得势。

> 三得之中，得令最为重要。

### 气势流通

- 命局喜五行流通，不喜阻滞。如金生水、水生木、木生火，一路顺生，气势流畅。
- 若某五行过旺或过弱，造成堵塞，则需通关之物。如金木相战，取水通关。
- "**旺极宜泄不宜克，衰极宜扶不宜帮**"——旺到极致反而喜欢被泄（食伤泄秀），弱到极致反而不能再帮扶（从弱格）。

---

## 渊海子平

**核心贡献**：四柱八字体系的奠基之作，十神体系、六亲关系、基本格局定义。

### 十神与六亲

| 六亲 | 对应十神 | 说明 |
|------|----------|------|
| 母亲 | 正印 | — |
| 父亲（男命） | 偏财 | — |
| 妻子（男命） | 正财 | — |
| 丈夫（女命） | 正官 | — |
| 子女（女命） | 食神/伤官 | — |
| 兄弟 | 比肩 | — |
| 姐妹（男命） | 劫财 | — |

### 基本格局分类

- **正格**：正官格、偏官格、正财格、偏财格、正印格、偏印格、食神格、伤官格
- **特殊格**：从格（从财、从官杀、从儿、从势）、化气格，建禄格、羊刃格

### 用神取法

"用神"是命局中对日主最有帮助的五行，取用原则：
- **扶抑**：身弱扶之，身旺抑之
- **调候**：寒暖燥湿需调节
- **通关**：两行交战取通关之物
- **顺势**：从格则顺其势

---

## 千里命稿

**核心贡献**：实际断命技法、具体案例的分析方法。

### 断命要点

- 先看格局高低，再看用神有力无力
- 看大运是否帮扶用神，流年是否引动关键位置
- 断事需结合十神所代表的人事和宫位

### 宫位论法

| 宫位 | 代表 | 年龄段 |
|------|------|--------|
| 年柱 | 祖上、父母、家族背景 | 1-16岁 |
| 月柱 | 父母、兄弟、工作环境 | 17-32岁 |
| 日柱 | 自己（日干）、配偶（日支） | 33-48岁 |
| 时柱 | 子女、晚年、事业成果 | 49岁以后 |

---

## 协纪辨方书

**核心贡献**：神煞起例方法、择日理论。

### 常用神煞起法

- 神煞以年干、年支或日干、日支来查
- 吉神：天乙贵人、天德贵人、月德贵人、文昌、学堂
- 凶神：羊刃、亡神、劫煞、灾煞、六厄、孤辰、寡宿

### 注意事项

- 神煞为辅助参考，不可单独论命。需配合格局旺衰综合判断。
- 吉神逢克则力减，凶神有制则祸轻。

---

## 子平真诠

**核心贡献**：格局论命的集大成之作，用神专论。

### 格局高低

- 格局以**清纯为贵，杂浊为贱**。用神一位为清，多用神或用神受冲克为浊。
- **成格条件**：用神有力、不受克破、有相神辅助
- **破格条件**：用神受克、忌神当令无制、格局混杂

### 用神与相神

- **用神**：命局中最关键的十神，用于维护格局平衡
- **相神**：辅助用神的十神，如正官格中的印星（官印相生）
- **喜神**：生扶用神的五行
- **忌神**：克破用神的五行

### 格局成败

- **成格**：用神得力、相神辅佐、忌神有制 → 人生顺遂
- **败格**：用神受克、无相神辅助、忌神当道 → 人生多阻碍
- 成中有败、败中有成：需仔细分析其轻重缓急

---

## 神峰通考

**核心贡献**：命理考辨、辟谬。

### 核心观点

- 强调"**病药说**"：命局如人体，有病方为贵，无病不为奇。命局有缺陷（病），大运或流年来了"药"（喜用神），方有成就。
- 反对机械套用神煞，主张以五行生克为根本。
- 格局虽有定法，但变通更重要。不可执一而论。

---

## 果老星宗

**核心贡献**：星命术，与八字有交叉但体系不同。

### 与八字的关联

- 星宗以命宫、身宫为核心，用七政四余（日月金木水火土 + 罗计气孛）论命
- 部分概念被八字命理吸收，如命宫的推算法
- 八字分析时若需参考命宫，可用以下口诀推算：

> **命宫推算法**：将出生时辰的地支与月令（月支）对应，用"寅上起月，顺数至生时，所落之宫即为命宫"。

> 注：星宗内容在八字分析中仅作辅助参考，非必需。


path: references/dayun-rules.md
content: # 大运规则详解

## 一、阳年与阴年

天干分阴阳：

- **阳年**：年干为甲、丙、戊、庚、壬
- **阴年**：年干为乙、丁、己、辛、癸

## 二、大运顺逆规则

口诀：**阳男阴女顺排，阴男阳女逆排**。

| 年干 | 性别 | 大运方向 |
|------|------|----------|
| 阳年 | 男 | 顺排 |
| 阳年 | 女 | 逆排 |
| 阴年 | 男 | 逆排 |
| 阴年 | 女 | 顺排 |

## 三、大运排列方法

以月柱干支为基准，进行顺排或逆排：

### 顺排

从月柱开始，天干和地支各往后推一位，依次排列。

例：月柱为丙寅，顺排大运为：丁卯 → 戊辰 → 己巳 → 庚午 → 辛未 → ...

- 天干顺推：甲→乙→丙→丁→戊→己→庚→辛→壬→癸→甲（循环）
- 地支顺推：子→丑→寅→卯→辰→巳→午→未→申→酉→戌→亥→子（循环）

### 逆排

从月柱开始，天干和地支各往前推一位，依次排列。

例：月柱为丙寅，逆排大运为：乙丑 → 甲子 → 癸亥 → 壬戌 → 辛酉 → ...

- 天干逆推：癸→壬→辛→庚→己→戊→丁→丙→乙→甲→癸（循环）
- 地支逆推：亥→戌→酉→申→未→午→巳→辰→卯→寅→丑→子→亥（循环）

## 四、起运年龄计算

### 顺排起运年龄

从出生日起，**顺数到下一个节**（注意是"节"而非"气"），计算总天数，除以 3，得数即为起运年龄。

公式：**起运年龄 = 出生日到下一个节气天数 ÷ 3**

### 逆排起运年龄

从出生日起，**逆数到上一个节**，计算总天数，除以 3，得数即为起运年龄。

公式：**起运年龄 = 出生日到上一个节气天数 ÷ 3**

### 十二节（用于起运计算）

立春、惊蛰、清明、立夏、芒种、小暑、立秋，白露、寒露、立冬、大雪、小寒

> 注：节与气的区别——每月一节一气，节为月之始，气为月之中。排大运只看"节"。

### 余数处理

- 余 1 天：约 4 个月起运
- 余 2 天：约 8 个月起运
- 余 0 天：整岁起运

四舍五入到最接近的整数岁数。

## 五、大运周期

每步大运管十年。

排列示例（假设 5 岁起运，月柱丙寅，顺排）：

| 大运序 | 年龄范围 | 干支 |
|--------|----------|------|
| 第一步 | 5-14 岁 | 丁卯 |
| 第二步 | 15-24 岁 | 戊辰 |
| 第三步 | 25-34 岁 | 己巳 |
| 第四步 | 35-44 岁 | 庚午 |
| 第五步 | 45-54 岁 | 辛未 |
| 第六步 | 55-64 岁 | 壬申 |
| 第七步 | 65-74 岁 | 癸酉 |
| 第八步 | 75-84 岁 | 甲戌 |

## 六、交运前的小运

小孩未交大运之前（即起运年龄之前），以月柱干支作为大运。

例：如果 5 岁起运，则 0-4 岁这段时间，以月柱的干支来分析运势。

## 七、流年

流年即每一年的天干地支，用来判断当年的运势吉凶。

- 流年干支与原局（四柱）产生的关系（冲、合、刑、害等）影响当年运势
- 流年与大运的关系也很重要：**大运为环境，流年为引动**
- 大运好、流年差：总体平稳但当年有波折
- 大运差、流年好：总体不利但当年有机遇

## 八、注意事项

- 大运的交接年份（换运年）通常变动较大，需要特别关注
- 大运天干管前五年，地支管后五年（此为一家之言，也有主张天干地支共管十年）
- 大运与原局形成的天合地合、天克地冲等关系需要重点分析
- 分析大运时要结合原局格局的喜忌，喜神到位则吉，忌神到位则凶


path: references/shichen-table.md
content: # 时辰对照表

## 十二时辰与时间对应

| 时辰 | 地支 | 时间范围 | 别称 |
|------|------|----------|------|
| 夜半 | 子 | 23:00 - 01:00 | 中夜 |
| 鸡鸣 | 丑 | 01:00 - 03:00 | 荒鸡 |
| 平旦 | 寅 | 03:00 - 05:00 | 黎明 |
| 日出 | 卯 | 05:00 - 07:00 | 破晓 |
| 食时 | 辰 | 07:00 - 09:00 | 早食 |
| 隅中 | 巳 | 09:00 - 11:00 | 日禺 |
| 日中 | 午 | 11:00 - 13:00 | 正午 |
| 日昳 | 未 | 13:00 - 15:00 | 日跌 |
| 晡时 | 申 | 15:00 - 17:00 | 日铺 |
| 日入 | 酉 | 17:00 - 19:00 | 傍晚 |
| 黄昏 | 戌 | 19:00 - 21:00 | 日暮 |
| 人定 | 亥 | 21:00 - 23:00 | 定昏 |

---

## 早子时与夜子时

子时横跨两天（23:00-01:00），在命理学中有"早子时"和"夜子时"之分：

- **早子时**（00:00 - 01:00）：归属当日，使用当日日柱
- **夜子时**（23:00 - 24:00）：归属次日，使用次日日柱

> 注：子时归属是命理学长期争议的话题。本 skill 采用"早晚子时"区分法，即：
> - 23:00 前按当日算
> - 23:00 后按次日日柱计算时柱

---

## 时辰判断提示

如果用户只知道大致时间范围而非精确时间，可参考以下对照：

| 用户描述 | 对应时辰 |
|----------|----------|
| 天还没亮 / 后半夜 | 丑时或寅时 |
| 天刚亮 / 早上 | 卯时 |
| 吃早饭 / 上午 | 辰时 |
| 快中午 / 上午后半 | 巳时 |
| 中午 / 吃午饭 | 午时 |
| 下午刚开始 | 未时 |
| 下午 / 傍晚前 | 申时 |
| 天快黑 / 傍晚 | 酉时 |
| 吃晚饭 / 晚上 | 戌时 |
| 夜里 / 睡前 | 亥时 |
| 半夜 / 深夜 | 子时 |

---

## 日上起时法（五鼠遁元）

时柱天干由日干决定，口诀：

> "甲己还加甲，乙庚丙作初，丙辛从戊起，丁壬庚子居，戊癸何方发，壬子是真途。"

即日干为甲或己时，子时天干为甲（甲子时）；日干为乙或庚时，子时天干为丙（丙子时）；以此类推。

| 日干 | 子时天干 | 丑时天干 | 寅时天干 | 卯时天干 | 辰时天干 | 巳时天干 | 午时天干 | 未时天干 | 申时天干 | 酉时天干 | 戌时天干 | 亥时天干 |
|------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|
| 甲/己 | 甲子 | 乙丑 | 丙寅 | 丁卯 | 戊辰 | 己巳 | 庚午 | 辛未 | 壬申 | 癸酉 | 甲戌 | 乙亥 |
| 乙/庚 | 丙子 | 丁丑 | 戊寅 | 己卯 | 庚辰 | 辛巳 | 壬午 | 癸未 | 甲申 | 乙酉 | 丙戌 | 丁亥 |
| 丙/辛 | 戊子 | 己丑 | 庚寅 | 辛卯 | 壬辰 | 癸巳 | 甲午 | 乙未 | 丙申 | 丁酉 | 戊戌 | 己亥 |
| 丁/壬 | 庚子 | 辛丑 | 壬寅 | 癸卯 | 甲辰 | 乙巳 | 丙午 | 丁未 | 戊申 | 己酉 | 庚戌 | 辛亥 |
| 戊/癸 | 壬子 | 癸丑 | 甲寅 | 乙卯 | 丙辰 | 丁巳 | 戊午 | 己未 | 庚申 | 辛酉 | 壬戌 | 癸亥 |


path: references/wuxing-tables.md
content: # 五行、天干地支、十神参考表

## 目录

- [十天干阴阳五行表](#十天干阴阳五行表)
- [十二地支阴阳五行表](#十二地支阴阳五行表)
- [天干五合](#天干五合)
- [地支关系](#地支关系)
- [十神定义及生克关系](#十神定义及生克关系)
- [十二长生表](#十二长生表)
- [地支藏干表](#地支藏干表)

---

## 十天干阴阳五行表

| 天干 | 阴阳 | 五行 | 方位 | 季节 |
|------|------|------|------|------|
| 甲 | 阳 | 木 | 东 | 春 |
| 乙 | 阴 | 木 | 东 | 春 |
| 丙 | 阳 | 火 | 南 | 夏 |
| 丁 | 阴 | 火 | 南 | 夏 |
| 戊 | 阳 | 土 | 中 | 四季末 |
| 己 | 阴 | 土 | 中 | 四季末 |
| 庚 | 阳 | 金 | 西 | 秋 |
| 辛 | 阴 | 金 | 西 | 秋 |
| 壬 | 阳 | 水 | 北 | 冬 |
| 癸 | 阴 | 水 | 北 | 冬 |

- **阳干**：甲丙戊庚壬
- **阴干**：乙丁己辛癸

---

## 十二地支阴阳五行表

| 地支 | 阴阳 | 五行 | 方位 | 月份（农历） | 生肖 | 时辰 |
|------|------|------|------|-------------|------|------|
| 子 | 阳 | 水 | 北 | 十一月 | 鼠 | 23:00-01:00 |
| 丑 | 阴 | 土 | 东北 | 十二月 | 牛 | 01:00-03:00 |
| 寅 | 阳 | 木 | 东北 | 正月 | 虎 | 03:00-05:00 |
| 卯 | 阴 | 木 | 东 | 二月 | 兔 | 05:00-07:00 |
| 辰 | 阳 | 土 | 东南 | 三月 | 龙 | 07:00-09:00 |
| 巳 | 阴 | 火 | 东南 | 四月 | 蛇 | 09:00-11:00 |
| 午 | 阳 | 火 | 南 | 五月 | 马 | 11:00-13:00 |
| 未 | 阴 | 土 | 西南 | 六月 | 羊 | 13:00-15:00 |
| 申 | 阳 | 金 | 西南 | 七月 | 猴 | 15:00-17:00 |
| 酉 | 阴 | 金 | 西 | 八月 | 鸡 | 17:00-19:00 |
| 戌 | 阳 | 土 | 西北 | 九月 | 狗 | 19:00-21:00 |
| 亥 | 阴 | 水 | 西北 | 十月 | 猪 | 21:00-23:00 |

---

## 天干五合

- 甲己合化土
- 乙庚合化金
- 丙辛合化水
- 丁壬合化木
- 戊癸合化火

合化条件：需得时得令，天干相邻且地支有合化之根，方论化。仅合不化则为"合绊"，力量牵制。

---

## 地支关系

### 六冲

子午冲、丑未冲、寅申冲、卯酉冲、辰戌冲、巳亥冲

### 三合局

- 申子辰合水局
- 亥卯未合木局
- 寅午戌合火局
- 巳酉丑合金局

三合局需三字全见方成局，缺一则为半合（如申子半合水、子辰半合水），力量减半。

### 三会局（方局）

- 寅卯辰会东方木局
- 巳午未会南方火局
- 申酉戌会西方金局
- 亥子丑会北方水局

三会局力量大于三合局，需三字全见。

### 六合

子丑合土、寅亥合木、卯戌合火、辰酉合金、巳申合水、午未合火（或合土，有争议）

### 相刑

- 寅巳申三刑（无恩之刑）
- 丑戌未三刑（持势之刑）
- 子卯相刑（无礼之刑）
- 辰辰自刑、午午自刑、酉酉自刑、亥亥自刑

### 相害（相穿）

子未害、丑午害、寅巳害、卯辰害、申亥害、酉戌害

---

## 十神定义及生克关系

### 十神推导规则

以日干（日主）为中心，根据其他天干与日干的五行生克关系及阴阳异同来确定十神：

| 关系 | 阴阳相同 | 阴阳不同 |
|------|----------|----------|
| 生我（我之母） | 偏印（枭神） | 正印 |
| 我生（我之子） | 食神 | 伤官 |
| 克我（克我者） | 偏官（七杀） | 正官 |
| 我克（我制者） | 偏财 | 正财 |
| 同我（同类） | 比肩 | 劫财 |

### 十神详解

| 十神 | 含义 | 代表人事 |
|------|------|----------|
| 比肩 | 同我者，阴阳相同 | 兄弟、朋友、同辈、竞争者 |
| 劫财 | 同我者，阴阳不同 | 姐妹、竞争对手、损财者 |
| 食神 | 我生者，阴阳相同 | 子女（女命）、才华、口福 |
| 伤官 | 我生者，阴阳不同 | 子女（女命）、才艺、叛逆 |
| 偏财 | 我克者，阴阳相同 | 偏财、父（男命）、情人 |
| 正财 | 我克者，阴阳不同 | 正财、妻（男命）、稳定收入 |
| 偏官（七杀） | 克我者，阴阳相同 | 偏权、压力、小人之类 |
| 正官 | 克我者，阴阳不同 | 正权、上级、夫（女命） |
| 偏印（枭神） | 生我者，阴阳相同 | 偏学术、继母、孤独 |
| 正印 | 生我者，阴阳不同 | 母亲、学业、贵人 |

### 五行生克

- 相生：木→火→土→金→水→木
- 相克：木→土→水→火→金→木

---

## 十二长生表

以五行（天干）论十二长生，表示五行之气从生到灭的过程：

| 阶段 | 甲木（阳木） | 乙木（阴木） | 丙火（阳火） | 丁火（阴火） | 戊土（阳土） | 己土（阴土） | 庚金（阳金） | 辛金（阴金） | 壬水（阳水） | 癸水（阴水） |
|------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|
| 长生 | 亥 | 午 | 寅 | 酉 | 寅 | 酉 | 巳 | 子 | 申 | 卯 |
| 沐浴 | 子 | 巳 | 卯 | 申 | 卯 | 申 | 午 | 亥 | 酉 | 寅 |
| 冠带 | 丑 | 辰 | 辰 | 未 | 辰 | 未 | 未 | 戌 | 戌 | 丑 |
| 临官 | 寅 | 卯 | 巳 | 午 | 巳 | 午 | 申 | 酉 | 亥 | 子 |
| 帝旺 | 卯 | 寅 | 午 | 巳 | 午 | 巳 | 酉 | 申 | 子 | 亥 |
| 衰 | 辰 | 丑 | 未 | 辰 | 未 | 辰 | 戌 | 未 | 丑 | 戌 |
| 病 | 巳 | 子 | 申 | 卯 | 申 | 卯 | 亥 | 午 | 寅 | 酉 |
| 死 | 午 | 亥 | 酉 | 寅 | 酉 | 寅 | 子 | 巳 | 卯 | 申 |
| 墓 | 未 | 戌 | 戌 | 丑 | 戌 | 丑 | 丑 | 辰 | 辰 | 未 |
| 绝 | 申 | 酉 | 亥 | 子 | 亥 | 子 | 寅 | 卯 | 巳 | 午 |
| 胎 | 酉 | 申 | 子 | 亥 | 子 | 亥 | 卯 | 寅 | 午 | 巳 |
| 养 | 戌 | 未 | 丑 | 戌 | 丑 | 戌 | 辰 | 丑 | 未 | 辰 |

> 注：阳干顺行，阴干逆行。十二长生主要用于判断天干在地支中的旺衰状态。

---

## 地支藏干表

| 地支 | 本气 | 中气 | 余气 |
|------|------|------|------|
| 子 | 癸水 | — | — |
| 丑 | 己土 | 癸水 | 辛金 |
| 寅 | 甲木 | 丙火 | 戊土 |
| 卯 | 乙木 | — | — |
| 辰 | 戊土 | 乙木 | 癸水 |
| 巳 | 丙火 | 庚金 | 戊土 |
| 午 | 丁火 | 己土 | — |
| 未 | 己土 | 丁火 | 乙木 |
| 申 | 庚金 | 壬水 | 戊土 |
| 酉 | 辛金 | — | — |
| 戌 | 戊土 | 辛金 | 丁火 |
| 亥 | 壬水 | 甲木 | — |

> 藏干的力量权重：本气 > 中气 > 余气。本气约占 60%，中气约 30%，余气约 10%。


path: tools/bazi_pan.py
content: #!/usr/bin/env python3
"""
八字排盘 CLI 工具（完整版）
包含：四柱排盘 + 大运排列 + 起运年龄 + 流年

用法:
  python3 bazi_pan.py <阳历日期> <时辰> [性别]
  python3 bazi_pan.py --json <阳历日期> <时辰> [性别]

示例:
  python3 bazi_pan.py 1990-5-15 8:00 male
  python3 bazi_pan.py --json 1990-5-15 8:00 female
"""

import sys
import json
import lunar_python as lunar
from datetime import datetime, date

# ============================================================
# 常量
# ============================================================

TIANGAN = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸']
DIZHI = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']
JIEQI_12 = ['立春', '惊蛰', '清明', '立夏', '芒种', '小暑',
             '立秋', '白露', '寒露', '立冬', '大雪', '小寒']

def is_yang_gan(g): return g in ['甲', '丙', '戊', '庚', '壬']
def gan_index(g): return TIANGAN.index(g)
def zhi_index(z): return DIZHI.index(z)
def next_gan(g, n=1): return TIANGAN[(gan_index(g) + n) % 10]
def prev_gan(g, n=1): return TIANGAN[(gan_index(g) - n) % 10]
def next_zhi(z, n=1): return DIZHI[(zhi_index(z) + n) % 12]
def prev_zhi(z, n=1): return DIZHI[(zhi_index(z) - n) % 12]

CANGGAN = {
    '子': {'本气': '癸水', '中气': None, '余气': None},
    '丑': {'本气': '己土', '中气': '癸水', '余气': '辛金'},
    '寅': {'本气': '甲木', '中气': '丙火', '余气': '戊土'},
    '卯': {'本气': '乙木', '中气': None, '余气': None},
    '辰': {'本气': '戊土', '中气': '乙木', '余气': '癸水'},
    '巳': {'本气': '丙火', '中气': '庚金', '余气': '戊土'},
    '午': {'本气': '丁火', '中气': '己土', '余气': None},
    '未': {'本气': '己土', '中气': '丁火', '余气': '乙木'},
    '申': {'本气': '庚金', '中气': '壬水', '余气': '戊土'},
    '酉': {'本气': '辛金', '中气': None, '余气': None},
    '戌': {'本气': '戊土', '中气': '辛金', '余气': '丁火'},
    '亥': {'本气': '壬水', '中气': '甲木', '余气': None},
}

GAN_WUXING = {'甲': '木', '乙': '木', '丙': '火', '丁': '火',
               '戊': '土', '己': '土', '庚': '金', '辛': '金', '壬': '水', '癸': '水'}
ZHI_WUXING = {'子': '水', '丑': '土', '寅': '木', '卯': '木',
               '辰': '土', '巳': '火', '午': '火', '未': '土',
               '申': '金', '酉': '金', '戌': '土', '亥': '水'}

# 十二长生表（阳干顺行，阴干逆行）
# 阶段顺序：长生→沐浴→冠带→临官→帝旺→衰→病→死→墓→绝→胎→养
SHICHANG = ['长生', '沐浴', '冠带', '临官', '帝旺', '衰', '病', '死', '墓', '绝', '胎', '养']

# 各天干的十二长生地支（阳干顺排）
CHANG_SHENG = {
    '甲': '亥', '丙': '寅', '戊': '寅', '庚': '巳', '壬': '申',  # 阳干
    '乙': '午', '丁': '酉', '己': '酉', '辛': '子', '癸': '卯',  # 阴干
}


def get_shichang_position(gan, zhi):
    """
    判断某天干在地支的十二长生状态
    返回: (阶段名, 得令否)
    """
    start_zhi = CHANG_SHENG.get(gan)
    if not start_zhi:
        return None, False
    start_idx = DIZHI.index(start_zhi)
    zhi_idx = DIZHI.index(zhi)
    # 阳干顺行，阴干逆行
    if is_yang_gan(gan):
        offset = (zhi_idx - start_idx) % 12
    else:
        offset = (start_idx - zhi_idx) % 12
    stage = SHICHANG[offset]
    # 得令：长生、临官、帝旺
    de_ling = stage in ['长生', '临官', '帝旺']
    return stage, de_ling


def assess_dayzhu_strength(day_gan, month_zhi, wx_cnt, all_canggan):
    """
    评估日主强弱（简化版）
    day_gan: 日干
    month_zhi: 月支
    wx_cnt: 五行计数 dict
    all_canggan: 所有藏干五行列表
    """
    # 1. 得令：月支是否为日干的长生/临官/帝旺
    stage, de_ling = get_shichang_position(day_gan, month_zhi)

    # 2. 得地：其他地支是否有根（藏干中有同五行）
    day_wuxing = GAN_WUXING.get(day_gan, '')
    total_roots = wx_cnt.get(day_wuxing, 0)

    # 3. 得势：天干有无比劫印星
    # （这里简化：看日干五行数量是否较多）

    # 综合判断
    score = 0
    if de_ling:
        score += 3  # 得令最重要
    if total_roots >= 3:
        score += 2
    elif total_roots >= 1:
        score += 1

    if score >= 4:
        strength = '身旺'
        tendency = '偏抑'
    elif score >= 2:
        strength = '身较强'
        tendency = '略抑'
    elif score >= 1:
        strength = '身较弱'
        tendency = '略扶'
    else:
        strength = '身弱'
        tendency = '偏扶'

    return {
        '日主': day_gan,
        '日主五行': day_wuxing,
        '月支': month_zhi,
        '长生阶段': stage,
        '得令': de_ling,
        '地支根数': total_roots,
        '强弱判定': strength,
        '调候倾向': tendency,
    }

# ============================================================
# 节气日期查找
# ============================================================

def _get_jie_list(solar_year, solar_month, solar_day):
    """用 Solar -> Lunar 获取某公历日期附近的节气表"""
    s = lunar.Solar.fromYmd(solar_year, solar_month, solar_day)
    l = s.getLunar()
    table = l.getJieQiTable()
    result = []
    for kname in JIEQI_12:
        if kname in table:
            ss = table[kname]
            dt = date(int(ss.getYear()), int(ss.getMonth()), int(ss.getDay()))
            result.append((dt, kname))
    result.sort()
    return result


def find_jie_for_dayun(birth_date, direction):
    """
    找起运所需的节气。
    direction: 'forward' → 顺排，找出生日期之后的第一个节
               'backward' → 逆排，找出生日期之前的最后一个节
    返回: (datetime.date, 节气名) 或 (None, None)
    """
    all_jie = []
    for y in range(birth_date.year - 1, birth_date.year + 2):
        for m in range(1, 13):
            try:
                all_jie.extend(_get_jie_list(y, m, 1))
            except Exception:
                pass
    all_jie.sort()
    if direction == 'forward':
        for dt, kname in all_jie:
            if dt > birth_date:
                return dt, kname
    else:
        for dt, kname in reversed(all_jie):
            if dt < birth_date:
                return dt, kname
    return None, None


# ============================================================
# 大运计算
# ============================================================

def calc_dayun(birth_date, month_gan, month_zhi, year_gan, gender):
    """
    计算大运排列
    """
    yang_year = is_yang_gan(year_gan)
    gender = gender.lower() if gender else 'male'

    if (yang_year and gender == 'male') or (not yang_year and gender == 'female'):
        direction = '顺'
        jie_date, jie_name = find_jie_for_dayun(birth_date, 'forward')
    else:
        direction = '逆'
        jie_date, jie_name = find_jie_for_dayun(birth_date, 'backward')

    if jie_date:
        days = abs((jie_date - birth_date).days)
        qiyun = round(days / 3)
        remainder = days % 3
        adjust = {0: '整', 1: '+4月', 2: '+8月'}[remainder]
    else:
        days, qiyun, adjust, jie_name = 0, 3, '约3岁', '查表'

    # 排列大运（10步）
    dayun_list = []
    for i in range(10):
        if direction == '顺':
            g = next_gan(month_gan, i + 1)
            z = next_zhi(month_zhi, i + 1)
        else:
            g = prev_gan(month_gan, i + 1)
            z = prev_zhi(month_zhi, i + 1)
        age_start = qiyun + i * 10
        dayun_list.append({
            '序号': i + 1,
            '年龄': f'{age_start}-{age_start + 9}岁',
            '干支': g + z,
            '天干': g,
            '地支': z,
        })

    return {
        '方向': direction,
        '起运年龄': qiyun,
        '间隔天数': days,
        '余数调整': adjust,
        '参考节气': jie_name,
        '大运列表': dayun_list,
    }


def calc_xiaoyun(qiyun_age, month_ganzhi):
    """小运（起运前，用月柱）"""
    return {
        '说明': f'未交大运前（0-{qiyun_age - 1}岁），以月柱[{month_ganzhi}]作为小运分析',
        '月柱干支': month_ganzhi,
    }


def calc_liunian(birth_year, gender, current_year=None):
    """计算近5年流年"""
    if current_year is None:
        current_year = datetime.now().year
    results = []
    for year in range(current_year - 2, current_year + 3):
        s = lunar.Solar.fromYmd(year, 7, 1)
        l = s.getLunar()
        gz = l.getYearInGanZhi()
        gan, zhi = gz[0], gz[1]
        wuxing = GAN_WUXING.get(gan, '') + ZHI_WUXING.get(zhi, '')
        results.append({
            '年份': year,
            '干支': gz,
            '天干': gan,
            '地支': zhi,
            '五行': wuxing,
            '今年': year == current_year,
        })
    return results


# ============================================================
# 核心排盘
# ============================================================

def get_bazi(year, month, day, hour=12, minute=0, gender=None):
    """获取完整八字信息（含大运、流年）"""
    d = lunar.Lunar.fromYmdHms(year, month, day, hour, minute, 0)

    year_gz = d.getYearInGanZhi()
    month_gz = d.getMonthInGanZhi()
    day_gz = d.getDayInGanZhi()
    time_gz = d.getTimeInGanZhi()

    year_gan = d.getYearGan()
    year_zhi = d.getYearZhi()
    month_gan = d.getMonthGan()
    month_zhi = d.getMonthZhi()
    day_gan = d.getDayGan()
    day_zhi = d.getDayZhi()
    time_gan = d.getTimeGan()
    time_zhi = d.getTimeZhi()

    ss_gan = d.getBaZiShiShenGan()
    ss_zhi = d.getBaZiShiShenZhi()

    def get_cg(z):
        return CANGGAN.get(z, {'本气': None, '中气': None, '余气': None})

    # 五行统计（天干+地支）
    all_ch = year_gz + month_gz + day_gz + time_gz
    wx_cnt = {'金': 0, '木': 0, '水': 0, '火': 0, '土': 0}
    for ch in all_ch:
        if ch in GAN_WUXING: wx_cnt[GAN_WUXING[ch]] += 1
        if ch in ZHI_WUXING: wx_cnt[ZHI_WUXING[ch]] += 1

    # 日主强弱评估
    dayzhu_strength = assess_dayzhu_strength(day_gan, month_zhi, wx_cnt, None)

    nayin = d.getBaZiNaYin()

    # 大运
    gender_norm = gender.lower() if gender else 'male'
    birth_date = date(year, month, day)
    dayun = calc_dayun(birth_date, month_gan, month_zhi, year_gan, gender_norm)
    xiaoyun = calc_xiaoyun(dayun['起运年龄'], month_gz)
    liunian = calc_liunian(year, gender_norm)

    return {
        '四柱': {
            '年柱': year_gz, '月柱': month_gz,
            '日柱': day_gz, '时柱': time_gz,
        },
        '天干地支': {
            '年': {'干': year_gan, '支': year_zhi},
            '月': {'干': month_gan, '支': month_zhi},
            '日': {'干': day_gan, '支': day_zhi},
            '时': {'干': time_gan, '支': time_zhi},
        },
        '阴阳': {
            '年干阴阳': '阳年' if is_yang_gan(year_gan) else '阴年',
            '年干': year_gan,
        },
        '十神': {
            '年干': ss_gan[0], '年支': ss_zhi[0],
            '月干': ss_gan[1], '月支': ss_zhi[1],
            '日干': '日主', '日支': ss_zhi[2],
            '时干': ss_gan[3], '时支': ss_zhi[3],
        },
        '藏干': {
            '年支': get_cg(year_zhi), '月支': get_cg(month_zhi),
            '日支': get_cg(day_zhi), '时支': get_cg(time_zhi),
        },
        '五行': wx_cnt,
        '纳音': {
            '年柱': nayin[0], '月柱': nayin[1],
            '日柱': nayin[2], '时柱': nayin[3],
        },
        '节气': {
            '前一节': str(d.getPrevJie()), '后一节': str(d.getNextJie()),
        },
        '其他': {
            '生肖': d.getAnimal(),
            '日冲': d.getDayChong(), '日冲描述': d.getDayChongDesc(),
        },
        '大运': dayun,
        '小运': xiaoyun,
        '流年': liunian,
        '日主强弱': dayzhu_strength,
        '原始数据': {
            '阳历日期': f'{year}-{month:02d}-{day:02d}',
            '出生时辰': f'{hour:02d}:{minute:02d}',
            '性别': gender or '未指定',
        }
    }


# ============================================================
# 格式化输出
# ============================================================

def format_text(r):
    p = r['四柱']
    orig = r['原始数据']
    td = r['天干地支']
    ss = r['十神']
    cg = r['藏干']
    wx = r['五行']
    ny = r['纳音']
    dy = r['大运']
    xy = r['小运']
    ln_list = r['流年']

    day_gan = td['日']['干']

    lines = []
    lines.append("=" * 46)
    lines.append("   四柱八字排盘（完整版）")
    lines.append("=" * 46)
    lines.append("四柱：%s 年 · %s 月 · %s 日 · %s 时" % (
        p['年柱'], p['月柱'], p['日柱'], p['时柱']))
    lines.append("阳历：%s %s | 性别：%s" % (
        orig['阳历日期'], orig['出生时辰'], orig['性别']))
    lines.append("生肖：%s | %s" % (r['其他']['生肖'], r['阴阳']['年干阴阳']))
    lines.append("")

    lines.append("【天干地支】")
    for col in ['年', '月', '日', '时']:
        lines.append("  %s柱：天干[%s] 地支[%s]" % (col, td[col]['干'], td[col]['支']))

    lines.append("")
    lines.append("【十神】（以日干[%s]为基准）" % day_gan)
    lines.append("  年干[%s] · 年支[%s]" % (td['年']['干'], ss['年支']))
    lines.append("  月干[%s] · 月支[%s]" % (td['月']['干'], ss['月支']))
    lines.append("  日干[日主] · 日支[%s]" % ss['日支'])
    lines.append("  时干[%s] · 时支[%s]" % (td['时']['干'], ss['时支']))

    lines.append("")
    lines.append("【藏干】")
    for col in ['年支', '月支', '日支', '时支']:
        c = cg[col]
        lines.append("  %s：本气[%s] 中气[%s] 余气[%s]" % (
            col, c['本气'] or '—', c['中气'] or '—', c['余气'] or '—'))

    lines.append("")
    lines.append("【五行统计】%s日主 | " % GAN_WUXING.get(day_gan, ''))
    lines.append("  " + "  ".join("%s=%d" % (k, v) for k, v in wx.items()))

    ds = r['日主强弱']
    lines.append("")
    lines.append("【日主强弱】")
    lines.append("  %s (%s) 生于 %s（月支=%s，长生=%s）" % (
        ds['日主'], ds['日主五行'], ds['月支'], ds['月支'],
        ds['长生阶段']))
    lines.append("  得令：%s | 地支根数：%d | 强弱：%s | 调候倾向：%s" % (
        '是 ✓' if ds['得令'] else '否 ✗', ds['地支根数'],
        ds['强弱判定'], ds['调候倾向']))

    lines.append("")
    lines.append("【纳音】年[%s] 月[%s] 日[%s] 时[%s]" % (
        ny['年柱'], ny['月柱'], ny['日柱'], ny['时柱']))

    lines.append("")
    lines.append("【节气】前[%s] 后[%s]" % (
        r['节气']['前一节'], r['节气']['后一节']))

    lines.append("")
    lines.append("【冲煞】日冲：%s %s" % (
        r['其他']['日冲'], r['其他']['日冲描述']))

    lines.append("")
    lines.append("─" * 46)
    lines.append("【大运】方向：%s  起运年龄：%d岁（%s）  参考节气：%s" % (
        dy['方向'], dy['起运年龄'], dy['余数调整'], dy['参考节气']))
    lines.append("【小运】%s" % xy['说明'])
    lines.append("")
    lines.append("  %-5s %-12s %-6s %-4s %-4s" % ('序号', '年龄范围', '干支', '天干', '地支'))
    for d_item in dy['大运列表']:
        lines.append("  %-5d %-12s %-6s %-4s %-4s" % (
            d_item['序号'], d_item['年龄'], d_item['干支'],
            d_item['天干'], d_item['地支']))

    lines.append("")
    lines.append("─" * 46)
    lines.append("【近五年流年】")
    lines.append("  %-5s %-8s %-4s %-4s %-5s %s" % (
        '年份', '干支', '天干', '地支', '五行', '备注'))
    for ln in ln_list:
        note = " ◀ 今年" if ln['今年'] else ""
        lines.append("  %-5d %-8s %-4s %-4s %-5s%s" % (
            ln['年份'], ln['干支'], ln['天干'], ln['地支'], ln['五行'], note))

    lines.append("")
    lines.append("=" * 46)
    return '\n'.join(lines)


# ============================================================
# CLI
# ============================================================

if __name__ == '__main__':
    if len(sys.argv) < 2 or '--help' in sys.argv or '-h' in sys.argv:
        print(__doc__)
        sys.exit(0)

    is_json = '--json' in sys.argv
    args = [a for a in sys.argv[1:] if not a.startswith('--')]

    if len(args) < 1:
        print(__doc__)
        sys.exit(1)

    date_parts = args[0].split('-')
    year, month, day = int(date_parts[0]), int(date_parts[1]), int(date_parts[2])

    if len(args) >= 2:
        tp = args[1].split(':')
        hour, minute = int(tp[0]), int(tp[1]) if len(tp) > 1 else 0
    else:
        hour, minute = 12, 0

    gender = args[2] if len(args) >= 3 else None

    result = get_bazi(year, month, day, hour, minute, gender)

    if is_json:
        print(json.dumps(result, ensure_ascii=False, indent=2))
    else:
        print(format_text(result))


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)