Skill: hello-ahang/flyai-destination-pk (version 1.0.1)

--- name: flyai-destination-pk description: 目的地PK对比助手，帮助纠结于多个目的地的用户快速做出决策。输入2-3个候选目的地、出发城市、出行日期，自动生成机票、酒店、景点的多维度对比卡片。当用户提到"选哪个目的地"、"XX还是XX"、"纠结去哪"、"对比目的地"、"PK"时使用。 --- # 目的地 PK 台 — 纠结终结器 你是一个目的地对比决策助手，帮助用户在2-3个纠结的目的地之间快速做出选择，通过机票、酒店、景点的多维度数据对比，30秒内给出决策建议。 --- ## 工具说明 > 详见 [reference/tools.md](reference/tools.md) ## 用户画像读取（双模式） 启动时读取用户历史偏好，减少重复询问。 > 详见 [reference/user-profile-storage.md](reference/user-profile-storage.md) **优先**：`search_memory(query="用户旅行画像", category="user_hobby", keywords="flyai")` **降级**：`read_file(file_path="~/.flyai/user-profile.md")` --- ## 启动对话 当用户触发此 Skill 时，使用 `ask_user_question` 工具**分步骤**收集必需信息。 ## 核心工作流 ### FlyAI 能力 > 完整命令参考见 reference 目录 **本技能主要使用**：`search-poi`、`search-hotel`、`search-flight` > 详细步骤见 [reference/core-workflow.md](reference/core-workflow.md) **核心阶段：** 1. 收集用户输入 - 候选目的地/出发城市/出行时间 2. 并行查询数据 - 机票/酒店/景点多维度搜索 3. 数据整理与评分 - 景点类型星级评估 4. 输出对比卡片 - 可视化并排对比 5. 综合推荐 - 根据用户偏好给出决策建议 ## 异常处理 | 场景 | 处理方式 | |------|----------| | 某目的地搜不到直飞航班 | 显示中转最短方案，并标注"无直飞" | | 目的地名称模糊（如"海岛"） | 追问具体目的地，或用 keyword-search 先推荐几个海岛 | | 对比超过3个目的地 | 提示"建议先选2-3个重点对比，太多反而更纠结" | | 数据维度不足以判断 | 标注"信息有限，建议结合个人偏好综合决定" | | 机票/酒店数据获取失败 | 使用"参考价"标注历史同期估价 | | 景点数据为空 | 使用 keyword-search 补充查询 | ## 后续操作 用户决定目的地后，可以继续： 1. **查看具体航班**: ```bash /flyai search-flight --origin "{出发城市}" --destination "{目的地}" --dep-date {出发日期} --back-date {返回日期} ``` 2. **查看高分酒店**: ```bash /flyai search-hotel --dest-name "{目的地}" --check-in-date {入住日期} --check-out-date {退房日期} --hotel-stars "4,5" --sort rate_desc ``` 3. **查看热门景点**: ```bash /flyai search-poi --city-name "{目的地城市}" --poi-level 5 ``` 4. **查看签证信息**（如需）: ```bash /flyai keyword-search --query "{目的地} 签证" ``` --- ## 示例对话 > 详见 [reference/examples.md](reference/examples.md) ## 三地对比扩展格式 当用户对比3个目的地时，采用表格形式输出： ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🆚 东京 vs 大阪 vs 首尔 · 全维度PK 🇯🇵 东京 🇯🇵 大阪 🇰🇷 首尔 ───────────────────────────────────────────────── ✈️ 机票 ¥2,500 ¥2,200 ¥1,800 🏨 酒店/晚 ¥500-800 ¥400-600 ¥350-500 📍 景点数 65个 48个 52个 💰 总预估 ¥6,500 ¥5,500 ¥4,300 ───────────────────────────────────────────────── 🏆 预算优先 → ✅ 首尔 🏆 景点多 → ✅ 东京 🏆 美食天堂 → ✅ 大阪 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` --- ## 用户偏好保存（双模式） 发现新偏好时提示保存。详见 [reference/user-profile-storage.md](reference/user-profile-storage.md) **保存流程**：发现偏好 → 提示确认 → Qoder用update_memory / 非Qoder更新本地文件

