Skill: tigerleon529/qimen-master (version 1.0.0)

--- name: qimen-dunjia description: 专业级奇门遁甲排盘与解盘技能。支持时家奇门拆补法/置润法、天地人神四盘完整排列、20+吉格20+凶格自动识别、100种天干克应、12类问题深度解盘。附带初学者使用指南。触发词：奇门遁甲、排盘、奇门、遁甲、择时、占卜、吉凶、吉方 metadata: openclaw: emoji: "☯️" requires: bins: - node --- # 奇门遁甲排盘与解盘技能 ## 核心功能 1. **精确排盘** - 时家奇门拆补法（默认）/置润法，天地人神四盘完整排列 2. **格局识别** - 20+吉格、20+凶格自动识别，100种天干克应全覆盖 3. **深度解盘** - 12类问题分类解盘（财运/事业/婚姻/健康/出行/官司/考试等） 4. **初学者友好** - 附带详细使用指南，解盘结论通俗易懂 5. **多输出格式** - 文本命盘、飞书文档、邮件报告 ## 使用流程 ### 1. 获取用户信息 **必需信息：** - 起盘时间（默认当前时间，也可指定） **可选信息：** - 想问的具体问题（事业、财运、婚姻等） - 排盘方法偏好（拆补法/置润法） ### 2. 执行排盘 ```bash # 当前时间排盘（综合运势） node scripts/main.js # 指定时间排盘 node scripts/main.js --time "2026-03-25 14:30" # 指定问题类型 node scripts/main.js --time "2026-03-25 14:30" --question wealth # JSON格式输出（用于程序化处理） node scripts/main.js --time "2026-03-25 14:30" --json ``` ### 3. 问题类型参数 | 参数 | 问题类型 | 用神 | |------|----------|------| | `general` | 综合运势 | 日干为主 | | `wealth` | 求财 | 生门、戊 | | `career` | 事业官运 | 开门、天心 | | `marriage` | 婚姻感情 | 六合、天后 | | `health` | 疾病健康 | 天芮、死门 | | `travel` | 出行 | 值符、开门 | | `lawsuit` | 官司诉讼 | 开门、天心 | | `exam` | 考试学业 | 天辅、杜门 | | `lost` | 失物寻找 | 值符飞宫 | | `missing` | 走失寻人 | 六合、太阴 | | `weather` | 天气预测 | 天蓬、天冲 | | `fengshui` | 住宅风水 | 生门、天任 | | `invest` | 投资理财 | 生门、戊 | ### 4. 解盘步骤（AI 解读时遵循） **解盘次序**（严格遵循）： 1. 先看整体格局（阳遁/阴遁、局数、值符值使） 2. 确定用神及其落宫 3. 分析用神宫位的天地人神四盘元素 4. 判断五行旺衰（旺相休囚死） 5. 识别格局（吉格、凶格、天干组合） 6. 分析日干与用神的生克关系 7. 综合判断成败、时间、方位 8. 给出建议 **解盘原则**： - 吉格多则事顺，凶格多则事阻 - 用神旺相为吉，休囚死为凶 - 门克宫为迫，宫克门为制 - 空亡之宫不为实，马星之宫主变动 - 伏吟主事缓不动，反吟主事反复 ### 5. 输出格式 - **文本命盘** - 九宫格 + 格局 + 解盘，适合飞书消息 - **飞书文档** - 完整报告（使用 feishu-create-doc） - **邮件报告** - Markdown 转 HTML 发送 ## 脚本说明 | 脚本 | 功能 | |------|------| | `scripts/main.js` | CLI 入口，整合所有模块 | | `scripts/engine.js` | 排盘核心引擎（节气、定局、四盘排列） | | `scripts/gejus.js` | 格局识别（吉格、凶格、天干组合） | | `scripts/interpret.js` | 深度解盘（用神、旺衰、成败判断） | | `scripts/format.js` | 盘面格式化输出（九宫格、文本） | ## 参考资料 | 文件 | 内容 | |------|------| | `references/basics.md` | 奇门遁甲基础理论 | | `references/four-plates.md` | 天地人神四盘详解 | | `references/gejus.md` | 格局大全（40+种） | | `references/stem-combinations.md` | 100种天干克应 | | `references/yongshen.md` | 用神取法系统 | | `references/wuxing.md` | 五行旺衰与宫位关系 | | `references/guide.md` | 初学者使用指南 | ## 触发场景 - "帮我排个奇门遁甲盘" - "奇门遁甲看看今天运势" - "用奇门遁甲帮我择时" - "奇门遁甲看财运" - "今天适合出行吗（奇门）" - "奇门遁甲看这个事能成吗" ## 初学者快速入门 ### 什么是奇门遁甲？ 奇门遁甲是中国古代最高层次的预测学之一，与太乙神数、六壬并称"三式"。它通过天时（九星）、地利（八卦九宫）、人和（八门）、神助（八神）四个维度分析事物的吉凶成败。 ### 怎么用？ 1. **心中默念问题**（或说出来） 2. **告诉我时间**（不说就用当前时间） 3. **告诉我问什么**（财运？事业？婚姻？） 4. **我来排盘解盘** ### 看懂结果 - 🟢 **吉格** = 好兆头 - 🔴 **凶格** = 需注意 - 📊 **评分** = 整体吉凶程度 - 🧭 **吉方** = 有利方位 - 🎨 **吉色** = 有利颜色 - ⏰ **时机** = 建议行动时间 ## 注意事项 1. **起盘时间** - 以问事的那一刻为准（"念动则占"） 2. **一事一占** - 每次只问一个问题 3. **诚心为要** - 心诚则灵，不可戏占 4. **仅供参考** - 传统文化传承，重大决策请综合判断 5. **不占三事** - 不占违法之事、不占害人之事、不占已知之事 ## 外部依赖 - **Node.js** - 排盘计算（无需 npm install，纯原生实现）

path: references/basics.md
content: # 奇门遁甲基础

## 一、起源与核心原理

### 1.1 起源

奇门遁甲与太乙神数、六壬神课并称"三式"，是中国古代最高层次的预测术和决策术。传说起源于黄帝战蚩尤时期，由九天玄女传授，经姜太公、张良、诸葛亮等历代高人传承发展。

- **黄帝时期**：传说始创，最初有4320局
- **姜太公**：简化为72局
- **张良**：最终简化为18局（阳遁9局 + 阴遁9局）

### 1.2 核心原理

奇门遁甲以**天、地、人、神**四盘合一，结合**时间**（干支历法）和**空间**（九宫八卦），模拟宇宙时空的运行规律，用以预测事物的发展趋势和选择最佳行动方案。

核心公式：**时间（干支）+ 空间（九宫）+ 天（九星）+ 地（地盘）+ 人（八门）+ 神（八神）= 局**

### 1.3 "奇门遁甲"名称含义

- **奇**：三奇，即乙、丙、丁
- **门**：八门，即休、生、伤、杜、景、死、惊、开
- **遁**：隐遁、藏匿
- **甲**：十天干之首，甲为统帅，在奇门中隐遁于六仪之下

甲为十干之首、为元帅，在奇门中不直接出现在天盘/地盘上，而是隐遁在六仪（戊、己、庚、辛、壬、癸）之下。故称"遁甲"。

---

## 二、三奇六仪详解

### 2.1 三奇

| 奇 | 天干 | 别称 | 五行 | 含义 |
|---|---|---|---|---|
| 天奇（日奇） | 乙 | 日奇 | 木 | 乙为日之精华，代表柔顺、文雅、谋略 |
| 地奇（月奇） | 丙 | 月奇 | 火 | 丙为月之光辉，代表光明、权威、刚猛 |
| 人奇（星奇） | 丁 | 星奇 | 火 | 丁为星之光芒，代表智慧、文昌、玄秘 |

### 2.2 六仪

六仪即甲所隐遁的六个天干：

| 六仪 | 遁甲 | 含义 | 说明 |
|---|---|---|---|
| 戊 | 甲子戊 | 甲子隐于戊下 | 六甲之首，大将 |
| 己 | 甲戌己 | 甲戌隐于己下 | |
| 庚 | 甲申庚 | 甲申隐于庚下 | |
| 辛 | 甲午辛 | 甲午隐于辛下 | |
| 壬 | 甲辰壬 | 甲辰隐于壬下 | |
| 癸 | 甲寅癸 | 甲寅隐于癸下 | |

### 2.3 三奇六仪排列顺序

固定顺序为：**戊、己、庚、辛、壬、癸、丁、丙、乙**

这是地盘三奇六仪的排列顺序（从甲子戊开始按六十甲子的六甲旬头顺序，再接三奇逆排）。

### 2.4 六甲旬首与遁甲对应

| 旬首 | 所遁 | 旬内天干 |
|---|---|---|
| 甲子 | 戊 | 甲子、乙丑、丙寅、丁卯、戊辰、己巳、庚午、辛未、壬申、癸酉 |
| 甲戌 | 己 | 甲戌、乙亥、丙子、丁丑、戊寅、己卯、庚辰、辛巳、壬午、癸未 |
| 甲申 | 庚 | 甲申、乙酉、丙戌、丁亥、戊子、己丑、庚寅、辛卯、壬辰、癸巳 |
| 甲午 | 辛 | 甲午、乙未、丙申、丁酉、戊戌、己亥、庚子、辛丑、壬寅、癸卯 |
| 甲辰 | 壬 | 甲辰、乙巳、丙午、丁未、戊申、己酉、庚戌、辛亥、壬子、癸丑 |
| 甲寅 | 癸 | 甲寅、乙卯、丙辰、丁巳、戊午、己未、庚申、辛酉、壬戌、癸亥 |

---

## 三、九宫八卦

### 3.1 洛书九宫

```
┌───────┬───────┬───────┐
│ 四(巽) │ 九(离) │ 二(坤) │
│ 东南   │  南   │ 西南   │
├───────┼───────┼───────┤
│ 三(震) │ 五(中) │ 七(兑) │
│  东    │  中   │  西    │
├───────┼───────┼───────┤
│ 八(艮) │ 一(坎) │ 六(乾) │
│ 东北   │  北   │ 西北   │
└───────┴───────┴───────┘
```

洛书数字口诀：**戴九履一，左三右七，二四为肩，六八为足，五居中央**

### 3.2 后天八卦与九宫对应

| 宫位 | 洛书数 | 后天卦 | 方位 | 五行 |
|---|---|---|---|---|
| 一宫 | 1 | 坎 ☵ | 北 | 水 |
| 二宫 | 2 | 坤 ☷ | 西南 | 土 |
| 三宫 | 3 | 震 ☳ | 东 | 木 |
| 四宫 | 4 | 巽 ☴ | 东南 | 木 |
| 五宫 | 5 | 中宫 | 中 | 土 |
| 六宫 | 6 | 乾 ☰ | 西北 | 金 |
| 七宫 | 7 | 兑 ☱ | 西 | 金 |
| 八宫 | 8 | 艮 ☶ | 东北 | 土 |
| 九宫 | 9 | 离 ☲ | 南 | 火 |

### 3.3 先天八卦数

| 卦 | 先天数 | 方位（先天） |
|---|---|---|
| 乾 | 1 | 南 |
| 兑 | 2 | 东南 |
| 离 | 3 | 东 |
| 震 | 4 | 东北 |
| 巽 | 5 | 西南 |
| 坎 | 6 | 西 |
| 艮 | 7 | 西北 |
| 坤 | 8 | 北 |

> 注：奇门遁甲主要使用**后天八卦**配洛书九宫。先天八卦数在某些起卦法中会用到。

---

## 四、阴阳遁与十八局

### 4.1 阴阳遁划分

- **阳遁**：冬至后到夏至前（阳气上升期），共9局
- **阴遁**：夏至后到冬至前（阴气上升期），共9局

### 4.2 阳遁转动规则

阳遁：三奇六仪在地盘上按洛书数**顺排**（1→2→3→4→5→6→7→8→9）

以**阳遁一局**为例，甲子戊落一宫（坎），然后按洛书顺序排列：
- 一宫(坎)：戊
- 二宫(坤)：己
- 三宫(震)：庚
- 四宫(巽)：辛
- 五宫(中)：壬（寄坤二宫）
- 六宫(乾)：癸
- 七宫(兑)：丁
- 八宫(艮)：丙
- 九宫(离)：乙

> **中五宫寄宫规则**：中五宫不放星门，三奇六仪落中五宫时，阳遁寄坤二宫，阴遁寄艮八宫。

### 4.3 阴遁转动规则

阴遁：三奇六仪在地盘上按洛书数**逆排**（9→8→7→6→5→4→3→2→1）

以**阴遁九局**为例，甲子戊落九宫（离），然后按洛书逆序排列：
- 九宫(离)：戊
- 八宫(艮)：己
- 七宫(兑)：庚
- 六宫(乾)：辛
- 五宫(中)：壬（寄艮八宫）
- 四宫(巽)：癸
- 三宫(震)：丁
- 二宫(坤)：丙
- 一宫(坎)：乙

### 4.4 十八局地盘排列总表

**阳遁（甲子戊起始宫位即为局数）：**

| 局 | 甲子戊所在宫 | 地盘排列（按宫序1-9） |
|---|---|---|
| 阳一局 | 一宫(坎) | 戊 己 庚 辛 壬 癸 丁 丙 乙 |
| 阳二局 | 二宫(坤) | 乙 戊 己 庚 辛 壬 癸 丁 丙 |
| 阳三局 | 三宫(震) | 丙 乙 戊 己 庚 辛 壬 癸 丁 |
| 阳四局 | 四宫(巽) | 丁 丙 乙 戊 己 庚 辛 壬 癸 |
| 阳五局 | 五宫(中) | 癸 丁 丙 乙 戊 己 庚 辛 壬 |
| 阳六局 | 六宫(乾) | 壬 癸 丁 丙 乙 戊 己 庚 辛 |
| 阳七局 | 七宫(兑) | 辛 壬 癸 丁 丙 乙 戊 己 庚 |
| 阳八局 | 八宫(艮) | 庚 辛 壬 癸 丁 丙 乙 戊 己 |
| 阳九局 | 九宫(离) | 己 庚 辛 壬 癸 丁 丙 乙 戊 |

**阴遁（甲子戊起始宫位即为局数）：**

| 局 | 甲子戊所在宫 | 地盘排列（按宫序1-9） |
|---|---|---|
| 阴一局 | 一宫(坎) | 戊 癸 壬 辛 庚 己 丙 丁 乙 |
| 阴二局 | 二宫(坤) | 乙 戊 癸 壬 辛 庚 己 丙 丁 |
| 阴三局 | 三宫(震) | 丁 乙 戊 癸 壬 辛 庚 己 丙 |
| 阴四局 | 四宫(巽) | 丙 丁 乙 戊 癸 壬 辛 庚 己 |
| 阴五局 | 五宫(中) | 己 丙 丁 乙 戊 癸 壬 辛 庚 |
| 阴六局 | 六宫(乾) | 庚 己 丙 丁 乙 戊 癸 壬 辛 |
| 阴七局 | 七宫(兑) | 辛 庚 己 丙 丁 乙 戊 癸 壬 |
| 阴八局 | 八宫(艮) | 壬 辛 庚 己 丙 丁 乙 戊 癸 |
| 阴九局 | 九宫(离) | 癸 壬 辛 庚 己 丙 丁 乙 戊 |

> 注：中五宫的三奇六仪，阳遁寄二宫（坤），阴遁寄八宫（艮）。上表中五宫位置的天干实际排入寄宫。

---

## 五、节气与局的对应关系

### 5.1 二十四节气与局数对应

每个节气分**上元、中元、下元**三元，每元管5天（一个干支旬的前半）。

#### 阳遁（冬至 → 芒种，共12个节气）

| 节气 | 上元 | 中元 | 下元 |
|---|---|---|---|
| **冬至** | 阳1局 | 阳7局 | 阳4局 |
| **小寒** | 阳2局 | 阳8局 | 阳5局 |
| **大寒** | 阳3局 | 阳9局 | 阳6局 |
| **立春** | 阳8局 | 阳5局 | 阳2局 |
| **雨水** | 阳9局 | 阳6局 | 阳3局 |
| **惊蛰** | 阳1局 | 阳7局 | 阳4局 |
| **春分** | 阳3局 | 阳9局 | 阳6局 |
| **清明** | 阳4局 | 阳1局 | 阳7局 |
| **谷雨** | 阳5局 | 阳2局 | 阳8局 |
| **立夏** | 阳4局 | 阳1局 | 阳7局 |
| **小满** | 阳5局 | 阳2局 | 阳8局 |
| **芒种** | 阳6局 | 阳3局 | 阳9局 |

#### 阴遁（夏至 → 大雪，共12个节气）

| 节气 | 上元 | 中元 | 下元 |
|---|---|---|---|
| **夏至** | 阴9局 | 阴3局 | 阴6局 |
| **小暑** | 阴8局 | 阴2局 | 阴5局 |
| **大暑** | 阴7局 | 阴1局 | 阴4局 |
| **立秋** | 阴2局 | 阴5局 | 阴8局 |
| **处暑** | 阴1局 | 阴4局 | 阴7局 |
| **白露** | 阴9局 | 阴3局 | 阴6局 |
| **秋分** | 阴7局 | 阴1局 | 阴4局 |
| **寒露** | 阴6局 | 阴9局 | 阴3局 |
| **霜降** | 阴5局 | 阴8局 | 阴2局 |
| **立冬** | 阴6局 | 阴9局 | 阴3局 |
| **小雪** | 阴5局 | 阴8局 | 阴2局 |
| **大雪** | 阴4局 | 阴7局 | 阴1局 |

### 5.2 符头与三元

**符头**：每元（上中下）的起始日，必须是**甲或己**日。

- **上元符头**：甲子、甲午、己卯、己酉
- **中元符头**：甲寅、甲申、己巳、己亥
- **下元符头**：甲辰、甲戌、己丑、己未

判断方法：看当天干支属于哪个旬，该旬的天干地支组合决定了是哪一元。

---

## 六、定局方法：拆补法与置润法

### 6.1 置润法

**原理**：严格按照节气交接来定局，每个节气固定管15天，分上中下三元各5天。

**算法**：
1. 确定当前时间所属的节气
2. 计算距离该节气交接的天数
3. 第1-5天为上元，第6-10天为中元，第11-15天为下元
4. 查表得到对应局数

**优点**：简单直接
**缺点**：实际节气间隔不总是恰好15天，会导致"超神"（节气未到已用完三元）和"接气"（节气已到但前元未用完）的问题。置润法通过设置"闰奇"来解决。

**闰奇处理**：当芒种或大雪节气有多余天数时，重复使用该节气的下元局数。

### 6.2 拆补法（目前最主流）

**原理**：严格按照符头（甲、己日）来分元，不管节气是否已交。

**算法**：
1. 确定当前时间的日干支
2. 找到最近的**节气交接准确时间**
3. 找到节气后第一个符头日（天干为甲或己的日子）
4. 节气交接时刻到符头日之间的时辰，用**上一个节气的下元局数**（这就是"拆"——把上一节气的尾巴拆过来）
5. 从符头日起，按上中下三元各5天排列（这就是"补"——补足本节气的三元）

**具体步骤**：
1. 查找该时刻所属节气及准确交节时间
2. 判断当前日干支是否为符头日
3. 如果节气已交但还未到符头日→用上一节气下元的局数
4. 如果已过符头日→按正常上中下元计算

**拆补法示例**：
假设春分交节在3月20日辰时，但该日天干为丙，最近的符头日（甲或己）是3月22日甲寅日。
- 3月20日辰时至3月22日之前：仍用雨水下元（阳3局）
- 3月22日起：用春分上元（阳3局）
- 3月27日起：用春分中元（阳9局）
- 4月1日起：用春分下元（阳6局）

### 6.3 两种方法的选择

| 比较项 | 拆补法 | 置润法 |
|---|---|---|
| 主流程度 | **目前最主流** | 古法，使用者较少 |
| 核心逻辑 | 以符头（甲己日）定元 | 以节气交接定元 |
| 闰的处理 | 自然拆补，无需特别处理 | 需要设闰奇 |
| 准确性 | 多数实践者认为更准 | 有争议 |

> **本技能默认使用拆补法。**

---

## 七、超神接气

### 7.1 概念

- **超神**：符头日在节气交接之前到来，即"神（符头）超过了气（节气）"。这时符头起的三元，实际上跑到了下一个节气的范围里。
- **接气**：节气交接时恰好遇到符头日，或者符头日在节气交接之后，即"气等着神来接"。

### 7.2 在拆补法中的处理

拆补法天然解决了超神接气问题：
- 节气交接后，如果还没到新的符头日，就继续用前一个节气的局数（"拆"前节气的尾巴）
- 到了符头日，才正式开始新节气的三元（"补"上新节气的头）

### 7.3 在置润法中的处理

置润法需要通过"置闰"来处理：
- 当超神积累到一定程度（通常超过9天），就在芒种/大雪后加一个闰局
- 闰局重复使用芒种/大雪的下元局数

---

## 八、时家奇门的排盘总流程

1. **确定时间**：将公历时间转换为干支历（年月日时四柱）
2. **定阴阳遁**：根据节气判断是阳遁还是阴遁
3. **定局数**：用拆补法（或置润法）确定具体局数（1-9）
4. **排地盘**：根据局数排列三奇六仪在九宫中的位置
5. **排天盘**：根据时干找到值符星（旬首所在宫的星），再根据时干应到的宫位确定天盘
6. **排人盘**：根据时干找到值使门（旬首所在宫的门），按同样规则转动
7. **排神盘**：根据值符星所在宫位，按阳遁顺排/阴遁逆排八神
8. **标注特殊状态**：空亡、马星、暗干等

### 8.1 值符值使的确定

1. 找到时辰干支所属的**旬首**（六甲旬头）
2. 旬首所遁的天干（六仪之一）在**地盘**上所在的宫位
3. 该宫位原有的**九星**即为**值符**（星）
4. 该宫位原有的**八门**即为**值使**（门）

### 8.2 天盘转动

1. 确定值符星
2. 将值符星从原宫位转到**时干**所在的地盘宫位
3. 其余八星随之转动（保持相对位置不变，按顺序排列）

### 8.3 人盘转动

1. 确定值使门
2. 将值使门从原宫位转到**时干**所在的地盘宫位（但需考虑时干在第几宫）
3. 阳遁时辰干支的地支按**顺时针**排列推算值使门移动步数
4. 阴遁时辰干支的地支按**逆时针**排列推算值使门移动步数

