> v2.0.0 更新(2026-10-06):基于国庆武汉 5 天自驾实战复盘。5 天发生 6 次改线,4 次源于规划期没查到的信息(排队时长、景区限行、停车实况、亲子项目盲区)。v2 的核心变化是新增 Phase 2.5 可执行性体检,把这四个盲区变成交付前的强制关卡。详见 references/feasibility-check.md。
Travel Planner — 旅行计划制定助手
触发条件
用户说出以下任一类意图时自动加载本 skill:
- "帮我规划旅行""我想去 XX 玩""做个路书""亲子游怎么安排"
- "带家人去 XX""自驾游路线""XX 日游"
- 给了目的地和时间但没说清楚需求 → 自动进入 Phase 1
- 行程进行中的调整:"今天下雨了改怎么办""这个景点排队太久重新排一下""明天出发晚了来得及吗" → 跳过 Phase 1/2 直接进 Phase 2.5 体检 + 改线,改完走「联动清零」(5.6)
- 行程结束复盘:"这次行程哪里没规划好""优化一下这个技能" → 进 Phase 7 复盘回写
核心流程(Phase 1 → 2 → 2.5 → 3 → 4 → 5 → 6 → 7)
Phase 1: 需求收集 → Phase 2: 方案生成(2.0 降级决策 → MCP/WebSearch 双路径)
→ Phase 2.5: 可执行性体检 🔴(不通过不许交付)
→ Phase 3: 决策辅助 → Phase 4: 订房(可跳过) → Phase 5: 路书交付 → Phase 6: 闭环
→ Phase 7: 复盘回写(行程结束后更新本 skill)
Phase 1:需求收集 🎯 弹窗式交互
目标:通过结构化弹窗一次性收齐所有关键信息,不回锅,避免来回拉扯。
交互方式:用 AskUserQuestion 工具分 2-3 轮弹窗,让用户"点选 + 填空",而非手写长文本:
- 点选 = 预填 2-4 个常见选项,覆盖 80% 场景
- 填空 = 选 Other 走自由输入,覆盖长尾需求
- 多选 = 勾选多个标签(multiSelect: true)
- 全部 2 轮内问完,最多 3 轮(条件触发)
触发话术(开场,避免冷启动):
> "行,去云南玩!先对一下基本信息——下面弹窗点几下就完事,复杂的走 Other 自由填。"
第 1 轮 · 基础信息(4 个问题,一次问完)
> 调用一次 AskUserQuestion 抛出 4 题。
Q1 出发地:默认给一线 + 新一线城市,其他城市走 Other 填空
- 北京
- 上海
- 广州 / 深圳
- 成都 / 重庆
Q2 目的地范围(多选,云南热门组合):
- 昆明(省会 + 中转)
- 大理 + 丽江(经典北线)
- 香格里拉(高原藏区)
- 西双版纳(热带雨林)
Q3 出行月份:
- 7-8 月(暑期雨季)
- 9-10 月(秋季最佳)⭐ 推荐
- 11-12 月(冬季避寒)
- 春节 / 寒假
Q4 行程天数:
- 5-7 天(短假)
- 8-10 天(中长假)⭐ 推荐
- 11-14 天(深度游)
- 14 天以上(自驾大环线)
第 2 轮 · 人员与偏好(4 个问题,一次问完)
Q1 同行人结构:
- 情侣 / 夫妻 2 人
- 家庭带娃(孩子 3-12 岁)
- 家庭带老人(65 岁+)
- 全成人朋友聚会
Q2 交通偏好:
- 全程自驾
- 飞机到昆明 + 当地租车 ⭐ 推荐
- 火车 + 当地租车
- 全程包车
Q3 食宿预算(每人每天):
- ¥300-500(经济)
- ¥500-800(舒适)
- ¥800-1500(轻奢)⭐ 推荐
- ¥1500+(高端)
Q4 住宿偏好(多选):
- 品牌连锁(希尔顿 / IHG / 万豪等)
- 特色民宿 / 客栈
- 亲子友好
- 景观房 / 网红打卡
第 3 轮(条件触发)· 加分项
> 仅当 Round 2 同行人 = 家庭带娃 / 带老人,或目的地已锁定具体线路时触发。普通用户可跳过,直接进入整合输出。
Q1 必去景点 / 体验(填空,Other 必填)
Q2 不想去的地方(填空,Other 可空)
Q3 驾驶能力:
- 老司机,长途无压力
- 偶尔长途
- 不熟悉
- 不能开(只坐车)
Q4 旅行节奏:
- 紧凑刷景(每天 2-3 个点)
- 适中留白(每天 1-2 个点)⭐ 推荐
- 慢游发呆(半天玩半天休)
- 随性而定
整合输出:需求卡
弹窗收齐后,输出一份结构化需求卡给用户最终确认(不直接进 Phase 2):
## 需求卡
| 字段 | 你的输入 |
|------|----------|
| 出发地 | 北京 |
| 目的地 | 大理 + 丽江 |
| 出行时间 | 9-10 月 / 8 天 |
| 同行人 | 家庭带娃(孩子 5 岁)|
| 交通 | 飞机到昆明 + 当地租车 |
| 预算 | ¥800-1500 / 人 / 天 |
| 住宿 | 品牌连锁 + 亲子友好 |
| 必去 | ... |
| 不去 | ... |
| 节奏 | 适中留白 |
> 用户回复"确认 / OK / 走起"后进入 Phase 2 区域扫描;如需调整则直接说改哪一项。
Phase 2:方案生成与迭代 🔗 MCP 驱动
2.0 降级决策:MCP 可用性检查
必须在进入 2.1 之前执行。 检查 ctrip-wendao 和 amap-maps 连接状态:
情况 A:两个 MCP 均已连接 ✅
→ 走标准流程(2.1 问道扫骨架 + 高德补坐标 → 2.2 问道出骨架 + 高德拉里程)
情况 B:部分或全部 MCP 未连接 ⚠️
先告知用户,同时给出选择:
> "检测到以下 MCP 未连接:{缺失的 MCP 名称}。
> - A 方案:先去连接器管理页面安装这些 MCP,回来继续走完整流程(精度高、体验好)
> - B 方案:我先用 WebSearch 帮你跑一版,精度会打折但能快速出结果。路线里程用网络搜索估算代替高德实测,景点推荐用搜索引擎代替携程问道"
用户选 A → 等待 MCP 就绪后走标准流程。
用户选 B → 走降级流程(WebSearch 兜底),细则如下。
降级模式标志:进入降级模式后,所有里程标注为 WebSearch 估算,所有方案标注 ⚠️ 降级版(MCP 缺失)。
降级:2.1 区域扫描(WebSearch 替代 ctrip-wendao)
用 WebSearch 替代 ctrip-wendao 完成区域扫描:
- 搜索:"{目的地} 旅游攻略 必去景点 经典路线 {出行月份}"
- 搜索:"{目的地} 亲子游 自驾游 推荐"
- 从搜索结果中提取:城市/区域列表、景点梯队排名、季节适配建议
- 数据来源标注"WebSearch",非"携程问道"
降级:2.1 坐标获取(WebSearch 替代 amap-maps)
用 WebSearch 替代高德 POI 搜索获取坐标:
- 搜索:"{景点名} 经纬度" 或 "{景点名} 位置坐标"
- 从百度百科/马蜂窝等页面提取坐标信息
- 无法获取坐标的景点标注"坐标估算",在路书中使用城市中心坐标近似
- 注:降级模式下跳过营业时间获取(WebSearch 难以准确获取)
降级:2.2 方案骨架(WebSearch 替代 ctrip-wendao)
用 WebSearch 替代 ctrip-wendao 生成行程骨架:
- 搜索:"{目的地} {天数}天 自驾游路线 行程安排"
- 搜索:"{目的地} 经典环线 自驾"
- 从马蜂窝/携程攻略/穷游等结果中提取成熟的行程骨架
- 人工整理成 2-3 版方案(仿问道骨架格式)
降级:2.2 里程数据(WebSearch 替代 amap-maps)
用 WebSearch 替代高德 directionDriving 获取里程:
- 搜索:"{城市A} 到 {城市B} 自驾 多少公里 多长时间"
- 从搜索结果(百度地图网页版、马蜂窝攻略)提取距离和预估时间
- 所有里程标注为"WebSearch 估算"(非"高德实测")
- 如果搜索不到某段里程,用相近城市间直线距离 × 1.3 粗略估计,标注"粗略估算"
降级对后续 Phase 的影响
- Phase 3 决策辅助:降级模式下「事实层」和「路由层」数据源改用 WebSearch,精度下降但不影响四维决策框架
- Phase 5 路书:降级模式下的路书在封面标注
⚠️ 降级版,所有里程标注WebSearch 估算,地图仍用高德瓦片渲染(瓦片源不依赖 MCP 连接)
2.1 区域扫描 —— "问道扫骨架、搜索补血肉"
第一步:携程问道扫骨架(降级模式见 2.0)
调用 ctrip-wendao(携程问道 MCP):
- 目的地全域扫描:有哪些必去的城市/区域?
- 景点梯队排名:第一梯队(必去)、第二梯队(顺路)、第三梯队(可跳过)
- 口碑与季节适配:当前季节最适合什么?
第二步:高德补坐标(降级模式见 2.0)
调用 mcp__amap-maps__maps_text_search:
- 对问道扫出的每个城市/景区,用 keywords=景区名+city=所在城市 搜 POI
- 获取精确坐标(GCJ-02)和营业时间
第三步:四条并行扫描线(v2 新增)
> 教训:武汉实战中,全程娃满意度最高的项目(光谷空轨)初始方案里没有,是临时聊出来的。原因是只扫了「景点梯队」,漏掉了体验型项目这一整类。
用 WebSearch 同时跑 4 条线,缺一条等于留盲区:
线 1 · 观光景点(原有)
「{目的地} 必去景点 梯队」
覆盖:传统观光梯队
线 2 · 体验项目
「{目的地} 亲子 必玩」「{目的地} 带孩子 玩什么」
覆盖:科技馆、沉浸式展、动物互动、非遗手作、夜游
线 3 · 新奇特交通 🔴 最容易漏的一类
「{目的地} 空轨 磁浮 有轨电车 缆车 索道 轮渡 观光巴士」
覆盖:轨道交通体验、索道缆车、轮渡、观光巴士
说明:这类项目对学龄儿童吸引力极高,且常附带观景属性,老人也不排斥
线 4 · 新开业态
「{目的地} 2025 2026 新开 网红 打卡」
覆盖:近两年新增项目(老攻略里不会有)
第四步:人群适配标签(v2 新增)
每个景点入库时必须打齐 6 个标签,否则不许进方案:
| 标签 | 取值 |
|---|---|
| 老人友好 | 是 / 否(含楼梯、陡坡、无电梯观景台判否) |
| 推车可行 | 是 / 否 |
| 学龄娃兴奋度 | 高 / 中 / 低 |
| 场地 | 室内 / 室外 / 半室内 |
| 排队风险 | 高 / 中 / 低(见 Phase 2.5 P0-2) |
| 体力消耗 | 高 / 中 / 低 |
排程铁律:🔴 每天至少安排 1 个「学龄娃兴奋度 = 高」的项目,且不与老人高体力项排在同一半天。
输出:一份"全域目的地手册",含坐标、梯队、口碑、季节适配、人群适配标签、体验项目与新奇特交通清单。
2.2 方案骨架生成 —— 里程实时拉取
第一步:携程问道出骨架(降级模式见 2.0)
调用 ctrip-wendao:
- 基于需求卡 + 全域手册,生成 2-3 版行程骨架
- 每版含:城市节点序列、推荐景点、住宿城市
第二步:高德实时拉里程(关键!6.1 前置到这里)(降级模式见 2.0)
对每条骨架的相邻城市节点,调用:
mcp__amap-maps__maps_directionDriving({
origin: "起点经度,纬度",
destination: "终点经度,纬度"
})
获取:总距离(米)、预估时长(秒)、路线步骤
为什么用高德不用腾讯地图? 腾讯地图 MCP directionDriving 有约 30 分钟级并发限流冷却(实战踩坑),高德 directionDriving 无此问题,且坐标系同为 GCJ-02。
里程标注规则:
- 每段数据必须标注来源:高德实测 vs 规划估算
- 生成阶段即拉实测,不留"事后修正"尾巴
第三步:出方案文档
方案文档格式:
## 方案 X:[一句话概括]
**路线骨架**:城市A → 城市B → ... → 城市C
**节奏**:松/紧/适中
**取舍逻辑**:为什么选这些点
| 日期 | 行程 | 住宿 | 开车 | 亮点 |
|------|------|------|------|------|
| D1 | A→B | B | Xkm/Yh(实测) | ... |
...
**每日详情**(含景点时间建议、餐厅推荐)
2.3 迭代原则
- 用户说"太松" → 加密版(加密景点、提早出发)
- 用户说"太赶" → 拆分版(中间多住一晚)
- 每次迭代只改 1-2 个变量,不推倒重来
- 里程已实测,迭代时不需重新拉(除非改城市节点)
Phase 2.5:可执行性体检 🔴 不通过不许交付
完整清单见 references/feasibility-check.md
> 这是 v2 的核心新增。方案骨架出来后、写路书之前强制执行。P0 五项全部通过才允许交付。
| 编号 | 检查项 | 级别 | 触发条件 |
|---|---|---|---|
| 1 | 交通管制 | P0 | 全程 |
| 2 | 排队风险 | P0 | 法定节假日 |
| 3 | 停车三要素 | P0 | 自驾 |
| 4 | 营业时间闭环 | P0 | 全程(实战复盘点名的核心项) |
| 5 | 硬约束倒推 | P0 | 赶车 / 赶飞机日 |
| 6 | 跨区次数 | P1 | 同城多片区 |
| 7 | 体力预算 | P1 | 含老人 65+ 或幼儿 |
| 8 | 雨天 B 版 | P1 | 雨季或预报有雨 |
2.5.1 P0-1 交通管制
必查:管制时段 · 路名清单 · 判定规则 · 新能源是否豁免(多数城市不豁免,必须单独查) · 执法例外(出租车 / 网约车常不受限)。
产出 尾号 ↔ 日期对照表,逐日核对行程每一天。
> 反例:武汉 10/6 双日、尾号 9 单号,东湖片 15 条路 8:00–19:00 单双号、新能源不豁免 → 东湖当日不可达。出发前 2 天才查到,整个东湖安排作废。
2.5.2 P0-2 排队风险(仅法定节假日触发)
只在找到明确的同期「排队严重」证据时才加缓冲,禁止凭热度拍脑袋加时间。
- 搜同期证据:
「{景点} 国庆 排队 多久」、「{景点} 排队 避坑 攻略」(限定近 1–2 年同假期) - 分级:多条同期反馈 ≥ 1 小时 → +60 分钟;30–60 分钟 → +30 分钟;查不到 → 不加,标注「未查到排队反馈」
- 🔴 当天首个景点若判为「严重」,自动砍掉当天 1 个软点
- 附错峰动作:开园即到 / 闭园前 2 小时 / 分时预约
> 反例:黄鹤楼国庆排队 1 小时未纳入排程,当天下午全部顺延,辛亥革命博物馆被压缩到 1 小时。
2.5.3 P0-3 停车三要素
见 references/parking-playbook.md。核心是补齐「停车场出口 → 目标入口」的步行距离与时间(本次唯一漏掉的关键项),以及铁律 🔴 当日终点锚定停车场(终点必须在停车场步行 10 分钟圈内)。
2.5.4 P0-4 营业时间闭环(核心项)
必查:开放日 · 停止入园 / 停止售票时间 · 闭馆日 · 法定节假日是否例外 · 是否需预约 · 分时段场次。
硬规则
- 🔴 计划到达时间 + 30 分钟 ≤ 停止入场时间,否则该点必须前移或砍掉
- 「周一闭馆,法定节假日例外」这类条件句必须查证当日是否真的开放;OTA 页面常挂"不开放",以景区公告为准;查不到就按不开放处理并给替代
- 南北区 / 新旧馆分离的场馆分别查各自的开放与停止入场时间
- 路书里每个带时间锁的景点单独成行,标注 最后入场 HH:MM
> 反例:10/5 抵达江汉关博物馆时已闭馆(16:00 停止入场),只能看外观。当时标注为「周一闭馆,法定节假日除外」,假期内是否开放各来源口径打架,未查证即排入行程。
2.5.5 P0-5 硬约束倒推(赶车 / 赶飞机日强制)
从硬终点往前倒推,每段耗时从严取上限(高峰按 1.2 倍):
15:40 高铁 ← 14:40 到候车厅 ← 14:10 到武汉站(还车+步行 30min)← 🔴 13:10 最晚从光谷上路
规则:
- 倒推出的「最晚出发时间」在路书里标红为死线
- 🔴 至少配 2 条熔断规则:到某时点没完成某步,就砍掉后面哪一项、改成什么
- 能提前在线完成的(买票、录人脸、值机)全部写进「出发前必做」——这是最大的时间杠杆
2.5.6 体检输出格式
## 可执行性体检
| # | 检查项 | 结果 | 处置 |
|---|---|---|---|
| 1 | 交通管制 | ⚠️ 10/6 东湖片禁行 | 东湖砍掉,改光谷 |
| 2 | 排队风险 | 黄鹤楼 严重 +60min | 当天砍 1 个软点 |
| 3 | 停车三要素 | 古德寺 ✅ / 汉口江滩 ⚠️ | 汉口江滩补备选链 |
| 4 | 营业时间 | 江汉关 16:00 停止入场 | 前移到当日首个点 |
| 5 | 死线倒推 | 🔴 13:10 | 已配 2 条熔断 |
体检未通过的项必须给出处置动作,不允许只标注风险不处理。
Phase 3:决策辅助
当用户面临二选一(如"镜泊湖 vs 伊春"),走四维决策框架:
| 维度 | 分析内容 | 数据来源 |
|---|---|---|
| 事实层 | 距离、营业时间、门票、适合年龄段、体力消耗 | 高德 POI + 搜索 |
| 口碑层 | 最近游客评价、亲子友好度 | 携程问道 + 小红书 |
| 性价比层 | 时间投入 vs 体验产出 | 综合判断 |
| 路由层 | 选了 A 对整条线路的影响 | 高德重算里程 |
输出:一份对比报告,给出推荐(带理由),不等用户做选择题。
Phase 4:订房执行 🔗 携程问道 · 可跳过
触发条件:用户确认最终方案后触发。用户可以跳过(说"酒店我自己定")。
4.1 酒店推荐
标准模式(ctrip-wendao 可用):
逐城调用 ctrip-wendao:
"在[城市名]推荐3家亲子友好酒店,靠近[核心景点/区域],
预算约[预算范围]/晚,含评分、价格、特色"
降级模式(ctrip-wendao 不可用,见 2.0):
用 WebSearch 替代 ctrip-wendao 搜酒店推荐:
- 搜索:"{城市} 亲子酒店 推荐 {预算}元"
- 搜索:"{城市} {酒店名} 携程 评分"(验证评分和价格)
- 从携程/马蜂窝/大众点评结果中提取酒店信息和预订链接
输出格式:每城 3 选 1 对比表(必须含预订链接)
### [城市名]住宿推荐
| 酒店 | 评分 | 参考价/晚 | 位置 | 亲子亮点 | 预订 |
|------|------|-----------|------|----------|------|
| A | 4.8 | ¥XXX | ... | ... | [预订](链接) |
| B | 4.6 | ¥XXX | ... | ... | [预订](链接) |
| C | 4.5 | ¥XXX | ... | ... | [预订](链接) |
推荐:A,理由:...
4.2 预订链接(⚠️ 铁律:每家必须配链接)
每家推荐酒店必须附带携程预订链接,不允许出现"请在携程搜索"这类无链接输出。
调用方式:
用 WebSearch 搜索:
"[酒店完整名称] 携程 预订"
从搜索结果中提取 hotels.ctrip.com/hotel/ 或 hotels.ctrip.com/hotels/ 开头的链接。
⚠️ 注意:携程问道(ctrip-wendao)不提供直接预订 URL,多次验证均返回"无法直接提供可点击的预订URL"。因此预订链接统一通过 WebSearch 获取,不依赖问道。
输出格式:每家酒店行末追加 [预订](链接)。
铁律:链接缺失 ≠ 跳过,WebSearch 搜到为止。
4.3 跳过机制
用户说以下任一句即跳过 Phase 4,直接进入 Phase 5:
- "酒店我自己定"
- "不用推荐酒店"
- "订房我自己来"
Phase 5:路书交付
5.1 受众适配
| 版本 | 适用对象 | 特点 |
|---|---|---|
| 家人版 | 同行的家人 | 文字温暖、地图直观、照片丰富 |
| 执行版 | 自己看 | 时间节点、订房链接、备选方案 |
| 长辈版 | 老人 | 大字、中文标注、无拼音 |
5.2 技术栈(固定规范)
地图:
- 引擎:Leaflet(CDN 引入)
- 瓦片源:高德 https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}(style=7,浅色底)
- 子域名:1-4 轮询
- 坐标系:GCJ-02(高德、腾讯地图同系)
- 每个地图页面独立创建瓦片层(Leaflet 不能共享实例)
照片:
- 源:Wikimedia Commons(https://commons.wikimedia.org/wiki/Special:FilePath/文件名)
- 校验:请求后检查是否 404
- Fallback:占位文字"实景以现场为准"
格式:
- 单文件 HTML(免部署、手机可看、打印友好)
- 原生 CSS + JS,无框架依赖
- 吸顶导航 + 打印样式 + 手机适配
里程/时间标注:
- 标准模式:所有里程从 Phase 2 高德实测数据填入
- 降级模式:所有里程从 Phase 2 WebSearch 估算填入,统一标注 WebSearch 估算
- 每段标注"约 X 小时(含休息建议预留 Y 小时)"
5.3 路书结构(v2:可折叠区块,仍是单页单一入口)
封面(标题 + 日期 + 路线概要 + [降级模式时追标 ⚠️ 降级版])
总览页(全程路线图 + 总览表 + 亮点速览)
逐日页 D1-DN(每日时刻表 + 路线图 + 景点照片 + 文字描述)
每日常驻展开:时刻表 · 🔴硬点/死线 · 🅿停车与导航
每日常驻折叠:备选方案 · 雨天 B 版 · 景点详解
全局折叠区:可执行性体检表 · 景点百科 · 门票总表 · 天气详表 · 行前准备清单
折叠规则(实战复盘定版)
| 区块 | 默认 |
|---|---|
| 当日行程时刻表 / 硬点提醒 / 死线倒推表 / 停车导航 | 展开 |
| 景点百科 / 行前清单 / 天气详表 / 门票总表 | 折叠 |
| 备选方案 / 雨天 B 版 / 体检表 | 折叠 |
- 手机端折叠头点击区 ≥ 44px,标题字号 ≥ 15px
- 用
localStorage记住展开状态 - 衍生内容(路线图、清单、体检表)全部内联,不拆多页;页内锚点跳转,不外链
时间锁可视化
🔴 硬点 · 19:00 苗家码头取票(分时场次)
⏰ 时间锁 · 江汉关博物馆 16:00 停止入场
每日顶部硬点 ≤ 2 个,其余为软点(可砍)。
5.4 工程自检(技术项)
> 完整工程坑见 references/roadbook-checklist.md。流程项见 5.7,两份一起过。
- [ ] 所有 map div id 合法(不能有
/、空格等特殊字符) - [ ] 逐日地图独立创建
L.tileLayer实例(共享实例只挂到最后一张图) - [ ] 城市标签为中文(不能用拼音)
- [ ] 成员姓名已清除(如用户要求不显示)
- [ ] 地图瓦片能加载(高德 style=7 可用,style=6 返回 404)
- [ ] 图片不 404(有 fallback)
- [ ] 文件路径写完整绝对路径
5.5 关键技术要点
WGS-84 → GCJ-02 转换(见 references/wgs84_to_gcj02.py)
Leaflet 多地图共享瓦片实例 Bug:
// ❌ 错误:全局共享 tiles 实例,只挂到最后一个地图
var tiles = L.tileLayer(...);
tiles.addTo(map1);
tiles.addTo(map2); // 实际上不会显示
// ✅ 正确:每个地图独立创建
function initMap(mapId, ...) {
var map = L.map(mapId).setView([lat, lng], zoom);
L.tileLayer(url, opts).addTo(map); // 独立实例
...
}
HTML 生成建议:
- 用 Python f-string 模板生成(批量替换数据,避免手动拼 HTML)
- 数据字典(城市坐标、路线坐标、景点名称、图片 URL)独立维护
5.6 发布与变更管理(v2 新增)
完整规范见 references/roadbook-blocks.md。
发布通道
- ✅ 主通道:资料库 page/import_html.py + page/publish_page.py
- ❌ workbuddy_sites_deploy 已排除:2026-10-04 连试 6 次全部 fetch failed,换纯英文路径、67 字节 hello-world 目录同样失败,属服务不可用
- 资料库导入要点:ZIP 会失败,改单文件逐个导入;显式给 --file-name;更新用 --node-block-id
联动清零:改动一处后 grep 全文件的旧时间点 / 旧景点名 / 旧死线,残留必须清零。
> 实例:10/6 出发时间 8:00 → 9:30,联动改了 10 处,12:45 旧死线全文件清零。
交付前校验(自建 _validate_html.py)
- 标签配平 + 抽取每段 <script> 用 node vm.Script 做语法检查
- ⚠️ 校验脚本里写死的 node 路径会被版本升级顶掉,报 FileNotFoundError 时先查该路径
内嵌片段必须做作用域隔离
- CSS 选择器加容器 id 前缀;JS 选择器同步作用域化
- ⚠️ 踩过的坑:前缀插到引号外面生成 querySelectorAll('#ck 'input[...]'),JS 语法错。正确做法是替换 querySelectorAll(' 这个完整片段
A / B 版并存:重大改线时保留旧版文件,新版另存,旧版不删。
5.7 交付前自检(流程项,v2 新增)
规划质量
- [ ] Phase 2.5 的 P0 五项已全部通过,未通过的已给处置动作
- [ ] 每日硬点 ≤ 2 个,且已在每日顶部标注
- [ ] 每个带停止入场时间的景点已标注 最后入场 HH:MM,到馆余量 ≥ 30 分钟
- [ ] 「周一闭馆 / 节假日例外」这类条件句已查证当日是否真的开放
- [ ] 每个停车点五要素齐全,终点在停车场步行 10 分钟圈内
- [ ] 法定节假日的高风险景点已附同期排队证据,缓冲已计入
- [ ] 赶车日已有死线倒推表 + ≥2 条熔断规则
- [ ] 每天至少 1 个「学龄娃兴奋度 = 高」的项目(带娃时)
- [ ] 每天有雨天 B 版(雨季或预报有雨时)
交付形态
- [ ] 折叠区块按 5.3 规则设置,手机端点得动
- [ ] 单一入口,衍生内容已内联,无外链依赖
- [ ] 改线后旧时间点 / 旧景点名残留已清零
- [ ] 已跑标签配平 + JS 语法校验
- [ ] 已按 5.4 工程自检过一遍
Phase 6:闭环
- 逐项确认:所有里程 = 实测值、所有图片可加载、所有链接有效
- 将最终路书 HTML present 给用户
- 如果用户要求订房,确认预订链接可访问
- 不需要事后补数据(Phase 2 已拉完实数)
Phase 7:复盘回写(v2 新增)
触发:行程结束,或用户在行程中反馈实际问题。
动作:把实际踩到的坑回写进本 skill,形成闭环。
| 实际反馈 | 回写位置 |
|---|---|
| 某景点排队超预期 | references/feasibility-check.md P0-2 分级表,追加实例 |
| 停车不好找 / 位置不对 / 离终点远 | references/parking-playbook.md 反例记录 |
| 场馆闭馆 / 停止入场没赶上 | feasibility-check.md P0-4 反例 |
| 某个亲子项目没被推荐出来 | Phase 2.1 扫描线,补搜索式 |
| 限行 / 管制查晚了 | feasibility-check.md P0-1 反例 |
| 交付形态问题(体积、拆页、发布失败) | references/roadbook-blocks.md |
回写格式:每条必须含「实际发生了什么 / 规划期为什么没发现 / 补进哪条规则」三段,缺任一段不收。
版本号:功能性回写升 minor,流程性微调升 patch。
自动化任务
如果数据拉取因 MCP 限流等外部原因中断,建一次性 automation 待冷却恢复后继续:
automation_update(mode="create", scheduleType="once", ...)
自动化 prompt 要求:
- 写清楚"不碰已实测数据"
- 写清楚"严格串行、不并发"
- 写清楚"限流时暂停 X 分钟重试,不无限循环"
- 完成后 present 更新后的路书
设计原则
| 原则 | 说明 |
|---|---|
| 先区域扫描,再生成方案 | 用户对目的地认知不完整时,先给全景视野再决策 |
| 四条扫描线并行 | 观光景点 + 体验项目 + 新奇特交通 + 新开业态,缺一条留一个盲区 |
| 体检不过不交付 | Phase 2.5 的 P0 五项(限行 / 排队 / 停车 / 营业时间 / 死线)是硬关卡 |
| 排队缓冲依赖证据 | 只有查到同期「排队严重」的评论或报道才加时间,不凭热度拍脑袋 |
| 营业时间以停止入场为准 | 「计划到达 + 30min ≤ 停止入场」,条件句必须查证当日是否真的开放 |
| 终点锚定停车场 | 当天最后一站必须在停车场步行 10 分钟圈内 |
| 硬约束从终点倒推 | 赶车赶飞机日一律做死线倒推表 + ≥2 条熔断规则 |
| 每次迭代只改 1-2 个变量 | 不推倒重来,保护用户心智投入 |
| 改一处,联动清零 | 改时间点 / 改景点后 grep 全文件残留,旧数据必须清零 |
| 里程在生成阶段即实测 | 高德实时拉,不留"事后修正"尾巴 |
| 问道扫骨架、搜索补血肉 | MCP 出结构化数据,公开搜索补口碑细节 |
| 二选一不走直觉 | 四维框架(事实/口碑/性价比/路由)辅助决策 |
| 受众决定交付形式 | 家人版 ≠ 执行版 ≠ 长辈版 |
| 单一入口 + 可折叠 | 衍生内容内联不拆页;高频信息常驻展开,查阅信息默认折叠 |
| 路书是工程产物 | 考虑瓦片 bug、坐标偏移、图片 404、id 合法性、标签配平、JS 语法 |
| 订房可跳过 | 用户说"酒店我自己定"即跳过 Phase 4 |
| MCP 缺失不卡流程 | 检测到 MCP 未连接时,给用户 A/B 两选(安装 MCP / WebSearch 降级),绝不卡在"请安装"不动 |
| 复盘回写 | 行程结束把实际问题写回本 skill,问题不重复犯第二次 |
References 索引(按需加载)
| 文件 | 何时读 |
|---|---|
references/feasibility-check.md |
Phase 2.5 必读:8 项体检的完整判据、搜索式、反例 |
references/parking-playbook.md |
自驾行程的 Phase 2.5 P0-3 必读:停车五要素与铁律 |
references/roadbook-blocks.md |
Phase 5 必读:折叠区块规范、发布通道、变更管理、校验脚本 |
references/roadbook-checklist.md |
Phase 5 必读:地图瓦片、坐标偏移、图片 404 等工程坑 |
references/wgs84_to_gcj02.py |
需要坐标转换时调用 |
MCP 依赖
本 skill 优先依赖以下 MCP 连接器,缺失时有 WebSearch 降级方案(详见 Phase 2.0):
| MCP | 用途 | 降级方案 |
|---|---|---|
| ctrip-wendao(携程问道) | 区域扫描、行程生成、酒店推荐 | WebSearch 搜索攻略/游记/酒店推荐 |
| amap-maps(高德地图) | 驾车里程/时长、POI 坐标、天气 | WebSearch 搜索距离/坐标,标注"估算" |
前置检查:Phase 2 开始前,先确认两个 MCP 连接状态。
- 均已连接 → 走标准流程
- 缺失任一 → 执行降级决策(AskUserQuestion 让用户选 A 装 MCP 或 B 降级走 WebSearch)
- 绝不卡在"请安装 MCP"不动——用户选 B 则立刻用 WebSearch 兜底推进