path: reference/examples.md
content: # 示例对话

**用户**: 清迈还是巴厘岛？上海出发，10月1日-5日，5天4晚，预算优先

**助手输出**:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🆚 清迈 vs 巴厘岛 · 全维度PK

                    🇹🇭 清迈          🇮🇩 巴厘岛
─────────────────────────────────────────────
✈️ 机票（往返）    ¥1,200-1,800     ¥2,100-3,200
                    直飞约4h          直飞约6.5h
                    
🏨 酒店（每晚）    ¥150-400         ¥300-800
   4晚总价参考      ¥600-1,600       ¥1,200-3,200
   搜到高分好评      38家             25家
                    
📍 景点/体验        搜到42个POI       搜到35个POI
   寺庙古迹类        ⭐⭐⭐⭐⭐          ⭐⭐⭐
   自然风光类        ⭐⭐⭐             ⭐⭐⭐⭐⭐
   网红打卡类        ⭐⭐⭐⭐            ⭐⭐⭐⭐
   水上活动类        ⭐⭐               ⭐⭐⭐⭐⭐
   
💰 预估总花费       ¥2,500-4,500     ¥4,500-8,500
   (机+酒，不含餐饮)
   
🏆 综合推荐：
   预算优先 → ✅ 清迈胜！总价可控制在巴厘岛的一半
   想玩海 → 巴厘岛
   文化体验 → 清迈
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

👉 下一步：
  [查看清迈具体航班] [查看清迈高分酒店] [查看清迈热门景点]
  [查看巴厘岛具体航班] [查看巴厘岛高分酒店] [查看巴厘岛热门景点]


path: reference/search-flight.md
content: # search-flight ref

## Flight Search (search-flight)

### Parameters

- **--origin** (required): Departure city or airport
- **--destination** (optional): Destination city or airport
- **--dep-date** (optional): Departure date (`YYYY-MM-DD`)
- **--dep-date-start** / **--dep-date-end** (optional): Departure date range
- **--back-date** (optional): Return date
- **--back-date-start** / **--back-date-end** (optional): Return date range
- **--journey-type** (optional): Journey type
  - `1` = direct, `2` = connecting
- **--seat-class-name** (optional): Cabin class name
- **--transport-no** (optional): Flight number
- **--transfer-city** (optional): Transfer city
- **--dep-hour-start** / **--dep-hour-end** (optional): Departure hour range (24h)
- **--arr-hour-start** / **--arr-hour-end** (optional): Arrival hour range (24h)
- **--total-duration-hour** (optional): Max total flight duration (hours)
- **--max-price** (optional): Max price (CNY)
- **--sort-type** (optional): Sort order
  - `1`: price high → low
  - `2`: recommended
  - `3`: price low → high
  - `4`: duration short → long
  - `5`: duration long → short
  - `6`: departure early → late
  - `7`: departure late → early
  - `8`: direct first

### Examples

```bash
flyai search-flight --origin "北京" --destination "上海" --dep-date 2026-03-15
flyai search-flight --origin "上海" --destination "东京" --dep-date 2026-03-20 --back-date 2026-03-25 --journey-type 1
flyai search-flight --origin "北京" --destination "上海" --dep-date 2026-03-15 --sort-type 3
```

### Output Example

```json
{
  "data": {
    "itemList": [
      {
        "adultPrice": "¥400.0",
        "journeys": [
            {
              "journeyType": "直达",
              "segments": [
                  {
                    "depCityCode": "BJS",
                    "depCityName": "北京",
                    "depStationCode": "PEK",
                    "depStationName": "首都国际机场",
                    "depStationShortName": "首都",
                    "depTerm": "T3",
                    "depDateTime": "2026-03-28 21:00:00",
                    "depWeekAbbrName": "周六",
                    "arrCityCode": "SHA",
                    "arrCityName": "上海",
                    "arrStationCode": "PVG",
                    "arrStationName": "浦东国际机场",
                    "arrStationShortName": "浦东",
                    "arrTerm": "T2",
                    "arrDateTime": "2026-03-28 23:20:00",
                    "arrWeekAbbrName": "周六",
                    "duration": "140分钟",
                    "transportType": "飞机",
                    "marketingTransportName": "国航",
                    "marketingTransportNo": "CA1883",
                    "seatClassName": "经济舱"
                  }
              ],
              "totalDuration": "140分钟"
            }
        ],
        "jumpUrl": "...",
        "totalDuration": "140分钟"
      }
    ]
  },
  "message": "success",
  "status": 0
}
```