> 注：人盘（八门）的转动方式与天盘略有不同。值使门的转动是根据**时干支**相对于**旬首**的宫位差来确定移动步数。具体为：从值使门原位出发，阳遁顺行、阴遁逆行，行进的宫数等于时干在旬中的序数（甲为0不动，乙为1，丙为2...癸为9）。但遇中五宫要跳过。

### 8.4 神盘排布

1. 值符星最终落入的宫位放**值符**（神）
2. 阳遁：按**顺时针**依次排其余七神
3. 阴遁：按**逆时针**依次排其余七神
4. 中五宫跳过

---

## 九、重要概念补充

### 9.1 旬空（空亡）

每一旬（10个干支组合）只用了10个天干配10个地支，但地支有12个，所以有2个地支没有配到天干，这2个地支就是该旬的空亡。

| 旬首 | 空亡地支 |
|---|---|
| 甲子旬 | 戌、亥 |
| 甲戌旬 | 申、酉 |
| 甲申旬 | 午、未 |
| 甲午旬 | 辰、巳 |
| 甲辰旬 | 寅、卯 |
| 甲寅旬 | 子、丑 |

### 9.2 马星（驿马）

驿马取法按"申子辰马在寅，寅午戌马在申，巳酉丑马在亥，亥卯未马在巳"。

日支或时支三合局对应驿马：
| 三合局 | 驿马 |
|---|---|
| 申子辰 | 寅 |
| 寅午戌 | 申 |
| 巳酉丑 | 亥 |
| 亥卯未 | 巳 |

### 9.3 时干入墓

| 天干 | 墓库 | 所在宫 |
|---|---|---|
| 甲/乙（木） | 未 | 坤二宫 [待验证：有说法为六宫] |
| 丙/丁（火） | 戌 | 乾六宫 |
| 戊/己（土） | 戌 | 乾六宫 [待验证：有说法为不同] |
| 庚/辛（金） | 丑 | 艮八宫 |
| 壬/癸（水） | 辰 | 巽四宫 |

> 注：天干入墓的宫位取法，不同派别有细微差异，此处以多数派为准。


path: references/four-plates.md
content: # 天地人神四盘

## 一、地盘（固定盘）

### 1.1 概述

地盘是奇门遁甲的基础盘，一旦确定局数后就**固定不变**。地盘代表"地利"，即固定的空间环境。

### 1.2 地盘九宫固定排列

地盘的排列由**局数**决定，甲子戊所落的宫位即为局数。三奇六仪按固定顺序（戊、己、庚、辛、壬、癸、丁、丙、乙）排入九宫。

- **阳遁**：从甲子戊所在宫开始，按洛书顺序（1→2→3→4→5→6→7→8→9）依次排入
- **阴遁**：从甲子戊所在宫开始，按洛书逆序（9→8→7→6→5→4→3→2→1）依次排入

### 1.3 九宫初始配置（不随局数变化的固定属性）

| 宫位 | 洛书数 | 八卦 | 方位 | 五行 | 初始九星 | 初始八门 |
|---|---|---|---|---|---|---|
| 一宫 | 1 | 坎 | 北 | 水 | 天蓬星 | 休门 |
| 二宫 | 2 | 坤 | 西南 | 土 | 天芮星 | 死门 |
| 三宫 | 3 | 震 | 东 | 木 | 天冲星 | 伤门 |
| 四宫 | 4 | 巽 | 东南 | 木 | 天辅星 | 杜门 |
| 五宫 | 5 | 中 | 中 | 土 | 天禽星 | —（无门） |
| 六宫 | 6 | 乾 | 西北 | 金 | 天心星 | 开门 |
| 七宫 | 7 | 兑 | 西 | 金 | 天柱星 | 惊门 |
| 八宫 | 8 | 艮 | 东北 | 土 | 天任星 | 生门 |
| 九宫 | 9 | 离 | 南 | 火 | 天英星 | 景门 |

> **重要**：九星和八门的"初始位置"是固定的（即所谓"原宫"），但天盘（九星）和人盘（八门）会随时干旋转。

---

## 二、天盘（九星）

### 2.1 概述

天盘由九星组成，代表"天时"。天盘会随着时辰的变化而旋转，**值符星随时干转动**，其余星保持相对位置跟随转动。

### 2.2 九星详解

| 九星 | 原宫 | 五行 | 吉凶 | 类象与含义 |
|---|---|---|---|---|
| **天蓬星** | 一宫(坎) | 水 | **大凶** | 盗贼、小人、暗昧、阴私。主贪狼、欺诈。但利于涉水、捕鱼 |
| **天芮星** | 二宫(坤) | 土 | **大凶** | 疾病、阴邪、小人、诡计。主病符、死丧。但利于求医问药 |
| **天冲星** | 三宫(震) | 木 | **小吉** | 勇猛果敢、行动力强。主武将、先锋。利于出行、征战、诉讼 |
| **天辅星** | 四宫(巽) | 木 | **大吉** | 文昌、学业、贵人。主文臣、谋士。利于求学、考试、拜师 |
| **天禽星** | 五宫(中) | 土 | **大吉** | 中央主宰、统御四方。利于聚众、统合。天禽寄二宫（坤）运算 |
| **天心星** | 六宫(乾) | 金 | **大吉** | 医药、领导、智谋、技术。主医生、长官。利于求医、谋划 |
| **天柱星** | 七宫(兑) | 金 | **小凶** | 口舌是非、破败、毁折。主间谍、内鬼。但利于隐匿、守御 |
| **天任星** | 八宫(艮) | 土 | **小吉** | 忠厚老实、稳重生财。主忠臣、乡绅。利于置产、营建 |
| **天英星** | 九宫(离) | 火 | **小凶** | 血光、口舌、虚华。主文才但暴躁。利于文书、但忌行军 |

### 2.3 九星吉凶总结

- **大吉**：天心、天辅、天禽
- **小吉**：天冲、天任
- **小凶**：天柱、天英
- **大凶**：天蓬、天芮

### 2.4 天盘转动规则

1. **找值符星**：时辰所在旬首遁干所在地盘宫位的九星，即为值符星
2. **值符随时干**：将值符星移到时干所在地盘宫位
3. **其余星顺布**：其余八星保持与值符星的相对位置，依次排入各宫
4. **中五宫处理**：天禽星若落入中五宫，寄于二宫（坤）；遇到中五宫时跳过

**转动顺序**（按洛书顺序跳过中五）：1→2→3→4→6→7→8→9

**示例**：
假设值符为天冲星（原在三宫），时干落在七宫，则：
- 天冲星移到七宫
- 从三宫到七宫，顺行经过4→6→7，移了4步
- 其余星也各向前移4步（按洛书顺序，跳过中五宫）

### 2.5 天禽星寄宫

天禽星原在中五宫，排盘时：
- 天禽星**随天芮星**（二宫坤）运算
- 即天禽星永远与天芮星同宫
- 在判断格局时，天禽星的三奇六仪按二宫处理

---

## 三、人盘（八门）

### 3.1 概述

人盘由八门组成，代表"人和"，即人事活动的状态。八门随值使门转动。

### 3.2 八门详解

| 八门 | 原宫 | 五行 | 吉凶 | 类象与含义 |
|---|---|---|---|---|
| **休门** | 一宫(坎) | 水 | **大吉** | 休养、安逸、贵人相助。主休息、恢复。利于求见贵人、嫁娶、求财、上任 |
| **死门** | 二宫(坤) | 土 | **大凶** | 死亡、凶险、不动。主丧葬、悲哀。利于丧葬、吊丧、收债，忌余事 |
| **伤门** | 三宫(震) | 木 | **小凶** | 伤害、损耗、竞争。主伤残、破财。利于索债、追击、竞技，忌出行 |
| **杜门** | 四宫(巽) | 木 | **中平** | 阻塞、隐藏、杜绝。主封闭、隐匿。利于躲藏、防守、堵截，忌出行求财 |
| **景门** | 九宫(离) | 火 | **中平** | 风景、光明、文书。主文章、计划。利于考试、发表、宣传，忌行兵 |
| **惊门** | 七宫(兑) | 金 | **小凶** | 惊恐、官非、口舌。主惊慌、诉讼。利于诉讼（惊动对方），忌出行嫁娶 |
| **开门** | 六宫(乾) | 金 | **大吉** | 开创、通达、权贵。主创业、晋升。利于开业、求职、求见贵人 |
| **生门** | 八宫(艮) | 土 | **大吉** | 生发、财运、兴旺。主生财、营建。利于求财、开业、置产、营建 |

### 3.3 八门吉凶总结

- **三吉门**：开门、休门、生门
- **中平门**：杜门、景门
- **三凶门**：伤门、死门、惊门

### 3.4 八门转动规则

1. **找值使门**：时辰所在旬首遁干所在地盘宫位的八门，即为值使门
2. **值使门的转动**：从原宫出发，按时辰在旬中的序数移动
   - 阳遁：**顺行**（按洛书顺序 1→2→3→4→6→7→8→9）
   - 阴遁：**逆行**（按洛书逆序 9→8→7→6→4→3→2→1）
3. **移动步数**：时干在旬中的序数（甲=0、乙=1、丙=2、丁=3、戊=4、己=5、庚=6、辛=7、壬=8、癸=9）
4. **其余门**：其余七门保持相对位置，随值使门同步移动
5. **中五宫**：跳过，遇到中五宫不计步数

**与天盘的区别**：
- 天盘是值符星飞到**时干所在的地盘宫位**
- 人盘是值使门从原宫出发，按**步数**逐宫移动

### 3.5 八门与中五宫

中五宫无门。如果八门转动后某门应落入中五宫：
- 阳遁：该门寄入二宫（坤）
- 阴遁：该门寄入八宫（艮）

---

## 四、神盘（八神）

### 4.1 概述

神盘由八神组成，代表"神助"，即天意、运气、不可控的力量。神盘的起始位置由**值符星最终所在宫位**决定。

### 4.2 八神详解

| 八神 | 吉凶 | 五行 | 含义与类象 |
|---|---|---|---|
| **值符** | **大吉** | 随宫 | 天乙贵人、上级领导、大贵人。万事皆吉，有靠山、有保护 |
| **螣蛇** | **凶** | 火 | 虚惊、怪异、缠绕、犹豫。主惊恐、噩梦、缠绕不清、虚假 |
| **太阴** | **吉** | 金 | 阴私、暗助、阴人相助。主暗中帮助、策划、利于阴事 |
| **六合** | **吉** | 木 | 和合、婚姻、中间人。主合作、联姻、和谐、交易 |
| **白虎** | **凶** | 金 | 凶暴、伤病、血光。主刀兵、疾病、死亡、凶狠 |
| **玄武** | **凶** | 水 | 盗贼、欺诈、暗昧。主偷盗、欺骗、小人、不正 |
| **九地** | **吉** | 土 | 坤顺、柔和、包容。主大地、稳固、利于防守、藏匿 |
| **九天** | **吉** | 金 | 乾健、刚强、向上。主天空、远大、利于进攻、外出、举事 |

### 4.3 八神吉凶总结

- **吉神**：值符、太阴、六合、九地、九天
- **凶神**：螣蛇、白虎、玄武

### 4.4 八神排列顺序（重要！阳遁阴遁不同）

**阳遁八神顺序（顺排）：**
值符 → 螣蛇 → 太阴 → 六合 → 白虎（勾陈）→ 玄武（朱雀）→ 九地 → 九天

> 注：有些派别第5位用"勾陈"代替"白虎"，第6位用"朱雀"代替"玄武"。本技能使用"白虎/玄武"体系。[待验证：不同派别存在差异]

**阴遁八神顺序（逆排）：**
值符 → 九天 → 九地 → 玄武（朱雀）→ 白虎（勾陈）→ 六合 → 太阴 → 螣蛇

> **关键区别**：阳遁八神从值符开始**顺时针**排列，阴遁八神从值符开始**逆时针**排列。且顺序不是简单的正反，而是有特定的排列！

### 4.5 神盘转动规则

1. **确定值符神位置**：值符神永远在值符星最终所落的宫位
2. **阳遁**：从值符神所在宫开始，按洛书**顺时针**方向（1→2→3→4→6→7→8→9），依次排入八神
3. **阴遁**：从值符神所在宫开始，按洛书**逆时针**方向（9→8→7→6→4→3→2→1），依次排入八神
4. **跳过中五宫**

**阳遁排神示例**：
假设值符星落在三宫(震)，阳遁：
- 三宫：值符
- 四宫：螣蛇
- 六宫：太阴（跳过中五宫）
- 七宫：六合
- 八宫：白虎
- 九宫：玄武
- 一宫：九地
- 二宫：九天

**阴遁排神示例**：
假设值符星落在三宫(震)，阴遁：
- 三宫：值符
- 二宫：九天
- 一宫：九地
- 九宫：玄武
- 八宫：白虎
- 七宫：六合
- 六宫：太阴
- 四宫：螣蛇（跳过中五宫）

---

## 五、四盘关系总结

| 盘 | 代表 | 组成 | 运动方式 | 含义 |
|---|---|---|---|---|
| 地盘 | 地利 | 三奇六仪（固定） | 不动 | 环境、基础条件 |
| 天盘 | 天时 | 九星（旋转） | 值符随时干 | 天象、时运、领导 |
| 人盘 | 人和 | 八门（旋转） | 值使按步数行 | 人事、活动、行为 |
| 神盘 | 神助 | 八神（旋转） | 随值符顺/逆排 | 天意、运气、不可控因素 |

### 读盘时各层含义

一个宫位中包含的信息（从外到内）：
1. **八神**（最外层）：神意、运气因素
2. **九星/天盘天干**（天盘层）：天时、上级态度、外部环境
3. **八门**（人盘层）：人为因素、行动方向
4. **地盘天干**（最内层）：基础条件、根本状态
5. **宫位八卦**（底层）：空间、方位、五行

**天盘天干克地盘天干**：外来力量压制内在条件
**地盘天干克天盘天干**：内在条件制约外来力量
**天盘天干生地盘天干**：外部助力增强内在条件
**地盘天干生天盘天干**：内在条件滋养外部环境


path: references/gejus.md
content: # 格局大全

## 一、吉格

### 1. 乙奇得使（日奇得使）
- **条件**：天盘乙 + 开门同宫
- **吉凶**：大吉
- **含义**：日奇配开门，万事通达，利于求见贵人、开业、求官、出行

### 2. 丙奇得使（月奇得使）
- **条件**：天盘丙 + 休门同宫
- **吉凶**：大吉
- **含义**：月奇配休门，光明正大，利于求财、贵人相助、升迁

### 3. 丁奇得使（星奇得使）
- **条件**：天盘丁 + 生门同宫
- **吉凶**：大吉
- **含义**：星奇配生门，聪明智慧生财，利于求财、考试、谋划

### 4. 三奇得使
- **条件**：乙+开门，丙+休门，丁+生门（以上三者统称）
- **吉凶**：大吉
- **含义**：三奇各配其最佳门，万事亨通

### 5. 龙回首（青龙回首）
- **条件**：天盘乙落在地盘甲子戊所在宫，且该宫临吉门（开、休、生）
- **吉凶**：大吉
- **含义**：乙为甲之妹，回到甲身边相护。主贵人返，失物可回，利于团聚

### 6. 鸟跌穴（朱雀投江/凤凰入巢）
- **条件**：天盘丁落在地盘甲子戊所在宫，且该宫临吉门
- **吉凶**：大吉
- **含义**：丁火（文昌星）投到甲的宫位，主文章大成、功名可就

### 7. 虎猖狂（白虎猖狂）→ 此为凶格，移至凶格部分
- [此处为纠正说明]

### 7. 玉女守门（仙人守门）
- **条件**：天盘丁落六宫（乾），且临休门或开门
- **吉凶**：大吉
- **含义**：丁为玉女（星奇），乾为天门，玉女守天门，主贵人暗助、机密事可成

### 8. 天遁
- **条件**：天盘丙 + 地盘戊 + 生门同宫（或天盘丙+天盘生门同宫落于戊地）
- **吉凶**：大吉
- **含义**：天时地利人和俱全，利于升迁、求官、大事谋划

### 9. 地遁
- **条件**：天盘乙 + 地盘己 + 开门同宫（乙己合，开门为吉门）
- **吉凶**：大吉
- **含义**：六合相配开门，利于藏匿、防守、避难、求地产

### 10. 人遁
- **条件**：天盘丁 + 地盘己 + 休门同宫（或太阴同宫）
- **吉凶**：大吉
- **含义**：丁己暗合配休门，利于求人、交际、暗中谋事

### 11. 风遁
- **条件**：天盘乙 + 开门同落四宫（巽宫），巽为风
- **吉凶**：吉
- **含义**：利于经商、出行、传播消息、行事快速

### 12. 云遁
- **条件**：天盘乙 + 开门同落六宫（乾），乾为天，或天盘乙+六合在六宫
- **吉凶**：吉
- **含义**：云行天下，利于出行、远行、化险为夷

### 13. 龙遁
- **条件**：天盘乙 + 休门同落一宫（坎），坎为水，乙为龙
- **吉凶**：吉
- **含义**：龙归大海，利于涉水、航运、求财

### 14. 虎遁
- **条件**：天盘辛 + 开门或生门同落八宫（艮），或天盘辛+九地在艮宫
- **吉凶**：吉
- **含义**：虎归山林，利于防守、营建、镇宅

### 15. 神遁
- **条件**：天盘丙 + 九地 + 生门同宫
- **吉凶**：大吉
- **含义**：神助加持，百事皆宜

### 16. 鬼遁
- **条件**：天盘丁 + 九天 + 休门同宫（或丁+太阴+生门）
- **吉凶**：吉（利于阴事）
- **含义**：鬼神暗助，利于密谋、夜行、暗中行事

### 17. 天三门
- **条件**：开门、休门、生门所落的宫位
- **吉凶**：吉
- **含义**：天上三吉门所在方位，宜向此方向行动。**真天三门**要求三门不受刑克

### 18. 地四户
- **条件**：开门、休门、生门、杜门所落的四个宫位
- **吉凶**：吉
- **含义**：地上四吉户，利于遁走、避难、藏匿。**杜门**在此处属于"利于隐匿"

### 19. 三奇贵人升殿
- **条件**：三奇（乙丙丁）落在各自旺相之地，且临吉门吉星
- **吉凶**：大吉
- **含义**：三奇得地得门得星，主大贵、大吉、事业腾达

### 20. 奇仪顺遂（天显时格）
- **条件**：天盘三奇落宫得地盘生合，且临吉门、吉星、吉神
- **吉凶**：上吉
- **含义**：天时、地利、人和、神助俱全，百事无忧

### 21. 三奇游六仪
- **条件**：天盘三奇加地盘六仪，呈相生关系
- **吉凶**：吉
- **含义**：奇仪相配得宜，事有助力

### 22. 飞鸟跌穴
- **条件**：天盘丙落在地盘甲子戊所在宫，临吉门
- **吉凶**：大吉
- **含义**：丙火光辉照甲，主功名显赫、一飞冲天

### 23. 真诈二门
- **条件**：开门临六宫（乾，原位），或休门临一宫（坎，原位）
- **吉凶**：吉（真门为吉，诈门须辨）
- **含义**：门归原位为"真"，力量最强。开门归乾、休门归坎为真门

### 24. 门合星
- **条件**：吉门（开休生）落在吉星（天心天辅天禽）所在宫
- **吉凶**：吉
- **含义**：人事与天时相合，行动顺利

---

## 二、凶格

### 1. 伏吟（天盘伏吟）
- **条件**：值符星回到自己原宫（天盘九星不动），即时干落在旬首所在宫位
- **判断方法**：天盘各星均在各自原宫位置不动
- **吉凶**：大凶
- **含义**：主事滞不前、进退两难、忧虑重重。"伏吟"如人伏地哭泣

### 2. 反吟（天盘反吟）
- **条件**：值符星落到自己原宫的对冲宫位（天盘各星均到对冲位）
- **对冲关系**：1↔9、2↔8、3↔7、4↔6（中五无对冲）
- **吉凶**：大凶
- **含义**：主反复无常、事情颠倒、出尔反尔。"反吟"如人反复折腾

### 3. 门伏吟
- **条件**：八门各回原宫（值使门不动）
- **吉凶**：凶
- **含义**：人事停滞、行事不动

### 4. 门反吟
- **条件**：八门各到对冲宫位
- **吉凶**：凶
- **含义**：人事反复、计划变动

### 5. 六仪击刑
- **条件**：六仪所在宫位的地支与该宫位所属地支形成**自刑**或**相刑**关系
- **具体条件**：
  - 甲子(戊)在一宫(坎/子)→子刑卯？不对。正确为：
  - **戊落三宫(震/卯)**：甲子之子刑卯（子卯相刑）
  - **己落六宫(乾/戌)**：甲戌之戌刑未？实为戌刑丑... [以下为正确版本]
  
**标准六仪击刑表**：

| 六仪 | 遁甲 | 地支 | 击刑宫位 | 说明 |
|---|---|---|---|---|
| 戊 | 甲子 | 子 | 三宫(震) | 子卯相刑 |
| 己 | 甲戌 | 戌 | 六宫(乾) | 戌刑未→但乾宫配戌... [待验证] 实际上：戌自刑在六宫（乾宫地支含戌亥） |
| 庚 | 甲申 | 申 | 八宫(艮) | 申刑寅（寅申相刑）→艮宫含寅 [待验证] |
| 辛 | 甲午 | 午 | 九宫(离) | 午自刑→午午自刑，离宫含午 |
| 壬 | 甲辰 | 辰 | 四宫(巽) | 辰自刑→辰辰自刑，巽宫含辰巳 |
| 癸 | 甲寅 | 寅 | 三宫(震) | 寅刑巳→... [待验证] 寅巳相刑 |

> **注意**：六仪击刑的具体对应在不同资料中有出入，需以实际使用的传统定义为准。[部分待验证]

- **吉凶**：凶
- **含义**：主刑伤、官非、灾祸。用事不利，容易受到惩罚或伤害

### 6. 三奇入墓
- **条件**：三奇落入墓库所在宫位
  - **乙入墓**：乙（木）墓在未→落坤二宫（坤宫含未申）
  - **丙入墓**：丙（火）墓在戌→落乾六宫（乾宫含戌亥）
  - **丁入墓**：丁（火）墓在戌→落乾六宫
- **吉凶**：凶
- **含义**：奇被困入墓中，力量全失。主智慧受困、贵人不显、谋事不成

