chore: 整理——gitignore android/.gradle 构建缓存 + 同步 todo 看板

- client/.gitignore 加 /android/.gradle/(gradle 构建缓存,不该入 git)。
- 同步 todo.json/html 到当前状态。

注:server/internal/pb/agent/v1 是 stray 生成产物(未被任何代码 import,代码用手写的
agentv1),未跟踪、不影响合并;清理需 rm,留给用户(! rm -rf server/internal/pb/agent)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-30 22:52:32 +08:00
parent 00bec95255
commit 53fb6492b1
3 changed files with 300 additions and 99 deletions
+80 -14
View File
@@ -1,9 +1,9 @@
{
"meta": {
"title": "feature+windows — 项目 TODO",
"updated_at": "2026-06-29T00:04:33.913Z"
"updated_at": "2026-06-30T14:47:39.344Z"
},
"seq": 12,
"seq": 17,
"items": [
{
"id": 1,
@@ -106,10 +106,10 @@
"tags": [
"后端"
],
"status": "done",
"status": "accepted",
"created_at": "2026-06-28T00:26:44.498Z",
"done": false,
"completed_at": null,
"done": true,
"completed_at": "2026-06-30T14:44:35.082Z",
"version": null
},
{
@@ -137,10 +137,10 @@
"前端",
"后端"
],
"status": "done",
"status": "accepted",
"created_at": "2026-06-28T09:32:26.008Z",
"done": false,
"completed_at": null,
"done": true,
"completed_at": "2026-06-30T14:44:34.810Z",
"version": null
},
{
@@ -152,10 +152,10 @@
"tags": [
"前端"
],
"status": "done",
"status": "accepted",
"created_at": "2026-06-28T09:32:26.080Z",
"done": false,
"completed_at": null,
"done": true,
"completed_at": "2026-06-30T14:44:34.991Z",
"version": null
},
{
@@ -167,10 +167,10 @@
"tags": [
"前端"
],
"status": "open",
"status": "accepted",
"created_at": "2026-06-28T11:27:56.637Z",
"done": false,
"completed_at": null,
"done": true,
"completed_at": "2026-06-30T14:47:39.343Z",
"version": null
},
{
@@ -188,6 +188,72 @@
"done": false,
"completed_at": null,
"version": null
},
{
"id": 13,
"title": "数据面故障韧性:节点健康上报+客户端连通看门狗",
"desc": "agent 心跳带 sing-box 健康(clash_api /version)→控制面 effectiveNodeStatus 标 down(列表置灰+connect拦截);客户端连上后 HTTP 204 看门狗,连续失败:智能选择自动切节点/手动只提示断开。plan: crystalline-exploring-lerdorf.md",
"level": "high",
"tier": 1,
"tags": [
"后端",
"前端",
"gRPC"
],
"status": "accepted",
"created_at": "2026-06-29T04:55:46.733Z",
"done": true,
"completed_at": "2026-06-29T16:59:39.926Z",
"version": null
},
{
"id": 14,
"title": "移动端真·常连:Android Always-on + iOS/iPad On-Demand(无UI自连)",
"desc": "系统在 app 未开时拉起隧道:Android Always-on VPN(系统设置开启+VpnService 支持 onStartCommand 无UI拉起+配置缓存)、iOS/iPad On-Demand(NEOnDemandRule + PacketTunnelProvider 用缓存 lastConfigJson 自连)。难点:paid 凭证 TTL 仅24h,长期常连需原生侧刷新配置/凭证。桌面自启+全平台自动连接已在另一轮做(plan crystalline-exploring-lerdorf)。",
"level": "mid",
"tier": 1,
"tags": [
"Android",
"iOS",
"后端"
],
"status": "open",
"created_at": "2026-06-29T09:36:14.004Z",
"done": false,
"completed_at": null,
"version": null
},
{
"id": 15,
"title": "iOS/iPad 实时统计+urltest 延迟与 macOS 对齐",
"desc": "移植 macOS 已验证的统计架构:扩展注入 clash_api + StatsCollector(clash 取 urltest),app StatsClient 改 sendProviderMessage 轮询;前置生成 iOS Libbox.xcframework。Dart 侧已对齐(共用 VpnNativeBridge)。",
"level": "mid",
"tier": 2,
"tags": [
"iOS",
"前端"
],
"status": "accepted",
"created_at": "2026-06-30T10:56:48.894Z",
"done": true,
"completed_at": "2026-06-30T14:44:34.900Z",
"version": null
},
{
"id": 16,
"title": "启用设备数量限制 + 超限 UX(踢旧/选择移除,非硬拒登)",
"desc": "现状:plans.max_devices(free1/pro5/team10)+ devices/service.go:216 强制逻辑 + DEVICE_LIMIT_EXCEEDED 错误码 + 账户API DevicesMax 都在,但 main.go:534 登录注册传 MaxDevices:0(不启用)。原因:free 用户重装会换 device UUID,登录硬卡会把人锁外面。需:① 登录/注册从套餐读 max_devices 传入 RegisterIfAbsent;② 超限不直接拒登,改为'踢最旧设备/让用户选哪台下线'的 UX(客户端弹窗 + 设备管理页操作);③ 处理 free 重装 churn(同机复用而非每次新增)。tier-1:涉及登录接口 + 跨后端/前端 + 策略设计。",
"level": "mid",
"tier": 1,
"tags": [
"后端",
"前端"
],
"status": "open",
"created_at": "2026-06-30T14:33:48.996Z",
"done": false,
"completed_at": null,
"version": null
}
]
}