path: reference/user-profile-storage.md
content: # 用户画像存储规范（双模式）

本文档定义了 flyai-* 技能中用户旅行画像的**跨平台存储方案**，支持 Qoder Memory 和本地文件双模式。

---

## 存储模式优先级

```
1. 优先尝试 Qoder Memory（search_memory / update_memory）
2. 如果不可用或无结果，降级使用本地文件
3. 两种模式的数据格式保持一致
```

---

## 模式判断逻辑

### 如何判断是否是 Qoder 环境

**Qoder 环境特征：**
- 具有 `search_memory` 和 `update_memory` 内置工具
- 可以直接调用这些工具而不会报错

**执行策略：**
```
尝试调用 search_memory(query="用户旅行画像", category="user_hobby", keywords="flyai")
├─ 成功返回 → Qoder 环境，使用 Memory 模式
└─ 失败/不支持 → 非 Qoder 环境，使用文件模式
```

> 在 SKILL.md 中，我们通过**描述两种路径**来实现降级，AI 会根据实际环境选择可用的方式。

---

## 模式 A：Qoder Memory

### 读取

```python
search_memory(
    query="用户旅行画像",
    category="user_hobby",
    keywords="flyai",
    depth="shallow"
)
```

### 写入

```python
update_memory(
    action="create",  # 或 "update"
    category="user_hobby",
    title="用户旅行画像",
    keywords="旅行偏好,用户画像,flyai",
    content="- 常驻城市: 杭州\n- 预算偏好: 中等"
)
```

---

## 模式 B：本地文件

### 文件路径

```
~/.flyai/user-profile.md
```

如果 `~/.flyai/` 目录不存在，需要先创建：
```bash
mkdir -p ~/.flyai
```

### 文件格式

```markdown
# FlyAI 用户旅行画像

> 最后更新: 2026-04-03 15:30

## 基础信息
- 常驻城市: 杭州
- 出发机场: 萧山机场

## 出行偏好
- 预算偏好: 中等(3000-8000/人)
- 出行人数: 2人
- 家庭成员: 有小孩(3岁)
- 偏好类型: 海岛、亲子、自然风光
- 住宿偏好: 四星及以上

## 历史记录
- 去过城市: 三亚、厦门、大理

## 特殊需求
- 宠物友好: 否
- 无障碍: 否
```

### 读取文件

```bash
cat ~/.flyai/user-profile.md
```

或使用工具：
```
read_file(file_path="~/.flyai/user-profile.md")
```

### 写入/更新文件

使用文件写入工具更新内容，记得更新"最后更新"时间戳。

---

## 统一数据字段

无论使用哪种模式，数据字段保持一致：

| 字段名 | 说明 | 示例 |
|--------|------|------|
| 常驻城市 | 用户居住城市 | 杭州 |
| 出发机场 | 首选出发机场 | 萧山机场 |
| 预算偏好 | 人均预算区间 | 中等(3000-8000/人) |
| 出行人数 | 常规同行人数 | 2人 |
| 家庭成员 | 同行人特征 | 有小孩(3岁) |
| 偏好类型 | 旅行风格 | 海岛、亲子 |
| 住宿偏好 | 酒店档次 | 四星及以上 |
| 去过城市 | 历史目的地 | 三亚、厦门 |
| 特殊需求 | 其他要求 | 宠物友好 |

---

## SKILL.md 中的写法模板

```markdown
## 启动时读取用户画像（双模式）

### 优先模式：Qoder Memory
如果支持 `search_memory` 工具，调用：
search_memory(query="用户旅行画像", category="user_hobby", keywords="flyai", depth="shallow")

### 降级模式：本地文件
如果上述工具不可用，读取本地文件：
read_file(file_path="~/.flyai/user-profile.md")

### 无画像时
如果两种方式都无结果，直接询问用户关键信息。

---

## 发现新偏好时保存（双模式）

当用户表达新偏好（如"我住杭州"、"预算3000左右"）时：

1. 提示用户确认保存：
   💡 发现新偏好：「{字段}: {值}」
   [保存到画像] [仅本次使用]

2. 用户确认后：
   - Qoder 环境：调用 update_memory 更新
   - 非 Qoder：更新 ~/.flyai/user-profile.md 文件
```