### 7. 门迫（门受迫）
- **条件**：八门落入的宫位五行克该门的五行
- **示例**：
  - 开门(金)落三宫(震/木)→被木泄？不对。门克宫为"门迫"：
  - **正确定义**：门所在宫位的五行克门的五行→"门受制"，即宫克门
  - 休门(水)落二宫(坤/土)→土克水→休门受迫
  - 开门(金)落九宫(离/火)→火克金→开门受迫
  - 生门(土)落三宫(震/木)→木克土→生门受迫
- **吉凶**：凶（吉门受迫减吉，凶门受迫减凶）
- **含义**：人事受到环境压制，行动不自由，计划受阻

### 8. 大格（庚格/太白格）
- **条件**：天盘庚 + 地盘癸（庚加癸）
- **吉凶**：大凶
- **含义**：庚为天狱格中的白虎，癸为地网，上有天狱下有地网。主阻隔、行人不归、事情阻塞

### 9. 小格
- **条件**：天盘庚 + 地盘壬（庚加壬）
- **吉凶**：凶
- **含义**：格而不通，稍逊于大格。主事有阻碍但程度较轻

### 10. 刑格（上格/刑俱格）
- **条件**：天盘庚 + 地盘甲子戊（庚加戊）
- **吉凶**：凶
- **含义**：庚为七煞克甲木，甲遁戊下被庚金所克。主上级施压、官灾、被克制

### 11. 五不遇时
- **条件**：时干克日干（时干五行克日干五行）
- **判断**：
  - 甲乙日遇庚辛时（金克木）
  - 丙丁日遇壬癸时（水克火）
  - 戊己日遇甲乙时（木克土）
  - 庚辛日遇丙丁时（火克金）
  - 壬癸日遇戊己时（土克水）
- **吉凶**：凶
- **含义**：时辰与日主相冲克，主行事不顺、出行不利、谋事难成

### 12. 时干入墓
- **条件**：时干落入自身墓库所在的宫位
  - 甲乙(木)墓在未→二宫(坤)
  - 丙丁(火)墓在戌→六宫(乾)
  - 戊己(土)墓在戌→六宫(乾) [待验证：有说戊墓在戌、己墓在丑]
  - 庚辛(金)墓在丑→八宫(艮)
  - 壬癸(水)墓在辰→四宫(巽)
- **吉凶**：凶
- **含义**：时运入墓，做事不明朗，被困、受阻

### 13. 奇格入墓（三奇入墓的扩展）
- **条件**：三奇六仪中任何天干落入对应墓库宫位
- **吉凶**：凶
- **含义**：力量被困，该天干所代表的事物受到极大限制

### 14. 荧入白（荧入太白）
- **条件**：天盘丙 + 地盘庚（丙加庚）
- **吉凶**：凶（用于战争则利客不利主）
- **含义**：火入金乡，贼来侵犯。主盗贼、竞争激烈、敌方来攻

### 15. 白入荧（太白入荧）
- **条件**：天盘庚 + 地盘丙（庚加丙）
- **吉凶**：凶（用于战争则利主不利客）
- **含义**：金入火地，自投罗网。主敌人自来送死、官司可胜

### 16. 飞宫格（天飞宫格/天网格）
- **条件**：天盘甲子戊加地盘庚（戊加庚），即戊落在庚的地盘宫上
- **吉凶**：凶
- **含义**：甲被庚金七杀所追，主官灾、口舌、牢狱

### 17. 年格（岁格）
- **条件**：天盘庚 + 地盘甲子戊上（同刑格/上格）
- **吉凶**：凶
- **含义**：同"刑格"，但特指年命受克

### 18. 月格
- **条件**：天盘庚 + 地盘丙（庚加丙），同"白入荧"
- **吉凶**：凶
- **含义**：月奇被庚克，主月事不利

### 19. 日格
- **条件**：天盘庚 + 地盘乙（庚加乙）
- **吉凶**：凶
- **含义**：日奇被庚克，主日事不利、阴人受害

### 20. 悖格（天悖格）
- **条件**：天盘丙 + 地盘甲子戊上（丙加戊），六仪击刑时更凶
- **吉凶**：凶
- **含义**：主背悖、事情颠倒、忘恩负义

### 21. 地私门（私门/鬼私门）
- **条件**：杜门 + 地盘六仪击刑，或杜门临凶星凶神
- **吉凶**：凶
- **含义**：主暗中害人、阴私事败露

### 22. 天牢（天狱）
- **条件**：天盘庚落宫旺相，且克制其他宫位
- **吉凶**：大凶
- **含义**：主牢狱之灾、被困被拘

### 23. 地网
- **条件**：时干或日干入墓，且逢空亡
- **吉凶**：凶
- **含义**：天罗地网，动弹不得

### 24. 墓迫
- **条件**：门入墓 + 门迫同时出现（门落入克门的宫位，且该宫恰好是门的墓地）
- **吉凶**：大凶
- **含义**：双重不利，极为困难

### 25. 奇墓格
- **条件**：三奇入墓 + 又逢凶门凶星
- **吉凶**：凶上加凶
- **含义**：贵人全无、智慧受困、雪上加霜

### 26. 天干相冲（天地盘相冲）
- **条件**：天盘天干与地盘天干五行相克
- **吉凶**：不利（但需看具体组合）
- **含义**：上下不和、内外矛盾

---

## 三、特殊格局

### 1. 值符落空
- **条件**：值符星所在宫位逢空亡
- **吉凶**：大凶
- **含义**：领导不力、靠山全无、大事不可为

### 2. 值使落空
- **条件**：值使门所在宫位逢空亡
- **吉凶**：凶
- **含义**：执行力缺失、事情虚而不实、计划落空

### 3. 空亡宫
- **条件**：某宫位的地支属于当前时辰旬空
- **吉凶**：视情况（空亡宫的事物不实、力量大减）
- **含义**：该宫代表的事物为虚、不可靠、但也可能逢空则不受克

### 4. 马星动
- **条件**：驿马星所在宫位有吉门吉星
- **吉凶**：吉
- **含义**：利于出行、变动、跳槽、搬迁

### 5. 奇门遇合
- **条件**：天地盘天干形成六合关系（甲己合、乙庚合、丙辛合、丁壬合、戊癸合）
- **吉凶**：吉（主和合）
- **含义**：事物和谐、有合作、有助力

### 6. 青龙逃走
- **条件**：天盘乙落到地盘庚上（乙加庚），且逢凶门
- **吉凶**：凶
- **含义**：甲之妹乙被庚金所克，贵人逃走、失去靠山

### 7. 白虎猖狂
- **条件**：天盘辛落到地盘乙上（辛加乙），即地盘乙上天盘辛
- **吉凶**：凶
- **含义**：白虎欺凌青龙，主恶人猖狂、好人受欺

### 8. 螣蛇夭矫
- **条件**：天盘丁 + 螣蛇（神）同宫
- **吉凶**：视情况（丁为奇但螣蛇为凶神）
- **含义**：虚惊、怪梦、但有谋略之象

---

## 四、格局判定优先级

1. **先看伏吟、反吟**（大局面）
2. **再看五不遇时**（时间层面的凶）
3. **看值符值使落宫状态**（空亡、入墓、击刑）
4. **看天地盘干组合**（吉格凶格）
5. **看门迫、三奇入墓等**
6. **综合判断**：多个格局叠加时，吉凶需综合权衡，非简单相加


path: references/guide.md
content: # 奇门遁甲初学者使用指南

## 什么是奇门遁甲？

奇门遁甲是中国古代最高层次的预测学之一，被誉为"帝王之学"。与太乙神数、大六壬并称为古代"三式"（三大绝学）。

**"奇"** = 乙、丙、丁三奇（日奇、月奇、星奇）
**"门"** = 开、休、生、伤、杜、景、死、惊八门
**"遁"** = 隐藏
**"甲"** = 十天干之首，甲为统帅

合起来就是：**天干甲隐藏（遁）在六仪之下，通过三奇和八门来预测吉凶**。

## 奇门遁甲能做什么？

### ✅ 适合的事情
- **择时**：选择做某事的最佳时间
- **择方**：选择有利的方位
- **占事**：预测某件事的成败
- **决策**：帮助在两难中做出选择
- **出行**：看出行是否顺利
- **求财**：看某笔投资/生意的前景
- **考试**：看能否考上
- **官司**：看诉讼结果
- **婚姻**：看姻缘走向
- **健康**：看病情发展
- **失物**：找丢失的东西
- **风水**：看住宅吉凶

### ❌ 不适合的事情
- 不占违法之事
- 不占害人之事
- 不占已知结果之事
- 不可反复占同一事（一事一占）
- 不可心存戏谑

## 基本概念（通俗版）

### 九宫格
想象一个 3×3 的格子（就像井字棋），每格代表一个方位：

```
┌──────┬──────┬──────┐
│ 东南 │ 正南 │ 西南 │
│ 巽4  │ 离9  │ 坤2  │
├──────┼──────┼──────┤
│ 正东 │ 中央 │ 正西 │
│ 震3  │ 中5  │ 兑7  │
├──────┼──────┼──────┤
│ 东北 │ 正北 │ 西北 │
│ 艮8  │ 坎1  │ 乾6  │
└──────┴──────┴──────┘
```

### 四盘（四层信息）

每个格子里有四层信息，就像四层楼：

| 楼层 | 名称 | 代表 | 比喻 |
|------|------|------|------|
| 4层 | **神盘**（八神） | 不可控的运气 | 天意、运势 |
| 3层 | **天盘**（九星） | 天时 | 大环境、趋势 |
| 2层 | **人盘**（八门） | 人事 | 人的选择、行动 |
| 1层 | **地盘**（天干） | 地利 | 基础条件 |

### 天干（10个）
甲、乙、丙、丁、戊、己、庚、辛、壬、癸

- **三奇**：乙（日奇）、丙（月奇）、丁（星奇）→ 代表吉祥
- **六仪**：戊、己、庚、辛、壬、癸 → 甲将军藏在里面

### 九星（9颗星）
天蓬、天芮、天冲、天辅、天禽、天心、天柱、天任、天英

- 🟢 吉星：天心、天任、天辅、天禽、天冲
- 🔴 凶星：天蓬、天芮、天柱
- 🟡 平星：天英

### 八门（8扇门）
开、休、生、伤、杜、景、死、惊

- 🟢 三吉门：**开门**（事业）、**休门**（休养）、**生门**（财运）
- 🟡 中平门：景门（文书）、杜门（隐藏）
- 🔴 三凶门：**伤门**（受伤）、**死门**（死亡）、**惊门**（惊恐）

### 八神（8位神灵）
值符、腾蛇、太阴、六合、白虎、玄武、九地、九天

- 🟢 吉神：值符（贵人）、太阴（暗中帮助）、六合（合作）、九天（光明）
- 🔴 凶神：腾蛇（纠缠）、白虎（凶险）、玄武（欺骗）
- 🟡 中平：九地（稳定）

## 如何起卦？

### 方法一：按时间（最常用）
直接用当前时间排盘。心中想着要问的问题，然后排盘。

```bash
# 当前时间排盘
node scripts/main.js

# 指定时间
node scripts/main.js --time "2026-03-25 14:30"
```

### 方法二：报数
心中想一个数字（1-9），以此数为局数排盘。

### 方法三：特定时刻
当某个重要事件发生的时刻（比如接到电话、收到消息），以该时刻排盘。

**原则**：**念动则占** — 心中产生疑问的那一刻，就是最佳起卦时间。

## 如何看懂盘面？

### 第一步：看基本信息
```
【四柱】丙午年 辛卯月 戊戌日 庚申时
【节气】春分
【局制】阳遁 9 局
```
- 四柱 = 年月日时的干支
- 阳遁/阴遁 = 当前时段的能量方向
- 局数 = 排盘的基准

### 第二步：看值符值使
```
【值符】天心星（落6宫）
【值使】开门（落8宫）
```
- 值符 = 当班的星，代表贵人、领导
- 值使 = 当班的门，代表事情的发展方向

### 第三步：看九宫格
每个宫里有：
- 天盘干 + 地盘干 → 组成"天干组合"（决定吉凶）
- 九星 → 天时好坏
- 八门 → 人事吉凶
- 八神 → 运气加持

### 第四步：看格局
- 🟢 吉格（龙回首、鸟跌穴等）→ 好兆头
- 🔴 凶格（伏吟、反吟等）→ 需小心
- 吉格多 > 凶格 → 事情顺利
- 凶格多 > 吉格 → 事情有阻碍

### 第五步：看用神
根据你问的问题，找到对应的"用神"：
- 问财运 → 看**生门**和**戊**在哪个宫
- 问事业 → 看**开门**和**天心**在哪个宫
- 问婚姻 → 看**六合**在哪个宫

用神所在宫位的好坏 = 事情的结果

### 第六步：看评分和建议
系统会自动给出：
- 📊 综合评分（0-100）
- 🧭 吉方（去哪个方向好）
- 🎨 吉色（穿什么颜色好）
- ⏰ 建议时间

## 常见问题 FAQ

### Q: 同一件事可以反复排盘吗？
**A**: 不可以。"初筮告，再三渎，渎则不告"。第一次的盘最准，反复排只会越来越不准。

### Q: 排盘时间是用北京时间还是真太阳时？
**A**: 奇门遁甲用的是当地真太阳时。但实际操作中，用北京标准时间误差在可接受范围内，除非在新疆等偏远地区。

### Q: 晚上23点以后算第二天吗？
**A**: 子时分早子时（23:00-0:00）和晚子时（0:00-1:00）。传统上23:00开始就算次日了。

### Q: 结果说凶，怎么办？
**A**: 
1. 凶不代表一定坏，可能是"有阻碍但最终能成"
2. 看具体凶格，有些只是提醒注意
3. 趋吉避凶：往吉方走、穿吉色、选吉时
4. 重大事情建议多方面综合判断

### Q: 奇门遁甲和紫微斗数有什么区别？
**A**: 
- **紫微斗数** = 看人的一生命运（固定的）
- **奇门遁甲** = 看某一件事的吉凶（随时变化的）
- 紫微看"命"，奇门看"事"

### Q: 准确率有多高？
**A**: 奇门遁甲的准确率取决于：
1. 排盘是否精确（本系统已保证）
2. 解盘者的水平
3. 起卦时的诚心程度
传统说法是"十占七八"（70-80%），但仅供参考。

## 注意事项

1. **心诚** - 不诚不占，心存戏谑不准
2. **一事一占** - 一次只问一个问题
3. **时机** - 心中产生疑问的那一刻最准
4. **客观** - 盘面只是参考，不要过度依赖
5. **保密** - 占卜结果不宜到处说
6. **正面** - 用于趋吉避凶，不用于害人

## 推荐学习路径

1. **入门**：先理解九宫、八门、九星的基本含义
2. **初级**：学会看天干组合的吉凶
3. **中级**：理解用神取法，能针对具体问题解盘
4. **高级**：掌握格局判断、五行旺衰、综合断事
5. **精通**：活盘活断，融会贯通

推荐书目：
- 《奇门遁甲基础入门》
- 《神奇之门》张志春
- 《开悟之门》张志春
- 《奇门遁甲秘笈大全》


path: references/stem-combinations.md
content: # 十天干克应（天地盘天干组合）

天盘天干在上，地盘天干在下。格式：**天盘X加地盘Y**。

> 注：甲在奇门中隐遁不露，通常以甲子戊、甲戌己等六仪代替。但在分析天地盘组合时，仍需列出甲的组合作为参考。实际排盘中天盘地盘出现的是乙丙丁戊己庚辛壬癸九个天干。

---

## 一、甲加X（甲为统帅，隐于六仪之下）

> 实际排盘中甲不直接出现，以下为理论参考。

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 甲加甲 | 伏吟 | 主事不动，伏而不起 | 凶 |
| 甲加乙 | 甲乙相邻 | 兄妹相依，和合 | 小吉 |
| 甲加丙 | 甲丙相生 | 青龙得火，光明 | 吉 |
| 甲加丁 | 甲丁相生 | 文昌助甲，谋略 | 吉 |
| 甲加戊 | 甲遁戊下 | 统帅居位，正常 | 中平 |
| 甲加己 | 甲己合 | 天地合德，百事吉 | 吉 |
| 甲加庚 | 甲庚冲 | 统帅遇敌，大战 | 大凶 |
| 甲加辛 | 甲辛克 | 被困受制 | 凶 |
| 甲加壬 | 甲壬泄 | 暗耗精力 | 小凶 |
| 甲加癸 | 甲癸泄 | 天牢困锁 | 凶 |

---

## 二、乙加X（日奇/天奇）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 乙加甲 | 乙甲同根 | 日奇归甲，依靠长辈 | 小吉 |
| 乙加乙 | 日奇伏吟 | 主不动，萎靡 | 平 |
| 乙加丙 | 奇仪相佐 | 日月相辉，光明渐显 | 吉 |
| 乙加丁 | 奇仪递生 | 日星并辉，文才大发 | 吉 |
| 乙加戊 | 阴害阳门 | 利阴人，不利阳事 | 中平 |
| 乙加己 | 日奇入墓（乙己合） | 地私门/日合，有合有困 | 中平偏吉 |
| 乙加庚 | **龙逃走** | 日奇被庚金克，贵人逃避，主人逃走 | 凶 |
| 乙加辛 | **青龙折足** | 乙木被辛金克，主伤残、折损、行人受阻 | 凶 |
| 乙加壬 | 日奇入地 | 乙逢壬水，木得水生但过泄，主漂泊 | 小凶 |
| 乙加癸 | 日奇入天网 | 华盖逢星，主沉迷玄学、隐遁，利修行 | 中平 |

---

## 三、丙加X（月奇/地奇）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 丙加甲 | 火照青龙 | 光明照统帅 | 吉 |
| 丙加乙 | 日月并行 | 光明大显，公务顺利 | 吉 |
| 丙加丙 | 月奇伏吟 | 主焦躁不安 | 平 |
| 丙加丁 | 月星相映 | 双火并明，主文书显赫 | 吉 |
| 丙加戊 | **飞鸟跌穴** | 丙火照甲木，主功名大成、一飞冲天 | 大吉 |
| 丙加己 | 火入地中 | 月奇入地，主暗昧不明 | 中平偏凶 |
| 丙加庚 | **荧入白** | 丙火克庚金，贼来犯主，主竞争激烈 | 凶（战争利客） |
| 丙加辛 | 丙辛合 | 天干合，主有情人相见、事和合 | 吉 |
| 丙加壬 | 火入水中 | 主名声受损、计划被阻 | 凶 |
| 丙加癸 | **悖格/华盖悖师** | 丙火被癸水克，主悖逆、文书出差错 | 凶 |

---

## 四、丁加X（星奇/人奇）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 丁加甲 | 星照统帅 | 谋略辅佐甲 | 吉 |
| 丁加乙 | 人遁/奇仪递生 | 星日并辉 | 吉 |
| 丁加丙 | 星月互映 | 双奇并临，大利文书、考试 | 吉 |
| 丁加丁 | 星奇伏吟 | 主犹豫不决 | 平 |
| 丁加戊 | **青龙转光/鸟跌穴** | 丁火生戊土（甲），主贵人垂顾、锦上添花 | 大吉 |
| 丁加己 | **人遁** | 丁己暗合（火生土合），主阴私、密谋可成 | 中平偏吉 |
| 丁加庚 | **年格/岁格** | 丁火克庚金，有克有合(丁壬合)... 主官灾、年内有灾 | 凶 |
| 丁加辛 | **朱雀入狱** | 丁火克辛金，主罪人自投、文书有阻 | 凶 |
| 丁加壬 | 丁壬合 | 天干合，主淫佚、私情、男女暗通 | 中平（利合不利正） |
| 丁加癸 | **朱雀投江** | 丁火被癸水克，主文书沉没、音信全无 | 凶 |

---

## 五、戊加X（甲子戊/六仪之首）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 戊加甲 | 大帐归元 | 遁甲还位 | 中平 |
| 戊加乙 | **阴害门** | 利阴人、女性之事 | 中平 |
| 戊加丙 | **鸟跌穴** | 丙火照戊（甲），主光明、升官 | 大吉 |
| 戊加丁 | **青龙转光** | 丁火助戊（甲），主贵人提携 | 大吉 |
| 戊加戊 | 伏吟 | 甲子戊归位不动，主事停滞 | 凶 |
| 戊加己 | 合德格 | 甲遇己合，天地合德 | 吉 |
| 戊加庚 | **值符飞宫/天乙伏宫** | 甲遇庚克（七杀），主官灾、牢狱 | 大凶 |
| 戊加辛 | **困龙被伤** | 甲被辛金正克，主受伤、折辱 | 凶 |
| 戊加壬 | **小蛇化龙** | 壬水生甲木，暗中得助 | 吉 |
| 戊加癸 | **天乙入狱/天牢** | 甲遇癸水（华盖），主被困、入牢 | 凶 |

---

## 六、己加X（甲戌己）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 己加甲 | 地合甲 | 己合甲，主合作、顺遂 | 吉 |
| 己加乙 | **墓神不明** | 己为墓神（六仪），乙入地户 | 中平偏凶 |
| 己加丙 | 火入勾陈 | 丙火生己土，主旺相但不纯 | 中平 |
| 己加丁 | 朱雀入墓 | 丁火生己土，暗中消耗 | 中平偏凶 |
| 己加戊 | **地户逢合** | 己遇戊（甲），土土比合 | 中平偏吉 |
| 己加己 | 地户伏吟 | 主暗昧不明、事情不清 | 凶 |
| 己加庚 | **刑格入狱** | 己被庚夺（六合被劫），主被困、入狱 | 凶 |
| 己加辛 | **入狱自刑** | 主自找苦吃、官灾、疾病 | 凶 |
| 己加壬 | **地网高悬** | 壬水被己土克，主下属受制 | 中平 |
| 己加癸 | **地刑玄武** | 己癸皆阴，主暗昧、奸佞 | 凶 |

---

## 七、庚加X（甲申庚/白虎/七杀）

庚为最凶之天干，主阻隔、竞争、战争、仇敌。

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 庚加甲 | 七杀克甲 | 统帅被克，大凶 | 大凶 |
| 庚加乙 | **日格/庚克乙** | 庚金克乙木，主女人受害、阴人不利 | 凶 |
| 庚加丙 | **白入荧/太白入荧** | 庚金被丙火克，敌自投罗网 | 凶（利主不利客） |
| 庚加丁 | **年格** | 庚金被丁火克(但庚丁非合)，主年灾 | 凶 |
| 庚加戊 | **上格/刑格** | 庚克戊（甲），主官灾、被上级惩罚 | 大凶 |
| 庚加己 | **刑格合局** | 庚逢己，有克有合之象 | 凶偏中平 |
| 庚加庚 | **太白同位/战格** | 庚庚比肩，主兄弟阋墙、同行竞争 | 大凶 |
| 庚加辛 | **白虎干格** | 金金比肩，主竞争、肃杀 | 凶 |
| 庚加壬 | **小格** | 庚金生壬水，上泄下受，主阻隔较轻 | 凶 |
| 庚加癸 | **大格/太白格** | 天狱加地网，主大阻隔、行人绝归路 | 大凶 |

