# CF DNS 命令修复与扩展记录（2026-03-19）

## 背景
用户要求：
- `/cf dnsproxy` 支持直接用域名，例如：`/cf dnsproxy ima.good.xx.kg on`
- `/cf dnsadd` 最后参数用 `on/off` 表示是否开启代理

线上报错：
- `yaml: line 8: did not find expected key`
- `/cf dnsproxy` 解析失败（bash: bad substitution）

## 改动概览
1) **命令解析**
- `internal/module/cf/commands.go`
  - `/cf dnsproxy` 支持 `record_id|name`
  - `/cf dnsadd` 支持 `on/off`（兼容 true/false；当未提供 on/off 时把第4参数视为类型）

2) **帮助文案**
- `internal/module/cf/module.go`
- `internal/core/ops/service.go`
  - 更新 `/cf dnsadd` 与 `/cf dnsproxy` 的参数示例

3) **runbook 修复**
- `runbooks/cf_dns_proxy.yaml`
  - 解决 YAML 行内命令渲染与变量替换问题
  - 修复 `${env.INPUT_RECORD_ID}` 未替换导致 bash 报错
  - 加入占位值 `__empty__`，避免空变量导致替换缺失
  - `update_dns` 中 JSON 通过单引号包裹，避免 shell 分词/换行破坏

4) **ops-runner 支持**
- `cmd/ops-runner/main.go`
  - 增加 `/cf dnsproxy` 支持
  - `/cf dnsadd` 参数改为 on/off

## 问题与修复记录
### 1. YAML 解析错误
- 现象：`yaml: line 8: did not find expected key`
- 原因：runbook 中 command 复杂引号/换行组合导致 YAML 解析失败
- 修复：重写 `cf_dns_proxy.yaml` command 区块

### 2. dnsproxy 变量替换失败
- 现象：`bash: ${env.INPUT_RECORD_ID}: bad substitution`
- 原因：输入为空时，没有替换占位，shell 直接解析 `${env.INPUT_RECORD_ID}`
- 修复：InputsFn 总是注入 `record_id/name` 占位值，runbook 将 `__empty__` 转为空

### 3. dnsproxy update 失败（JSON 被 shell 吞掉）
- 现象：`bash: line 1: true,: command not found`
- 原因：`${steps.resolve_dns.output}` 未加引号，JSON 被 shell 拆分
- 修复：`INPUT_JSON='${steps.resolve_dns.output}'`

### 4. dnsadd on/off 支持
- 现象：`DNS record type "on" is invalid`
- 原因：解析逻辑未识别 on/off，误当作类型
- 修复：InputsFn 与 ops-runner 同步支持 `on/off`

### 5. 测试记录创建失败（127.0.0.1）
- 现象：`Target 127.0.0.1 is not allowed for a proxied record`
- 处理：改用公网 IP 199.188.198.12

## 测试结果
1) 新增测试记录
```
/cf dnsadd test001.good.xx.kg 199.188.198.12 on
```
- 成功创建，proxied=true

2) 代理切换
```
/cf dnsproxy ima.good.xx.kg on
```
- 成功更新，proxied=true

## 产物
- 修复代码与 runbook
- 版本化二进制输出（dist/ 目录）

## 注意事项
- proxied=on 不能指向 127.0.0.1 等内网回环地址
- runbook command 中 JSON 建议统一使用单引号包裹