---

## 平台兼容性

| 平台 | Memory 模式 | 文件模式 |
|------|-------------|----------|
| Qoder | ✅ | ✅ |
| Cursor | ❌ | ✅ |
| Claude Desktop (MCP) | ❌ | ✅ |
| VS Code + Continue | ❌ | ✅ |
| 本地 Ollama | ❌ | ✅ |
| ChatGPT (网页版) | ❌ | ❌ |

---

## 版本记录

| 版本 | 日期 | 变更 |
|------|------|------|
| 1.0.0 | 2026-04-03 | 初始版本，定义双模式存储规范 |


path: reference/search-marriott-package.md
content: # search-marriott-package ref

## Marriott Package Search (search-marriott-package)

### Parameters

- **--keyword** (required): Search keyword, only one dimension at a time
  - Supported dimensions: province, city, brand, hotel name, selling point
- **--sort-type** (optional): Sort order
  - Values: `price_asc`, `price_desc`

### Examples

```bash
flyai search-marriott-package --keyword "上海"
flyai search-marriott-package --keyword "JW万豪" --sort-type price_asc
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
      {
        "name": "上海浦东丽思卡尔顿酒店 双人下午茶套餐",
        "brandName": "丽思卡尔顿",
        "hotelName": "上海浦东丽思卡尔顿酒店",
        "cityName": "上海",
        "price": "¥899",
        "detailUrl": "https://...",
        "mainPic": "https://img.alicdn.com/...",
        "sellingPoint": "高空景观、双人下午茶、周末可用"
      }
    ]
  }
}
```


path: reference/search-marriott-hotel.md
content: # search-marriott-hotel ref

## Marriott Hotel Search (search-marriott-hotel)

### Parameters

- **--dest-name** (required): Destination — must be a country, province, city, or district
- **--key-words** (optional): Search keywords
- **--poi-name** (optional): Nearby attraction name, used to filter by surrounding POI
- **--hotel-brands** (optional): Marriott hotel brands, comma-separated
- **--hotel-name** (optional): Exact or fuzzy hotel name
- **--hotel-bed-types** (optional): Bed type, comma-separated
  - Values: `大床房` (king), `双床房` (twin), `多床房` (multi)
- **--max-price** (optional): Max price per night (CNY)
- **--sort** (optional): Sort order
  - Values: `distance_asc`, `rate_desc`, `price_asc`, `price_desc`, `no_rank`
- **--check-in-date** (optional): Check-in date, format `YYYY-MM-DD`
- **--check-out-date** (optional): Check-out date, format `YYYY-MM-DD`

### Examples

```bash
flyai search-marriott-hotel --dest-name "上海" --hotel-brands "万豪酒店,喜来登" --check-in-date 2026-03-20 --check-out-date 2026-03-22
flyai search-marriott-hotel --dest-name "杭州" --hotel-name "杭州JW万豪酒店" --sort price_asc --max-price 1200
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
      {
        "address": "延安中路1218号",
        "brandName": "JW万豪",
        "interestsPoi": "近静安寺商圈",
        "latitude": "31.224612",
        "longitude": "121.442115",
        "mainPic": "https://img.alicdn.com/...",
        "detailUrl": "...",
        "name": "上海明天广场JW万豪酒店",
        "price": "¥1288",
        "review": "地理位置优越，服务稳定",
        "score": "4.8",
        "scoreDesc": "很棒",
        "shId": "12345678",
        "star": "豪华型"
      }
    ]
  }
}
```


path: reference/search-hotel.md
content: # search-hotel ref

## Hotel Search (search-hotel)

### Parameters

- **--dest-name** (required): Destination — must be a country, province, city, or district
- **--key-words** (optional): Search keywords
- **--poi-name** (optional): Nearby attraction name, used to filter by surrounding POI
- **--hotel-types** (optional): Hotel type
  - Values: `酒店` (hotel), `民宿` (homestay), `客栈` (inn)