---

## 八、辛加X（甲午辛）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 辛加甲 | 辛克甲 | 金克木，主受制 | 凶 |
| 辛加乙 | **白虎猖狂** | 辛金克乙木，恶人欺善、女人受害 | 凶 |
| 辛加丙 | 辛丙合 | 天干合，主仇人和好、事有转圜 | 吉 |
| 辛加丁 | **狱神得奇** | 辛（天牢）逢丁（星奇），主狱中有救、因祸得福 | 中平偏吉 |
| 辛加戊 | **困龙得水** | 辛克戊甲，但辛戊非纯克 | 中平偏凶 |
| 辛加己 | **入墓困顿** | 辛己相生（土生金），但己为墓 | 中平 |
| 辛加庚 | **白虎出力** | 辛庚金金比助 | 凶（主肃杀） |
| 辛加辛 | 伏吟 | 主呻吟、痛苦 | 凶 |
| 辛加壬 | **凶蛇入狱** | 辛金生壬水泄气 | 中平偏凶 |
| 辛加癸 | **天牢华盖** | 辛逢癸，主入狱、修行 | 凶（利出家修道） |

---

## 九、壬加X（甲辰壬）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 壬加甲 | 水生甲木 | 暗中资助 | 吉 |
| 壬加乙 | **小蛇得地** | 壬水生乙木，主谋略可成 | 吉 |
| 壬加丙 | 水火相射 | 壬水克丙火，主事情突变 | 凶 |
| 壬加丁 | 壬丁合 | 天干合，主阴阳交泰但多淫佚 | 中平 |
| 壬加戊 | **小蛇化龙** | 壬水生戊（甲木），主暗中升腾 | 吉 |
| 壬加己 | **地网高张** | 壬被己土克，主网罗密布 | 凶 |
| 壬加庚 | **小格上门** | 壬金泄庚... 庚生壬，主阻隔有泄 | 凶 |
| 壬加辛 | 凶蛇入洞 | 壬辛金水相生 | 中平偏凶 |
| 壬加壬 | 伏吟 | 水流不止，主变动、漂泊 | 凶 |
| 壬加癸 | **蛇入地罗** | 壬癸皆水，泛滥成灾 | 凶 |

---

## 十、癸加X（甲寅癸/天网/华盖）

| 组合 | 名称 | 含义 | 吉凶 |
|---|---|---|---|
| 癸加甲 | 华盖护甲 | 天网罩统帅 | 中平（利隐不利显） |
| 癸加乙 | **华盖逢星** | 癸水生乙木，利隐修、学术 | 中平偏吉 |
| 癸加丙 | **华盖悖师/悖格** | 癸水克丙火，主文书错乱、悖逆 | 凶 |
| 癸加丁 | **螣蛇妖矫** | 癸水克丁火，主奇谋怪事、虚幻 | 凶 |
| 癸加戊 | **天乙入牢** | 癸罩戊（甲），主被困、入狱 | 凶 |
| 癸加己 | **华盖地网** | 癸被己克，天网地网，动弹不得 | 大凶 |
| 癸加庚 | **大格** | 天网加太白，最大阻隔 | 大凶 |
| 癸加辛 | **天牢网格** | 癸逢辛，网中加锁 | 凶 |
| 癸加壬 | **地网覆舟** | 癸壬皆水，洪水泛滥 | 凶 |
| 癸加癸 | 伏吟 | 天网重重，主黑暗、沉沦 | 大凶 |

---

## 十一、组合速查规律

### 吉组合特征
1. **三奇互配**：乙丙、乙丁、丙丁组合多吉
2. **天干相合**：甲己、乙庚、丙辛、丁壬、戊癸相合多有转机
3. **三奇配戊**：丙加戊（飞鸟跌穴）、丁加戊（青龙转光）为大吉
4. **壬加戊/壬加乙**：水生木为吉

### 凶组合特征
1. **庚加任何干**：庚为凶星，多数组合为凶
2. **癸加火（丙丁）**：水克火为凶
3. **三奇被克**：庚加乙、壬加丙、己加丁等
4. **同干伏吟**：任何天干自加自为伏吟

### 克应强弱
- **天盘克地盘**：外来之力克内在，主被动受制
- **地盘克天盘**：内在之力克外来，主主动制人
- **天盘生地盘**：外力生内在，主有助力
- **地盘生天盘**：内在泄气予外来，主消耗


path: references/wuxing.md
content: # 五行旺衰与宫位关系

## 一、五行基本属性

### 天干五行
| 天干 | 五行 | 阴阳 |
|------|------|------|
| 甲 | 木 | 阳 |
| 乙 | 木 | 阴 |
| 丙 | 火 | 阳 |
| 丁 | 火 | 阴 |
| 戊 | 土 | 阳 |
| 己 | 土 | 阴 |
| 庚 | 金 | 阳 |
| 辛 | 金 | 阴 |
| 壬 | 水 | 阳 |
| 癸 | 水 | 阴 |

### 地支五行
| 地支 | 五行 | 阴阳 |
|------|------|------|
| 子 | 水 | 阳 |
| 丑 | 土 | 阴 |
| 寅 | 木 | 阳 |
| 卯 | 木 | 阴 |
| 辰 | 土 | 阳 |
| 巳 | 火 | 阴 |
| 午 | 火 | 阳 |
| 未 | 土 | 阴 |
| 申 | 金 | 阳 |
| 酉 | 金 | 阴 |
| 戌 | 土 | 阳 |
| 亥 | 水 | 阴 |

### 九宫五行
| 宫位 | 八卦 | 五行 | 方位 |
|------|------|------|------|
| 1宫 | 坎 | 水 | 正北 |
| 2宫 | 坤 | 土 | 西南 |
| 3宫 | 震 | 木 | 正东 |
| 4宫 | 巽 | 木 | 东南 |
| 5宫 | 中 | 土 | 中央 |
| 6宫 | 乾 | 金 | 西北 |
| 7宫 | 兑 | 金 | 正西 |
| 8宫 | 艮 | 土 | 东北 |
| 9宫 | 离 | 火 | 正南 |

### 九星五行
| 九星 | 五行 | 落宫 |
|------|------|------|
| 天蓬 | 水 | 1宫 |
| 天芮 | 土 | 2宫 |
| 天冲 | 木 | 3宫 |
| 天辅 | 木 | 4宫 |
| 天禽 | 土 | 5宫 |
| 天心 | 金 | 6宫 |
| 天柱 | 金 | 7宫 |
| 天任 | 土 | 8宫 |
| 天英 | 火 | 9宫 |

### 八门五行
| 八门 | 五行 | 落宫 |
|------|------|------|
| 休门 | 水 | 1宫 |
| 死门 | 土 | 2宫 |
| 伤门 | 木 | 3宫 |
| 杜门 | 木 | 4宫 |
| 开门 | 金 | 6宫 |
| 惊门 | 金 | 7宫 |
| 生门 | 土 | 8宫 |
| 景门 | 火 | 9宫 |

## 二、五行生克关系

### 五行相生
- 木生火 → 火生土 → 土生金 → 金生水 → 水生木

### 五行相克
- 木克土 → 土克水 → 水克火 → 火克金 → 金克木

### 在奇门中的应用
- **生我者**为印（获助力）
- **我生者**为泄（耗精力）
- **克我者**为官鬼（压力、阻碍）
- **我克者**为财（可得之物）
- **同我者**为比肩（平等竞争）

## 三、四季五行旺衰

### 旺相休囚死判断表

| 季节 | 旺 | 相 | 休 | 囚 | 死 |
|------|----|----|----|----|-----|
| 春（寅卯月） | 木 | 火 | 水 | 金 | 土 |
| 夏（巳午月） | 火 | 土 | 木 | 水 | 金 |
| 四季月（辰未戌丑） | 土 | 金 | 火 | 木 | 水 |
| 秋（申酉月） | 金 | 水 | 土 | 火 | 木 |
| 冬（亥子月） | 水 | 木 | 金 | 土 | 火 |

### 节气与月支对应
| 节气 | 月支 | 季节 |
|------|------|------|
| 立春-惊蛰 | 寅 | 春 |
| 惊蛰-清明 | 卯 | 春 |
| 清明-立夏 | 辰 | 四季(春土) |
| 立夏-芒种 | 巳 | 夏 |
| 芒种-小暑 | 午 | 夏 |
| 小暑-立秋 | 未 | 四季(夏土) |
| 立秋-白露 | 申 | 秋 |
| 白露-寒露 | 酉 | 秋 |
| 寒露-立冬 | 戌 | 四季(秋土) |
| 立冬-大雪 | 亥 | 冬 |
| 大雪-小寒 | 子 | 冬 |
| 小寒-立春 | 丑 | 四季(冬土) |

### 旺衰力量值
| 状态 | 力量 | 含义 |
|------|------|------|
| 旺 | 100 | 当令得时，力量最强 |
| 相 | 80 | 得时之生，力量次强 |
| 休 | 50 | 休养之态，力量一般 |
| 囚 | 30 | 被囚之象，力量较弱 |
| 死 | 10 | 绝气之状，力量最弱 |

## 四、得地与失地

### 得地（天干落入同五行或生我之宫）
| 天干 | 得地宫位 |
|------|----------|
| 甲乙(木) | 震3宫、巽4宫（同行）、坎1宫（生我） |
| 丙丁(火) | 离9宫（同行）、震3宫、巽4宫（生我） |
| 戊己(土) | 坤2宫、艮8宫、中5宫（同行）、离9宫（生我） |
| 庚辛(金) | 乾6宫、兑7宫（同行）、坤2宫、艮8宫（生我） |
| 壬癸(水) | 坎1宫（同行）、乾6宫、兑7宫（生我） |

### 失地（天干落入克我之宫）
| 天干 | 失地宫位 |
|------|----------|
| 甲乙(木) | 乾6宫、兑7宫（金克木） |
| 丙丁(火) | 坎1宫（水克火） |
| 戊己(土) | 震3宫、巽4宫（木克土） |
| 庚辛(金) | 离9宫（火克金） |
| 壬癸(水) | 坤2宫、艮8宫（土克水） |

## 五、入墓

### 天干入墓宫位
| 天干 | 五行 | 墓库 | 对应宫位 |
|------|------|------|----------|
| 甲乙 | 木 | 未(墓于未) | 坤2宫(未在坤) |
| 丙丁 | 火 | 戌(墓于戌) | 乾6宫(戌在乾) |
| 戊己 | 土 | 戌(墓于戌) | 乾6宫(戌在乾) |
| 庚辛 | 金 | 丑(墓于丑) | 艮8宫(丑在艮) |
| 壬癸 | 水 | 辰(墓于辰) | 巽4宫(辰在巽) |

### 入墓含义
- 入墓如入牢笼，力量大减
- 三奇入墓为凶格
- 用神入墓：事难成，需等待
- 日干入墓：求测者本身状态不佳

## 六、空亡（旬空）

### 十天干配十二地支的空亡
| 旬 | 空亡地支 | 空亡宫位 |
|------|----------|----------|
| 甲子旬 | 戌、亥 | 乾6宫(戌)、坎1宫(亥)偏乾6 |
| 甲戌旬 | 申、酉 | 坤2宫(申偏)、兑7宫(酉) |
| 甲申旬 | 午、未 | 离9宫(午)、坤2宫(未) |
| 甲午旬 | 辰、巳 | 巽4宫(辰偏巽)、巽4宫(巳偏离) |
| 甲辰旬 | 寅、卯 | 艮8宫(寅)、震3宫(卯) |
| 甲寅旬 | 子、丑 | 坎1宫(子)、艮8宫(丑) |

### 空亡判断方法
1. 确定日干支所在旬
2. 找出该旬空亡地支
3. 该地支对应的宫位为空亡宫

### 空亡含义
- 空亡之宫事不实、主虚假
- 用神落空亡：事不成、人不在
- 日干落空亡：求测者心意不定
- **真空**：空亡且被克 → 彻底无望
- **假空**：空亡但得生 → 过空则实（过了该旬就好）

## 七、马星（驿马）

### 驿马查法
| 日支三合局 | 驿马 | 对应宫位 |
|------------|------|----------|
| 申子辰 | 寅 | 艮8宫 |
| 寅午戌 | 申 | 坤2宫 |
| 巳酉丑 | 亥 | 坎1宫偏乾6 |
| 亥卯未 | 巳 | 巽4宫偏离9 |

### 马星含义
- 马星所在宫位主变动、迁移、奔波
- 用神临马星：事情有变化
- 出行问马星：宜出行
- 马星加吉格：远行获利
- 马星加凶格：奔波劳碌

## 八、门与宫的关系

### 门生宫（吉）
- 门的五行生宫的五行
- 例：伤门(木)到离9宫(火)，木生火，门生宫为吉

### 宫生门（平）
- 宫的五行生门的五行
- 例：坎1宫(水)有伤门(木)，水生木，宫生门为平

### 门克宫（凶 - 门迫）
- 门的五行克宫的五行
- 例：休门(水)到离9宫(火)，水克火，为门迫，凶

### 宫克门（凶 - 门制）
- 宫的五行克门的五行
- 例：离9宫(火)有休门(水)，火被水克？不对——应该是宫火克门水？水克火才对
- **正确**：宫克门 = 宫的五行克门的五行
- 例：乾6宫(金)有伤门(木)，金克木，宫克门为制，不太凶但受限

### 门宫比和（平）
- 门与宫五行相同
- 例：休门(水)到坎1宫(水)，水水比和，平稳


path: references/yongshen.md
content: # 用神取法系统

## 一、概述

奇门遁甲断事的核心在于**取用神**。根据所问事项的类型，确定代表该事物的用神（天干、八门、九星、八神、宫位等），然后分析用神的旺衰、落宫、与其他盘元素的生克关系，最终判断吉凶成败。

### 通用取用原则

1. **日干**代表问事者本人（求测者）
2. **时干**代表所问之事
3. **年干**代表长辈、上级、大环境
4. **月干**代表同辈、平级、月运
5. **值符**（九星）代表上级、领导、贵人
6. **值使**（八门）代表执行、结果

---

## 二、求财类

### 2.1 求财（一般）

| 用神 | 说明 |
|---|---|
| **日干** | 求测者本人 |
| **时干** | 所求之财 |
| **生门** | 财运之门 |
| **戊** | 资本、正财 |
| **己** | 合作之财、偏财 |

**断法**：
1. 看日干落宫与生门落宫的关系（生门生日干宫→有财）
2. 看戊（资本）与日干的生克关系
3. 生门旺相、临吉星吉神→求财顺利
4. 生门入墓、落空亡→求财无望
5. 日干宫克戊宫→可得财（我克者为财）
6. 日干宫生戊宫→财泄我力（付出大于收获）

### 2.2 投资理财

| 用神 | 说明 |
|---|---|
| **日干** | 投资者 |
| **生门** | 投资收益 |
| **戊** | 本金、资本 |
| **庚** | 风险、阻碍 |
| **开门** | 市场大势 |

**断法**：
1. 生门旺相得奇→投资有利
2. 庚落日干宫或生门宫→有风险阻碍
3. 戊旺相→本金安全
4. 戊入墓/逢空→本金有损

### 2.3 生意经商

| 用神 | 说明 |
|---|---|
| **日干** | 自己 |
| **时干** | 顾客/市场 |
| **生门** | 财运 |
| **开门** | 事业门面 |
| **六合** | 合作方、中介 |

---

## 三、事业工作类

### 3.1 求职应聘

| 用神 | 说明 |
|---|---|
| **日干** | 求职者 |
| **时干** | 工作岗位 |
| **开门** | 工作、事业 |
| **值符/天心** | 领导/面试官 |
| **景门** | 面试表现 |

**断法**：
1. 开门旺相临吉星→事业运好
2. 日干宫与开门宫相生→可得工作
3. 日干宫被开门宫所克→求职困难
4. 值符生日干→贵人相助

### 3.2 升职晋升

| 用神 | 说明 |
|---|---|
| **日干** | 本人 |
| **开门** | 官运 |
| **值符** | 上级领导 |
| **天心星** | 顶头上司 |
| **丙** | 权威、权力 |

**断法**：
1. 开门临日干宫或生日干宫→有升职机会
2. 值符生日干→领导欣赏
3. 日干旺相得奇→自身条件好
4. 开门逢空/入墓→暂无升职

### 3.3 创业开业

| 用神 | 说明 |
|---|---|
| **日干** | 创业者 |
| **开门** | 事业 |
| **生门** | 财运 |
| **时干** | 项目/市场 |
| **天辅星** | 技术/策略 |

---

## 四、婚姻感情类

### 4.1 婚姻

| 用神 | 说明 |
|---|---|
| **日干** | 求测者 |
| **乙** | 女方（问婚以乙为女） |
| **庚** | 男方（问婚以庚为男） |
| **六合** | 婚姻和合、媒人 |
| **休门** | 婚姻之门 |
| **天盘乙+地盘庚或天盘庚+地盘乙** | 男女关系 |

**断法**：
1. 乙庚同宫或相合→婚事可成
2. 乙宫与庚宫相生→关系和谐
3. 乙宫与庚宫相克→关系紧张
4. 六合旺相临吉→有媒人撮合
5. 六合落空→无人做媒/婚事不成
6. 看天盘乙加地盘庚→女追男（乙主动）
7. 看天盘庚加地盘乙→男追女（庚主动）

### 4.2 恋爱感情

| 用神 | 说明 |
|---|---|
| **日干** | 自己 |
| **时干** | 对方 |
| **六合** | 感情和合 |
| **休门** | 感情状态 |
| **太阴** | 暗恋、暗中关系 |

### 4.3 离婚

| 用神 | 说明 |
|---|---|
| 同婚姻用神 | |
| **庚** | 阻隔、分离 |
| **惊门** | 官司 |
| **伤门** | 伤害 |

---

## 五、疾病健康类

### 5.1 疾病

| 用神 | 说明 |
|---|---|
| **日干** | 病人（自己问自己），或**时干**代表病人（代问他人） |
| **天芮星** | 疾病星（主病） |
| **死门** | 病情严重程度 |
| **天心星** | 医生、医药 |
| **开门** | 治疗方法 |
| **乙** | 医生（也取天心） |

**断法**：
1. 天芮星旺相→疾病严重
2. 天芮星休囚→疾病较轻
3. 天芮星逢空→虚惊一场/病不严重
4. 天心星生日干（病人）宫→可治
5. 天心星克日干宫→药不对症或加重
6. 死门临日干宫→病重难愈
7. 生门临日干宫→可痊愈
8. 看天芮落宫五行→判断病在哪个脏腑（金-肺、木-肝、水-肾、火-心、土-脾）

### 5.2 求医

| 用神 | 说明 |
|---|---|
| **天心星** | 医生 |
| **开门** | 医院、治疗方案 |
| **乙** | 药方 |
| **生门** | 康复希望 |

---

## 六、出行类

### 6.1 出行

| 用神 | 说明 |
|---|---|
| **日干** | 出行人 |
| **时干** | 目的地/事由 |
| **开门** | 出行之门 |
| **杜门** | 阻隔（不利出行） |
| **天冲星** | 行动力 |
| **驿马** | 变动、移动 |

**断法**：
1. 开门旺相临日干→出行顺利
2. 杜门临日干→出行受阻
3. 日干宫逢空→出行不成
4. 庚临日干宫→途中有阻
5. 驿马动→利出行变动
6. 看目的地方向对应的宫位状态

### 6.2 出国/远行

| 用神 | 说明 |
|---|---|
| 同出行 | |
| **九天** | 远方、高处、海外 |
| **天冲星** | 远行之星 |

---

## 七、官司诉讼类

### 7.1 官司

| 用神 | 说明 |
|---|---|
| **日干** | 自己（原告或被告） |
| **时干** | 对方 |
| **开门** | 法官/官方 |
| **惊门** | 诉讼之门 |
| **值符** | 法官/裁判者 |
| **庚** | 仇人、对手 |
| **辛** | 牢狱、罪名 |

**断法**：
1. 日干旺、时干衰→我胜
2. 日干衰、时干旺→我败
3. 日干宫克时干宫→我胜诉
4. 惊门旺相临日干→官司缠身但有应对
5. 开门（法官）生日干→判决有利于我
6. 辛临日干→有牢狱之忧
7. 庚临日干→对手压制

---

## 八、考试学业类

### 8.1 考试

| 用神 | 说明 |
|---|---|
| **日干** | 考生 |
| **时干** | 考试/试卷 |
| **景门** | 考试之门（文书之门） |
| **天辅星** | 文昌星 |
| **丁** | 文昌、聪明 |
| **四宫(巽)** | 文昌位 |

**断法**：
1. 景门旺相临吉星→考试顺利
2. 天辅星生日干→学业有助
3. 丁奇临日干宫→聪明智慧发挥好
4. 日干旺相得奇→自身实力强
5. 景门落空→考试无望
6. 日干宫克景门宫→我能驾驭考试

### 8.2 学业深造

| 用神 | 说明 |
|---|---|
| **天辅星** | 学校、导师 |
| **四宫** | 文昌位 |
| **景门** | 学业 |
| **丁** | 学习能力 |

---

## 九、失物寻物类

| 用神 | 说明 |
|---|---|
| **日干** | 失主 |
| **时干** | 失物 |
| **玄武** | 盗贼（八神） |
| **天蓬星** | 盗贼（九星） |
| **庚** | 阻隔（找回难度） |
| **六合** | 中间人、线索 |

**断法**：
1. 时干宫旺相不逢空→物还在
2. 时干宫逢空亡→物已失不可得
3. 玄武落宫方位→贼在何方
4. 时干宫生日干宫→物可回
5. 庚阻隔严重→找回困难
6. 生门临时干→物安全
7. 死门临时干→物已毁坏
8. 看时干落宫方位→物在何方位

---

## 十、寻人类

| 用神 | 说明 |
|---|---|
| **日干** | 寻人者 |
| **时干** | 被寻之人 |
| **六合** | 线索、中间人 |
| **开门** | 出行方向 |
| **庚** | 阻隔 |

