Files
Yonexus/TASKLIST.md
nav 014a985814 feat: YNX-0102 protocol codec + YNX-0401 server persistence types
- Add Yonexus.Protocol/src/codec.ts with encodeBuiltin/decodeBuiltin,
  rule message parsing, and type-safe envelope builders
- Add Yonexus.Server/plugin/core/persistence.ts with ClientRecord,
  ServerRegistry, and serialization helpers
- Update exports in both modules
2026-04-08 20:19:41 +00:00

865 lines
20 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.
# Yonexus — TASKLIST
基于 `FEAT.md``PLAN.md``PROTOCOL.md``README.md` 整理。
目标:把 Yonexus 从“规划完成、实现未开始”的状态,拆成可逐项交付、可验收、尽量低耦合的小任务列表。
---
## 0. 任务拆分原则
- 先把**协议、边界、脚手架**固定,再做运行时逻辑
- 先做**可启动、可连接**,再做**配对/认证**
- 先做**核心 happy path**,再做**失败路径和安全硬化**
- 先做**Server / Client 各自最小闭环**,再做联调
- 每个任务尽量满足:
- 范围明确
- 可以单独提交
- 有清晰验收标准
---
## Phase 0 — 仓库与规范对齐
### YNX-0001 统一仓库定位与术语
**目标**
- 统一文档中对 Yonexus、Yonexus.Server、Yonexus.Client、Yonexus.Protocol 的描述
- 明确这是“umbrella + 三个独立仓库/子模块”的模型
**子任务**
- 检查 `README.md``PLAN.md``FEAT.md``PROTOCOL.md` 术语是否一致
- 明确 `builtin``rule_identifier``identifier``secret``pairingCode` 等词汇定义
- 记录 v1 非目标,避免实现漂移
**验收标准**
- 核心文档不存在角色冲突或架构冲突描述
- 协议字段名称在文档中保持一致
---
### YNX-0002 定义 v1 实现边界
**目标**
- 把“必须做”和“以后再说”彻底分开
**子任务**
- 固化 v1 必做项WebSocket、pairing、auth、heartbeat、rule dispatch、持久化
- 固化 v1 不做项:多服务器、离线消息队列、复杂规则匹配、管理 UI
- 明确心跳 ack 是否默认开启
- 明确断线重连采用指数退避还是固定退避
**验收标准**
- 有一份可执行的 v1 scope 列表
- 实现阶段不再反复讨论边界
---
## Phase 1 — 协议落地与共享契约
### YNX-0101 固化 builtin 协议信封与类型枚举
**状态**
- [x] 已完成2026-04-08
**目标**
-`PROTOCOL.md` 里的 builtin envelope 转成共享 TypeScript 类型
**子任务**
- 定义 `BuiltinEnvelope`
- 定义所有 builtin `type` 的联合类型
- 定义 payload 接口:`HelloPayload``PairRequestPayload``PairConfirmPayload``PairSuccessPayload``AuthRequestPayload``HeartbeatPayload`
- 统一 `timestamp` 使用 UTC unix seconds
**产出**
- `Yonexus.Protocol` 中的共享类型文件
**验收标准**
- Server / Client 都能直接复用类型
- 所有 builtin 消息都可被类型系统约束
**已完成内容**
- 已在 `Yonexus.Protocol/src/types.ts` 落地 `BuiltinEnvelope`、builtin `type` 联合类型、各类 payload 接口与 `BuiltinPayloadMap`
- 已增加 `Yonexus.Protocol/src/index.ts` 作为导出入口
- 已同步更新 `Yonexus.Protocol/README.md`,让共享类型入口不再停留在 planned 状态
---
### YNX-0102 实现协议编解码工具
**状态**
- [x] 已完成2026-04-08
**目标**
- 提供统一的字符串协议解析与序列化能力
**子任务**
- 实现 `encodeBuiltin(envelope)`
- 实现 `decodeBuiltin(raw)`
- 实现 rule message 的首段分隔解析
- 确保 message content 中包含 `::` 时不会被错误切碎
- 为 malformed message 提供标准错误
**验收标准**
- `builtin::{json}` 可稳定双向转换
- `rule::content``rule::sender::content` 都能正确解析
**已完成内容**
- 已新增 `Yonexus.Protocol/src/codec.ts`
- 已实现 `encodeBuiltin` / `decodeBuiltin` 及类型安全的 envelope builders
- 已实现 `parseRuleMessage` / `parseRewrittenRuleMessage` / `encodeRuleMessage` / `encodeRewrittenRuleMessage`
- 已提供 `CodecError` 标准错误类及辅助函数 `isBuiltinMessage`
- 已更新 `Yonexus.Protocol/src/index.ts` 导出 codec 模块
---
### YNX-0103 定义协议错误码与错误对象
**目标**
- 统一错误语义,避免 Server / Client 各自发明错误格式
**子任务**
- 定义协议错误码枚举
- 定义错误 envelope payload 结构
- 区分:配置错误、协议错误、认证错误、配对错误、运行时错误
**验收标准**
- 所有失败路径都能落到有限集合的错误码
- 文档与代码错误码一致
---
### YNX-0104 编写协议级测试样例
**目标**
- 在实现运行时前,先锁定协议行为
**子任务**
- 为 hello / pair / auth / heartbeat / error 编写样例用例
- 为 malformed、缺字段、错误 rule、保留字冲突编写反例
-`::` 分隔边界编写测试
**验收标准**
- 协议测试能独立运行
- 后续实现可直接拿这些样例做回归
---
## Phase 2 — Server 插件脚手架
### YNX-0201 创建 Yonexus.Server 最小插件骨架
**状态**
- [x] 已完成2026-04-08
**目标**
- 让 Server 插件可被 OpenClaw 加载
**已完成内容**
- 已补齐 `plugin/``servers/``skills/``scripts/` 目录骨架
- 已创建 `package.json``tsconfig.json`
- 已写入 `plugin/openclaw.plugin.json`
- 已补齐 wiring-only `plugin/index.ts`
- 已补齐最小 `scripts/install.mjs`
**验收标准**
- 插件能被识别
- 启动时至少能加载但不报致命错误
---
### YNX-0202 定义 Yonexus.Server 配置 schema
**状态**
- [x] 已完成2026-04-08
**目标**
- 让 Server 配置在启动前就能被校验
**子任务**
- 校验 `followerIdentifiers`
- 校验 `notifyBotToken`
- 校验 `adminUserId`
- 校验 `listenPort`
- 校验 `listenHost` / `publicWsUrl` 可选字段
- 启动失败时返回明确错误
**验收标准**
- 缺字段和非法字段会 fail fast
- 错误信息足够定位问题
**已完成内容**
- 已新增 `Yonexus.Server/plugin/core/config.ts`
- 已实现 `validateYonexusServerConfig()``YonexusServerConfigError`
- 已覆盖 `followerIdentifiers``notifyBotToken``adminUserId``listenPort``listenHost``publicWsUrl` 的基础约束与默认值处理
- 已从 `plugin/index.ts` 导出配置类型与校验入口,方便后续 lifecycle wiring 复用
---
### YNX-0203 实现 Server 生命周期 wiring
**目标**
- 在 gateway 启动时初始化 Server 内部组件
**子任务**
- 初始化配置
- 初始化 registry
- 初始化持久化层
- 初始化 rule registry
- 注册 shutdown 清理逻辑
**验收标准**
- 启停流程完整
- 不会留下悬挂 timer / socket
---
## Phase 3 — Client 插件脚手架
### YNX-0301 创建 Yonexus.Client 最小插件骨架
**状态**
- [x] 已完成2026-04-08
**目标**
- 让 Client 插件可被 OpenClaw 加载
**已完成内容**
- 已补齐 `plugin/``servers/``skills/``scripts/` 目录骨架
- 已创建 `package.json``tsconfig.json`
- 已写入 `plugin/openclaw.plugin.json`
- 已补齐 wiring-only `plugin/index.ts`
- 已补齐最小 `scripts/install.mjs`
**验收标准**
- 插件能被识别并加载
---
### YNX-0302 定义 Yonexus.Client 配置 schema
**状态**
- [x] 已完成2026-04-08
**目标**
- 保证 Client 配置可启动前校验
**子任务**
- 校验 `mainHost`
- 校验 `identifier`
- 校验 `notifyBotToken`
- 校验 `adminUserId`
- 规范 `mainHost` 是否允许裸 `host:port`
**验收标准**
- 配置错误可在启动时直接发现
**已完成内容**
- 已新增 `Yonexus.Client/plugin/core/config.ts`
- 已实现 `validateYonexusClientConfig()``YonexusClientConfigError`
- 已覆盖 `mainHost``identifier``notifyBotToken``adminUserId` 的必填校验,并限定 `mainHost``ws://` / `wss://`
- 已从 `plugin/index.ts` 导出配置类型与校验入口,方便后续 lifecycle wiring 直接接入
---
### YNX-0303 实现 Client 生命周期 wiring
**目标**
- 在 gateway 启动时初始化 Client 运行时
**子任务**
- 加载本地状态
- 初始化连接管理器
- 初始化规则注册器
- 注册 shutdown 清理逻辑
**验收标准**
- Client 可启动并在未连接状态下稳定运行
---
## Phase 4 — 持久化与状态模型
### YNX-0401 定义 Server 持久化记录结构
**状态**
- [x] 已完成2026-04-08
**目标**
-`PLAN.md` 中的 `ClientRecord` 落到代码
**子任务**
- 定义 paired/unpaired/revoked/pending 状态
- 定义 heartbeat/liveness 字段
- 定义 pairing 通知字段
- 定义 recent nonce / recent attempts 窗口结构
- 定义 `createdAt` / `updatedAt`
**验收标准**
- 持久化结构足以支撑 pairing/auth/heartbeat
**已完成内容**
- 已新增 `Yonexus.Server/plugin/core/persistence.ts`
- 已实现 `ClientRecord``ClientSession``ServerRegistry` 接口
- 已实现 `SerializedClientRecord``ServerPersistenceData` 持久化结构
- 已提供 `createClientRecord``serializeClientRecord``deserializeClientRecord` 工厂函数
- 已提供 `isPairable``hasPendingPairing``isPairingExpired``canAuthenticate` 状态检查函数
- 已更新 `Yonexus.Server/plugin/index.ts` 导出 persistence 模块
---
### YNX-0402 实现 Server 状态存储
**目标**
- 让信任状态在重启后仍可恢复
**子任务**
- 选择 JSON 文件或等价轻量持久化形式
- 实现加载、保存、原子写入
- 区分持久数据与内存态数据
- 明确 restart 后是否清空 rolling windows
**验收标准**
- 重启后 paired client 不丢失
- 损坏文件时有可恢复行为
---
### YNX-0403 实现 Client 本地信任材料存储
**目标**
- 持久化 Client 的 `identifier`、私钥、secret
**子任务**
- 定义本地 state 文件结构
- 实现加载 / 初始化 / 保存
- 缺失文件时自动初始化最小状态
- 标记敏感字段
**验收标准**
- Client 重启后可恢复身份与 secret
---
## Phase 5 — Transport 最小闭环
### YNX-0501 实现 Server WebSocket 启动与连接接入
**目标**
- Server 能监听并接受连接
**子任务**
- 启动 WebSocket server
- 处理 connect / message / close / error
- 记录连接与 identifier 绑定前的临时会话
**验收标准**
- 可看到客户端连接进入
- 无协议时也不会崩
---
### YNX-0502 实现 Client WebSocket 连接器
**目标**
- Client 能主动连到 Server
**子任务**
- 建立 outbound 连接
- 处理 open / message / close / error
- 提供连接状态机
**验收标准**
- Client 能连上可用的 Server
- Server 不可用时不会死循环刷日志
---
### YNX-0503 实现 hello / hello_ack
**目标**
- 完成连接后的第一段协议握手
**子任务**
- Client 连接后发送 `hello`
- Server 验证 `identifier`、协议版本、payload 形状
- Server 返回 `hello_ack`
- 根据状态决定 `nextAction`
**验收标准**
- 未配对客户端收到 `pair_required`
- 已配对客户端收到 `auth_required`
- 非 allowlist 客户端被拒绝
---
### YNX-0504 实现基础重连策略
**目标**
- Client 断线后可恢复连接
**子任务**
- 设计退避策略
- 避免并发多次重连
- 在成功连接后重置退避计数
**验收标准**
- 断线可自动恢复
- 不会形成高频重连风暴
---
## Phase 6 — Pairing 主流程
### YNX-0601 实现 Client 首次密钥生成
**目标**
- Client 首次运行自动生成本地公私钥
**子任务**
- 选定签名算法(建议 Ed25519
- 生成 keypair
- 保存私钥
- 导出公钥供握手使用
**验收标准**
- 首次启动可生成并持久化 keypair
- 重启不会重复生成
---
### YNX-0602 实现 Server pairing request 创建
**目标**
- Server 可为待配对客户端创建 pairing 会话
**子任务**
- 生成 pairing code
- 生成 expiresAt / ttl
- 将状态写入 registry
- 更新 pairing 状态为 pending
**验收标准**
- 每次 pairing 会话有可验证的过期时间
- pairing code 不会通过 Yonexus WS 下发
---
### YNX-0603 实现 Discord DM 配对通知
**目标**
- Server 通过 `notifyBotToken``adminUserId` 发送 pairing code
**子任务**
- 封装 Discord DM 发送逻辑
- DM 内容包含 identifier、pairingCode、expiresAt/TTL
- 处理发送失败
- 记录 pairing notification metadata
**验收标准**
- 通知成功时 Client 才能进入可确认状态
- 通知失败时不会继续配对成功路径
---
### YNX-0604 实现 pair_request / pair_confirm / pair_success
**目标**
- 打通完整配对流程
**子任务**
- Server 下发不含 code 的 `pair_request`
- Client 接收并进入 pairing pending
- Client 提交 `pair_confirm`
- Server 校验 code 和 expiry
- 成功后生成 secret
- Server 返回 `pair_success`
- Client 保存 secret
**验收标准**
- 正确 code 可完成配对
- 错误 code / 过期 code 会失败
---
### YNX-0605 实现配对失败路径
**目标**
- 补齐 pairing 相关失败逻辑
**子任务**
- `invalid_code`
- `expired`
- `identifier_not_allowed`
- `admin_notification_failed`
- `internal_error`
- 配对失败后的状态恢复策略
**验收标准**
- 失败后不会留下脏状态导致后续无法重试
---
## Phase 7 — Authentication 主流程
### YNX-0701 固化 proof 构造与签名规范
**目标**
- 明确签名输入,避免 Server / Client 不一致
**子任务**
- 决定 canonical serialization 方案
- 明确签名字段secret、nonce、timestamp
- 定义签名编码格式(如 base64
**验收标准**
- 同一输入在 Client 与 Server 上验证一致
---
### YNX-0702 实现 Client auth_request
**目标**
- Client 能基于本地 secret 与私钥发起认证
**子任务**
- 生成 24 字符 nonce
- 生成 proofTimestamp
- 构造签名
- 发送 `auth_request`
**验收标准**
- 报文字段完整
- nonce 格式符合协议要求
---
### YNX-0703 实现 Server 认证校验
**目标**
- Server 能验证 auth_request 真伪
**子任务**
- 校验 identifier allowlist
- 校验 paired 状态
- 校验 publicKey 匹配
- 校验 signature
- 校验 secret
- 校验 timestamp 漂移
- 校验 nonce 重放
- 校验 attempts 频率
**验收标准**
- 正确认证返回 `auth_success`
- 各类失败返回对应 `auth_failed`
---
### YNX-0704 实现 re_pair_required 机制
**目标**
- 在不安全条件下强制重新配对
**子任务**
- 检测 nonce collision
- 检测 `>10 attempts / 10s`
- 失效旧 secret 或标记 trust revoked
- 返回 `re_pair_required`
- Client 收到后切回 pairing_required
**验收标准**
- 不安全状态下不会继续接受旧信任材料
---
## Phase 8 — Heartbeat 与在线状态
### YNX-0801 实现 Client heartbeat loop
**目标**
- Client 在认证后按周期发心跳
**子任务**
- 认证成功后启动 heartbeat timer
- 断线或未认证时停止 timer
- 发送 `heartbeat`
**验收标准**
- 默认每 5 分钟发送一次
- 状态切换时 timer 无泄漏
---
### YNX-0802 实现 Server heartbeat 接收与记录
**目标**
- Server 能更新客户端最近存活时间
**子任务**
- 接收 heartbeat
- 校验来源已认证
- 更新 `lastHeartbeatAt`
- 可选返回 `heartbeat_ack`
**验收标准**
- 收到心跳后客户端状态可维持在线
---
### YNX-0803 实现 Server liveness sweep
**目标**
- Server 能周期性评估 online / unstable / offline
**子任务**
- 增加 30~60s sweep timer
- 7 分钟无心跳标记 unstable
- 11 分钟无心跳标记 offline
- offline 时发送 `disconnect_notice` 并断开连接
**验收标准**
- 状态转移符合文档定义
---
## Phase 9 — 规则消息与 API
### YNX-0901 实现 Client rule registry
**目标**
- Client 侧支持应用层规则分发
**子任务**
- 实现 `registerRule(rule, processor)`
- 禁止 `builtin`
- 默认禁止重复注册
- 按 exact match 分发
**验收标准**
- 命中规则时正确调用处理器
- 非法注册被拒绝
---
### YNX-0902 实现 Server rule registry
**目标**
- Server 侧支持应用层规则分发
**子任务**
- 实现 `registerRule(rule, processor)`
- 禁止 `builtin`
- 默认禁止重复注册
- 按 exact match 分发
**验收标准**
- 规则注册与调用行为一致
---
### YNX-0903 实现 `sendMessageToServer(message)`
**目标**
- 暴露 Client 到 Server 的发送 API
**子任务**
- 校验连接/认证状态
- 发送 `${rule_identifier}::${message_content}`
- 未连接时返回明确错误
**验收标准**
- 上层插件可直接调用
---
### YNX-0904 实现 `sendMessageToClient(identifier, message)`
**目标**
- 暴露 Server 到指定 Client 的发送 API
**子任务**
- 校验目标 client 已知且在线
- 发送 `${rule_identifier}::${message_content}`
- 离线时返回明确错误
**验收标准**
- 上层插件可向指定客户端投递消息
---
### YNX-0905 实现 Server 入站消息重写
**目标**
- 把客户端来的消息重写成带 sender 标识的形式
**子任务**
- 解析 `${rule_identifier}::${message_content}`
- 重写为 `${rule_identifier}::${sender_identifier}::${message_content}`
- 再进入 rule dispatch
**验收标准**
- Server 侧处理器能可靠识别消息来源
---
## Phase 10 — 安全与鲁棒性
### YNX-1001 实现敏感信息脱敏日志
**目标**
- 避免 secret、私钥、proof 原文进入日志
**子任务**
- 定义 redaction 工具
- 覆盖 pairing、auth、error 日志路径
- 对外只保留必要上下文
**验收标准**
- 关键敏感值不会明文打印
---
### YNX-1002 实现 malformed / unsupported / unauthorized 防御
**目标**
- 所有非法输入都能被可控拒绝
**子任务**
- malformed json
- 缺字段 payload
- unsupported protocol version
- unauthorized identifier
- 非法 builtin type
**验收标准**
- 错误不会导致进程崩溃
- 客户端能收到明确错误反馈或断开
---
### YNX-1003 实现单 identifier 单活跃连接策略
**目标**
- 同一 client identifier 只允许一个活跃认证连接
**子任务**
- 定义旧连接替换策略
- 新连接成功认证后踢掉旧连接
- 避免竞态导致双在线
**验收标准**
- 任意时刻同一 identifier 只有一个有效 session
---
### YNX-1004 实现重启恢复策略
**目标**
- 重启后行为可预期且文档一致
**子任务**
- 恢复 durable trust records
- 清理或重建 rolling windows
- 明确 pending pairing 如何恢复
- 明确 active connection 状态如何重建
**验收标准**
- 重启后的认证/配对行为稳定可解释
---
## Phase 11 — 测试与联调
### YNX-1101 编写协议单元测试
**目标**
- 覆盖编解码、字段校验、错误码
### YNX-1102 编写 Server 单元测试
**目标**
- 覆盖 registry、pairing、auth、heartbeat sweep
### YNX-1103 编写 Client 单元测试
**目标**
- 覆盖状态机、keypair、auth 构造、heartbeat timer
### YNX-1104 编写 Server-Client 集成测试
**目标**
- 覆盖首次配对、正常重连、认证失败、心跳超时、re-pair
### YNX-1105 编写失败路径测试矩阵
**目标**
- 系统性覆盖 pairing/auth 失败路径
**重点场景**
- pairing code 错误
- pairing 过期
- DM 发送失败
- stale timestamp
- future timestamp
- nonce collision
- handshake rate limit
- unknown identifier
- duplicate connection
**验收标准**
- 核心安全路径都有自动化测试
---
## Phase 12 — 文档与交付
### YNX-1201 补齐 Server README
**目标**
- Server 仓库可独立被安装与使用
### YNX-1202 补齐 Client README
**目标**
- Client 仓库可独立被安装与使用
### YNX-1203 输出部署文档
**目标**
- 写清楚单主多从部署方式、配置示例、配对流程
### YNX-1204 输出运维排障文档
**目标**
- 写清楚常见报错、状态含义、恢复步骤
### YNX-1205 输出协议测试与验收清单
**目标**
- 让后续改动有统一回归基线
---
## 推荐执行顺序(最小闭环)
### Milestone A — 能启动
- YNX-0101
- YNX-0102
- YNX-0201
- YNX-0202
- YNX-0301
- YNX-0302
- YNX-0401
- YNX-0402
- YNX-0403
### Milestone B — 能连接
- YNX-0203
- YNX-0303
- YNX-0501
- YNX-0502
- YNX-0503
- YNX-0504
### Milestone C — 能配对认证
- YNX-0601
- YNX-0602
- YNX-0603
- YNX-0604
- YNX-0605
- YNX-0701
- YNX-0702
- YNX-0703
- YNX-0704
### Milestone D — 能稳定通信
- YNX-0801
- YNX-0802
- YNX-0803
- YNX-0901
- YNX-0902
- YNX-0903
- YNX-0904
- YNX-0905
### Milestone E — 能交付
- YNX-1001
- YNX-1002
- YNX-1003
- YNX-1004
- YNX-1101
- YNX-1102
- YNX-1103
- YNX-1104
- YNX-1105
- YNX-1201
- YNX-1202
- YNX-1203
- YNX-1204
- YNX-1205
---
## 可直接开工的首批任务
如果要我给出“今天就能开始做”的第一批,我建议是:
1. YNX-0101 固化共享协议类型
2. YNX-0102 实现协议编解码工具
3. YNX-0201 创建 Yonexus.Server 插件骨架
4. YNX-0301 创建 Yonexus.Client 插件骨架
5. YNX-0401 定义 Server / Client 状态模型
6. YNX-0503 实现 hello / hello_ack 最小握手
这样最快能拿到一个“能启动、能连接、能判断下一步动作”的基础闭环。