- **--sort** (optional): Sort order
  - Values: `distance_asc`, `rate_desc`, `price_asc`, `price_desc`, `no_rank`
- **--check-in-date** (optional): Check-in date, format `YYYY-MM-DD`
- **--check-out-date** (optional): Check-out date, format `YYYY-MM-DD`
- **--hotel-stars** (optional): Star rating, comma-separated
  - Range: 1–5
- **--hotel-bed-types** (optional): Bed type, comma-separated
  - Values: `大床房` (king), `双床房` (twin), `多床房` (multi)
- **--max-price** (optional): Max price per night (CNY)

### Examples

```bash
flyai search-hotel --dest-name "杭州" --poi-name "西湖" --check-in-date 2026-03-10 --check-out-date 2026-03-12
flyai search-hotel --dest-name "三亚" --hotel-stars "4,5" --sort rate_desc --max-price 800
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
        {
          "address": "环城西路2号",
          "brandName": "雷迪森",
          "decorationTime": "2014",
          "interestsPoi": "近杭州西湖风景名胜区",
          "latitude": "30.259204",
          "longitude": "120.159246",
          "mainPic": "https://img.alicdn.com/...",
          "detailUrl": "...",
          "name": "杭州望湖宾馆",
          "price": "¥618",
          "review": "西湖边的位置，家庭出游首选",
          "score": "5.0",
          "scoreDesc": "超棒",
          "shId": "10021423",
          "star": "豪华型"
        }
    ]
  }
}
```


path: reference/ai-search.md
content: # ai-search ref

## AI Search (ai-search)

### Parameters

- **--query** (required): Full natural-language query for semantic search
  - Supports hotels, attractions, flights, trains, and mixed travel intent
  - Can include complex constraints such as destination, date, budget, companions, preferences, and scenario

### Examples

```bash
flyai ai-search --query "五一去杭州玩三天，预算人均2000，想住西湖附近，推荐行程和酒店"
flyai ai-search --query "下周从上海去东京，优先直飞，帮我找性价比高的航班和酒店"
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": "..."
}
```


path: reference/search-poi.md
content: # search-poi ref

## POI / Attraction Search (search-poi)

### Parameters

- **--city-name** (required): City name where the attraction is located
- **--poi-level** (optional): Attraction level
  - Range: 1–5
- **--keyword** (optional): Attraction name keyword
  - e.g. `西湖`, `故宫`, `长城`
- **--category** (optional): Attraction category (single select only)
  - Values: `自然风光` (nature) · `山湖田园` (lake & countryside) · `森林丛林` (forest) · `峡谷瀑布` (canyon & waterfall) · `沙滩海岛` (beach & island) · `沙漠草原` (desert & grassland) · `人文古迹` (cultural heritage) · `古镇古村` (ancient town) · `历史古迹` (historic site) · `园林花园` (garden) · `宗教场所` (temple) · `公园乐园` (park) · `主题乐园` (theme park) · `水上乐园` (water park) · `影视基地` (film studio) · `动物园` (zoo) · `植物园` (botanical garden) · `海洋馆` (aquarium) · `体育场馆` (sports venue) · `演出赛事` (shows & events) · `剧院剧场` (theater) · `博物馆` (museum) · `纪念馆` (memorial) · `展览馆` (exhibition hall) · `地标建筑` (landmark) · `市集` (market) · `文创街区` (creative district) · `城市观光` (city sightseeing) · `户外活动` (outdoor activities) · `滑雪` (skiing) · `漂流` (rafting) · `冲浪` (surfing) · `潜水` (diving) · `露营` (camping) · `温泉` (hot spring)

### Examples

```bash
flyai search-poi --city-name "杭州" --keyword "西湖" --category "山湖田园"
flyai search-poi --city-name "北京" --poi-level 5
flyai search-poi --city-name "西安" --category "历史古迹"
```

### Output Example

```json
{
    "data": {
      "itemList": [
        {
          "address": "陕西省西安市莲湖区北院门...",
          "id": "177224",
          "mainPic": "https://img.alicdn.com/tfscom/...",
          "jumpUrl": "...",
          "name": "西安钟鼓楼",
          "freePoiStatus": "...",
          "ticketInfo": {
              "price": null,
              "priceDate": "2026-03-19",
              "ticketName": "西安鼓楼门票 成人票"
          }
        }
      ]
    },
    "message": "success",
    "status": 0
}
```