**断法**：
1. 时干落宫方位→人在何方
2. 时干宫旺相→人安全
3. 时干宫逢空→暂时找不到（但逢空未必不吉）
4. 时干宫临生门→人安好
5. 时干宫临死门→人凶险
6. 日干宫与时干宫相生→能找到
7. 开门临日干→宜出发寻找

---

## 十一、天气类

| 用神 | 说明 |
|---|---|
| **天盘天干** | 天象 |
| **一宫(坎)** | 雨水 |
| **九宫(离)** | 晴天 |
| **六宫(乾)** | 阴天 |
| **四宫(巽)** | 风 |
| **天蓬星** | 大雨 |
| **天英星** | 晴热 |
| **壬癸** | 水、雨 |
| **丙丁** | 火、晴 |

**断法**：
1. 值符（天象代表）落坎宫→有雨
2. 值符落离宫→晴天
3. 壬癸旺相→下雨
4. 丙丁旺相→晴天
5. 巽宫旺相→有风
6. 天蓬临值符→大雨
7. 天英临值符→晴天

---

## 十二、风水阳宅类

| 用神 | 说明 |
|---|---|
| **日干** | 宅主 |
| **时干** | 宅运 |
| **生门** | 阳宅之门 |
| **开门** | 大门方位 |
| **天心星** | 宅气 |
| **各宫位** | 对应房屋各方位 |

**断法**：
1. 看各宫位的星门神干状态→判断方位吉凶
2. 生门所在方位→最佳居住/开门方向
3. 死门/惊门所在方位→不宜居住
4. 各宫五行与宅主命局的关系
5. 伏吟→宅运不动，适合守
6. 反吟→宅运不稳，可能搬迁

---

## 十三、其他常见问题用神速查

| 问题类型 | 主要用神 | 辅助用神 |
|---|---|---|
| **合伙** | 日干(我)、时干(对方)、六合 | 生门、开门 |
| **借贷** | 日干(借方)、时干(贷方)、戊(钱) | 生门 |
| **讨债** | 日干(债主)、时干(欠债人)、伤门 | 庚(阻隔) |
| **买房** | 日干(买方)、生门(房产)、二宫八宫(土/房) | 开门、戊 |
| **卖房** | 日干(卖方)、时干(买方)、生门 | 开门 |
| **怀孕** | 日干(母)、时干(胎)、天芮(孕) | 生门、六合 |
| **行人来否** | 日干(等待者)、时干(行人)、开门 | 庚(阻隔)、驿马 |
| **签约** | 日干(我)、时干(对方)、景门(文书) | 六合(合同)、丁(文书) |
| **竞标** | 日干(我)、庚(对手)、开门(结果) | 天心(决策者) |
| **搬迁** | 日干(搬家人)、时干(新居)、驿马 | 开门、天冲 |

---

## 十四、旺衰判断通则

### 14.1 用神旺相判断
1. **得令**：用神五行与当前月令（季节）相合，为旺
2. **得地**：用神落在与其五行相生/比和的宫位
3. **得奇**：用神宫位有三奇（乙丙丁）临之
4. **得门**：用神宫位有吉门（开休生）临之
5. **得星**：用神宫位有吉星临之

### 14.2 用神衰弱判断
1. **失令**：五行与月令相克
2. **失地**：落在被克的宫位
3. **入墓**：落入墓库宫位
4. **逢空**：落在空亡宫位
5. **受制**：被凶星凶门凶神夹击

### 14.3 成败逻辑
- **用神旺相 + 吉门吉星**→事可成
- **用神旺相 + 凶门凶星**→事可成但有波折
- **用神衰弱 + 吉门吉星**→有贵人助但力不足
- **用神衰弱 + 凶门凶星**→事难成
- **用神逢空**→事为虚，暂不可得（但空亡也有"空而后实"之说）
- **用神入墓**→事被困，需等出墓之时


path: scripts/engine.js
content: #!/usr/bin/env node
/**
 * 奇门遁甲排盘核心引擎
 * 支持时家奇门拆补法
 * 天地人神四盘完整排列
 */

// ========== 基础常量 ==========
const TIAN_GAN = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'];
const DI_ZHI = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'];

// 三奇六仪顺序（地盘排列用）：戊己庚辛壬癸丁丙乙
const QI_YI_ORDER = ['戊','己','庚','辛','壬','癸','丁','丙','乙'];

// 甲隐遁对应：甲子→戊, 甲戌→己, 甲申→庚, 甲午→辛, 甲辰→壬, 甲寅→癸
const JIA_DUN = { '甲子':'戊', '甲戌':'己', '甲申':'庚', '甲午':'辛', '甲辰':'壬', '甲寅':'癸' };
const YI_TO_JIA = { '戊':'甲子', '己':'甲戌', '庚':'甲申', '辛':'甲午', '壬':'甲辰', '癸':'甲寅' };

// 洛书九宫飞行顺序（跳过5宫）
const FEI_XING = [1,8,3,4,9,2,7,6];

// 九宫信息
const PALACES = {
  1: { name:'坎', gua:'☵', element:'水', dir:'正北', diZhi:['子'] },
  2: { name:'坤', gua:'☷', element:'土', dir:'西南', diZhi:['未','申'] },
  3: { name:'震', gua:'☳', element:'木', dir:'正东', diZhi:['卯'] },
  4: { name:'巽', gua:'☴', element:'木', dir:'东南', diZhi:['辰','巳'] },
  5: { name:'中', gua:'',  element:'土', dir:'中央', diZhi:[] },
  6: { name:'乾', gua:'☰', element:'金', dir:'西北', diZhi:['戌','亥'] },
  7: { name:'兑', gua:'☱', element:'金', dir:'正西', diZhi:['酉'] },
  8: { name:'艮', gua:'☶', element:'土', dir:'东北', diZhi:['丑','寅'] },
  9: { name:'离', gua:'☲', element:'火', dir:'正南', diZhi:['午'] },
};

// 九星（按原始宫位1-9排列）
const NINE_STARS = {
  1: { name:'天蓬', element:'水', type:'凶', weight:30 },
  2: { name:'天芮', element:'土', type:'凶', weight:20 },
  3: { name:'天冲', element:'木', type:'吉', weight:80 },
  4: { name:'天辅', element:'木', type:'吉', weight:90 },
  5: { name:'天禽', element:'土', type:'吉', weight:100 },
  6: { name:'天心', element:'金', type:'吉', weight:90 },
  7: { name:'天柱', element:'金', type:'凶', weight:40 },
  8: { name:'天任', element:'土', type:'吉', weight:85 },
  9: { name:'天英', element:'火', type:'平', weight:60 },
};

// 八门（按原始宫位排列，5宫无门）
const EIGHT_DOORS = {
  1: { name:'休门', element:'水', type:'吉', weight:90 },
  2: { name:'死门', element:'土', type:'凶', weight:10 },
  3: { name:'伤门', element:'木', type:'凶', weight:30 },
  4: { name:'杜门', element:'木', type:'平', weight:50 },
  6: { name:'开门', element:'金', type:'吉', weight:95 },
  7: { name:'惊门', element:'金', type:'凶', weight:40 },
  8: { name:'生门', element:'土', type:'吉', weight:100 },
  9: { name:'景门', element:'火', type:'平', weight:65 },
};

// 八神
const EIGHT_GODS_YANG = ['值符','腾蛇','太阴','六合','白虎','玄武','九地','九天']; // 阳遁顺排
const EIGHT_GODS_YIN  = ['值符','九天','九地','玄武','白虎','六合','太阴','腾蛇']; // 阴遁逆排
const GOD_INFO = {
  '值符': { type:'吉', weight:100 },
  '腾蛇': { type:'凶', weight:20 },
  '太阴': { type:'吉', weight:80 },
  '六合': { type:'吉', weight:85 },
  '白虎': { type:'凶', weight:10 },
  '玄武': { type:'凶', weight:20 },
  '九地': { type:'平', weight:75 },
  '九天': { type:'吉', weight:90 },
};

// 天干五行
const GAN_ELEMENT = { '甲':'木','乙':'木','丙':'火','丁':'火','戊':'土','己':'土','庚':'金','辛':'金','壬':'水','癸':'水' };

// ========== 节气相关 ==========

// 24节气精确系数（寿星天文算法）
const TERM_INFO = [
  // [月, 日近似系数C, 名称, 是否为"节"(true)或"气"(false)]
  // 从小寒开始，与传统排列一致
  { month:1, name:'小寒', C:5.4055 },
  { month:1, name:'大寒', C:20.12 },
  { month:2, name:'立春', C:3.87 },
  { month:2, name:'雨水', C:18.73 },
  { month:3, name:'惊蛰', C:5.63 },
  { month:3, name:'春分', C:20.646 },
  { month:4, name:'清明', C:4.81 },
  { month:4, name:'谷雨', C:20.1 },
  { month:5, name:'立夏', C:5.52 },
  { month:5, name:'小满', C:21.04 },
  { month:6, name:'芒种', C:5.678 },
  { month:6, name:'夏至', C:21.37 },
  { month:7, name:'小暑', C:7.108 },
  { month:7, name:'大暑', C:22.83 },
  { month:8, name:'立秋', C:7.5 },
  { month:8, name:'处暑', C:23.13 },
  { month:9, name:'白露', C:7.646 },
  { month:9, name:'秋分', C:23.042 },
  { month:10, name:'寒露', C:8.318 },
  { month:10, name:'霜降', C:23.438 },
  { month:11, name:'立冬', C:7.438 },
  { month:11, name:'小雪', C:22.36 },
  { month:12, name:'大雪', C:7.18 },
  { month:12, name:'冬至', C:21.94 },
];

// 节气对应局数 [上元, 中元, 下元]
const TERM_JU = {
  '冬至':[1,7,4], '小寒':[2,8,5], '大寒':[3,9,6],
  '立春':[8,5,2], '雨水':[9,6,3], '惊蛰':[1,7,4],
  '春分':[3,9,6], '清明':[4,1,7], '谷雨':[5,2,8],
  '立夏':[4,1,7], '小满':[5,2,8], '芒种':[6,3,9],
  '夏至':[9,3,6], '小暑':[8,2,5], '大暑':[7,1,4],
  '立秋':[2,5,8], '处暑':[1,4,7], '白露':[9,3,6],
  '秋分':[7,1,4], '寒露':[6,9,3], '霜降':[5,8,2],
  '立冬':[6,9,3], '小雪':[5,8,2], '大雪':[4,7,1],
};

// 阳遁节气（冬至到芒种）
const YANG_TERMS = ['冬至','小寒','大寒','立春','雨水','惊蛰','春分','清明','谷雨','立夏','小满','芒种'];

/**
 * 计算某年某个节气的日期
 * 使用寿星天文算法
 */
function getTermDate(year, termIndex) {
  const info = TERM_INFO[termIndex];
  const y = year % 100;
  const d = 0.2422;
  const l = Math.floor((year % 100) / 4);
  let day = Math.floor(y * d + info.C) - l;
  
  // 特殊年份修正
  if (termIndex === 0 && (year === 2019)) day -= 1; // 小寒
  if (termIndex === 2 && (year === 2026)) day += 0; // 立春
  
  return new Date(year, info.month - 1, day);
}

/**
 * 获取所有节气日期（某年）
 */
function getAllTermDates(year) {
  const terms = [];
  // 上一年的冬至开始
  for (let i = 0; i < 24; i++) {
    terms.push({
      name: TERM_INFO[i].name,
      date: getTermDate(year, i),
      index: i,
    });
  }
  // 补上一年冬至
  const prevWinterIdx = 23;
  terms.unshift({
    name: '冬至',
    date: getTermDate(year - 1, prevWinterIdx),
    index: prevWinterIdx,
    prevYear: true,
  });
  return terms;
}

/**
 * 确定日期所在的节气
 */
function getCurrentTerm(date) {
  const year = date.getFullYear();
  const terms = getAllTermDates(year);
  
  let currentTerm = terms[0];
  for (let i = 1; i < terms.length; i++) {
    if (date >= terms[i].date) {
      currentTerm = terms[i];
    } else {
      break;
    }
  }
  return currentTerm;
}

// ========== 干支计算 ==========

/**
 * 计算四柱干支
 */
function getGanZhi(date) {
  const year = date.getFullYear();
  const month = date.getMonth(); // 0-11
  const day = date.getDate();
  const hour = date.getHours();
  
  // 获取当前节气以确定月柱
  const term = getCurrentTerm(date);
  
  // === 年柱 ===
  // 以立春为界
  const lichunDate = getTermDate(year, 2); // 立春index=2
  const chineseYear = date < lichunDate ? year - 1 : year;
  const yOffset = ((chineseYear - 4) % 60 + 60) % 60;
  const yGan = yOffset % 10;
  const yZhi = yOffset % 12;
  
  // === 月柱 ===
  // 月支按"节"定，按日期顺序排列
  const JIE_DEFS = [
    { termIdx:0,  zhi:1  }, // 小寒→丑
    { termIdx:2,  zhi:2  }, // 立春→寅
    { termIdx:4,  zhi:3  }, // 惊蛰→卯
    { termIdx:6,  zhi:4  }, // 清明→辰
    { termIdx:8,  zhi:5  }, // 立夏→巳
    { termIdx:10, zhi:6  }, // 芒种→午
    { termIdx:12, zhi:7  }, // 小暑→未
    { termIdx:14, zhi:8  }, // 立秋→申
    { termIdx:16, zhi:9  }, // 白露→酉
    { termIdx:18, zhi:10 }, // 寒露→戌
    { termIdx:20, zhi:11 }, // 立冬→亥
    { termIdx:22, zhi:0  }, // 大雪→子
  ];
  // 构建带日期的列表（包括去年大雪），按日期排序
  const jieList = [{ date: getTermDate(year - 1, 22), zhi: 0 }]; // 去年大雪→子月
  for (const jie of JIE_DEFS) {
    jieList.push({ date: getTermDate(year, jie.termIdx), zhi: jie.zhi });
  }
  jieList.sort((a, b) => a.date - b.date);
  let mZhi = 1;
  for (const jie of jieList) {
    if (date >= jie.date) {
      mZhi = jie.zhi;
    } else {
      break;
    }
  }
  // 月干根据年干推算（五虎遁月）
  const mGanBase = [2, 4, 6, 8, 0]; // 甲己→丙, 乙庚→戊, 丙辛→庚, 丁壬→壬, 戊癸→甲
  const mGan = (mGanBase[yGan % 5] + ((mZhi - 2 + 12) % 12)) % 10;
  
  // === 日柱 ===
  // 使用已验证的基准日推算（2024-02-10 = 壬辰日, 壬=8, 辰=4）
  const baseDate = Date.UTC(2024, 1, 10); // 2024-02-10 壬辰日
  const targetDate = Date.UTC(year, month, day);
  const dayDiff = Math.floor((targetDate - baseDate) / 86400000);
  const dGan = ((8 + dayDiff) % 10 + 10) % 10;  // 壬=8
  const dZhi = ((4 + dayDiff) % 12 + 12) % 12;  // 辰=4
  
  // === 时柱 ===
  // 子时23-1, 丑时1-3, ..., 亥时21-23
  let hZhi;
  if (hour >= 23 || hour < 1) hZhi = 0; // 子
  else hZhi = Math.floor((hour + 1) / 2);
  
  // 时干根据日干推算（五鼠遁时）
  const hGanBase = [0, 2, 4, 6, 8]; // 甲己→甲, 乙庚→丙, 丙辛→戊, 丁壬→庚, 戊癸→壬
  const hGan = (hGanBase[dGan % 5] + hZhi) % 10;
  
  return {
    year: TIAN_GAN[yGan] + DI_ZHI[yZhi],
    month: TIAN_GAN[mGan] + DI_ZHI[mZhi],
    day: TIAN_GAN[dGan] + DI_ZHI[dZhi],
    hour: TIAN_GAN[hGan] + DI_ZHI[hZhi],
    vals: { yGan, yZhi, mGan, mZhi, dGan, dZhi, hGan, hZhi },
    termName: term.name,
  };
}

// ========== 定局 ==========

/**
 * 拆补法定局
 * 正确方法：
 * 1. 找节气日期
 * 2. 找节气日期当天或之前最近的符头（甲/己日）
 * 3. 从符头开始每5天一元（上中下）
 * 4. 看当前日在第几元
 * 符头：天干为甲或己的日子
 * 甲子/己卯/甲午/己酉 = 上元符头
 * 甲寅/己巳/甲申/己亥 = 中元符头  
 * 甲辰/己未/甲戌/己丑 = 下元符头
 */
function determineJu(date, gz) {
  const termName = gz.termName;
  const isYang = YANG_TERMS.includes(termName);
  const dunType = isYang ? '阳遁' : '阴遁';
  
  const year = date.getFullYear();
  const month = date.getMonth();
  const day = date.getDate();
  
  // 找节气日期
  const term = getCurrentTerm(date);
  const termDate = term.date;
  
  // 从节气日期往前找最近的符头（甲或己日）
  // 符头 = 天干为甲(0)或己(5)的日子
  const baseDate = Date.UTC(1900, 0, 31); // 甲午日
  
  // 节气日的日干
  const termUTC = Date.UTC(termDate.getFullYear(), termDate.getMonth(), termDate.getDate());
  const termDayDiff = Math.floor((termUTC - baseDate) / 86400000);
  const termDayGan = ((termDayDiff % 10) + 10) % 10;
  
  // 往前找甲(0)或己(5)日
  let fuTouOffset = 0;
  for (let i = 0; i <= 9; i++) {
    const gan = ((termDayGan - i) % 10 + 10) % 10;
    if (gan === 0 || gan === 5) { // 甲或己
      fuTouOffset = i;
      break;
    }
  }
  
  // 符头日期
  const fuTouDate = new Date(termDate);
  fuTouDate.setDate(fuTouDate.getDate() - fuTouOffset);
  
  // 当前日距符头的天数
  const currentUTC = Date.UTC(year, month, day);
  const fuTouUTC = Date.UTC(fuTouDate.getFullYear(), fuTouDate.getMonth(), fuTouDate.getDate());
  const daysSinceFuTou = Math.floor((currentUTC - fuTouUTC) / 86400000);
  
  // 每5天一元
  let yuan;
  if (daysSinceFuTou < 5) {
    yuan = 0; // 上元
  } else if (daysSinceFuTou < 10) {
    yuan = 1; // 中元
  } else {
    yuan = 2; // 下元
  }
  
  const yuanNames = ['上元','中元','下元'];
  const juNums = TERM_JU[termName];
  if (!juNums) {
    console.error(`未找到节气 ${termName} 的局数`);
    return { dunType, yuan: yuanNames[0], juNum: 1, termName };
  }
  
  const juNum = juNums[yuan];
  
  return {
    dunType,
    yuan: yuanNames[yuan],
    juNum,
    termName,
    isYang,
  };
}

// ========== 排盘核心 ==========

/**
 * 排地盘
 * 阳遁：从局数对应宫位开始，按洛书顺序顺排 戊己庚辛壬癸丁丙乙
 * 阴遁：从局数对应宫位开始，按洛书逆序排列
 */
function buildEarthPlate(juNum, isYang) {
  const earth = {};
  const startPalace = juNum;
  
  // 含5宫的完整洛书飞行序列
  // 1→8→3→4→5→9→2→7→6（5宫在4和9之间）
  const FULL_SEQ = [1,8,3,4,5,9,2,7,6];
  
  // 找起始位置
  let startIdx = FULL_SEQ.indexOf(startPalace);
  if (startIdx === -1) startIdx = 0;
  
  if (isYang) {
    // 阳遁顺排
    for (let i = 0; i < 9; i++) {
      const palace = FULL_SEQ[(startIdx + i) % 9];
      earth[palace] = QI_YI_ORDER[i];
    }
  } else {
    // 阴遁逆排
    for (let i = 0; i < 9; i++) {
      const palace = FULL_SEQ[((startIdx - i) % 9 + 9) % 9];
      earth[palace] = QI_YI_ORDER[i];
    }
  }
  
  return earth;
}

/**
 * 洛书九宫下一宫
 * 顺序：1→8→3→4→9→2→7→6→1（跳过5由2代替）
 * 包含5宫的完整顺序：1→8→3→4→(5寄2)→9→2→7→6
 */
function nextPalace(current, forward) {
  // 含5宫的完整飞行序列
  const fullSeq = [1,8,3,4,9,2,7,6];
  // 5宫在4和9之间
  
  if (current === 5) current = 2; // 5宫寄2宫
  
  const idx = fullSeq.indexOf(current);
  if (idx === -1) return 1;
  
  if (forward) {
    return fullSeq[(idx + 1) % 8];
  } else {
    return fullSeq[(idx - 1 + 8) % 8];
  }
}

/**
 * 获取洛书飞行序列中从某宫开始的偏移宫
 */
function getPalaceByOffset(start, offset, forward) {
  if (start === 5) start = 2;
  const idx = FEI_XING.indexOf(start);
  if (idx === -1) return 1;
  
  if (forward) {
    return FEI_XING[(idx + offset) % 8];
  } else {
    return FEI_XING[(idx - offset + 80) % 8];
  }
}

/**
 * 排天盘（九星）
 * 正确逻辑：
 * 1. 找时辰所在旬首（六甲之一）对应的六仪
 * 2. 该六仪在地盘的宫位 = 值符原始宫位
 * 3. 找时干在地盘的宫位 = 值符目标宫位
 * 4. 值符星从原始宫位转到目标宫位
 * 5. 其余星按同样偏移量转动
 */
