chore(pangolin): 还原批量合并误并入的 doc/todo WIP(回退到 WIP 前,WIP 抽回为未提交)
This commit is contained in:
+22
-953
File diff suppressed because it is too large
Load Diff
+9
-477
@@ -131,37 +131,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
}
|
||||
.reject-date { color: #ef9999; font-size: 12px; }
|
||||
|
||||
/* ── 确认闸(方案/改动说明)── */
|
||||
.gate-block { margin: 10px 0 4px; padding: 10px 14px; border-radius: 8px; font-size: 13px; }
|
||||
.gate-pending { background: #fff7ed; border: 1px solid #fdba74; }
|
||||
.gate-granted { background: #f0fdf4; border: 1px solid #bbf7d0; }
|
||||
.gate-info { background: #f1f5f9; border: 1px solid #e2e8f0; }
|
||||
.gate-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 4px; }
|
||||
.gate-badge { padding: 2px 9px; border-radius: 10px; font-size: 11.5px; font-weight: 700; white-space: nowrap; }
|
||||
.gate-badge.pending { background: #f97316; color: #fff; }
|
||||
.gate-badge.granted { background: #22c55e; color: #fff; }
|
||||
.gate-badge.info { background: #94a3b8; color: #fff; }
|
||||
.gate-kind { font-size: 12px; color: #52606d; }
|
||||
.gate-date { font-size: 12px; color: #8aa3c4; margin-left: auto; }
|
||||
.gate-note { color: #52606d; margin: 4px 0; white-space: pre-wrap; }
|
||||
.gate-ref { font-size: 12.5px; color: #52606d; margin-top: 4px; }
|
||||
.gate-note code, .gate-ref code {
|
||||
background: #fff; padding: 1px 5px; border-radius: 3px;
|
||||
font-family: "JetBrains Mono", monospace; font-size: 12px; color: #b91c1c;
|
||||
}
|
||||
.approve-btn {
|
||||
margin-top: 8px; padding: 5px 14px; border-radius: 6px; border: none;
|
||||
background: #16a34a; color: #fff; font-size: 12.5px; font-weight: 600; cursor: pointer;
|
||||
transition: background .15s;
|
||||
}
|
||||
.approve-btn:hover { background: #15803d; }
|
||||
.approve-cmd { margin-top: 10px; padding: 10px 12px; background: #1e293b; border-radius: 8px; }
|
||||
.approve-cmd-label { font-size: 12px; color: #94a3b8; margin-bottom: 6px; }
|
||||
.approve-cmd-code { font-family: "JetBrains Mono", monospace; font-size: 13px; color: #86efac; display: block; word-break: break-all; }
|
||||
.approve-copy-btn { margin-top: 8px; padding: 4px 12px; border-radius: 6px; background: #334155; color: #e2e8f0; border: none; font-size: 12px; cursor: pointer; }
|
||||
.approve-copy-btn:hover { background: #475569; }
|
||||
.stat-pill.gate-stat { background: #f97316; }
|
||||
|
||||
/* ── 子任务区 ── */
|
||||
.subtask-block {
|
||||
margin-top: 12px; padding: 10px 14px;
|
||||
@@ -252,22 +221,13 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
<header>
|
||||
<div class="wrap">
|
||||
<h1>doc — 项目 TODO</h1>
|
||||
<div class="header-meta">生成于 2026-06-12 · 真相源 todo/todo.json</div>
|
||||
<div class="header-meta">生成于 2026-06-11 · 真相源 todo/todo.json</div>
|
||||
<div class="stats">
|
||||
<div class="stat-pill"><strong>18</strong>全部</div>
|
||||
<div class="stat-pill"><strong>14</strong>待开始</div>
|
||||
<div class="stat-pill"><strong>4</strong>开发中</div>
|
||||
<div class="stat-pill"><strong>0</strong>待验收</div>
|
||||
<div class="stat-pill"><strong>0</strong>已验收</div>
|
||||
<div class="stat-pill gate-stat"><strong>4</strong>待确认</div>
|
||||
<div class="header-meta">生成于 2026-06-13 · 真相源 todo/todo.json</div>
|
||||
<div class="stats">
|
||||
<div class="stat-pill"><strong>19</strong>全部</div>
|
||||
<div class="stat-pill"><strong>18</strong>待开始</div>
|
||||
<div class="stat-pill"><strong>0</strong>开发中</div>
|
||||
<div class="stat-pill"><strong>1</strong>待验收</div>
|
||||
<div class="stat-pill"><strong>0</strong>待验收</div>
|
||||
<div class="stat-pill"><strong>0</strong>已验收</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
@@ -309,7 +269,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="section-block" id="section-open">
|
||||
<div class="section-title st-open" data-toggle="open">
|
||||
📋 待开始 <span class="s-count">14</span>
|
||||
📋 待开始 <span class="s-count">18</span>
|
||||
<span class="s-arrow">▴ 收起</span>
|
||||
</div>
|
||||
<div class="section-list-wrap " id="list-wrap-open">
|
||||
@@ -334,7 +294,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">依据 doc/02、doc/03:openapi.yaml 展开全部 /v1 契约(connect 返回 sing-box 凭证而非 WG peer);MySQL 8 全量 DDL(users/devices/plans/subscriptions/codes/usage_daily/audit_log + providers/node_events/directory_version)。后端各模块的共同前置。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span> <span class="tag t-tag" data-tag="数据库">数据库</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -363,7 +322,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">proto 定义(注册/心跳/凭证下发与回收/用量上报,mTLS 双向)、节点目录 version 灰度(if_version 304)、connect/disconnect 下发 REALITY/Hy2 参数、free 凭证 TTL。依赖 #1。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -392,7 +350,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">用 design/flutter/ 起步包建工程:pubspec 覆盖、theme/widgets/main 拷入、字体配置,flutter run 出登录→引导→主框架演示态。前端线起点,可与后端完全并行。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="iOS">iOS</span> <span class="tag t-tag" data-tag="Android">Android</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -421,7 +378,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">gomobile AAR/XCFramework + iOS NetworkExtension / Android VpnService / 桌面 TUN 子进程;URLTest 智能选线、Kill-switch。全项目最大技术风险,应尽早并行启动。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="iOS">iOS</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="Windows">Windows</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -450,7 +406,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">境内多 ISP 拨测 + 境外对照 + 流量骤降三路互证;blocked_suspect/confirmed 状态机、阈值与熔断、池水位告警、自动补新。依赖 #5、#14。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -479,7 +434,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">邮箱验证码限频、注册自动 7 天 PRO 试用、argon2id、JWT RS256(access 15min + refresh 30d)、Redis 滑窗限流。依赖 #1。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -508,7 +462,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">批量生成(Crockford Base32 + 校验位,库存 hash)、发卡店 webhook(HMAC)、兑换幂等 + 订阅顺延叠加、失败锁定、audit_log。依赖 #1。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -537,7 +490,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">设备登记/移除(同步回收节点侧凭证)、套餐/到期/设备数校验中间件。依赖 #1、#2。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -566,7 +518,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">轻量 agent:mTLS 自注册、心跳、sing-box 用户表增删(凭证下发/回收/TTL)、负载上报 Redis;cloud-init 一段式安装。依赖 #5 的 proto。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -595,7 +546,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">usage_daily 聚合(仅字节/分钟,无日志口径)、/v1/ads/unlock 验广告 SDK 回执、free 用户 connect 额度校验。依赖 #1。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -624,7 +574,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">对照 ui_kits/mobile + tablet 逐屏补齐:智能选择推荐卡、免费额度卡+看广告解锁、Tab 滑动切换、宽度 ≥900 切侧栏分栏(连接页双栏/节点双列网格);四态验证(明暗×中英)。依赖 #9。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="iOS">iOS</span> <span class="tag t-tag" data-tag="Android">Android</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -653,7 +602,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">ui_kits/website → Astro SSG + Cloudflare Pages 多镜像;保留 i18n 单显、响应式断点、全部脱敏文案。完全独立可并行。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="Web">Web</span> <span class="tag t-tag" data-tag="前端">前端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -682,7 +630,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">ui_kits/usercenter React 组件直接复用;先 mock 数据,后接 me/redeem/devices;TOTP 2FA。UI 部分独立并行,接口联调依赖 #2。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="Web">Web</span> <span class="tag t-tag" data-tag="前端">前端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -711,7 +658,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">多厂商 API 适配层(providers 池)、cloud-init 模板、replace 一键更换(make-before-break)与全量滚动轮换、换 IP 不换机。依赖 #6 的 agent。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="CI/CD">CI/CD</span> <span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -740,7 +686,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">四组域名隔离与冷备池、源站隐藏(回源鉴权)、Ed25519 签名端点更新与公告 JSON 多镜像、客户端 DoH/IP 直连兜底联动。可独立并行。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="Web">Web</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -769,7 +714,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">xtrabackup 每日全量 + binlog 15min 增量、age 加密异地(独立身份账号)、月度恢复演练脚本、RPO≤15min/RTO≤4h 验证。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="数据库">数据库</span> <span class="tag t-tag" data-tag="CI/CD">CI/CD</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -798,7 +742,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">码批次生成导出、节点操作(replace/draining)、audit_log 查看;独立监听 + 内网白名单 + 2FA。依赖 #1。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span> <span class="tag t-tag" data-tag="Web">Web</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -827,7 +770,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
|
||||
<div class="item-desc">lint + 单测 + OpenAPI 同步校验 + 脱敏红线词扫描(UI 文案资源)+ 容器镜像构建。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="CI/CD">CI/CD</span></div>
|
||||
<div class="item-meta">
|
||||
@@ -841,392 +783,23 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
</div>
|
||||
<div class="section-block" id="section-doing">
|
||||
<div class="section-title st-doing" data-toggle="doing">
|
||||
🔨 开发中 <span class="s-count">4</span>
|
||||
🔨 开发中 <span class="s-count">0</span>
|
||||
<span class="s-arrow">▴ 收起</span>
|
||||
</div>
|
||||
<div class="section-list-wrap " id="list-wrap-doing">
|
||||
<ul class="todo-list" id="list-doing">
|
||||
|
||||
<li class="todo-card s-doing"
|
||||
data-id="1"
|
||||
data-level="high"
|
||||
data-status="doing"
|
||||
data-tier="1"
|
||||
data-tags="后端,数据库">
|
||||
<div class="card-header">
|
||||
<span class="item-title">OpenAPI 契约 + MySQL migration 基线</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-doing">开发中</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
<span class="tag sub-progress-badge">0/6 子任务</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">依据 doc/02、doc/03:openapi.yaml 展开全部 /v1 契约(connect 返回 sing-box 凭证而非 WG peer);MySQL 8 全量 DDL(users/devices/plans/subscriptions/codes/usage_daily/audit_log + providers/node_events/directory_version)。后端各模块的共同前置。</div>
|
||||
<div class="gate-block gate-pending">
|
||||
<div class="gate-head"><span class="gate-badge pending">⏸ 待确认</span>
|
||||
<span class="gate-kind">一级方案规划 · 确认后方可继续开发</span></div>
|
||||
<div class="gate-note">openapi.yaml 13 端点 + MySQL 12 表 migration + plans seed;golang-migrate/oapi-codegen/chi;connect 返回 sing-box 凭证</div><div class="gate-ref">📄 详见 <code>doc/plans/01-openapi-mysql.md</code></div>
|
||||
<button class="approve-btn" data-id="1">确认执行 ✓</button>
|
||||
<div class="approve-cmd" id="approve-cmd-1" style="display:none">
|
||||
<div class="approve-cmd-label">在终端运行:</div>
|
||||
<code class="approve-cmd-code">/todo approve 1</code>
|
||||
<button class="approve-copy-btn" data-cmd="/todo approve 1">复制命令</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="subtask-block">
|
||||
<div class="subtask-header">
|
||||
<span class="subtask-label">子任务</span>
|
||||
<span class="subtask-progress-text">0 / 6 完成</span>
|
||||
<div class="subtask-progress-bar"><div class="subtask-progress-fill" style="width:0%"></div></div>
|
||||
</div>
|
||||
<ul class="subtask-list"><li class="subtask-item s-open" data-sid="1A">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">1A</span>
|
||||
<span class="sub-title">Go 模块骨架 + 工具链(go.mod/tools.go/Makefile)</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="1B">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">1B</span>
|
||||
<span class="sub-title">MySQL migration 7 文件 + plans seed</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="1C">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">1C</span>
|
||||
<span class="sub-title">openapi.yaml 契约(13 操作 + 全量 schema)</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="1D">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">1D</span>
|
||||
<span class="sub-title">oapi-codegen 接线 + 生成代码入库</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="1A 未完成">1A</span><span class="dep-badge dep-pending" title="1C 未完成">1C</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="1E">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">1E</span>
|
||||
<span class="sub-title">config + store(UTC DSN) + 自动迁移</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="1A 未完成">1A</span><span class="dep-badge dep-pending" title="1B 未完成">1B</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="1F">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">1F</span>
|
||||
<span class="sub-title">apierr + idgen + CONVENTIONS.md</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="1A 未完成">1A</span></span></div>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span> <span class="tag t-tag" data-tag="数据库">数据库</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="meta-date">🕐 2026-06-11</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-doing"
|
||||
data-id="5"
|
||||
data-level="high"
|
||||
data-status="doing"
|
||||
data-tier="1"
|
||||
data-tags="后端">
|
||||
<div class="card-header">
|
||||
<span class="item-title">nodes 模块 + agent gRPC 协议设计</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-doing">开发中</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
<span class="tag sub-progress-badge">0/5 子任务</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">proto 定义(注册/心跳/凭证下发与回收/用量上报,mTLS 双向)、节点目录 version 灰度(if_version 304)、connect/disconnect 下发 REALITY/Hy2 参数、free 凭证 TTL。依赖 #1。</div>
|
||||
<div class="gate-block gate-pending">
|
||||
<div class="gate-head"><span class="gate-badge pending">⏸ 待确认</span>
|
||||
<span class="gate-kind">一级方案规划 · 确认后方可继续开发</span></div>
|
||||
<div class="gate-note">agent gRPC proto(buf) + 控制面 nodes 模块;agent 主动拨号、下发服务端流、mTLS 内部CA、目录 version 灰度</div><div class="gate-ref">📄 详见 <code>doc/plans/05-nodes-grpc.md</code></div>
|
||||
<button class="approve-btn" data-id="5">确认执行 ✓</button>
|
||||
<div class="approve-cmd" id="approve-cmd-5" style="display:none">
|
||||
<div class="approve-cmd-label">在终端运行:</div>
|
||||
<code class="approve-cmd-code">/todo approve 5</code>
|
||||
<button class="approve-copy-btn" data-cmd="/todo approve 5">复制命令</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="subtask-block">
|
||||
<div class="subtask-header">
|
||||
<span class="subtask-label">子任务</span>
|
||||
<span class="subtask-progress-text">0 / 5 完成</span>
|
||||
<div class="subtask-progress-bar"><div class="subtask-progress-fill" style="width:0%"></div></div>
|
||||
</div>
|
||||
<ul class="subtask-list"><li class="subtask-item s-open" data-sid="5A">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">5A</span>
|
||||
<span class="sub-title">proto 契约 + buf 工具链(最先冻结)</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="5B">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">5B</span>
|
||||
<span class="sub-title">mTLS/CA + 引导 token 框架</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="5C">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">5C</span>
|
||||
<span class="sub-title">gRPC server + hub + 跨实例 pub/sub</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="5A 未完成">5A</span><span class="dep-badge dep-pending" title="5B 未完成">5B</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="5D">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">5D</span>
|
||||
<span class="sub-title">目录灰度 + connect/disconnect + 凭证编排</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="5C 未完成">5C</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="5E">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">5E</span>
|
||||
<span class="sub-title">生命周期状态机接口(供 #15)</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="5C 未完成">5C</span></span></div>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="meta-date">🕐 2026-06-11</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-doing"
|
||||
data-id="11"
|
||||
data-level="high"
|
||||
data-status="doing"
|
||||
data-tier="1"
|
||||
data-tags="前端,iOS,Android,mac,Windows">
|
||||
<div class="card-header">
|
||||
<span class="item-title">sing-box libbox 桥接 PoC(三端隧道)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-doing">开发中</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
<span class="tag sub-progress-badge">0/8 子任务</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">gomobile AAR/XCFramework + iOS NetworkExtension / Android VpnService / 桌面 TUN 子进程;URLTest 智能选线、Kill-switch。全项目最大技术风险,应尽早并行启动。</div>
|
||||
<div class="gate-block gate-pending">
|
||||
<div class="gate-head"><span class="gate-badge pending">⏸ 待确认</span>
|
||||
<span class="gate-kind">一级方案规划 · 确认后方可继续开发</span></div>
|
||||
<div class="gate-note">gomobile libbox + Platform Channel + 三端壳;首发桌面→Android→iOS;含数据面定稿 11A</div><div class="gate-ref">📄 详见 <code>doc/plans/11-libbox-bridge.md</code></div>
|
||||
<button class="approve-btn" data-id="11">确认执行 ✓</button>
|
||||
<div class="approve-cmd" id="approve-cmd-11" style="display:none">
|
||||
<div class="approve-cmd-label">在终端运行:</div>
|
||||
<code class="approve-cmd-code">/todo approve 11</code>
|
||||
<button class="approve-copy-btn" data-cmd="/todo approve 11">复制命令</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="subtask-block">
|
||||
<div class="subtask-header">
|
||||
<span class="subtask-label">子任务</span>
|
||||
<span class="subtask-progress-text">0 / 8 完成</span>
|
||||
<div class="subtask-progress-bar"><div class="subtask-progress-fill" style="width:0%"></div></div>
|
||||
</div>
|
||||
<ul class="subtask-list"><li class="subtask-item s-open" data-sid="11A">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11A</span>
|
||||
<span class="sub-title">数据面定稿 + 修订 ARCHITECTURE.md connect 契约</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="11B">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11B</span>
|
||||
<span class="sub-title">app/kernel 构建管线(AAR/XCFramework/桌面二进制)</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="11C">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11C</span>
|
||||
<span class="sub-title">桥接 API 面(Channel 契约 + 三端原生骨架)</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="11D">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11D</span>
|
||||
<span class="sub-title">桌面端 PoC M1(首发打通)</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="11A 未完成">11A</span><span class="dep-badge dep-pending" title="11B 未完成">11B</span><span class="dep-badge dep-pending" title="11C 未完成">11C</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="11E">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11E</span>
|
||||
<span class="sub-title">Android 端 PoC M2</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="11B 未完成">11B</span><span class="dep-badge dep-pending" title="11C 未完成">11C</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="11F">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11F</span>
|
||||
<span class="sub-title">iOS 端 PoC M3 + entitlement 申请</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="11B 未完成">11B</span><span class="dep-badge dep-pending" title="11C 未完成">11C</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="11G">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11G</span>
|
||||
<span class="sub-title">URLTest + Kill-switch + 弹性重连 M4/M5</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="11D 未完成">11D</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="11H">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">11H</span>
|
||||
<span class="sub-title">控制面联调 M6</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="11A 未完成">11A</span></span></div>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="iOS">iOS</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="Windows">Windows</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="meta-date">🕐 2026-06-11</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-doing"
|
||||
data-id="15"
|
||||
data-level="high"
|
||||
data-status="doing"
|
||||
data-tier="1"
|
||||
data-tags="后端">
|
||||
<div class="card-header">
|
||||
<span class="item-title">探针判封 + 自动更换 scheduler</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-doing">开发中</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
<span class="tag sub-progress-badge">0/8 子任务</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">境内多 ISP 拨测 + 境外对照 + 流量骤降三路互证;blocked_suspect/confirmed 状态机、阈值与熔断、池水位告警、自动补新。依赖 #5、#14。</div>
|
||||
<div class="gate-block gate-pending">
|
||||
<div class="gate-head"><span class="gate-badge pending">⏸ 待确认</span>
|
||||
<span class="gate-kind">一级方案规划 · 确认后方可继续开发</span></div>
|
||||
<div class="gate-note">探针汇聚入口 + 三路互证判定引擎 + make-before-break 自动更换 + 熔断;Go 单体 goroutine + Redis 选主</div><div class="gate-ref">📄 详见 <code>doc/plans/15-probe-scheduler.md</code></div>
|
||||
<button class="approve-btn" data-id="15">确认执行 ✓</button>
|
||||
<div class="approve-cmd" id="approve-cmd-15" style="display:none">
|
||||
<div class="approve-cmd-label">在终端运行:</div>
|
||||
<code class="approve-cmd-code">/todo approve 15</code>
|
||||
<button class="approve-copy-btn" data-cmd="/todo approve 15">复制命令</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="subtask-block">
|
||||
<div class="subtask-header">
|
||||
<span class="subtask-label">子任务</span>
|
||||
<span class="subtask-progress-text">0 / 8 完成</span>
|
||||
<div class="subtask-progress-bar"><div class="subtask-progress-fill" style="width:0%"></div></div>
|
||||
</div>
|
||||
<ul class="subtask-list"><li class="subtask-item s-open" data-sid="15A">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15A</span>
|
||||
<span class="sub-title">探针汇聚入口 + Redis 探针存储</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="15B">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15B</span>
|
||||
<span class="sub-title">轻量探针客户端 L1/L2/L3</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="15A 未完成">15A</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="15C">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15C</span>
|
||||
<span class="sub-title">第三方拨测 API 适配</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="15A 未完成">15A</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="15D">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15D</span>
|
||||
<span class="sub-title">判定引擎 signals+rules+streak</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="15A 未完成">15A</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="15E">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15E</span>
|
||||
<span class="sub-title">自动更换编排 + 养机灰度</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="15D 未完成">15D</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="15F">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15F</span>
|
||||
<span class="sub-title">容量水位 + 熔断器</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="15E 未完成">15E</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="15G">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15G</span>
|
||||
<span class="sub-title">告警出口 TG bot + runbook</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="15D 未完成">15D</span></span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-open" data-sid="15H">
|
||||
<span class="sub-icon s-open">○</span>
|
||||
<span class="sub-sid">15H</span>
|
||||
<span class="sub-title">scheduler 装配 + 选主 + 优雅退出</span>
|
||||
<div class="sub-badges"><span class="tag tier-1">一级</span><span class="tag status-badge s-open">待开始</span><span class="dep-section"><span class="dep-label">依赖:</span><span class="dep-badge dep-pending" title="15D 未完成">15D</span><span class="dep-badge dep-pending" title="15E 未完成">15E</span></span></div>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="meta-date">🕐 2026-06-11</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<p class="empty-tip">暂无条目</p>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section-block" id="section-done">
|
||||
<div class="section-title st-done" data-toggle="done">
|
||||
🔍 待验收 <span class="s-count">1</span>
|
||||
🔍 待验收 <span class="s-count">0</span>
|
||||
<span class="s-arrow">▴ 收起</span>
|
||||
</div>
|
||||
<div class="section-list-wrap " id="list-wrap-done">
|
||||
<ul class="todo-list" id="list-done">
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="19"
|
||||
data-level="mid"
|
||||
data-status="done"
|
||||
data-tier=""
|
||||
data-tags="">
|
||||
<div class="card-header">
|
||||
<span class="item-title">Flutter 逐屏还原+iPad断点: l10n/Riverpod/三态连接/推荐卡/额度卡/Tab滑动/≥900分栏/golden/CI红线</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
|
||||
|
||||
<button class="reject-btn" data-id="19" data-title="Flutter 逐屏还原+iPad断点: l10n/Riverpod/三态连接/推荐卡/额度卡/Tab滑动/≥900分栏/golden/CI红线">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"></div>
|
||||
<div class="item-meta">
|
||||
<span class="meta-date">🕐 2026-06-13</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<p class="empty-tip">暂无条目</p>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1271,16 +844,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
let curTier = 'all';
|
||||
let curTags = new Set();
|
||||
|
||||
// 通过本地服务(http)打开时,按钮直接写库;用 file:// 直接打开则回退为「复制命令」
|
||||
const SERVED = location.protocol === 'http:' || location.protocol === 'https:';
|
||||
function postAction(url, payload) {
|
||||
return fetch(url, {
|
||||
method: 'POST',
|
||||
headers: payload ? { 'Content-Type': 'application/json' } : undefined,
|
||||
body: payload ? JSON.stringify(payload) : undefined,
|
||||
}).then(r => r.json());
|
||||
}
|
||||
|
||||
function applyFilter() {
|
||||
document.querySelectorAll('.todo-card').forEach(card => {
|
||||
const lvl = card.dataset.level;
|
||||
@@ -1401,13 +964,8 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
reasonInput.focus();
|
||||
return;
|
||||
}
|
||||
if (SERVED) {
|
||||
postAction('/api/reject/' + rejectId, { reason })
|
||||
.then(d => { if (d.ok) { location.reload(); } else { alert('拒绝失败:' + (d.error || '')); } })
|
||||
.catch(() => alert('请求失败,确认本地服务是否在运行'));
|
||||
return;
|
||||
}
|
||||
const cmd = '/todo reject ' + rejectId + ' ' + JSON.stringify(reason);
|
||||
const escaped = reason.replace(/\/g, '\\').replace(/"/g, '\"');
|
||||
const cmd = '/todo reject ' + rejectId + ' ' + escaped;
|
||||
cmdText.textContent = cmd;
|
||||
cmdWrap.style.display = 'block';
|
||||
document.getElementById('reject-confirm-btn').style.display = 'none';
|
||||
@@ -1425,32 +983,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
|
||||
copyBtn.textContent = '已复制 ✓';
|
||||
});
|
||||
});
|
||||
|
||||
// ── 确认闸:服务模式直接写库;file:// 模式回退为展开命令 ──
|
||||
document.querySelectorAll('.approve-btn').forEach(btn => {
|
||||
btn.addEventListener('click', e => {
|
||||
e.stopPropagation();
|
||||
const id = btn.dataset.id;
|
||||
if (SERVED) {
|
||||
btn.disabled = true; btn.textContent = '确认中…';
|
||||
postAction('/api/approve/' + id)
|
||||
.then(d => {
|
||||
if (d.ok) { location.reload(); }
|
||||
else { btn.disabled = false; btn.textContent = '确认执行 ✓'; alert('确认失败:' + (d.error || '')); }
|
||||
})
|
||||
.catch(() => { btn.disabled = false; btn.textContent = '确认执行 ✓'; alert('请求失败,确认本地服务是否在运行'); });
|
||||
} else {
|
||||
const box = document.getElementById('approve-cmd-' + id);
|
||||
if (box) box.style.display = box.style.display === 'none' ? 'block' : 'none';
|
||||
}
|
||||
});
|
||||
});
|
||||
document.querySelectorAll('.approve-copy-btn').forEach(btn => {
|
||||
btn.addEventListener('click', e => {
|
||||
e.stopPropagation();
|
||||
navigator.clipboard.writeText(btn.dataset.cmd).then(() => { btn.textContent = '已复制 ✓'; });
|
||||
});
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
+10
-324
@@ -1,10 +1,9 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "doc — 项目 TODO",
|
||||
"updated_at": "2026-06-11T16:33:27.008Z"
|
||||
"updated_at": "2026-06-13T06:32:11.161Z"
|
||||
"updated_at": "2026-06-11T15:48:46.142Z"
|
||||
},
|
||||
"seq": 19,
|
||||
"seq": 18,
|
||||
"items": [
|
||||
{
|
||||
"id": 1,
|
||||
@@ -16,77 +15,11 @@
|
||||
"后端",
|
||||
"数据库"
|
||||
],
|
||||
"status": "doing",
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T15:48:05.656Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"subtasks": [
|
||||
{
|
||||
"sid": "1A",
|
||||
"title": "Go 模块骨架 + 工具链(go.mod/tools.go/Makefile)",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:18.892Z"
|
||||
},
|
||||
{
|
||||
"sid": "1B",
|
||||
"title": "MySQL migration 7 文件 + plans seed",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:18.952Z"
|
||||
},
|
||||
{
|
||||
"sid": "1C",
|
||||
"title": "openapi.yaml 契约(13 操作 + 全量 schema)",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.013Z"
|
||||
},
|
||||
{
|
||||
"sid": "1D",
|
||||
"title": "oapi-codegen 接线 + 生成代码入库",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"1A",
|
||||
"1C"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.070Z"
|
||||
},
|
||||
{
|
||||
"sid": "1E",
|
||||
"title": "config + store(UTC DSN) + 自动迁移",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"1A",
|
||||
"1B"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.125Z"
|
||||
},
|
||||
{
|
||||
"sid": "1F",
|
||||
"title": "apierr + idgen + CONVENTIONS.md",
|
||||
"tier": 2,
|
||||
"deps": [
|
||||
"1A"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.182Z"
|
||||
}
|
||||
],
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "openapi.yaml 13 端点 + MySQL 12 表 migration + plans seed;golang-migrate/oapi-codegen/chi;connect 返回 sing-box 凭证",
|
||||
"ref": "doc/plans/01-openapi-mysql.md",
|
||||
"approval": "pending",
|
||||
"proposed_at": "2026-06-11T16:33:26.856Z",
|
||||
"approved_at": null
|
||||
}
|
||||
"version": null
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
@@ -142,68 +75,11 @@
|
||||
"tags": [
|
||||
"后端"
|
||||
],
|
||||
"status": "doing",
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T15:48:05.872Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"subtasks": [
|
||||
{
|
||||
"sid": "5A",
|
||||
"title": "proto 契约 + buf 工具链(最先冻结)",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.245Z"
|
||||
},
|
||||
{
|
||||
"sid": "5B",
|
||||
"title": "mTLS/CA + 引导 token 框架",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.299Z"
|
||||
},
|
||||
{
|
||||
"sid": "5C",
|
||||
"title": "gRPC server + hub + 跨实例 pub/sub",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"5A",
|
||||
"5B"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.356Z"
|
||||
},
|
||||
{
|
||||
"sid": "5D",
|
||||
"title": "目录灰度 + connect/disconnect + 凭证编排",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"5C"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.415Z"
|
||||
},
|
||||
{
|
||||
"sid": "5E",
|
||||
"title": "生命周期状态机接口(供 #15)",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"5C"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:19.471Z"
|
||||
}
|
||||
],
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "agent gRPC proto(buf) + 控制面 nodes 模块;agent 主动拨号、下发服务端流、mTLS 内部CA、目录 version 灰度",
|
||||
"ref": "doc/plans/05-nodes-grpc.md",
|
||||
"approval": "pending",
|
||||
"proposed_at": "2026-06-11T16:33:26.908Z",
|
||||
"approved_at": null
|
||||
}
|
||||
"version": null
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
@@ -298,99 +174,11 @@
|
||||
"mac",
|
||||
"Windows"
|
||||
],
|
||||
"status": "doing",
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T15:48:25.745Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"subtasks": [
|
||||
{
|
||||
"sid": "11A",
|
||||
"title": "数据面定稿 + 修订 ARCHITECTURE.md connect 契约",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.334Z"
|
||||
},
|
||||
{
|
||||
"sid": "11B",
|
||||
"title": "app/kernel 构建管线(AAR/XCFramework/桌面二进制)",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.389Z"
|
||||
},
|
||||
{
|
||||
"sid": "11C",
|
||||
"title": "桥接 API 面(Channel 契约 + 三端原生骨架)",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.447Z"
|
||||
},
|
||||
{
|
||||
"sid": "11D",
|
||||
"title": "桌面端 PoC M1(首发打通)",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"11A",
|
||||
"11B",
|
||||
"11C"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.504Z"
|
||||
},
|
||||
{
|
||||
"sid": "11E",
|
||||
"title": "Android 端 PoC M2",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"11B",
|
||||
"11C"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.561Z"
|
||||
},
|
||||
{
|
||||
"sid": "11F",
|
||||
"title": "iOS 端 PoC M3 + entitlement 申请",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"11B",
|
||||
"11C"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.616Z"
|
||||
},
|
||||
{
|
||||
"sid": "11G",
|
||||
"title": "URLTest + Kill-switch + 弹性重连 M4/M5",
|
||||
"tier": 2,
|
||||
"deps": [
|
||||
"11D"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.672Z"
|
||||
},
|
||||
{
|
||||
"sid": "11H",
|
||||
"title": "控制面联调 M6",
|
||||
"tier": 2,
|
||||
"deps": [
|
||||
"11A"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.731Z"
|
||||
}
|
||||
],
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "gomobile libbox + Platform Channel + 三端壳;首发桌面→Android→iOS;含数据面定稿 11A",
|
||||
"ref": "doc/plans/11-libbox-bridge.md",
|
||||
"approval": "pending",
|
||||
"proposed_at": "2026-06-11T16:33:26.957Z",
|
||||
"approved_at": null
|
||||
}
|
||||
"version": null
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
@@ -449,100 +237,11 @@
|
||||
"tags": [
|
||||
"后端"
|
||||
],
|
||||
"status": "doing",
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T15:48:45.987Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"subtasks": [
|
||||
{
|
||||
"sid": "15A",
|
||||
"title": "探针汇聚入口 + Redis 探针存储",
|
||||
"tier": 1,
|
||||
"deps": [],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.789Z"
|
||||
},
|
||||
{
|
||||
"sid": "15B",
|
||||
"title": "轻量探针客户端 L1/L2/L3",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"15A"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.845Z"
|
||||
},
|
||||
{
|
||||
"sid": "15C",
|
||||
"title": "第三方拨测 API 适配",
|
||||
"tier": 2,
|
||||
"deps": [
|
||||
"15A"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.900Z"
|
||||
},
|
||||
{
|
||||
"sid": "15D",
|
||||
"title": "判定引擎 signals+rules+streak",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"15A"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:37.959Z"
|
||||
},
|
||||
{
|
||||
"sid": "15E",
|
||||
"title": "自动更换编排 + 养机灰度",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"15D"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:38.015Z"
|
||||
},
|
||||
{
|
||||
"sid": "15F",
|
||||
"title": "容量水位 + 熔断器",
|
||||
"tier": 2,
|
||||
"deps": [
|
||||
"15E"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:38.072Z"
|
||||
},
|
||||
{
|
||||
"sid": "15G",
|
||||
"title": "告警出口 TG bot + runbook",
|
||||
"tier": 2,
|
||||
"deps": [
|
||||
"15D"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:38.130Z"
|
||||
},
|
||||
{
|
||||
"sid": "15H",
|
||||
"title": "scheduler 装配 + 选主 + 优雅退出",
|
||||
"tier": 1,
|
||||
"deps": [
|
||||
"15D",
|
||||
"15E"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-06-11T16:14:38.187Z"
|
||||
}
|
||||
],
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "探针汇聚入口 + 三路互证判定引擎 + make-before-break 自动更换 + 熔断;Go 单体 goroutine + Redis 选主",
|
||||
"ref": "doc/plans/15-probe-scheduler.md",
|
||||
"approval": "pending",
|
||||
"proposed_at": "2026-06-11T16:33:27.007Z",
|
||||
"approved_at": null
|
||||
}
|
||||
"version": null
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
@@ -589,19 +288,6 @@
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"title": "Flutter 逐屏还原+iPad断点: l10n/Riverpod/三态连接/推荐卡/额度卡/Tab滑动/≥900分栏/golden/CI红线",
|
||||
"desc": null,
|
||||
"level": "mid",
|
||||
"tier": null,
|
||||
"tags": [],
|
||||
"status": "done",
|
||||
"created_at": "2026-06-13T06:08:14.230Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user