path: reference/keyword-search.md
content: # keyword-search ref

## Keyword Search (keyword-search)

### Parameters

- **--query** (required): Search keywords, supports natural language queries for hotels, flights, etc.
  - Choose the best-matching query pattern from below:
  - **Location / Nearby**: e.g. "nearby attractions", "restaurants near {POI}"
  - **POI general**: e.g. "{POI} free travel", "{POI} routes"
  - **Attractions / Activities**: e.g. "attraction tickets", "photo tours near {POI}"
  - **Destination**: e.g. "destination guide", "destination hotels"
  - **Entertainment / Experiences**: e.g. "hot spring spa", "skiing"
  - **Tours / Packages**: e.g. "group tour", "custom tour"
  - **Food & Dining**: e.g. "food guide", "buffet"
  - **Visa / Documents**: e.g. "visa", "travel insurance"
  - **Telecom / Connectivity**: e.g. "wifi rental", "SIM card"
  - **Cruise**: e.g. "cruise", "ocean sightseeing"
  - **Other**: e.g. "time-based queries", "shopping district {POI}"

### Examples

```bash
flyai keyword-search --query "France visa"
flyai keyword-search --query "Hangzhou group tour"
flyai keyword-search --query "Hangzhou 3-day trip"
flyai keyword-search --query "Shanghai cruise"
flyai keyword-search --query "Hong Kong SIM card"
```

### Output Example

```json
{
    "data": {
      "itemList": [
        {
          "info": {
              "jumpUrl": "...",
              "picUrl": "...",
              "price": "...",
              "scoreDesc": "",
              "star": "...",
              "tags": ["..."],
              "title": "..."
          }
        }
      ]
    },
    "message": "success",
    "status": 0
}
```


path: reference/core-workflow.md
content: # 核心工作流

### 前置步骤：安装/升级 FlyAI CLI

在执行任何搜索之前，**必须先执行安装命令**（无论是否已安装，确保为最新版本）：

```bash
npm install -g @fly-ai/flyai-cli@latest --registry=https://registry.npmjs.org
```

> 💡 此命令会自动处理首次安装和版本升级，无需手动判断是否已安装。**安装后验证：**
```bash
flyai --help
```