function buildHeavenPlate(earth, gz, isYang) {
  const hourGan = TIAN_GAN[gz.vals.hGan];
  const hGan = gz.vals.hGan;
  const hZhi = gz.vals.hZhi;
  
  // 1. 找旬首：时辰干支所在旬的甲X
  const xunZhi = ((hZhi - hGan) % 12 + 12) % 12;
  // 旬首地支 → 对应的六仪
  const XUN_TO_YI = { 0:'戊', 10:'己', 8:'庚', 6:'辛', 4:'壬', 2:'癸' };
  const xunYi = XUN_TO_YI[xunZhi] || '戊';
  
  // 2. 旬首六仪在地盘的宫位 = 值符原始宫位
  let zhiFuOrigPalace = null;
  for (const [p, stem] of Object.entries(earth)) {
    if (stem === xunYi) {
      zhiFuOrigPalace = parseInt(p);
      break;
    }
  }
  if (!zhiFuOrigPalace) zhiFuOrigPalace = 1;
  if (zhiFuOrigPalace === 5) zhiFuOrigPalace = 2; // 5宫寄2宫
  
  // 3. 时干在地盘的宫位 = 值符目标宫位
  let hourEarthPalace = null;
  for (const [p, stem] of Object.entries(earth)) {
    if (stem === hourGan) {
      hourEarthPalace = parseInt(p);
      break;
    }
  }
  // 如果时干是甲，甲隐于旬首六仪下，宫位同旬首六仪
  if (hourGan === '甲' || !hourEarthPalace) {
    hourEarthPalace = zhiFuOrigPalace;
  }
  if (hourEarthPalace === 5) hourEarthPalace = 2;
  
  const zhiFuTargetPalace = hourEarthPalace;
  const zhiFuStar = NINE_STARS[zhiFuOrigPalace];
  
  // 4. 计算偏移
  const fromIdx = FEI_XING.indexOf(zhiFuOrigPalace);
  const toIdx = FEI_XING.indexOf(zhiFuTargetPalace);
  const shift = ((toIdx - fromIdx) % 8 + 8) % 8;
  
  // 排天盘星
  const heaven = {};
  const heavenStems = {};
  
  for (let i = 0; i < 8; i++) {
    const origPalace = FEI_XING[i];
    const targetPalace = FEI_XING[(i + shift) % 8];
    heaven[targetPalace] = NINE_STARS[origPalace].name;
    // 天盘干 = 原宫地盘干
    heavenStems[targetPalace] = earth[origPalace];
  }
  
  // 5宫天禽星寄2宫
  // 如果2宫还没有天禽，加入标记
  heaven[5] = '天禽(寄' + (heaven[2] ? '2' : '2') + '宫)';
  heavenStems[5] = earth[5] || earth[2];
  
  return {
    stars: heaven,
    stems: heavenStems,
    zhiFu: {
      star: zhiFuStar.name,
      origPalace: zhiFuOrigPalace,
      targetPalace: zhiFuTargetPalace,
    },
    shift,
  };
}

/**
 * 排人盘（八门）
 * 正确逻辑：
 * 1. 值使门 = 旬首六仪在地盘宫位的本宫门
 * 2. 值使门按时辰前进（从值使起始宫按时辰地支-旬首地支步数前进）
 */
function buildHumanPlate(earth, gz, isYang) {
  const hourGan = TIAN_GAN[gz.vals.hGan];
  const hGan = gz.vals.hGan;
  const hZhi = gz.vals.hZhi;
  
  // 找旬首六仪
  const xunZhi = ((hZhi - hGan) % 12 + 12) % 12;
  const XUN_TO_YI = { 0:'戊', 10:'己', 8:'庚', 6:'辛', 4:'壬', 2:'癸' };
  const xunYi = XUN_TO_YI[xunZhi] || '戊';
  
  // 旬首六仪在地盘的宫位
  let xunPalace = null;
  for (const [p, stem] of Object.entries(earth)) {
    if (stem === xunYi) {
      xunPalace = parseInt(p);
      break;
    }
  }
  if (!xunPalace) xunPalace = 1;
  
  // 值使门 = 旬首宫位的本宫门
  const zhiShiOrigPalace = xunPalace === 5 ? 2 : xunPalace;
  const zhiShiDoor = EIGHT_DOORS[zhiShiOrigPalace];
  
  // 时干在地盘的宫位
  let hourEarthPalace = null;
  for (const [p, stem] of Object.entries(earth)) {
    if (stem === hourGan) {
      hourEarthPalace = parseInt(p);
      break;
    }
  }
  if (hourGan === '甲' || !hourEarthPalace) {
    hourEarthPalace = xunPalace;
  }
  if (hourEarthPalace === 5) hourEarthPalace = 2;
  
  // 值使门前进步数
  // 步数 = 从旬首地支到时辰地支的步数（即时干在旬中的序号）
  const steps = hGan; // 时干序号就是在旬中的位置（甲=0, 乙=1, ..., 癸=9）
  
  // 值使门从原始宫位前进steps步
  let zhiShiTargetPalace = zhiShiOrigPalace;
  for (let i = 0; i < steps; i++) {
    zhiShiTargetPalace = nextPalace(zhiShiTargetPalace, isYang);
    // 跳过5宫
    if (zhiShiTargetPalace === 5) {
      zhiShiTargetPalace = nextPalace(zhiShiTargetPalace, isYang);
    }
  }
  
  // 偏移量
  const fromIdx = FEI_XING.indexOf(zhiShiOrigPalace === 5 ? 2 : zhiShiOrigPalace);
  const toIdx = FEI_XING.indexOf(zhiShiTargetPalace === 5 ? 2 : zhiShiTargetPalace);
  const shift = ((toIdx - fromIdx) % 8 + 8) % 8;
  
  // 排八门
  const doors = {};
  for (let i = 0; i < 8; i++) {
    const origPalace = FEI_XING[i];
    if (!EIGHT_DOORS[origPalace]) continue;
    const targetPalace = FEI_XING[(i + shift) % 8];
    doors[targetPalace] = EIGHT_DOORS[origPalace].name;
  }
  
  return {
    doors,
    zhiShi: {
      door: zhiShiDoor ? zhiShiDoor.name : '死门',
      origPalace: zhiShiOrigPalace,
      targetPalace: zhiShiTargetPalace,
    },
    shift,
  };
}

/**
 * 排神盘（八神）
 * 值符神在值符星所在宫
 * 阳遁：从值符宫顺排 值符→腾蛇→太阴→六合→白虎→玄武→九地→九天
 * 阴遁：从值符宫逆排 值符→九天→九地→玄武→白虎→六合→太阴→腾蛇
 */
function buildGodPlate(zhiFuPalace, isYang) {
  const godOrder = isYang ? EIGHT_GODS_YANG : EIGHT_GODS_YIN;
  const gods = {};
  
  let palace = zhiFuPalace === 5 ? 2 : zhiFuPalace;
  
  for (let i = 0; i < 8; i++) {
    gods[palace] = godOrder[i];
    if (isYang) {
      palace = nextPalace(palace, true);
    } else {
      palace = nextPalace(palace, false);
    }
    if (palace === 5) {
      palace = isYang ? nextPalace(palace, true) : nextPalace(palace, false);
    }
  }
  
  return { gods };
}

// ========== 空亡和马星 ==========

/**
 * 计算空亡宫位
 */
function getKongWang(dGan, dZhi) {
  // 日干支所在旬的空亡地支
  const xunZhi = ((dZhi - dGan) % 12 + 12) % 12;
  // 空亡 = 旬中未配到的两个地支
  // 甲子旬(0): 空亡戌(10)亥(11)
  // 甲戌旬(10): 空亡申(8)酉(9)
  // 甲申旬(8): 空亡午(6)未(7)
  // 甲午旬(6): 空亡辰(4)巳(5)
  // 甲辰旬(4): 空亡寅(2)卯(3)
  // 甲寅旬(2): 空亡子(0)丑(1)
  const kongZhi1 = (xunZhi + 10) % 12;
  const kongZhi2 = (xunZhi + 11) % 12;
  
  // 地支对应宫位
  const zhiToPalace = {
    0:1, 1:8, 2:8, 3:3, 4:4, 5:4,
    6:9, 7:2, 8:2, 9:7, 10:6, 11:6
  };
  
  const palaces = new Set();
  palaces.add(zhiToPalace[kongZhi1]);
  palaces.add(zhiToPalace[kongZhi2]);
  
  return {
    diZhi: [DI_ZHI[kongZhi1], DI_ZHI[kongZhi2]],
    palaces: [...palaces],
  };
}

/**
 * 计算马星（驿马）
 */
function getHorse(dZhi) {
  // 申子辰→驿马寅(8宫), 寅午戌→驿马申(2宫)
  // 巳酉丑→驿马亥(6宫), 亥卯未→驿马巳(4宫)
  const groups = {
    '申子辰': { zhi: [8,0,4], horse: 2, horsePalace: 8 },  // 寅在艮8宫
    '寅午戌': { zhi: [2,6,10], horse: 8, horsePalace: 2 }, // 申在坤2宫
    '巳酉丑': { zhi: [5,9,1], horse: 11, horsePalace: 6 }, // 亥在乾6宫
    '亥卯未': { zhi: [11,3,7], horse: 5, horsePalace: 4 }, // 巳在巽4宫
  };
  
  for (const [name, info] of Object.entries(groups)) {
    if (info.zhi.includes(dZhi)) {
      return {
        diZhi: DI_ZHI[info.horse],
        palace: info.horsePalace,
      };
    }
  }
  return { diZhi: '寅', palace: 8 };
}

// ========== 六仪击刑 ==========
/**
 * 判断六仪击刑
 * 戊在震3(卯)受刑(子卯刑), 己在坎1(子)受刑(子卯刑)... 等
 * 具体规则：
 * 戊+震3宫(卯): 子卯之刑
 * 己+坎1宫(子): 子卯之刑  [待验证]
 * 庚+艮8宫(丑寅): 丑戌之刑
 * 辛+离9宫(午): 午午自刑
 * 壬+巽4宫(巳): 寅巳之刑
 * 癸+巽4宫(巳): 寅巳之刑  [待验证]
 */
function checkLiuYiJiXing(earthPlate) {
  const xingRules = [
    { stem:'戊', palace:3, desc:'子卯之刑' },
    { stem:'庚', palace:8, desc:'丑未戌之刑' },
    { stem:'辛', palace:9, desc:'午午自刑' },
    { stem:'壬', palace:4, desc:'寅巳之刑' },
    { stem:'癸', palace:4, desc:'寅巳之刑' },
  ];
  
  const results = [];
  for (const rule of xingRules) {
    if (earthPlate[rule.palace] === rule.stem) {
      results.push(rule);
    }
  }
  return results;
}

// ========== 主排盘函数 ==========

/**
 * 完整排盘
 * @param {string|Date} dateInput - 日期时间
 * @returns {object} 完整盘面数据
 */
function calculate(dateInput) {
  let date;
  if (typeof dateInput === 'string') {
    date = new Date(dateInput);
  } else if (dateInput instanceof Date) {
    date = dateInput;
  } else {
    date = new Date();
  }
  
  if (isNaN(date.getTime())) {
    throw new Error('无效的日期格式');
  }
  
  // 1. 四柱干支
  const gz = getGanZhi(date);
  
  // 2. 定局
  const ju = determineJu(date, gz);
  
  // 3. 排地盘
  const earth = buildEarthPlate(ju.juNum, ju.isYang);
  
  // 4. 排天盘
  const heavenResult = buildHeavenPlate(earth, gz, ju.isYang);
  
  // 5. 排人盘（八门）
  const humanResult = buildHumanPlate(earth, gz, ju.isYang);
  
  // 6. 排神盘
  const godResult = buildGodPlate(heavenResult.zhiFu.targetPalace, ju.isYang);
  
  // 7. 空亡和马星
  const kongWang = getKongWang(gz.vals.dGan, gz.vals.dZhi);
  const horse = getHorse(gz.vals.dZhi);
  
  // 8. 六仪击刑
  const jiXing = checkLiuYiJiXing(earth);
  
  // 9. 组装宫位数据
  const palaces = {};
  for (let i = 1; i <= 9; i++) {
    const flags = [];
    if (kongWang.palaces.includes(i)) flags.push('空');
    if (horse.palace === i) flags.push('马');
    if (jiXing.some(j => j.palace === i)) flags.push('刑');
    
    palaces[i] = {
      position: PALACES[i].name,
      direction: PALACES[i].dir,
      element: PALACES[i].element,
      earthStem: earth[i] || '',
      heavenStem: heavenResult.stems[i] || '',
      star: heavenResult.stars[i] || '',
      door: humanResult.doors[i] || '',
      god: godResult.gods[i] || '',
      flags,
    };
  }
  
  return {
    datetime: {
      year: date.getFullYear(),
      month: date.getMonth() + 1,
      day: date.getDate(),
      hour: date.getHours(),
      minute: date.getMinutes(),
      formatted: `${date.getFullYear()}年${date.getMonth()+1}月${date.getDate()}日 ${date.getHours()}:${String(date.getMinutes()).padStart(2,'0')}`,
    },
    ganZhi: gz,
    solarTerm: gz.termName,
    yuan: ju.yuan,
    dunType: ju.dunType,
    juNum: ju.juNum,
    isYang: ju.isYang,
    method: '拆补法',
    palaces,
    zhiFu: heavenResult.zhiFu,
    zhiShi: humanResult.zhiShi,
    horse,
    kongWang,
    jiXing,
    earth,
    heavenStems: heavenResult.stems,
  };
}

module.exports = { calculate, PALACES, NINE_STARS, EIGHT_DOORS, GOD_INFO, GAN_ELEMENT, TIAN_GAN, DI_ZHI, FEI_XING, QI_YI_ORDER };


path: scripts/format.js
content: /**
 * 奇门遁甲 - 精美九宫格格式化输出模块
 * 支持终端文本和飞书消息格式
 */

const { PALACES, NINE_STARS, EIGHT_DOORS, GOD_INFO, GAN_ELEMENT } = require('./engine.js');

// ========== 字符宽度工具 ==========

/** 计算字符串显示宽度（CJK字符宽度2） */
function strWidth(str) {
  let w = 0;
  for (const ch of str) {
    const code = ch.codePointAt(0);
    // CJK范围 + 特殊符号（☵☷☳☴☰☱☶☲ 等）
    if ((code >= 0x2E80 && code <= 0x9FFF) || 
        (code >= 0xF900 && code <= 0xFAFF) ||
        (code >= 0x20000 && code <= 0x2FA1F) ||
        (code >= 0x2600 && code <= 0x27BF) ||  // Misc symbols
        (code >= 0x2190 && code <= 0x21FF)) {   // Arrows
      w += 2;
    } else if (code > 0x7f) {
      w += 2;
    } else {
      w += 1;
    }
  }
  return w;
}

/** 右填充到指定显示宽度 */
function padEnd(str, targetWidth) {
  const cur = strWidth(str);
  const padding = Math.max(0, targetWidth - cur);
  return str + ' '.repeat(padding);
}

/** 居中填充到指定显示宽度 */
function padCenter(str, targetWidth) {
  const cur = strWidth(str);
  const total = Math.max(0, targetWidth - cur);
  const left = Math.floor(total / 2);
  const right = total - left;
  return ' '.repeat(left) + str + ' '.repeat(right);
}

// ========== 九宫格 ==========

// 传统排列：4-9-2 / 3-5-7 / 8-1-6（洛书九宫）
const GRID_ROWS = [[4, 9, 2], [3, 5, 7], [8, 1, 6]];
const COL_WIDTH = 24; // 每列显示宽度

/**
 * 构建单宫格内容（6行）
 */
function buildPalaceLines(palace, palaceNum) {
  const info = PALACES[palaceNum];
  const lines = [];
  
  if (palaceNum === 5) {
    // 中5宫特殊处理
    lines.push(`${info.name}${palaceNum}宫 ${info.dir}`);
    lines.push('天禽(寄2宫)');
    lines.push('');
    lines.push('');
    lines.push(`天:${palace.heavenStem || '乙'} 地:${palace.earthStem || '乙'}`);
    lines.push('');
    return lines;
  }
  
  // 行1: 宫名+方位
  lines.push(`${info.name}${palaceNum}宫 ${info.dir}`);
  
  // 行2: 九星
  lines.push(palace.star || '');
  
  // 行3: 八门
  lines.push(palace.door || '');
  
  // 行4: 八神
  lines.push(palace.god || '');
  
  // 行5: 天地盘干
  lines.push(`天:${palace.heavenStem} 地:${palace.earthStem}`);
  
  // 行6: 标记（空亡、马星、刑等）
  const flags = [];
  if (palace.flags.includes('空')) flags.push('空');
  if (palace.flags.includes('马')) flags.push('马');
  if (palace.flags.includes('刑')) flags.push('刑');
  lines.push(flags.length > 0 ? flags.map(f => `[${f}]`).join('') : '');
  
  return lines;
}

/**
 * 格式化九宫格（纯文本）
 */
function formatGrid(chart) {
  const w = COL_WIDTH;
  let out = '';
  
  const hLine = '─'.repeat(w);
  out += '┌' + hLine + '┬' + hLine + '┬' + hLine + '┐\n';
  
  for (let r = 0; r < 3; r++) {
    const palNums = GRID_ROWS[r];
    const cols = palNums.map(n => buildPalaceLines(chart.palaces[n], n));
    
    // 6行内容
    for (let line = 0; line < 6; line++) {
      out += '│';
      for (let c = 0; c < 3; c++) {
        const text = cols[c][line] || '';
        out += ' ' + padEnd(text, w - 1) + '│';
      }
      out += '\n';
    }
    
    // 分隔线
    if (r < 2) {
      out += '├' + hLine + '┼' + hLine + '┼' + hLine + '┤\n';
    }
  }
  
  out += '└' + hLine + '┴' + hLine + '┴' + hLine + '┘\n';
  return out;
}

/**
 * 格式化头部信息
 */
function formatHeader(chart) {
  let out = '';
  out += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
  out += '          ☯️  奇门遁甲排盘\n';
  out += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
  
  out += `【时间】${chart.datetime.formatted}\n`;
  out += `【四柱】${chart.ganZhi.year}年 ${chart.ganZhi.month}月 ${chart.ganZhi.day}日 ${chart.ganZhi.hour}时\n`;
  out += `【节气】${chart.solarTerm} · ${chart.yuan}\n`;
  out += `【局制】${chart.dunType} ${chart.juNum} 局（${chart.method}）\n`;
  out += `【值符】${chart.zhiFu.star}（${chart.zhiFu.targetPalace}宫）\n`;
  out += `【值使】${chart.zhiShi.door}（${chart.zhiShi.targetPalace}宫）\n`;
  out += `【空亡】${chart.kongWang.diZhi.join('、')}（${chart.kongWang.palaces.join('、')}宫）\n`;
  out += `【马星】${chart.horse.diZhi}（${chart.horse.palace}宫）\n`;
  if (chart.jiXing && chart.jiXing.length > 0) {
    out += `【击刑】${chart.jiXing.map(j => j.stem + '在' + j.palace + '宫(' + j.desc + ')').join('、')}\n`;
  }
  out += '\n';
  return out;
}

/**
 * 格式化格局分析
 */
function formatGejus(gejuResult) {
  if (!gejuResult) return '';
  
  let out = '【格局分析】\n';
  
  if (gejuResult.auspicious.length > 0) {
    out += '🟢 吉格:\n';
    for (const g of gejuResult.auspicious) {
      out += `  ✦ ${g.name}（${g.palace}宫）`;
      if (g.desc) out += `: ${g.desc}`;
      out += '\n';
    }
  } else {
    out += '🟢 吉格: 无\n';
  }
  
  if (gejuResult.inauspicious.length > 0) {
    out += '🔴 凶格:\n';
    for (const g of gejuResult.inauspicious) {
      out += `  ✧ ${g.name}（${g.palace}宫）`;
      if (g.desc) out += `: ${g.desc}`;
      out += '\n';
    }
  } else {
    out += '🔴 凶格: 无\n';
  }
  
  // 天干克应摘要（只列有意义的）
  if (gejuResult.stemCombos) {
    const notable = Object.entries(gejuResult.stemCombos).filter(([p, c]) => c.type !== '平');
    if (notable.length > 0) {
      out += '\n📜 天干克应:\n';
      for (const [palace, combo] of notable) {
        const icon = combo.type === '吉' ? '🟢' : '🔴';
        out += `  ${icon} ${palace}宫 ${combo.heaven}+${combo.earth} = ${combo.name}${combo.desc ? '（' + combo.desc + '）' : ''}\n`;
      }
    }
  }
  
  out += `\n📊 综合评分: ${gejuResult.score}/100\n`;
  return out;
}

/**
 * 格式化解盘结论
 */
function formatInterpretation(interpretResult) {
  if (!interpretResult) return '';
  
  let out = '';
  out += '━'.repeat(40) + '\n';
  out += '【解盘结论】\n\n';
  out += interpretResult.summary + '\n\n';
  out += interpretResult.detail + '\n';
  
  // 方位/颜色/时机
  const meta = [];
  if (interpretResult.direction) meta.push(`🧭 吉方: ${interpretResult.direction}`);
  if (interpretResult.color) meta.push(`🎨 吉色: ${interpretResult.color}`);
  if (interpretResult.timing) meta.push(`⏰ 吉时: ${interpretResult.timing}`);
  if (meta.length > 0) out += '\n' + meta.join('  ') + '\n';
  
  if (interpretResult.advice) {
    out += `\n💡 建议: ${interpretResult.advice}\n`;
  }
  
  return out;
}

/**
 * 完整格式化输出
 */
function formatFull(chart, gejuResult, interpretResult) {
  let out = '';
  out += formatHeader(chart);
  out += formatGrid(chart);
  out += '\n';
  if (gejuResult) out += formatGejus(gejuResult);
  if (interpretResult) out += '\n' + formatInterpretation(interpretResult);
  out += '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
  out += '  奇门之妙在于趋吉避凶，望君审时度势\n';
  out += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
  return out;
}

module.exports = { formatGrid, formatFull, formatHeader, formatGejus, formatInterpretation, strWidth, padEnd };


path: scripts/gejus.js
content: /**
 * 奇门遁甲格局识别模块
 * 识别吉格、凶格、天干组合
 */

const { PALACES, NINE_STARS, EIGHT_DOORS, GOD_INFO, GAN_ELEMENT } = require('./engine.js');

