Files
Xboard/.helloagents/archive/2026-04/202604180029_fix-clashmeta-flow-map-export/proposal.md
T

128 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 变更提案: fix-clashmeta-flow-map-export
## 元信息
```yaml
类型: 修复
方案类型: implementation
优先级: P1
状态: 已确认
创建: 2026-04-18
```
---
## 1. 需求
### 背景
当前 Clash Meta 订阅模板本身是合法的 block style YAML,但服务端在导出订阅时会重新执行
`Yaml::dump(...)`。由于 `inline` 深度设置过低,深层节点对象会被压成单行 flow map,
例如 TUIC 节点被输出为 `{ name: ..., alpn: [h3, h2, http/1.1], ... }`
在部分 Clash Meta 客户端中,这种超长单行 flow map 会触发:
`Flow map in block collection must be sufficiently indented and end with a }`
### 目标
- 修复 Clash Meta 订阅导出,避免代理节点被压成易出错的单行 flow map。
- 保持改动最小,仅影响 `ClashMeta` 导出链路。
- 不改动模板文件和其他协议导出器。
### 约束条件
```yaml
时间约束: 当前回合内完成修复与静态验证
性能约束: 不引入额外运行时依赖
兼容性约束: 不改动节点字段语义,仅调整 YAML 序列化风格
业务约束: 仅修复 Clash MetaClash / Stash 暂不联动修改
```
### 验收标准
- [ ] `app/Protocols/ClashMeta.php` 中 YAML 导出策略已调整,深层对象优先输出为 block style
- [ ] 不再依赖单行 flow map 来表示 `proxies` 中的 TUIC 等节点对象
- [ ] 改动范围限制在 `ClashMeta` 导出逻辑与方案包记录
- [ ] 完成最小静态验证并明确运行验证受限原因
---
## 2. 方案
### 技术方案
`ClashMeta` 中的 `Yaml::dump($config, 2, 4, ...)` 提升为更高的 inline 深度阈值,
使 `proxies``proxy-groups` 等深层结构优先以 block style 导出,而不是压缩成单行 flow map。
本次仅修改:
1. `app/Protocols/ClashMeta.php` 的 dump 参数;
2. 在代码旁增加一行说明性注释,明确修复目的;
3. 不改模板、不改节点字段构造、不改 Clash / Stash。
### 影响范围
```yaml
涉及模块:
- ClashMeta 订阅导出: YAML 序列化风格调整
- .helloagents 方案包: 记录本次修复过程
预计变更文件: 2-4
```
### 风险评估
| 风险 | 等级 | 应对 |
|------|------|------|
| 导出 YAML 变得更“展开”,文件体积略增 | 低 | 只调整序列化风格,不改字段内容 |
| 同类问题在 `Clash` / `Stash` 中也存在,但本次未修 | 中 | 范围明确限制为 Clash Meta,后续可按需补修 |
| 本机无 PHP / vendor,无法直接做运行时生成验证 | 中 | 通过代码路径与参数语义做静态验证,并在结论中说明限制 |
---
## 3. 技术设计(可选)
> 本次为序列化参数修复,不涉及架构/API/数据模型设计。
### 架构设计
N/A
### API设计
N/A
### 数据模型
N/A
---
## 4. 核心场景
### 场景: 导出含长 TUIC 节点的 Clash Meta 订阅
**模块**: Clash Meta 订阅导出
**条件**: 用户订阅中包含较长节点名、`alpn` 数组、`udp-relay-mode` 等字段
**行为**: 服务端生成 YAML 订阅文本
**结果**: 节点对象以 block style 输出,避免客户端在解析长单行 flow map 时失败
---
## 5. 技术决策
### fix-clashmeta-flow-map-export#D001: 只调整 dump 参数,不重写节点构造逻辑
**日期**: 2026-04-18
**状态**: ✅采纳
**背景**: 问题的根源在序列化风格,而不是 TUIC 节点字段本身的构造。
**选项分析**:
| 选项 | 优点 | 缺点 |
|------|------|------|
| A: 提高 `Yaml::dump` 的 inline 深度阈值 | 改动最小,直接命中根因,不改变节点字段 | 输出会更展开 |
| B: 手工重写整个 YAML 渲染流程 | 可完全控制格式 | 风险高,改动大,超出当前修复范围 |
**决策**: 选择方案 A
**理由**: 当前问题是 flow style 输出兼容性差,调高 dump 阈值即可稳定转回 block style,最符合最小修复原则。
**影响**: 仅影响 Clash Meta 订阅的最终文本格式,不影响节点字段语义
---
## 6. 成果设计
### 设计方向
- N/A
### 视觉要素
- N/A
### 技术约束
- **可访问性**: N/A
- **响应式**: N/A