**安装失败处理：**
| 情况 | 处理方式 |
|-----|---------|
| npm 未安装 | 提示用户先安装 Node.js (https://nodejs.org/) |
| 权限不足 | 建议使用 `sudo npm install -g @fly-ai/flyai-cli@latest --registry=https://registry.npmjs.org` 或使用 nvm 管理 Node |
| 网络问题 | 建议用户检查网络或使用国内镜像 `npm config set registry https://registry.npmmirror.com` |

**注意：** 此步骤只在首次使用时执行，后续调用会直接跳过已安装的情况。

### Step 1: 收集用户输入

使用 `ask_user_question` 工具收集以下信息：

#### 1.1 询问候选目的地

```
问题: "你纠结的目的地是哪几个？"
选项:
- "日本（东京/大阪/冲纳）"
- "东南亚（泰国/巴厘岛/越南）"
- "韩国（首尔/济州岛）"
- "我来输入具体目的地"
```

> **注意**：如果用户已经在触发语中明确了目的地（如"清迈还是巴厘岛"），则跳过此步骤。

#### 1.2 询问出发城市

```
问题: "你从哪个城市出发？"
选项:
- "上海"
- "北京"
- "广州/深圳"
- "其他城市（我来输入）"
```

#### 1.3 询问出行时间

```
问题: "你计划什么时候出行？"
选项:
- "1个月内"
- "1-2个月后"
- "2-3个月后"
- "我有具体日期（我来输入）"
```

#### 1.4 询问出行天数

```
问题: "计划玩几天？"
选项:
- "3-4天（周末短途）"
- "5-7天（小长假）"
- "7天以上（深度游）"
```

#### 1.5 询问在意维度（可选）

```
问题: "你最在意哪个方面？"
选项:
- "预算优先 - 花最少的钱"
- "景点多 - 玩的地方要多"
- "适合拍照 - 网红打卡点"
- "美食丰富 - 吃货天堂"
multiSelect: false
```

**收集完成后**，整理用户信息：
- **候选目的地**: 2-3个城市/地区
- **出发城市**: 用户所在城市
- **出行日期**: 出发日期和返回日期
- **在意维度**: 预算优先 / 景点多 / 适合拍照 / 美食丰富

如果目的地超过3个，提示：
> "建议先选2-3个重点对比，太多反而更纠结哦～"

### Step 2: 并行查询数据

为每个目的地**同时**调用三个搜索能力。

#### 2.1 查询机票

```bash
/flyai search-flight --origin "{出发城市}" --destination "{目的地}" --dep-date {出发日期} --back-date {返回日期} --sort-type 3
```

> **⚠️ SSL 证书问题**：如果通过终端执行 flyai CLI 命令时遇到 `UNABLE_TO_GET_ISSUER_CERT_LOCALLY` 错误，需要在命令前加上环境变量：
> ```bash
> NODE_TLS_REJECT_UNAUTHORIZED=0 flyai search-flight ...
> ```

**提取信息**:
- 最低价/最高价区间
- 飞行时长
- 是否有直飞

#### 2.2 查询酒店

```bash
/flyai search-hotel --dest-name "{目的地}" --check-in-date {入住日期} --check-out-date {退房日期} --sort rate_desc
```

**提取信息**:
- 每晚价格区间
- 高分酒店数量（评分4.5+）
- 酒店类型分布

#### 2.3 查询景点

```bash
/flyai search-poi --city-name "{目的地城市}"
```

**提取信息**:
- 景点总数
- 按类别统计（寺庙古迹、自然风光、网红打卡、水上活动等）

### Step 3: 数据整理与评分

#### 3.1 景点类型星级评估

根据各目的地的景点数量和类型丰富度，给出各类别的星级评分（⭐1-5颗星）：

| 类别 | 评估依据 |
|------|----------|
| 寺庙古迹类 | 历史古迹、宗教场所、古镇古村数量 |
| 自然风光类 | 山湖田园、森林丛林、峡谷瀑布数量 |
| 网红打卡类 | 地标建筑、文创街区、特色市集数量 |
| 水上活动类 | 沙滩海岛、潜水、冲浪、漂流数量 |
| 亲子娱乐类 | 主题乐园、水上乐园、动物园、海洋馆数量 |

#### 3.2 综合成本估算

```
预估总花费 = 机票往返(取中位价) + 酒店(每晚均价 × 晚数)
```

标注：不含餐饮购物

### Step 4: 输出对比卡片

按以下格式输出并排对比卡片：

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🆚 {目的地A} vs {目的地B} · 全维度PK

                    {国旗A} {目的地A}          {国旗B} {目的地B}
─────────────────────────────────────────────
✈️ 机票（往返）    ¥{低}-{高}              ¥{低}-{高}
                    {直飞/中转}约{X}h         {直飞/中转}约{X}h
                    
🏨 酒店（每晚）    ¥{低}-{高}              ¥{低}-{高}
   {N}晚总价参考    ¥{低}-{高}              ¥{低}-{高}
   搜到高分好评      {X}家                   {X}家
                    
📍 景点/体验        搜到{X}个POI            搜到{X}个POI
   寺庙古迹类        ⭐⭐⭐⭐⭐                  ⭐⭐⭐
   自然风光类        ⭐⭐⭐                     ⭐⭐⭐⭐⭐
   网红打卡类        ⭐⭐⭐⭐                    ⭐⭐⭐⭐
   水上活动类        ⭐⭐                       ⭐⭐⭐⭐⭐
   
💰 预估总花费       ¥{低}-{高}              ¥{低}-{高}
   (机+酒，不含餐饮)
   
🏆 综合推荐：
   {用户偏好} → ✅ {胜出目的地}胜！{胜出理由}
   想玩{特点A} → {推荐目的地}
   想玩{特点B} → {推荐目的地}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

👉 下一步：
  [查看{目的地A}具体航班] [查看{目的地A}高分酒店] [查看{目的地A}热门景点]
  [查看{目的地B}具体航班] [查看{目的地B}高分酒店] [查看{目的地B}热门景点]
```

### Step 5: 综合推荐逻辑

根据用户在意的维度给出推荐：

| 用户偏好 | 推荐逻辑 |
|----------|----------|
| 预算优先 | 推荐总花费最低的目的地 |
| 景点多 | 推荐POI数量最多的目的地 |
| 适合拍照 | 推荐网红打卡类评分最高的目的地 |
| 美食丰富 | 结合当地特色美食介绍推荐 |
| 亲子友好 | 推荐亲子娱乐类评分最高的目的地 |
| 海岛度假 | 推荐水上活动类评分最高的目的地 |

如果用户未指定偏好，按以下优先级综合推荐：
1. 性价比（总花费 / 景点数量）
2. 交通便利性（直飞 > 中转）
3. 景点丰富度


path: reference/search-train.md
content: # search-train ref

## Train Search (search-train)

### Parameters

- **--origin** (required): Departure city or station
- **--destination** (optional): Destination city or station
- **--dep-date** (optional): Departure date (`YYYY-MM-DD`)
- **--dep-date-start** / **--dep-date-end** (optional): Departure date range
- **--back-date** (optional): Return date
- **--back-date-start** / **--back-date-end** (optional): Return date range
- **--journey-type** (optional): Journey type
  - `1` = direct, `2` = transit
- **--seat-class-name** (optional): Seat class name, comma-separated
  - Example values: `second class`, `first class`, `business class`, `hard sleeper`, `soft sleeper`
- **--transport-no** (optional): Train number(s), comma-separated
- **--transfer-city** (optional): Transfer city(s), comma-separated
- **--dep-hour-start** / **--dep-hour-end** (optional): Departure hour range (24h)
- **--arr-hour-start** / **--arr-hour-end** (optional): Arrival hour range (24h)
- **--total-duration-hour** (optional): Max total travel duration (hours)
- **--max-price** (optional): Max price (CNY)
- **--sort-type** (optional): Sort order
  - `1`: price high -> low
  - `2`: recommended
  - `3`: price low -> high
  - `4`: duration short -> long
  - `5`: duration long -> short
  - `6`: departure early -> late
  - `7`: departure late -> early
  - `8`: direct first

### Examples

```bash
flyai search-train --origin "北京" --destination "上海"
flyai search-train --origin "北京" --destination "上海" --dep-date 2026-03-15
flyai search-train --origin "上海" --destination "杭州" --dep-date 2026-03-20 --journey-type 1 --seat-class-name "second class"
flyai search-train --origin "北京" --destination "上海" --dep-date 2026-03-15 --max-price 800 --sort-type 3
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
      {
        "adultPrice": "¥553.0",
        "journeys": [
          {
            "journeyType": "直达",
            "segments": [
              {
                "depCityName": "北京",
                "depStationName": "北京南",
                "depDateTime": "2026-03-15 08:00:00",
                "arrCityName": "上海",
                "arrStationName": "上海虹桥",
                "arrDateTime": "2026-03-15 12:28:00",
                "duration": "268分钟",
                "transportType": "火车",
                "marketingTransportNo": "G11",
                "seatClassName": "二等座"
              }
            ],
            "totalDuration": "268分钟"
          }
        ],
        "jumpUrl": "..."
      }
    ]
  }
}
```


path: reference/tools.md
content: # 工具说明

## ask_user_question 工具

用于向用户提出选择题，快速收集信息。

**格式要求**：
- question: 清晰的问题文案
- header: 简短标签（≤12字符）
- options: 2-4个选项，每个包含 label 和 description

**示例**：
```json
{
  "questions": [{
    "question": "你从哪个城市出发？",
    "header": "出发城市",
    "options": [
      { "label": "上海", "description": "长三角出发" },
      { "label": "北京", "description": "华北出发" }
    ]
  }]
}
```

## FlyAI 核心能力

使用 `npx @anthropic-ai/flyai-cli@latest` 调用飞猪数据。

**常用命令**：
- `search flights`: 搜索航班
- `search hotels`: 搜索酒店
- `search attractions`: 搜索景点
- `search restaurants`: 搜索餐厅


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