// ========== 十天干克应（天地盘干组合） ==========
const STEM_COMBOS = {
  // 甲(戊)加X
  '戊戊':{ name:'伏吟', type:'平', desc:'事情迟缓不动' },
  '戊乙':{ name:'青龙和会', type:'吉', desc:'门户光辉，百事顺遂' },
  '戊丙':{ name:'飞鸟跌穴', type:'吉', desc:'百事大吉，谋望有成' },
  '戊丁':{ name:'青龙转光', type:'吉', desc:'官讼皆吉，出入皆利' },
  '戊己':{ name:'贵人入狱', type:'凶', desc:'公私皆不利' },
  '戊庚':{ name:'值符飞宫', type:'凶', desc:'上司有灾，吉事成凶' },
  '戊辛':{ name:'青龙折足', type:'凶', desc:'吉门被伤，求谋有阻' },
  '戊壬':{ name:'青龙入天牢', type:'凶', desc:'公私不利，官司牢狱' },
  '戊癸':{ name:'青龙华盖', type:'平', desc:'贵人有阻，暗中有助' },
  // 乙加X
  '乙乙':{ name:'日奇伏吟', type:'平', desc:'不宜谋事' },
  '乙戊':{ name:'利见中人', type:'吉', desc:'利见贵人' },
  '乙丙':{ name:'奇仪顺遂', type:'吉', desc:'谋事皆宜' },
  '乙丁':{ name:'奇仪相佐', type:'吉', desc:'最利文书' },
  '乙己':{ name:'日奇入墓', type:'凶', desc:'被人诬陷，门户破败' },
  '乙庚':{ name:'日奇被刑', type:'凶', desc:'失道被伤，争讼不利' },
  '乙辛':{ name:'青龙逃走', type:'凶', desc:'奴仆背主，六畜有灾' },
  '乙壬':{ name:'日奇入地', type:'平', desc:'尊卑悖逆，阴人害事' },
  '乙癸':{ name:'华盖逢星', type:'平', desc:'遁迹修道为吉' },
  // 丙加X
  '丙丙':{ name:'月奇伏吟', type:'平', desc:'文书阻碍' },
  '丙戊':{ name:'鸟跌穴', type:'吉', desc:'事从心想' },
  '丙乙':{ name:'日月并行', type:'吉', desc:'公谋私谋皆大吉' },
  '丙丁':{ name:'月奇朱雀', type:'吉', desc:'贵人文书皆吉' },
  '丙己':{ name:'火悖入刑', type:'凶', desc:'游魂入墓' },
  '丙庚':{ name:'荧入太白', type:'凶', desc:'贼来害我，被人欺凌' },
  '丙辛':{ name:'谋事能成', type:'吉', desc:'利于谋事' },
  '丙壬':{ name:'火入天罗', type:'凶', desc:'为客不利' },
  '丙癸':{ name:'华盖悖师', type:'凶', desc:'文书口舌是非' },
  // 丁加X
  '丁丁':{ name:'星奇伏吟', type:'平', desc:'文书不行' },
  '丁戊':{ name:'青龙转光', type:'吉', desc:'贵人财帛有喜' },
  '丁乙':{ name:'人遁吉格', type:'吉', desc:'贵人加临，百事皆吉' },
  '丁丙':{ name:'星月相会', type:'吉', desc:'贵人星助，文书有成' },
  '丁己':{ name:'火入勾陈', type:'凶', desc:'奸私仇冤，事多不明' },
  '丁庚':{ name:'文星入狱', type:'凶', desc:'文书口舌，行人不归' },
  '丁辛':{ name:'朱雀入狱', type:'凶', desc:'罪人得刑' },
  '丁壬':{ name:'五离不遇', type:'凶', desc:'文书逢鬼，口舌破财' },
  '丁癸':{ name:'朱雀投江', type:'凶', desc:'文书口舌，词讼不利' },
  // 己加X
  '己己':{ name:'地户伏吟', type:'凶', desc:'百事不遂' },
  '己戊':{ name:'犬遇青龙', type:'平', desc:'门户不正' },
  '己乙':{ name:'墓神不明', type:'凶', desc:'地户逢星，阴人害事' },
  '己丙':{ name:'火悖地户', type:'凶', desc:'文书不行' },
  '己丁':{ name:'朱雀入墓', type:'凶', desc:'文书词讼先损后益' },
  '己庚':{ name:'刑格', type:'凶', desc:'求人无益，行事有阻' },
  '己辛':{ name:'入狱自刑', type:'凶', desc:'奴仆欺主，官讼不利' },
  '己壬':{ name:'地入天牢', type:'凶', desc:'关梁不通' },
  '己癸':{ name:'地刑玄武', type:'凶', desc:'阴谋贼害，词讼不利' },
  // 庚加X
  '庚庚':{ name:'太白伏吟', type:'凶', desc:'诸事不利' },
  '庚戊':{ name:'上格', type:'凶', desc:'值符被伤，上司有灾' },
  '庚乙':{ name:'太白逢星', type:'凶', desc:'退吉进凶，谋事不成' },
  '庚丙':{ name:'太白入荧', type:'凶', desc:'贼去害人，被人告发' },
  '庚丁':{ name:'亭亭之格', type:'凶', desc:'因私匿成讼，损财招非' },
  '庚己':{ name:'刑格返名', type:'凶', desc:'上格多灾' },
  '庚辛':{ name:'白虎干格', type:'凶', desc:'官讼惊恐' },
  '庚壬':{ name:'小格', type:'凶', desc:'诸事不利' },
  '庚癸':{ name:'大格', type:'凶', desc:'行人不归，诸事不利' },
  // 辛加X
  '辛辛':{ name:'伏吟天庭', type:'凶', desc:'公废私就' },
  '辛戊':{ name:'困龙被伤', type:'凶', desc:'谋事有阻' },
  '辛乙':{ name:'白虎猖狂', type:'凶', desc:'被人欺凌，灾害重重' },
  '辛丙':{ name:'谋事有成', type:'吉', desc:'有小人阻但终成' },
  '辛丁':{ name:'狱神得奇', type:'平', desc:'经商安稳' },
  '辛己':{ name:'入墓自刑', type:'凶', desc:'奴仆被害' },
  '辛庚':{ name:'白虎出力', type:'凶', desc:'刀兵相见，主有血光' },
  '辛壬':{ name:'凶蛇入狱', type:'凶', desc:'两男争女，讼狱不息' },
  '辛癸':{ name:'天牢华盖', type:'凶', desc:'日月失明' },
  // 壬加X
  '壬壬':{ name:'天牢伏吟', type:'凶', desc:'公私皆不利' },
  '壬戊':{ name:'蛇入龙穴', type:'吉', desc:'男吉女凶' },
  '壬乙':{ name:'玉女游龙', type:'吉', desc:'有情有义' },
  '壬丙':{ name:'水蛇入火', type:'凶', desc:'官灾刑禁' },
  '壬丁':{ name:'蛇夭矫', type:'凶', desc:'文书词讼，贼来害己' },
  '壬己':{ name:'入地化柱', type:'凶', desc:'凡阴不利' },
  '壬庚':{ name:'小格', type:'凶', desc:'诸事不利' },
  '壬辛':{ name:'凶蛇入狱', type:'凶', desc:'两男争女' },
  '壬癸':{ name:'天网四张', type:'凶', desc:'行人失伴' },
  // 癸加X
  '癸癸':{ name:'华盖伏吟', type:'凶', desc:'阴人害事' },
  '癸戊':{ name:'天乙合局', type:'吉', desc:'利见贵人' },
  '癸乙':{ name:'华盖逢星', type:'平', desc:'贵人暗中相助' },
  '癸丙':{ name:'华盖悖师', type:'凶', desc:'是非口舌' },
  '癸丁':{ name:'螣蛇夭矫', type:'凶', desc:'文书官讼，贼盗不宁' },
  '癸己':{ name:'华盖地户', type:'凶', desc:'阴人害事' },
  '癸庚':{ name:'大格', type:'凶', desc:'行人不归' },
  '癸辛':{ name:'网盖天牢', type:'凶', desc:'主有官讼' },
  '癸壬':{ name:'天网四张', type:'凶', desc:'行人失伴，主落水灾' },
};

// ========== 格局识别 ==========

/**
 * 识别所有格局
 */
function identifyGejus(chartData) {
  const auspicious = [];
  const inauspicious = [];
  const stemCombos = {};
  
  // 1. 天干组合
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    const p = chartData.palaces[i];
    const key = p.heavenStem + p.earthStem;
    const combo = STEM_COMBOS[key];
    stemCombos[i] = {
      heaven: p.heavenStem,
      earth: p.earthStem,
      name: combo ? combo.name : '未知',
      type: combo ? combo.type : '平',
      desc: combo ? combo.desc : '',
    };
  }
  
  // 2. 吉格识别
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    const p = chartData.palaces[i];
    
    // 龙回首：天盘戊落在地盘戊上（甲回本位）
    if (p.heavenStem === '戊' && p.earthStem === '戊' && i !== 5) {
      // 这其实是伏吟的一种特殊情况
    }
    
    // 鸟跌穴：天盘丙落在地盘戊上
    if (p.heavenStem === '丙' && p.earthStem === '戊') {
      auspicious.push({ name:'鸟跌穴', palace:i, desc:'丙奇加甲子戊，百事大吉' });
    }
    
    // 三奇得使
    if (p.heavenStem === '乙' && p.door === '开门') {
      auspicious.push({ name:'三奇得使(乙奇开门)', palace:i, desc:'日奇得使，百事可为' });
    }
    if (p.heavenStem === '丙' && p.door === '休门') {
      auspicious.push({ name:'三奇得使(丙奇休门)', palace:i, desc:'月奇得使，贵人来助' });
    }
    if (p.heavenStem === '丁' && p.door === '生门') {
      auspicious.push({ name:'三奇得使(丁奇生门)', palace:i, desc:'星奇得使，财利大吉' });
    }
    
    // 玉女守门：丁奇+开门+太阴
    if (p.heavenStem === '丁' && p.door === '开门' && p.god === '太阴') {
      auspicious.push({ name:'玉女守门', palace:i, desc:'阴贵相助，暗中有益' });
    }
    
    // 三奇贵人升殿
    if (['乙','丙','丁'].includes(p.heavenStem)) {
      const stemEl = GAN_ELEMENT[p.heavenStem];
      const palaceEl = PALACES[i].element;
      // 三奇落在生旺之地
      if ((stemEl === '木' && palaceEl === '木') ||
          (stemEl === '火' && palaceEl === '火') ||
          (stemEl === '木' && palaceEl === '水')) { // 水生木
        auspicious.push({ name:'三奇贵人升殿', palace:i, desc:p.heavenStem + '奇得地旺相' });
      }
    }
    
    // 九遁
    // 天遁：天盘丙+地盘戊+生门（或天盘丁+地盘癸+生门）
    if (p.heavenStem === '丙' && p.earthStem === '戊' && p.door === '生门') {
      auspicious.push({ name:'天遁', palace:i, desc:'天地人三盘合一，大吉' });
    }
    // 地遁：天盘乙+地盘己+开门
    if (p.heavenStem === '乙' && p.earthStem === '己' && p.door === '开门') {
      auspicious.push({ name:'地遁', palace:i, desc:'利于隐匿、埋藏' });
    }
    // 人遁：天盘丁+地盘乙+休门+太阴
    if (p.heavenStem === '丁' && p.earthStem === '乙' && p.door === '休门' && p.god === '太阴') {
      auspicious.push({ name:'人遁', palace:i, desc:'利于求人、交际' });
    }
    // 神遁：天盘丙+地盘戊+九天（或生门+九天）
    if (p.heavenStem === '丙' && p.earthStem === '戊' && p.god === '九天') {
      auspicious.push({ name:'神遁', palace:i, desc:'利于祈福、求神' });
    }
    // 鬼遁：天盘丁+地盘癸+九地（或生门+九地）
    if (p.heavenStem === '丁' && p.earthStem === '癸' && p.god === '九地') {
      auspicious.push({ name:'鬼遁', palace:i, desc:'利于阴事、暗中行事' });
    }
    // 龙遁：天盘乙+休门+六合（卦为坎/震）
    if (p.heavenStem === '乙' && p.door === '休门' && p.god === '六合') {
      auspicious.push({ name:'龙遁', palace:i, desc:'利于求财、交易' });
    }
    // 虎遁：天盘辛+生门+太阴（或开门+太阴）
    if (p.heavenStem === '辛' && p.door === '生门' && p.god === '太阴') {
      auspicious.push({ name:'虎遁', palace:i, desc:'利于行猎、捕获' });
    }
    // 风遁：天盘乙+开门+九天（巽宫）
    if (p.heavenStem === '乙' && p.door === '开门' && p.god === '九天') {
      auspicious.push({ name:'风遁', palace:i, desc:'利于出行、行军' });
    }
    // 云遁：天盘乙+开门+九地（坤宫/艮宫）
    if (p.heavenStem === '乙' && p.door === '开门' && p.god === '九地') {
      auspicious.push({ name:'云遁', palace:i, desc:'利于隐藏、潜伏' });
    }
    
    // 吉门+吉星+吉神 = 大吉
    const doorInfo = Object.values(EIGHT_DOORS).find(d => d.name === p.door);
    const starInfo = Object.values(NINE_STARS).find(s => s.name === p.star);
    const godInfo = GOD_INFO[p.god];
    if (doorInfo && doorInfo.type === '吉' && starInfo && starInfo.type === '吉' && godInfo && godInfo.type === '吉') {
      auspicious.push({ name:'三吉会合', palace:i, desc:p.star + '+' + p.door + '+' + p.god + '，大吉之象' });
    }
  }
  
  // 3. 凶格识别
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    const p = chartData.palaces[i];
    
    // 伏吟：天盘干=地盘干
    if (p.heavenStem === p.earthStem) {
      inauspicious.push({ name:'伏吟', palace:i, desc:'事情迟缓不动，凡事宜守不宜进' });
    }
    
    // 反吟：天盘干与地盘干相冲（甲庚冲、乙辛冲、丙壬冲、丁癸冲、戊甲冲→戊庚？）
    const chongPairs = {'戊':'壬','壬':'戊','己':'癸','癸':'己','庚':'甲','辛':'乙','乙':'辛','丙':'庚','丁':'辛'};
    // 简化：五行相冲
    if (GAN_ELEMENT[p.heavenStem] && GAN_ELEMENT[p.earthStem]) {
      const hEl = GAN_ELEMENT[p.heavenStem];
      const eEl = GAN_ELEMENT[p.earthStem];
      if ((hEl === '金' && eEl === '木') || (hEl === '木' && eEl === '金') ||
          (hEl === '水' && eEl === '火') || (hEl === '火' && eEl === '水')) {
        inauspicious.push({ name:'反吟', palace:i, desc:'天地盘干相冲克，事情反复' });
      }
    }
    
    // 三奇入墓
    // 乙奇入墓：乙在坤2宫（未为乙墓）
    if (p.heavenStem === '乙' && i === 2) {
      inauspicious.push({ name:'三奇入墓(乙)', palace:i, desc:'日奇入墓，不能发挥作用' });
    }
    // 丙奇入墓：丙在乾6宫（戌为丙墓）
    if (p.heavenStem === '丙' && i === 6) {
      inauspicious.push({ name:'三奇入墓(丙)', palace:i, desc:'月奇入墓，贵人无力' });
    }
    // 丁奇入墓：丁在艮8宫？[待验证]  一般认为丁墓在丑→艮8宫不完全对
    // 传统：丁(火)墓在戌→乾6宫
    if (p.heavenStem === '丁' && i === 6) {
      inauspicious.push({ name:'三奇入墓(丁)', palace:i, desc:'星奇入墓，事情暗中受阻' });
    }
    
    // 门迫：门克宫（门不在本宫才算）
    const doorInfo = Object.values(EIGHT_DOORS).find(d => d.name === p.door);
    if (doorInfo && i !== 5) {
      const doorEl = doorInfo.element;
      const palaceEl = PALACES[i].element;
      const keMap = { '金':'木', '木':'土', '土':'水', '水':'火', '火':'金' };
      // 门在本宫不算迫
      const DOOR_ORIG = {'休门':1,'死门':2,'伤门':3,'杜门':4,'开门':6,'惊门':7,'生门':8,'景门':9};
      if (keMap[doorEl] === palaceEl && DOOR_ORIG[p.door] !== i) {
        inauspicious.push({ name:'门迫', palace:i, desc:p.door + '(' + doorEl + ')克' + PALACES[i].name + '宫(' + palaceEl + ')，门受宫制约' });
      }
    }
    
    // 大格：庚加癸
    if (p.heavenStem === '庚' && p.earthStem === '癸') {
      inauspicious.push({ name:'大格', palace:i, desc:'行人不归，诸事不利' });
    }
    // 小格：庚加壬
    if (p.heavenStem === '庚' && p.earthStem === '壬') {
      inauspicious.push({ name:'小格', palace:i, desc:'诸事不利' });
    }
    
    // 荧入太白：丙加庚
    if (p.heavenStem === '丙' && p.earthStem === '庚') {
      inauspicious.push({ name:'荧入太白', palace:i, desc:'贼来害我' });
    }
    // 太白入荧：庚加丙
    if (p.heavenStem === '庚' && p.earthStem === '丙') {
      inauspicious.push({ name:'太白入荧', palace:i, desc:'贼去害人' });
    }
    
    // 青龙逃走：乙加辛
    if (p.heavenStem === '乙' && p.earthStem === '辛') {
      inauspicious.push({ name:'青龙逃走', palace:i, desc:'奴仆背主' });
    }
    // 白虎猖狂：辛加乙
    if (p.heavenStem === '辛' && p.earthStem === '乙') {
      inauspicious.push({ name:'白虎猖狂', palace:i, desc:'被人欺凌' });
    }
    
    // 朱雀投江：丁加癸
    if (p.heavenStem === '丁' && p.earthStem === '癸') {
      inauspicious.push({ name:'朱雀投江', palace:i, desc:'文书词讼不利' });
    }
    // 螣蛇夭矫：癸加丁
    if (p.heavenStem === '癸' && p.earthStem === '丁') {
      inauspicious.push({ name:'螣蛇夭矫', palace:i, desc:'文书官讼' });
    }
    
    // 三凶门+凶星+凶神
    const starInfo = Object.values(NINE_STARS).find(s => s.name === p.star);
    const godInfo = GOD_INFO[p.god];
    if (doorInfo && doorInfo.type === '凶' && starInfo && starInfo.type === '凶' && godInfo && godInfo.type === '凶') {
      inauspicious.push({ name:'三凶会合', palace:i, desc:p.star + '+' + p.door + '+' + p.god + '，大凶之象' });
    }
  }
  
  // 4. 全局格局
  // 五不遇时：时干克日干
  const hGanEl = GAN_ELEMENT[chartData.ganZhi.hour[0]];
  const dGanEl = GAN_ELEMENT[chartData.ganZhi.day[0]];
  const keMap2 = { '金':'木', '木':'土', '土':'水', '水':'火', '火':'金' };
  if (keMap2[hGanEl] === dGanEl) {
    inauspicious.push({ name:'五不遇时', palace:0, desc:'时干克日干，诸事不利' });
  }
  
  // 值符落空
  const zhiFuPalace = chartData.zhiFu.targetPalace;
  if (chartData.kongWang.palaces.includes(zhiFuPalace)) {
    inauspicious.push({ name:'值符落空', palace:zhiFuPalace, desc:'领导不力、靠山全无' });
  }
  
  // 值使落空
  const zhiShiPalace = chartData.zhiShi.targetPalace;
  if (chartData.kongWang.palaces.includes(zhiShiPalace)) {
    inauspicious.push({ name:'值使落空', palace:zhiShiPalace, desc:'执行力缺失，计划落空' });
  }
  
  // 全局伏吟：值符星回原宫
  if (chartData.zhiFu.origPalace === chartData.zhiFu.targetPalace) {
    inauspicious.push({ name:'天盘伏吟', palace:0, desc:'九星不动，主事滞不前、进退两难' });
  }
  
  // 全局反吟：值符星到对冲宫
  const CHONG_PALACE = {1:9, 9:1, 2:8, 8:2, 3:7, 7:3, 4:6, 6:4};
  if (CHONG_PALACE[chartData.zhiFu.origPalace] === chartData.zhiFu.targetPalace) {
    inauspicious.push({ name:'天盘反吟', palace:0, desc:'九星对冲，主反复无常、出尔反尔' });
  }
  
  // 门伏吟：值使门回原宫
  if (chartData.zhiShi.origPalace === chartData.zhiShi.targetPalace) {
    inauspicious.push({ name:'门伏吟', palace:0, desc:'八门不动，人事停滞' });
  }
  
  // 门反吟：值使门到对冲宫
  if (CHONG_PALACE[chartData.zhiShi.origPalace] === chartData.zhiShi.targetPalace) {
    inauspicious.push({ name:'门反吟', palace:0, desc:'八门对冲，人事反复' });
  }
  
  // 奇门遇合（天地盘六合）
  const LIU_HE = {'甲':'己','己':'甲','乙':'庚','庚':'乙','丙':'辛','辛':'丙','丁':'壬','壬':'丁','戊':'癸','癸':'戊'};
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    const p = chartData.palaces[i];
    if (LIU_HE[p.heavenStem] === p.earthStem) {
      auspicious.push({ name:'奇门遇合', palace:i, desc:p.heavenStem + '与' + p.earthStem + '六合，主和合有助' });
    }
  }
  
  // 时干入墓
  const hourGan = chartData.ganZhi.hour[0];
  const STEM_TOMB = {'甲':2,'乙':2,'丙':6,'丁':6,'戊':6,'己':6,'庚':8,'辛':8,'壬':4,'癸':4};
  const hourTombPalace = STEM_TOMB[hourGan];
  // 找时干在天盘的宫位
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    if (chartData.palaces[i].heavenStem === hourGan && i === hourTombPalace) {
      inauspicious.push({ name:'时干入墓', palace:i, desc:hourGan + '落' + i + '宫入墓，做事不明朗' });
      break;
    }
  }
  
  // 刑格（庚加戊）
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    const p = chartData.palaces[i];
    if (p.heavenStem === '庚' && p.earthStem === '戊') {
      inauspicious.push({ name:'刑格(上格)', palace:i, desc:'庚克甲(戊)，上级施压、官灾' });
    }
  }
  
  // 天三门：开休生三吉门所在宫位
  const sanJiMen = [];
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    if (['开门','休门','生门'].includes(chartData.palaces[i].door)) {
      sanJiMen.push(i);
    }
  }
  
  // 5. 综合评分
  const score = calculateScore(auspicious, inauspicious, stemCombos);
  
  return { auspicious, inauspicious, stemCombos, score, sanJiMen };
}

/**
 * 综合评分
 */
function calculateScore(auspicious, inauspicious, stemCombos) {
  let score = 50; // 基准分
  
  // 吉格加分
  score += auspicious.length * 5;
  
  // 凶格减分
  score -= inauspicious.length * 5;
  
  // 天干组合
  for (const [p, combo] of Object.entries(stemCombos)) {
    if (combo.type === '吉') score += 3;
    if (combo.type === '凶') score -= 3;
  }
  
  return Math.max(0, Math.min(100, Math.round(score)));
}

module.exports = { identifyGejus, STEM_COMBOS };


path: scripts/interpret.js
content: /**
 * 奇门遁甲深度解盘模块
 */

const { PALACES, NINE_STARS, EIGHT_DOORS, GOD_INFO, GAN_ELEMENT } = require('./engine.js');

// 五行生克
const WU_XING_SHENG = { '木':'火', '火':'土', '土':'金', '金':'水', '水':'木' };
const WU_XING_KE = { '金':'木', '木':'土', '土':'水', '水':'火', '火':'金' };

// 四季旺衰：monthZhi → { 旺, 相, 休, 囚, 死 }
function getSeasonWangShuai(mZhi) {
  // 寅卯=春, 巳午=夏, 申酉=秋, 亥子=冬, 辰未戌丑=四季
  if ([2,3].includes(mZhi)) return { '木':'旺','火':'相','水':'休','金':'囚','土':'死' };
  if ([5,6].includes(mZhi)) return { '火':'旺','土':'相','木':'休','水':'囚','金':'死' };
  if ([8,9].includes(mZhi)) return { '金':'旺','水':'相','土':'休','火':'囚','木':'死' };
  if ([11,0].includes(mZhi)) return { '水':'旺','木':'相','金':'休','土':'囚','火':'死' };
  // 四季月：辰(4)未(7)戌(10)丑(1)
  return { '土':'旺','金':'相','火':'休','木':'囚','水':'死' };
}

const STATUS_POWER = { '旺':100, '相':80, '休':50, '囚':30, '死':10 };

function getWangShuai(element, mZhi) {
  const table = getSeasonWangShuai(mZhi);
  const status = table[element] || '休';
  return { status, power: STATUS_POWER[status] || 50 };
}

// 用神系统
const YONG_SHEN = {
  general: { name:'综合运势', primary:[{type:'stem',name:'日干'}], desc:'以日干落宫为主' },
  wealth: { name:'求财', primary:[{type:'door',name:'生门'},{type:'stem',name:'戊'}], desc:'生门为财门，戊为财星' },
  career: { name:'事业', primary:[{type:'door',name:'开门'},{type:'star',name:'天心'}], desc:'开门主事业，天心主决策' },
  marriage: { name:'婚姻', primary:[{type:'god',name:'六合'},{type:'door',name:'景门'}], desc:'六合主合和，景门主感情' },
  health: { name:'健康', primary:[{type:'star',name:'天芮'},{type:'door',name:'死门'}], desc:'天芮主疾病，死门主病灶' },
  travel: { name:'出行', primary:[{type:'door',name:'开门'},{type:'god',name:'值符'}], desc:'开门主出入，值符主贵人' },
  lawsuit: { name:'官司', primary:[{type:'door',name:'开门'},{type:'star',name:'天心'}], desc:'开门主官府，天心主法律' },
  exam: { name:'考试', primary:[{type:'star',name:'天辅'},{type:'door',name:'杜门'}], desc:'天辅主文昌，杜门主闭关苦读' },
  lost: { name:'失物', primary:[{type:'god',name:'值符'},{type:'door',name:'景门'}], desc:'值符指方向' },
  missing: { name:'寻人', primary:[{type:'god',name:'六合'},{type:'god',name:'太阴'}], desc:'六合主藏匿方位' },
  weather: { name:'天气', primary:[{type:'star',name:'天蓬'},{type:'star',name:'天冲'}], desc:'天蓬主雨，天冲主风' },
  fengshui: { name:'风水', primary:[{type:'door',name:'生门'},{type:'star',name:'天任'}], desc:'生门主旺气，天任主稳固' },
  invest: { name:'投资', primary:[{type:'door',name:'生门'},{type:'stem',name:'戊'}], desc:'同求财，关注风险' },
};

// 找用神所在宫位
function findYongShenPalace(chartData, ys) {
  for (let i = 1; i <= 9; i++) {
    if (i === 5) continue;
    const p = chartData.palaces[i];
    if (ys.type === 'door' && p.door === ys.name) return i;
    if (ys.type === 'star' && p.star === ys.name) return i;
    if (ys.type === 'god' && p.god === ys.name) return i;
    if (ys.type === 'stem') {
      // 日干落宫
      const dayGan = chartData.ganZhi.day[0];
      if (p.heavenStem === dayGan || p.earthStem === dayGan) return i;
    }
  }
  return null;
}

// 五行对应颜色
const ELEMENT_COLOR = { '金':'白色/金色', '木':'绿色/青色', '水':'黑色/蓝色', '火':'红色/紫色', '土':'黄色/棕色' };

// 解盘主函数
function interpret(chartData, gejuData, questionType = 'general') {
  const mZhi = chartData.ganZhi.vals.mZhi;
  const ysConfig = YONG_SHEN[questionType] || YONG_SHEN.general;
  
  // 找用神宫位
  const ysPalaces = [];
  for (const ys of ysConfig.primary) {
    const palace = findYongShenPalace(chartData, ys);
    if (palace) {
      ysPalaces.push({ ...ys, palace, palaceData: chartData.palaces[palace] });
    }
  }
  
  // 分析用神
  let detail = '';
  let summaryParts = [];
  let overallScore = 50;
  
  detail += `📋 问题类型：${ysConfig.name}\n`;
  detail += `📖 用神说明：${ysConfig.desc}\n\n`;
  
  for (const ys of ysPalaces) {
    const p = ys.palaceData;
    const pInfo = PALACES[ys.palace];
    
    // 用神五行旺衰
    let ysElement = '';
    if (ys.type === 'door') {
      const doorInfo = Object.values(EIGHT_DOORS).find(d => d.name === ys.name);
      ysElement = doorInfo ? doorInfo.element : '';
    } else if (ys.type === 'star') {
      const starInfo = Object.values(NINE_STARS).find(s => s.name === ys.name);
      ysElement = starInfo ? starInfo.element : '';
    } else if (ys.type === 'stem') {
      ysElement = GAN_ELEMENT[chartData.ganZhi.day[0]] || '';
    }
    
    const ws = ysElement ? getWangShuai(ysElement, mZhi) : { status:'休', power:50 };
    
    detail += `【用神: ${ys.name}】落${pInfo.name}${ys.palace}宫（${pInfo.dir}）\n`;
    detail += `  五行: ${ysElement}  旺衰: ${ws.status}(${ws.power})\n`;
    detail += `  宫内: ${p.star} + ${p.door} + ${p.god}\n`;
    detail += `  天盘: ${p.heavenStem}  地盘: ${p.earthStem}\n`;
    
    // 得地/失地判断
    if (ysElement && pInfo.element) {
      if (ysElement === pInfo.element) {
        detail += `  ✅ 用神得地（五行同宫），力量增强\n`;
        overallScore += 10;
      } else if (WU_XING_SHENG[pInfo.element] === ysElement) {
        detail += `  ✅ 宫生用神，有助力\n`;
        overallScore += 5;
      } else if (WU_XING_KE[pInfo.element] === ysElement) {
        detail += `  ❌ 宫克用神，用神受制\n`;
        overallScore -= 10;
      } else if (WU_XING_KE[ysElement] === pInfo.element) {
        detail += `  ⚠️ 用神克宫，消耗过大\n`;
        overallScore -= 5;
      }
    }
    
    // 空亡
    if (p.flags.includes('空')) {
      detail += `  ⚠️ 用神落空亡，事难成实\n`;
      overallScore -= 15;
      summaryParts.push('用神落空');
    }
    // 马星
    if (p.flags.includes('马')) {
      detail += `  🐎 用神临马星，事有变动\n`;
      summaryParts.push('临马星');
    }
    
    // 旺衰影响
    if (ws.power >= 80) {
      summaryParts.push(ys.name + '旺相有力');
      overallScore += 10;
    } else if (ws.power <= 30) {
      summaryParts.push(ys.name + '囚死无力');
      overallScore -= 10;
    }
    
    detail += '\n';
  }
  
  // 格局影响
  if (gejuData) {
    overallScore += gejuData.auspicious.length * 3;
    overallScore -= gejuData.inauspicious.length * 3;
    
    if (gejuData.auspicious.length > gejuData.inauspicious.length) {
      summaryParts.push('吉格多于凶格');
    } else if (gejuData.inauspicious.length > gejuData.auspicious.length) {
      summaryParts.push('凶格多于吉格');
    }
    
    // 特殊格局影响
    for (const g of gejuData.inauspicious) {
      if (g.name === '五不遇时') { overallScore -= 8; summaryParts.push('五不遇时'); }
      if (g.name === '值符落空') { overallScore -= 10; summaryParts.push('值符落空'); }
      if (g.name === '值使落空') { overallScore -= 8; summaryParts.push('值使落空'); }
      if (g.name === '天盘伏吟') { overallScore -= 10; summaryParts.push('天盘伏吟'); }
      if (g.name === '天盘反吟') { overallScore -= 10; summaryParts.push('天盘反吟'); }
    }
    for (const g of gejuData.auspicious) {
      if (g.name.includes('天遁') || g.name.includes('地遁') || g.name.includes('人遁')) {
        overallScore += 8;
      }
      if (g.name.includes('奇门遇合')) { overallScore += 3; }
    }
  }
  
  overallScore = Math.max(0, Math.min(100, overallScore));
  
  // 吉方（值符所在宫）
  const zhiFuPalace = chartData.zhiFu.targetPalace;
  const direction = PALACES[zhiFuPalace] ? PALACES[zhiFuPalace].dir : '中央';
  const color = PALACES[zhiFuPalace] ? ELEMENT_COLOR[PALACES[zhiFuPalace].element] || '黄色' : '黄色';
  
  // 吉时（三吉门宫位对应）
  let timing = '';
  if (gejuData && gejuData.sanJiMen) {
    const jiGong = gejuData.sanJiMen;
    timing = '三吉门在' + jiGong.map(g => PALACES[g].name + g + '宫').join('、');
  }
  
  // 生成总结
  let summary = '';
  if (overallScore >= 75) {
    summary = `🟢 ${ysConfig.name}整体大吉（${overallScore}分）。`;
  } else if (overallScore >= 55) {
    summary = `🟡 ${ysConfig.name}整体中吉（${overallScore}分），有利但需留意细节。`;
  } else if (overallScore >= 40) {
    summary = `🟠 ${ysConfig.name}整体平平（${overallScore}分），宜谨慎行事。`;
  } else {
    summary = `🔴 ${ysConfig.name}整体不利（${overallScore}分），建议暂缓或另择时日。`;
  }
  if (summaryParts.length > 0) {
    summary += ' ' + summaryParts.join('，') + '。';
  }
  
  // 建议（按问题类型个性化）
  let advice = '';
  if (overallScore >= 65) {
    const adviceMap = {
      general: `整体趋势向好，把握时机行动。可择${direction}方行事，穿${color}增运。`,
      wealth: `财运看好，宜积极求财。方向${direction}，穿${color}。注意量入为出，不贪大。`,
      career: `事业运旺，适合推进重要项目或求职面试。往${direction}方发展更佳。`,
      marriage: `感情运佳，单身可主动出击，已婚宜增进感情。${direction}方为桃花位。`,
      health: `身体无大碍，但仍需注意保养。规律作息，适量运动。`,
      travel: `出行大吉，往${direction}方向最佳。穿${color}出行平安顺利。`,
      lawsuit: `官司有利，可积极应诉。找贵人相助更佳。`,
      exam: `考运不错，静心复习，正常发挥即可。穿${color}增考运。`,
      invest: `投资时机尚可，可适量入场。注意分散风险，不宜all in。`,
      fengshui: `住宅${direction}方位气场旺盛，可在此方位布局。`,
    };
    advice = adviceMap[questionType] || adviceMap.general;
  } else if (overallScore >= 40) {
    const adviceMap = {
      general: `宜守不宜进，多观察少行动。若必须行事，可往${direction}方，穿${color}。`,
      wealth: `求财宜谨慎，不宜大额投入。小财可得，大财需等。穿${color}稍增财运。`,
      career: `事业暂缓大动作，做好本职工作。不宜跳槽或提出重大方案。`,
      marriage: `感情需耐心经营，不宜急于求成。多沟通少争吵。`,
      health: `注意身体信号，及时检查。饮食清淡，避免劳累。`,
      travel: `出行需谨慎，做好准备再动。避开凶方。`,
      lawsuit: `官司胜负未定，宜调解和解。不宜硬刚。`,
      exam: `考试中等，需更努力复习。保持心态平和。`,
      invest: `投资观望为主，不宜追高。已有仓位可持有但不加仓。`,
      fengshui: `住宅风水一般，可在${direction}方位摆放吉物化解。`,
    };
    advice = adviceMap[questionType] || adviceMap.general;
  } else {
    const adviceMap = {
      general: `建议暂缓此事，另择吉时。若不得已需行动，避开凶方，多加小心。`,
      wealth: `不宜求财，尤其避免大额交易和投机。守住现有资产为上。`,
      career: `事业运低迷，忍耐为主。不宜冒进、跳槽或得罪上司。`,
      marriage: `感情易生变故，控制情绪，避免争吵。给彼此空间。`,
      health: `健康需高度重视，建议尽快体检。注意${direction}方位的风水。`,
      travel: `不宜出行，如必须则避开凶方，做好万全准备。`,
      lawsuit: `官司不利，建议和解退让。硬来损失更大。`,
      exam: `考运不佳，需加倍努力。调整心态，做最坏打算。`,
      invest: `强烈建议不要入场，已有仓位考虑止损。现金为王。`,
      fengshui: `住宅风水有问题，建议请专业人士实地勘查。`,
    };
    advice = adviceMap[questionType] || adviceMap.general;
  }
  
  return {
    summary,
    detail,
    yongShen: ysPalaces,
    score: { overall: overallScore },
    direction,
    color,
    timing,
    advice,
  };
}

module.exports = { interpret, getWangShuai, YONG_SHEN };


path: scripts/main.js
content: #!/usr/bin/env node
/**
 * 奇门遁甲排盘系统 - CLI入口
 * 
 * 用法:
 *   node main.js                              # 当前时间排盘（综合）
 *   node main.js --time "2026-03-25 14:30"    # 指定时间
 *   node main.js --question wealth            # 指定问题类型
 *   node main.js --json                       # JSON输出
 *   node main.js --grid                       # 只输出九宫格
 */

const path = require('path');
const { calculate } = require('./engine.js');

// 动态加载可选模块（可能还在开发中）
let formatModule, gejusModule, interpretModule;
try { formatModule = require('./format.js'); } catch(e) { formatModule = null; }
try { gejusModule = require('./gejus.js'); } catch(e) { gejusModule = null; }
try { interpretModule = require('./interpret.js'); } catch(e) { interpretModule = null; }

// ========== 参数解析 ==========
function parseArgs(argv) {
  const args = {
    time: null,
    question: 'general',
    json: false,
    grid: false,
    help: false,
  };
  
  for (let i = 0; i < argv.length; i++) {
    switch(argv[i]) {
      case '--time': case '-t':
        args.time = argv[++i];
        break;
      case '--question': case '-q':
        args.question = argv[++i];
        break;
      case '--json': case '-j':
        args.json = true;
        break;
      case '--grid': case '-g':
        args.grid = true;
        break;
      case '--help': case '-h':
        args.help = true;
        break;
    }
  }
  return args;
}

// ========== 简易格式化（当format.js不可用时）==========
function simpleFormat(chart) {
  let out = '';
  
  out += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
  out += '          ☯️  奇门遁甲排盘\n';
  out += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
  
  out += `【时间】${chart.datetime.formatted}\n`;
  out += `【四柱】${chart.ganZhi.year}年 ${chart.ganZhi.month}月 ${chart.ganZhi.day}日 ${chart.ganZhi.hour}时\n`;
  out += `【节气】${chart.solarTerm} · ${chart.yuan}\n`;
  out += `【局制】${chart.dunType} ${chart.juNum} 局（${chart.method}）\n`;
  out += `【值符】${chart.zhiFu.star}（${chart.zhiFu.targetPalace}宫）\n`;
  out += `【值使】${chart.zhiShi.door}（${chart.zhiShi.targetPalace}宫）\n`;
  out += `【空亡】${chart.kongWang.diZhi.join('、')}（${chart.kongWang.palaces.join('、')}宫）\n`;
  out += `【马星】${chart.horse.diZhi}（${chart.horse.palace}宫）\n`;
  
  out += '\n';
  
  // 简易九宫格
  // 传统排列：4-9-2 / 3-5-7 / 8-1-6
  const rows = [[4,9,2],[3,5,7],[8,1,6]];
  const width = 22;
  
  out += '┌' + '─'.repeat(width) + '┬' + '─'.repeat(width) + '┬' + '─'.repeat(width) + '┐\n';
  
  for (let r = 0; r < 3; r++) {
    const ps = rows[r].map(n => chart.palaces[n]);
    
    // 行1: 宫名
    out += '│';
    for (const p of ps) {
      const label = `${p.position}${rows[r][ps.indexOf(p)]}宫 ${p.direction}`;
      out += ` ${label}${' '.repeat(Math.max(0, width - label.length - strWidth(label) + label.length - 1))}│`;
    }
    out += '\n';
    
    // 行2: 九星
    out += '│';
    for (const p of ps) {
      const label = p.star || '(天禽寄2宫)';
      out += ` ${label}${' '.repeat(Math.max(0, width - strWidth(label) - 1))}│`;
    }
    out += '\n';
    
    // 行3: 八门
    out += '│';
    for (const p of ps) {
      const label = p.door || '';
      out += ` ${label}${' '.repeat(Math.max(0, width - strWidth(label) - 1))}│`;
    }
    out += '\n';
    
    // 行4: 八神
    out += '│';
    for (const p of ps) {
      const label = p.god || '';
      out += ` ${label}${' '.repeat(Math.max(0, width - strWidth(label) - 1))}│`;
    }
    out += '\n';
    
    // 行5: 天地盘干
    out += '│';
    for (const p of ps) {
      const label = `天:${p.heavenStem || '-'} 地:${p.earthStem || '-'}`;
      out += ` ${label}${' '.repeat(Math.max(0, width - strWidth(label) - 1))}│`;
    }
    out += '\n';
    
    // 行6: 标记
    out += '│';
    for (const p of ps) {
      const label = p.flags.length > 0 ? `[${p.flags.join('][')}]` : '';
      out += ` ${label}${' '.repeat(Math.max(0, width - strWidth(label) - 1))}│`;
    }
    out += '\n';
    
    if (r < 2) {
      out += '├' + '─'.repeat(width) + '┼' + '─'.repeat(width) + '┼' + '─'.repeat(width) + '┤\n';
    }
  }
  
  out += '└' + '─'.repeat(width) + '┴' + '─'.repeat(width) + '┴' + '─'.repeat(width) + '┘\n';
  
  return out;
}

// 计算字符串显示宽度（中文字符宽度2）
function strWidth(str) {
  let w = 0;
  for (const ch of str) {
    w += ch.charCodeAt(0) > 0x7f ? 2 : 1;
  }
  return w;
}

// 右填充到指定显示宽度
function padEnd(str, targetWidth) {
  const currentWidth = strWidth(str);
  const padding = Math.max(0, targetWidth - currentWidth);
  return str + ' '.repeat(padding);
}

// ========== 帮助信息 ==========
function showHelp() {
  console.log(`
☯️  奇门遁甲排盘系统

用法:
  node main.js [选项]

选项:
  --time, -t <时间>      指定排盘时间（默认当前时间）
                         格式: "2026-03-25 14:30"
  --question, -q <类型>  指定问题类型（默认 general）
  --json, -j             JSON格式输出
  --grid, -g             只输出九宫格
  --help, -h             显示帮助

问题类型:
  general   综合运势      wealth    求财
  career    事业官运      marriage  婚姻感情
  health    疾病健康      travel    出行
  lawsuit   官司诉讼      exam      考试学业
  lost      失物寻找      missing   走失寻人
  weather   天气预测      fengshui  住宅风水
  invest    投资理财

示例:
  node main.js
  node main.js --time "2026-03-25 14:30"
  node main.js --time "2026-03-25 14:30" --question wealth
  node main.js --json
`);
}

// ========== 主入口 ==========
function main() {
  const args = parseArgs(process.argv.slice(2));
  
  if (args.help) {
    showHelp();
    return;
  }
  
  // 排盘
  const dateInput = args.time || new Date();
  let chart;
  try {
    chart = calculate(dateInput);
  } catch(e) {
    console.error('❌ 排盘失败:', e.message);
    process.exit(1);
  }
  
  // 格局识别
  let gejuResult = null;
  if (gejusModule) {
    try {
      gejuResult = gejusModule.identifyGejus(chart);
    } catch(e) {
      // 格局模块出错不影响基本排盘
    }
  }
  
  // 解盘
  let interpretResult = null;
  if (interpretModule) {
    try {
      interpretResult = interpretModule.interpret(chart, gejuResult, args.question);
    } catch(e) {
      // 解盘模块出错不影响基本排盘
    }
  }
  
  // JSON输出
  if (args.json) {
    const output = {
      chart,
      gejus: gejuResult,
      interpretation: interpretResult,
    };
    console.log(JSON.stringify(output, null, 2));
    return;
  }
  
  // 文本输出
  let output = '';
  
  // 使用format模块（包含格局+解盘）或简易格式化
  if (formatModule && !args.grid) {
    output = formatModule.formatFull(chart, gejuResult, interpretResult);
  } else if (formatModule && args.grid) {
    output = formatModule.formatGrid(chart);
  } else {
    // 无format模块时用简易格式化 + 手动拼接格局和解盘
    output = simpleFormat(chart);
    
    if (gejuResult && !args.grid) {
      output += '\n【格局分析】\n';
      if (gejuResult.auspicious.length > 0) {
        output += '🟢 吉格:\n';
        for (const g of gejuResult.auspicious) {
          output += `  ✦ ${g.name}（${g.palace}宫）${g.desc ? ': ' + g.desc : ''}\n`;
        }
      }
      if (gejuResult.inauspicious.length > 0) {
        output += '🔴 凶格:\n';
        for (const g of gejuResult.inauspicious) {
          output += `  ✧ ${g.name}（${g.palace}宫）${g.desc ? ': ' + g.desc : ''}\n`;
        }
      }
      output += `\n📊 综合评分: ${gejuResult.score}/100\n`;
    }
    
    if (interpretResult && !args.grid) {
      output += '\n' + '━'.repeat(40) + '\n';
      output += '【解盘结论】\n\n';
      output += interpretResult.summary + '\n\n';
      output += interpretResult.detail + '\n';
      if (interpretResult.direction) output += `\n🧭 吉方: ${interpretResult.direction}`;
      if (interpretResult.color) output += `  🎨 吉色: ${interpretResult.color}`;
      if (interpretResult.timing) output += `  ⏰ 吉时: ${interpretResult.timing}`;
      output += '\n';
      if (interpretResult.advice) output += `\n💡 建议: ${interpretResult.advice}\n`;
    }
    
    output += '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
    output += '  奇门之妙在于趋吉避凶，望君审时度势\n';
    output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
  }
  
  console.log(output);
}

main();


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