feat(pay): 同源收款测试页 GET /_test(Phase E 手动闭环验证)
pay-server 自带 /_test 测试页:创建订单→显示收款地址+精确金额(可复制)
+过期倒计时→轮询状态到 paid。同源、无 CORS/CSP 摩擦,不碰营销站安全头;
纯调 POST /order + GET /order/{id},无私钥无密钥。生产收银台后续走独角数卡门面。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+582
-43
@@ -329,12 +329,12 @@ header .header-meta{color:var(--fg-soft)}
|
||||
<h1>feature+windows — 项目 TODO</h1>
|
||||
<div class="header-meta">生成于 2026-07-08 · 真相源 todo/todo.json</div>
|
||||
<div class="stats">
|
||||
<div class="stat-pill"><strong>18</strong>全部</div>
|
||||
<div class="stat-pill"><strong>8</strong>待开始</div>
|
||||
<div class="stat-pill"><strong>33</strong>全部</div>
|
||||
<div class="stat-pill"><strong>12</strong>待开始</div>
|
||||
<div class="stat-pill"><strong>0</strong>开发中</div>
|
||||
<div class="stat-pill"><strong>2</strong>待验收</div>
|
||||
<div class="stat-pill"><strong>8</strong>已验收</div>
|
||||
|
||||
<div class="stat-pill"><strong>6</strong>待验收</div>
|
||||
<div class="stat-pill"><strong>15</strong>已验收</div>
|
||||
<div class="stat-pill gate-stat"><strong>1</strong>待确认</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
@@ -367,7 +367,7 @@ header .header-meta{color:var(--fg-soft)}
|
||||
<div class="filter-sep"></div>
|
||||
<div class="filter-group">
|
||||
<span class="filter-label">平台 / 标签</span>
|
||||
<button class="filter-chip" data-filter-tag="Android">Android</button><button class="filter-chip" data-filter-tag="CI/CD">CI/CD</button><button class="filter-chip" data-filter-tag="Web">Web</button><button class="filter-chip" data-filter-tag="Windows">Windows</button><button class="filter-chip" data-filter-tag="gRPC">gRPC</button><button class="filter-chip" data-filter-tag="iOS">iOS</button><button class="filter-chip" data-filter-tag="mac">mac</button><button class="filter-chip" data-filter-tag="前端">前端</button><button class="filter-chip" data-filter-tag="后端">后端</button><button class="filter-chip" data-filter-tag="运维">运维</button>
|
||||
<button class="filter-chip" data-filter-tag="Android">Android</button><button class="filter-chip" data-filter-tag="CI/CD">CI/CD</button><button class="filter-chip" data-filter-tag="Web">Web</button><button class="filter-chip" data-filter-tag="Windows">Windows</button><button class="filter-chip" data-filter-tag="gRPC">gRPC</button><button class="filter-chip" data-filter-tag="iOS">iOS</button><button class="filter-chip" data-filter-tag="mac">mac</button><button class="filter-chip" data-filter-tag="network">network</button><button class="filter-chip" data-filter-tag="pangolin1">pangolin1</button><button class="filter-chip" data-filter-tag="reddit">reddit</button><button class="filter-chip" data-filter-tag="warp">warp</button><button class="filter-chip" data-filter-tag="前端">前端</button><button class="filter-chip" data-filter-tag="后端">后端</button><button class="filter-chip" data-filter-tag="支付">支付</button><button class="filter-chip" data-filter-tag="数据库">数据库</button><button class="filter-chip" data-filter-tag="文档">文档</button><button class="filter-chip" data-filter-tag="运维">运维</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -376,7 +376,7 @@ header .header-meta{color:var(--fg-soft)}
|
||||
|
||||
<div class="section-block" id="section-open">
|
||||
<div class="section-title st-open" data-toggle="open">
|
||||
📋 待开始 <span class="s-count">8</span>
|
||||
📋 待开始 <span class="s-count">12</span>
|
||||
<span class="s-arrow">▴ 收起</span>
|
||||
</div>
|
||||
<div class="section-list-wrap " id="list-wrap-open">
|
||||
@@ -401,7 +401,12 @@ header .header-meta{color:var(--fg-soft)}
|
||||
</div>
|
||||
|
||||
<div class="item-desc">现状 L0(stub):VpnChannel.swift:69 setKillSwitch 直接 result(nil)、includeAllNetworks()→false。天花板 L3。改 NetworkExtension:includeAllNetworks=true + NEOnDemandRule 常开 + enforceRoutes,由 neagent 系统级强制、扛 app 崩溃。性价比最高的跨端缺口。依据见 docs/killswitch-design.md §4-6。</div>
|
||||
|
||||
<div class="gate-block gate-granted">
|
||||
<div class="gate-head"><span class="gate-badge granted">✓ 已确认</span>
|
||||
<span class="gate-kind">二级改动说明</span>
|
||||
<span class="gate-date">2026-06-30</span></div>
|
||||
<div class="gate-note">macOS L0→L3,改 2 个原生文件(不动 Dart/服务端)。【VpnChannel.swift】①加缓存 killSwitchEnabled(默认true);②setKillSwitch 落地:存标志+manager已存在则重新applyKillSwitchConfig+saveToPreferences即时生效;③loadOrCreateManager 按标志设 proto.includeAllNetworks/enforceRoutes=true/excludeLocalNetworks=true(放行LAN)+mgr.onDemandRules=[NEOnDemandRuleConnect()]+isOnDemandEnabled;④stop() gotcha:先关 isOnDemandEnabled+save 再 stopVPNTunnel,否则on-demand把断开拉回;⑤start() options 带 killSwitch 传扩展。【PacketTunnelProvider.swift】startTunnel 读 killSwitch option 缓存,includeAllNetworks() 回调返回该值与NE层对齐。无需新增entitlement。验证靠真机:连上后杀扩展/拔网验证流量被阻断(过L1→L2质变线)+on-demand开机/掉线自动拉起+手动断开不反弹。</div><div class="gate-ref">📄 详见 <code>docs/killswitch-design.html</code></div>
|
||||
</div>
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="mac">mac</span></div>
|
||||
@@ -569,14 +574,76 @@ header .header-meta{color:var(--fg-soft)}
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-open"
|
||||
data-id="16"
|
||||
data-id="31"
|
||||
data-level="mid"
|
||||
data-status="open"
|
||||
data-tier="2"
|
||||
data-tags="Web,文档">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#31</span>
|
||||
<span class="item-title">官网文档页:撰写 快速开始/FAQ/协议与安全/隐私政策 4 页,接回 Docs 卡片链接</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-open">待开始</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-2">二级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">web/website Docs 区当前 4 张卡为占位信息卡(不可点)。需撰写真实文档页(可用 Astro content/MDX 或 docs 站),写好后把 Docs.astro 卡片改回 <a href> 并恢复「阅读」CTA、页脚 文档/FAQ/隐私政策 指向对应页。注意:隐私政策属法律文本,由创始人审定,Claude 仅出初稿;对「无日志」VPN,隐私政策是软性上线门槛。</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">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-05</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-open"
|
||||
data-id="32"
|
||||
data-level="mid"
|
||||
data-status="open"
|
||||
data-tier="2"
|
||||
data-tags="前端,后端,Android,iOS">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#32</span>
|
||||
<span class="item-title">控制面 fallback:CF 域名被 SNI 封时客户端退回直连节点 IP 的 https 控制口</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-open">待开始</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-2">二级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">#25 采用 CF Tunnel 前置控制面(api.yanmeiai.com)。已知弱点:该域名可被 GFW 单独 SNI 封锁,届时登录/拉配置不可用(已连隧道不受影响,数据面 REALITY:443 直连也不受影响)。加固:客户端 api 层保留一个直连某健康节点 IP 的 https 控制面 fallback——域名连不上/握手被 RST 时自动退回直连,保证仍能登录/刷新配置/换节点。服务端需在节点上也暴露一个可直连的 https 控制口(或复用现有端口+证书)。属 #25 的后续加固,不在 #25 本轮范围。</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> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-06</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-open"
|
||||
data-id="34"
|
||||
data-level="mid"
|
||||
data-status="open"
|
||||
data-tier="1"
|
||||
data-tags="后端,前端">
|
||||
data-tags="后端,支付,运维">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#16</span>
|
||||
<span class="item-title">启用设备数量限制 + 超限 UX(踢旧/选择移除,非硬拒登)</span>
|
||||
<span class="item-id">#34</span>
|
||||
<span class="item-title">独角数卡 + USDT 收款闭环</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-open">待开始</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
@@ -586,14 +653,14 @@ header .header-meta{color:var(--fg-soft)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-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:涉及登录接口 + 跨后端/前端 + 策略设计。</div>
|
||||
<div class="item-desc">自建发卡网(独角数卡,独立小 VPS 隔离部署,不放 pangolin1)+ USDT(TRC20)收款,打通『下单→付款→自动发激活码→客户端/用户中心兑换→订阅生效』闭环。复用已就绪后端:POST /webhook/store/codes(HMAC+时间戳+nonce)、POST /v1/redeem(JWT)、批次生成/导出(server/internal/codes)。收款终点=单一自托管 USDT 钱包,变现经交易所出金到 US LLC(记账走 accounting)。真相源三文档:docs/payment-a-selfhosted-store-plan.html · payment-channels-overview.html · payment-reseller-fulfillment-design.html。tier-1:含新增 /internal/codes/mint(模型B 单源产码)+ 跨 server/发卡网/客户端/运维。待定:钱包(自托管热钱包 vs 交易所地址)、USDT 路子(自建 TronGrid watcher vs 加密网关)、起步用模型A(预充卡密,零胶水当天可卖)。开工前按 tier-1 走 plan→propose→approve。</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="tag-row"><span class="tag t-tag" data-tag="后端">后端</span> <span class="tag t-tag" data-tag="支付">支付</span> <span class="tag t-tag" data-tag="运维">运维</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-06-30</span>
|
||||
<span class="meta-date">🕐 2026-07-08</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -626,6 +693,68 @@ header .header-meta{color:var(--fg-soft)}
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-06-22</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-open"
|
||||
data-id="19"
|
||||
data-level="low"
|
||||
data-status="open"
|
||||
data-tier="3"
|
||||
data-tags="前端,Android,iOS">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#19</span>
|
||||
<span class="item-title">连接页 resume 时整页闪 spinner(锁屏久重开)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-open">待开始</span>
|
||||
<span class="tag t-low">一般 / 优化</span>
|
||||
<span class="tag tier-3">三级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">长锁屏重开 app 连接页整页 blank 成全屏转圈再回来。根因:MeNotifier.build 里 watch(authProvider),token 过期后 resume 首个请求 401 刷 token,authProvider 变,meProvider 重建进 AsyncLoading,meLoadingProvider(=me.isLoading)true,connect_page:38 整页转圈。功能无碍(VPN 没断),仅体验跳。改:meLoadingProvider 只在真首次(还没成功拿过账户数据)整页转圈;已有数据后的刷新保持连接页不动、后台静默更新,同时保留原意(别先闪免费再跳会员)。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-01</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-open"
|
||||
data-id="24"
|
||||
data-level="low"
|
||||
data-status="open"
|
||||
data-tier="1"
|
||||
data-tags="前端,后端,数据库,mac,Windows,Android,iOS">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#24</span>
|
||||
<span class="item-title">联系我们渠道二级页:Telegram/LINE 多频道/群组,DB 配置</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-open">待开始</span>
|
||||
<span class="tag t-low">一般 / 优化</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">点渠道进二级页,按 kind 分组(频道/群组/Bot)列多条链接,内容 DB 配置。新表 contact_link + GET /v1/contact + 各端 UI。设计:docs/contact-telegram-channels-design.html。待用户统一交互后开发。</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> <span class="tag t-tag" data-tag="数据库">数据库</span> <span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="Windows">Windows</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@@ -645,75 +774,253 @@ header .header-meta{color:var(--fg-soft)}
|
||||
</div>
|
||||
<div class="section-block" id="section-done">
|
||||
<div class="section-title st-done" data-toggle="done">
|
||||
🔍 待验收 <span class="s-count">2</span>
|
||||
🔍 待验收 <span class="s-count">6</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="18"
|
||||
data-level="mid"
|
||||
data-id="25"
|
||||
data-level="high"
|
||||
data-status="done"
|
||||
data-tier="3"
|
||||
data-tags="mac,前端">
|
||||
data-tier="2"
|
||||
data-tags="后端,前端,CI/CD">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#18</span>
|
||||
<span class="item-title">看门狗后台唤醒误判节点死→假重连</span>
|
||||
<span class="item-id">#25</span>
|
||||
<span class="item-title">控制面上 TLS:域名 + 反代证书,客户端默认 https(F1)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-3">三级</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-2">二级</span>
|
||||
|
||||
<button class="reject-btn" data-id="18" data-title="看门狗后台唤醒误判节点死→假重连">拒绝验收</button>
|
||||
<button class="reject-btn" data-id="25" data-title="控制面上 TLS:域名 + 反代证书,客户端默认 https(F1)">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">app/Mac 后台或睡眠一段时间再打开,连通看门狗路径A(urltest stale)用墙上时钟算陈旧度,_lastUrltestOk 在挂起期冻住→唤醒时误判>45s→_onNodeUnhealthy 触发 disconnect+connect 假重连(智能模式还自动切节点),但隧道没掉。修:_onStats 记 _lastStatsAt,路径A 仅在 stats 仍在流但 urltest 停更时才判死;stats 整体停(挂起)则跳过。connection_provider.dart 一处。</div>
|
||||
|
||||
<div class="item-desc">审查 F1(P0 安全):当前客户端默认 http://103.119.13.48:8080 明文,密码/JWT 裸奔公网。需先有域名/HTTP 服务:域名解析到 pangolin1 → Caddy/nginx 自动 Let's Encrypt 反代 :8080 → 客户端 api_config.dart 默认改 https → Android 移除 usesCleartextTraffic → 8080 收回 loopback。见 docs/code-review-2026-07.html</div>
|
||||
<div class="gate-block gate-granted">
|
||||
<div class="gate-head"><span class="gate-badge granted">✓ 已确认</span>
|
||||
<span class="gate-kind">二级改动说明</span>
|
||||
<span class="gate-date">2026-07-06</span></div>
|
||||
<div class="gate-note">控制面上 TLS 走 CF Tunnel:cloudflared 出站隧道前置 api.yanmeiai.com→127.0.0.1:8080(不占 :443,sing-box REALITY 不动)。6 个 Task:①建隧道+装 cloudflared(加法上线,与旧口并存)②客户端默认切 https+去 Android 明文③CI 守护禁明文④PANGOLIN_PUBLIC_URL 切 https(规则集下载基址)⑤待客户端迁移后收 8080 loopback+关防火墙+修健康检查⑥文档。fallback 拆到 #32。</div><div class="gate-ref">📄 详见 <code>docs/superpowers/plans/2026-07-06-control-plane-tls-tunnel.md</code></div>
|
||||
</div>
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="前端">前端</span></div>
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span> <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">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-01</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="19"
|
||||
data-id="26"
|
||||
data-level="high"
|
||||
data-status="done"
|
||||
data-tier="3"
|
||||
data-tags="后端,CI/CD,数据库">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#26</span>
|
||||
<span class="item-title">SQLite 每日备份 + 异地容灾(F2)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-3">三级</span>
|
||||
|
||||
<button class="reject-btn" data-id="26" data-title="SQLite 每日备份 + 异地容灾(F2)">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">审查 F2(P0 运维):pangolin1 生产 SQLite 无任何备份,单盘单机。最简:cron 每日 sqlite3 .backup + rclone 推 R2/S3 异地保留 30 天;更优 Litestream 持续复制。恢复流程写 runbook 并演练。见 docs/code-review-2026-07.html</div>
|
||||
<div class="gate-block gate-info">
|
||||
<div class="gate-head"><span class="gate-badge info">改动说明</span><span class="gate-kind">三级 · 可直接执行</span></div>
|
||||
<div class="gate-note">定时 Gitea Actions 备份工作流(镜像 jiu backup.yml):scripts/ci/backup-db.sh(ssh pangolin1 → sqlite3 online .backup 取 WAL 一致快照 + 远端 integrity_check → gzip 流回 → 存 NAS /volume1/docker/backups/pangolin,保留30天)+ .gitea/workflows/backup.yml(每日02:00北京 cron + 手动,ubuntu-latest,复用 DEPLOY_SSH_KEY,Telegram 通知)。异地=家里NAS≠VPS机房。不动 pangolin1。</div>
|
||||
</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> <span class="tag t-tag" data-tag="数据库">数据库</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="29"
|
||||
data-level="high"
|
||||
data-status="done"
|
||||
data-tier="1"
|
||||
data-tags="warp,network,reddit,pangolin1">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#29</span>
|
||||
<span class="item-title">给 pangolin1 挂 Cloudflare WARP 出站分流:信誉敏感站走 WARP 干净 IP</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
|
||||
<button class="reject-btn" data-id="29" data-title="给 pangolin1 挂 Cloudflare WARP 出站分流:信誉敏感站走 WARP 干净 IP">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">背景与目标:
|
||||
pangolin1 出口是机房脏 IP,访问 Reddit 会触发 403 / 验证码。用 Cloudflare WARP 作为 pangolin1 的一条出站(egress),按目的地分流——把信誉敏感流量(Reddit 等)从 WARP 出,出口 IP 变成 Cloudflare 干净 IP,验证码/403 基本消失;其余流量仍直出保满速。WARP 免费(住宅代理按 GB 收费)。参考本地知识库 /Users/wangjia/code/reddit-karma/docs/sni-throttle-warp.html。
|
||||
|
||||
实现步骤(pangolin1,sing-box 数据面):
|
||||
1) 在 pangolin1 用 wgcf(或 warp-go)注册并生成 WARP 的 WireGuard 配置 profile。
|
||||
2) sing-box 增加一个 wireguard 类型 outbound,tag=warp。
|
||||
3) 增加路由规则:下方「走 WARP 的域名」匹配到 outbound=warp;其余走 direct。
|
||||
4) 重启 sing-box 并验证。
|
||||
|
||||
走 WARP 的域名(用 domain_suffix,自动覆盖子域):
|
||||
- reddit.com(含 www / old / new / sh / oauth.reddit.com API)
|
||||
- redd.it(短链)
|
||||
- i.redd.it、v.redd.it(图片/视频媒体)
|
||||
- redditstatic.com(静态资源)
|
||||
- redditmedia.com(媒体)
|
||||
先只放 Reddit 全家桶;后续若遇其它易弹验证码的社交站,再按同样方式往这条规则里追加,规则集可扩展。
|
||||
|
||||
保持直出(不走 WARP):
|
||||
- 其余所有流量,尤其大流量/大下载——避免 WARP 免费版吞吐瓶颈,保满速。
|
||||
|
||||
约束:
|
||||
- 改机器前遵循 notify-before-system-changes:先只读勘察 pangolin1 现有 sing-box 配置与是否已装 wgcf → 给出改动清单请用户确认 → 再改 + 重启验证。
|
||||
- WARP 配置/密钥不入 git;wgcf 生成的 profile 落 pangolin1 本地(/etc 下),敏感值走 Bitwarden 记录,不提交明文。
|
||||
- WARP 本质仍是数据中心 IP,对最严反欺诈可能仍被标记,但对 Reddit 足够;WARP 不作翻墙用途。
|
||||
|
||||
验收标准:
|
||||
- 经 pangolin 访问 reddit.com 不再出现 403 / 验证码;
|
||||
- curl 确认 reddit 路由的出口 IP 属 Cloudflare 段,而其它流量出口仍为 pangolin1;
|
||||
- 直出流量速度不受影响。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="warp">warp</span> <span class="tag t-tag" data-tag="network">network</span> <span class="tag t-tag" data-tag="reddit">reddit</span> <span class="tag t-tag" data-tag="pangolin1">pangolin1</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="30"
|
||||
data-level="high"
|
||||
data-status="done"
|
||||
data-tier="1"
|
||||
data-tags="CI/CD,后端,前端,mac,Windows,Android,iOS">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#30</span>
|
||||
<span class="item-title">CI/CD 全流程:tag 触发编译/发版/部署到 pangolin1(server+agent+client 产物+官网)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
<span class="tag sub-progress-badge">2/2 子任务</span>
|
||||
<button class="reject-btn" data-id="30" data-title="CI/CD 全流程:tag 触发编译/发版/部署到 pangolin1(server+agent+client 产物+官网)">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">参考 jiu 的 .gitea/workflows(checks/deploy-server/deploy-site/deploy-client/build-windows/backup),套路:tag 触发(server-v*/site-v*/client-v*)→ checkout → provision(幂等)→ compile(scripts/ci/*.sh)→ go test/flutter test → 建 Gitea/Forgejo release 传产物 → ssh 部署目标机;国内镜像 goproxy.cn/flutter-io.cn。pangolin 差异:①部署机=pangolin1(103.119.13.48,非 jiu 的 ali/EC2),走 ssh 别名;②runner label=nas;③server 端要跑 migrate(SQLite,先备份再迁);④client 产出 apk(split-per-abi arm64)+ macOS 公证 dmg + Windows exe + 未来 iOS,这些产物正是官网下载链接的来源(接 web/website Download.astro 的 href)。现有仅 .gitea/workflows/ci.yml(校验,无部署)。含:官网 Astro 构建+部署、server/agent/migrate 编译部署、客户端多端出包与 release 挂载。</div>
|
||||
<div class="gate-block gate-granted">
|
||||
<div class="gate-head"><span class="gate-badge granted">✓ 已确认</span>
|
||||
<span class="gate-kind">一级方案规划</span>
|
||||
<span class="gate-date">2026-07-05</span></div>
|
||||
<div class="gate-note">三期 11 任务(基座+官网+服务端 / Android / macOS+Windows);镜像 jiu scripts/ci+workflows,runner nas/mac/windows,tag 触发;服务端部署固化 F3/F4 备份/迁移/回滚;下载链接接 release;密钥已建对齐 jiu。设计 docs/cicd-design.html,计划 docs/cicd-plan.html。</div><div class="gate-ref">📄 详见 <code>docs/superpowers/plans/2026-07-05-cicd.md</code></div>
|
||||
</div>
|
||||
<div class="subtask-block">
|
||||
<div class="subtask-header">
|
||||
<span class="subtask-label">子任务</span>
|
||||
<span class="subtask-progress-text">2 / 2 完成</span>
|
||||
<div class="subtask-progress-bar"><div class="subtask-progress-fill" style="width:100%"></div></div>
|
||||
</div>
|
||||
<ul class="subtask-list"><li class="subtask-item s-done" data-sid="30A">
|
||||
<span class="sub-icon s-done">✓</span>
|
||||
<span class="sub-sid">30A</span>
|
||||
<span class="sub-title">官网入口接真实 URL:部署后恢复 Header 登录(→usercenter)+ 下载按钮 href(→客户端产物)</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span></div>
|
||||
</li>
|
||||
<li class="subtask-item s-done" data-sid="30B">
|
||||
<span class="sub-icon s-done">✓</span>
|
||||
<span class="sub-sid">30B</span>
|
||||
<span class="sub-title">官网部署:静态站发布到 pangolin.yanmeiai.com + CF DNS 记录指向服务器</span>
|
||||
<div class="sub-badges"><span class="tag tier-2">二级</span><span class="tag status-badge s-done">待验收</span></div>
|
||||
</li></ul>
|
||||
</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> <span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="Windows">Windows</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-05</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="33"
|
||||
data-level="mid"
|
||||
data-status="done"
|
||||
data-tier="1"
|
||||
data-tags="前端,Web,mac,iOS,Android,Windows,CI/CD">
|
||||
data-tags="前端,Web,mac,Windows,Android,iOS">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#19</span>
|
||||
<span class="item-title">前端设计系统治理重构(ds-flow 全端)</span>
|
||||
<span class="item-id">#33</span>
|
||||
<span class="item-title">三端多语言(6语)+ 默认英文</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
|
||||
<button class="reject-btn" data-id="19" data-title="前端设计系统治理重构(ds-flow 全端)">拒绝验收</button>
|
||||
<button class="reject-btn" data-id="33" data-title="三端多语言(6语)+ 默认英文">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">用 ds-flow 把 Flutter 五端+官网+用户中心收口到设计单源。补原型三件套(atoms.css/icons.js/index.html)+Web共享原子层去重(各自实现+同源闸)+硬编码色/fidelity闸+启用pre-commit。6阶段。计划见 docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md</div>
|
||||
<div class="gate-block gate-granted">
|
||||
<div class="gate-head"><span class="gate-badge granted">✓ 已确认</span>
|
||||
<span class="gate-kind">一级方案规划</span>
|
||||
<span class="gate-date">2026-07-07</span></div>
|
||||
<div class="gate-note">6 阶段 ds-flow 治理重构:Phase0 CLAUDE.md+计划落库 / Phase1 原型三件套(atoms.css/icons.js/index.html,收敛ui_kits) / Phase2 Web token同源闸 / Phase3 Web共享原子层去重(各自实现+同源闸,★工作量最大) / Phase4 Flutter收尾+golden补齐 / Phase5 静态闸挂满+启用pre-commit+fidelity体检。已定决策:Web各自实现+同源闸、ui_kits收敛纯HTML、先定稿再逐刀。主题保持light/dark。</div><div class="gate-ref">📄 详见 <code>docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md</code></div>
|
||||
</div>
|
||||
<div class="item-desc">客户端/官网/用户中心新增 日/韩/俄/西(共6语 zh/en/ja/ko/ru/es),默认语种改英文。官网根路由/=英文、中文挪/zh/、新增/ja//ko//ru//es/;用户中心补入 site-v* CI 部署。B1:硬编码UI文案6语化+修auth错误消息永远显中文bug;B2:语言选择持久化(shared_preferences)。红线扫描0违规。已发 client-v1.0.60 + site-v0.0.6;B1/B2 待 client-v1.0.61。</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> <span class="tag t-tag" data-tag="mac">mac</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="Windows">Windows</span> <span class="tag t-tag" data-tag="CI/CD">CI/CD</span></div>
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="Web">Web</span> <span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="Windows">Windows</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-07</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="18"
|
||||
data-level="low"
|
||||
data-status="done"
|
||||
data-tier="3"
|
||||
data-tags="前端,Android,iOS">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#18</span>
|
||||
<span class="item-title">节点判死无备用时自动重连当前节点(而非断开报错)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-low">一般 / 优化</span>
|
||||
<span class="tag tier-3">三级</span>
|
||||
|
||||
<button class="reject-btn" data-id="18" data-title="节点判死无备用时自动重连当前节点(而非断开报错)">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">长挂机后数据面睡死→看门狗 path A 正确判上游死,但智能模式仅1节点/找不到备用时只会 _disconnect+报节点异常,逼用户手动重连(实测挂机2h回来即遇)。改 _onNodeUnhealthy:无备用节点时自动重连当前节点重建通路,加有限次数保护避免节点真挂时死循环。connection_provider.dart 一处。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-01</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@@ -722,12 +1029,244 @@ header .header-meta{color:var(--fg-soft)}
|
||||
</div>
|
||||
<div class="section-block" id="section-accepted">
|
||||
<div class="section-title st-accepted" data-toggle="accepted">
|
||||
✅ 已验收 <span class="s-count">8</span>
|
||||
✅ 已验收 <span class="s-count">15</span>
|
||||
<span class="s-arrow">▾ 展开</span>
|
||||
</div>
|
||||
<div class="section-list-wrap collapsed" id="list-wrap-accepted">
|
||||
<ul class="todo-list" id="list-accepted">
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="28"
|
||||
data-level="mid"
|
||||
data-status="accepted"
|
||||
data-tier="3"
|
||||
data-tags="后端,前端">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#28</span>
|
||||
<span class="item-title">disconnect 撤销每设备凭证而非账户级(F4)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-accepted">已验收</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-3">三级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">审查 F4:ConnectNode 发每设备 devDp,DisconnectNode 却吊销账户级 ent.DpUUID 且无 device_id 入参——断开从未真正吊销,凭证活到 TTL。修:disconnect 收 device_id,吊销该设备 dp_uuid(账户级作遗留兜底);客户端带上 device_id。</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="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
<span class="meta-date">✅ 验收 2026-07-05</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="27"
|
||||
data-level="high"
|
||||
data-status="accepted"
|
||||
data-tier="1"
|
||||
data-tags="后端,数据库">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#27</span>
|
||||
<span class="item-title">同机换账号设备注册 403 死结:devices 唯一键改 (user_id,uuid)(F3)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-accepted">已验收</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">审查 F3:device_id 跨账号复用 + devices.uuid 全局 UNIQUE → 第二账号注册永远 403 → 连接被 DEVICE_NOT_REGISTERED 卡死。落地 migration16 注释里推迟的 UNIQUE(user_id,uuid) 表重建,注册查找改按 (user,uuid)。见 docs/code-review-2026-07.html</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="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
<span class="meta-date">✅ 验收 2026-07-05</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="22"
|
||||
data-level="high"
|
||||
data-status="accepted"
|
||||
data-tier="2"
|
||||
data-tags="后端">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#22</span>
|
||||
<span class="item-title">用量分钟数超计(多设备并发按 dp_uuid 累加)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-accepted">已验收</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-2">二级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">agent 每 dp_uuid 每窗口计 SessionMinutes=1,控制面 ReportUsage 逐条累加进 usage_daily.minutes_used → N 台并发=N×墙上时钟(chenxin 2903/天)。免费卡控下会错误判耗尽。改:账户维度按 user 分组去重(minutes=max,bytes=sum),每设备维度不变。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="后端">后端</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
<span class="meta-date">✅ 验收 2026-07-02 · <span class="ver-badge">v1.0.47</span></span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="21"
|
||||
data-level="high"
|
||||
data-status="accepted"
|
||||
data-tier="1"
|
||||
data-tags="后端,前端,数据库,mac,Windows,Android,iOS">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#21</span>
|
||||
<span class="item-title">免费版10分钟卡控+累加式看广告加时</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-accepted">已验收</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">连接期倒计时+到点切断;耗尽按钮灰化;点击弹广告(占位流程)看完+10分钟(累加,每日封顶120);桌面硬10分钟不可延+升级提示。额度全账户共享。服务端ConnectNode按remaining卡控+TTL硬切;ad_bonus_minutes累加模型;DevVerifier占位。</div>
|
||||
<div class="gate-block gate-granted">
|
||||
<div class="gate-head"><span class="gate-badge granted">✓ 已确认</span>
|
||||
<span class="gate-kind">一级方案规划</span>
|
||||
<span class="gate-date">2026-07-01</span></div>
|
||||
<div class="gate-note">已进 plan 模式出方案并经用户 ExitPlanMode 批准</div><div class="gate-ref">📄 详见 <code>/Users/wangjia/.claude/plans/crystalline-exploring-lerdorf.md</code></div>
|
||||
</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> <span class="tag t-tag" data-tag="数据库">数据库</span> <span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="Windows">Windows</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-01</span>
|
||||
<span class="meta-date">✅ 验收 2026-07-02 · <span class="ver-badge">v1.0.44</span></span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="23"
|
||||
data-level="mid"
|
||||
data-status="accepted"
|
||||
data-tier="3"
|
||||
data-tags="mac,前端">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#23</span>
|
||||
<span class="item-title">macOS 最小化托盘后点 Dock 图标无法唤回窗口</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-accepted">已验收</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-3">三级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">windowManager.hide() 走 orderOut: 后窗口不可见,点 Dock 图标只发 applicationShouldHandleReopen(hasVisibleWindows=false),AppDelegate 未接管 → 点了没反应。修:AppDelegate 实现 applicationShouldHandleReopen 唤回 mainFlutterWindow。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="前端">前端</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-02</span>
|
||||
<span class="meta-date">✅ 验收 2026-07-02 · <span class="ver-badge">v1.0.48</span></span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="20"
|
||||
data-level="mid"
|
||||
data-status="accepted"
|
||||
data-tier="3"
|
||||
data-tags="Android,iOS,前端">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#20</span>
|
||||
<span class="item-title">看门狗后台唤醒/切后台误判节点死→假断连(已修)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-accepted">已验收</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-3">三级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">后台/挂起期 urltest 被限流停更但 speed 在流→path A 误判上游死断连。修:statsLive 闸 + 切后台(paused/hidden)停看门狗、resumed 重启并重置基准。另修连接时长墙上时钟(切后台不漏计)。已合 main 07861ea/37c1724/58211d2,含回归测试。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="iOS">iOS</span> <span class="tag t-tag" data-tag="前端">前端</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-07-01</span>
|
||||
<span class="meta-date">✅ 验收 2026-07-01</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="16"
|
||||
data-level="mid"
|
||||
data-status="accepted"
|
||||
data-tier="1"
|
||||
data-tags="后端,前端">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#16</span>
|
||||
<span class="item-title">启用设备数量限制 + 超限 UX(踢旧/选择移除,非硬拒登)</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-accepted">已验收</span>
|
||||
<span class="tag t-high">重要</span>
|
||||
<span class="tag tier-1">一级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-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:涉及登录接口 + 跨后端/前端 + 策略设计。</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">登录卡超限(非硬拒登:token照发+返回device_limit信号,客户端挡在移除设备页)+连接backstop兜底;选择移除+一键踢最旧;服务端按last_seen自动清理久不活跃(staleWindow=30d,活跃count排除+登录best-effort删僵尸)。复用现成 DeleteDevice/ResolvePlan/CheckDeviceQuota/ConnectNode。后端:auth service/handler(recordLogin回传+LoginOutcome.DeviceLimit)、devices(DeviceLimitStatus+活跃count+prune)、main wiring、nodes ConnectNode backstop。前端:auth_api解析、auth_provider路由、DeviceLimitScreen、l10n。无DB schema变更。</div><div class="gate-ref">📄 详见 <code>~/.claude/plans/crystalline-exploring-lerdorf.md</code></div>
|
||||
<button class="approve-btn" data-id="16">确认执行 ✓</button>
|
||||
<div class="approve-cmd" id="approve-cmd-16" style="display:none">
|
||||
<div class="approve-cmd-label">在终端运行:</div>
|
||||
<code class="approve-cmd-code">/todo approve 16</code>
|
||||
<button class="approve-copy-btn" data-cmd="/todo approve 16">复制命令</button>
|
||||
</div>
|
||||
</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="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-06-30</span>
|
||||
<span class="meta-date">✅ 验收 2026-07-01</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-accepted"
|
||||
data-id="11"
|
||||
data-level="low"
|
||||
|
||||
+362
-26
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "feature+windows — 项目 TODO",
|
||||
"updated_at": "2026-07-07T17:45:18.036Z"
|
||||
"updated_at": "2026-07-08T14:10:36.344Z"
|
||||
},
|
||||
"seq": 19,
|
||||
"seq": 34,
|
||||
"items": [
|
||||
{
|
||||
"id": 1,
|
||||
@@ -19,6 +19,14 @@
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"gate": {
|
||||
"kind": "change",
|
||||
"note": "macOS L0→L3,改 2 个原生文件(不动 Dart/服务端)。【VpnChannel.swift】①加缓存 killSwitchEnabled(默认true);②setKillSwitch 落地:存标志+manager已存在则重新applyKillSwitchConfig+saveToPreferences即时生效;③loadOrCreateManager 按标志设 proto.includeAllNetworks/enforceRoutes=true/excludeLocalNetworks=true(放行LAN)+mgr.onDemandRules=[NEOnDemandRuleConnect()]+isOnDemandEnabled;④stop() gotcha:先关 isOnDemandEnabled+save 再 stopVPNTunnel,否则on-demand把断开拉回;⑤start() options 带 killSwitch 传扩展。【PacketTunnelProvider.swift】startTunnel 读 killSwitch option 缓存,includeAllNetworks() 回调返回该值与NE层对齐。无需新增entitlement。验证靠真机:连上后杀扩展/拔网验证流量被阻断(过L1→L2质变线)+on-demand开机/掉线自动拉起+手动断开不反弹。",
|
||||
"ref": "docs/killswitch-design.html",
|
||||
"approval": "granted",
|
||||
"proposed_at": "2026-06-30T15:40:37.653Z",
|
||||
"approved_at": "2026-06-30T15:46:23.512Z"
|
||||
},
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
@@ -264,25 +272,34 @@
|
||||
"后端",
|
||||
"前端"
|
||||
],
|
||||
"status": "open",
|
||||
"status": "accepted",
|
||||
"created_at": "2026-06-30T14:33:48.996Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"done": true,
|
||||
"completed_at": "2026-07-01T14:59:20.954Z",
|
||||
"version": null,
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "登录卡超限(非硬拒登:token照发+返回device_limit信号,客户端挡在移除设备页)+连接backstop兜底;选择移除+一键踢最旧;服务端按last_seen自动清理久不活跃(staleWindow=30d,活跃count排除+登录best-effort删僵尸)。复用现成 DeleteDevice/ResolvePlan/CheckDeviceQuota/ConnectNode。后端:auth service/handler(recordLogin回传+LoginOutcome.DeviceLimit)、devices(DeviceLimitStatus+活跃count+prune)、main wiring、nodes ConnectNode backstop。前端:auth_api解析、auth_provider路由、DeviceLimitScreen、l10n。无DB schema变更。",
|
||||
"ref": "~/.claude/plans/crystalline-exploring-lerdorf.md",
|
||||
"approval": "pending",
|
||||
"proposed_at": "2026-07-01T11:05:42.018Z",
|
||||
"approved_at": null
|
||||
},
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"title": "看门狗后台唤醒误判节点死→假重连",
|
||||
"desc": "app/Mac 后台或睡眠一段时间再打开,连通看门狗路径A(urltest stale)用墙上时钟算陈旧度,_lastUrltestOk 在挂起期冻住→唤醒时误判>45s→_onNodeUnhealthy 触发 disconnect+connect 假重连(智能模式还自动切节点),但隧道没掉。修:_onStats 记 _lastStatsAt,路径A 仅在 stats 仍在流但 urltest 停更时才判死;stats 整体停(挂起)则跳过。connection_provider.dart 一处。",
|
||||
"level": "mid",
|
||||
"title": "节点判死无备用时自动重连当前节点(而非断开报错)",
|
||||
"desc": "长挂机后数据面睡死→看门狗 path A 正确判上游死,但智能模式仅1节点/找不到备用时只会 _disconnect+报节点异常,逼用户手动重连(实测挂机2h回来即遇)。改 _onNodeUnhealthy:无备用节点时自动重连当前节点重建通路,加有限次数保护避免节点真挂时死循环。connection_provider.dart 一处。",
|
||||
"level": "low",
|
||||
"tier": 3,
|
||||
"tags": [
|
||||
"mac",
|
||||
"前端"
|
||||
"前端",
|
||||
"Android",
|
||||
"iOS"
|
||||
],
|
||||
"status": "done",
|
||||
"created_at": "2026-06-30T23:00:25.193Z",
|
||||
"created_at": "2026-07-01T04:11:47.293Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
@@ -290,33 +307,352 @@
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"title": "前端设计系统治理重构(ds-flow 全端)",
|
||||
"desc": "用 ds-flow 把 Flutter 五端+官网+用户中心收口到设计单源。补原型三件套(atoms.css/icons.js/index.html)+Web共享原子层去重(各自实现+同源闸)+硬编码色/fidelity闸+启用pre-commit。6阶段。计划见 docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md",
|
||||
"title": "连接页 resume 时整页闪 spinner(锁屏久重开)",
|
||||
"desc": "长锁屏重开 app 连接页整页 blank 成全屏转圈再回来。根因:MeNotifier.build 里 watch(authProvider),token 过期后 resume 首个请求 401 刷 token,authProvider 变,meProvider 重建进 AsyncLoading,meLoadingProvider(=me.isLoading)true,connect_page:38 整页转圈。功能无碍(VPN 没断),仅体验跳。改:meLoadingProvider 只在真首次(还没成功拿过账户数据)整页转圈;已有数据后的刷新保持连接页不动、后台静默更新,同时保留原意(别先闪免费再跳会员)。",
|
||||
"level": "low",
|
||||
"tier": 3,
|
||||
"tags": [
|
||||
"前端",
|
||||
"Android",
|
||||
"iOS"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-07-01T04:13:36.446Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 20,
|
||||
"title": "看门狗后台唤醒/切后台误判节点死→假断连(已修)",
|
||||
"desc": "后台/挂起期 urltest 被限流停更但 speed 在流→path A 误判上游死断连。修:statsLive 闸 + 切后台(paused/hidden)停看门狗、resumed 重启并重置基准。另修连接时长墙上时钟(切后台不漏计)。已合 main 07861ea/37c1724/58211d2,含回归测试。",
|
||||
"level": "mid",
|
||||
"tier": 3,
|
||||
"tags": [
|
||||
"Android",
|
||||
"iOS",
|
||||
"前端"
|
||||
],
|
||||
"status": "accepted",
|
||||
"created_at": "2026-07-01T04:14:03.051Z",
|
||||
"done": true,
|
||||
"completed_at": "2026-07-01T14:59:21.052Z",
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 21,
|
||||
"title": "免费版10分钟卡控+累加式看广告加时",
|
||||
"desc": "连接期倒计时+到点切断;耗尽按钮灰化;点击弹广告(占位流程)看完+10分钟(累加,每日封顶120);桌面硬10分钟不可延+升级提示。额度全账户共享。服务端ConnectNode按remaining卡控+TTL硬切;ad_bonus_minutes累加模型;DevVerifier占位。",
|
||||
"level": "high",
|
||||
"tier": 1,
|
||||
"tags": [
|
||||
"后端",
|
||||
"前端",
|
||||
"数据库",
|
||||
"mac",
|
||||
"Windows",
|
||||
"Android",
|
||||
"iOS"
|
||||
],
|
||||
"status": "accepted",
|
||||
"created_at": "2026-07-01T15:30:27.692Z",
|
||||
"done": true,
|
||||
"completed_at": "2026-07-02T03:21:30.577Z",
|
||||
"version": "v1.0.44",
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "已进 plan 模式出方案并经用户 ExitPlanMode 批准",
|
||||
"ref": "/Users/wangjia/.claude/plans/crystalline-exploring-lerdorf.md",
|
||||
"approval": "granted",
|
||||
"proposed_at": "2026-07-01T15:30:53.245Z",
|
||||
"approved_at": "2026-07-01T15:31:08.948Z"
|
||||
},
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 22,
|
||||
"title": "用量分钟数超计(多设备并发按 dp_uuid 累加)",
|
||||
"desc": "agent 每 dp_uuid 每窗口计 SessionMinutes=1,控制面 ReportUsage 逐条累加进 usage_daily.minutes_used → N 台并发=N×墙上时钟(chenxin 2903/天)。免费卡控下会错误判耗尽。改:账户维度按 user 分组去重(minutes=max,bytes=sum),每设备维度不变。",
|
||||
"level": "high",
|
||||
"tier": 2,
|
||||
"tags": [
|
||||
"后端"
|
||||
],
|
||||
"status": "accepted",
|
||||
"created_at": "2026-07-02T01:34:10.026Z",
|
||||
"done": true,
|
||||
"completed_at": "2026-07-02T03:21:42.079Z",
|
||||
"version": "v1.0.47",
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"title": "macOS 最小化托盘后点 Dock 图标无法唤回窗口",
|
||||
"desc": "windowManager.hide() 走 orderOut: 后窗口不可见,点 Dock 图标只发 applicationShouldHandleReopen(hasVisibleWindows=false),AppDelegate 未接管 → 点了没反应。修:AppDelegate 实现 applicationShouldHandleReopen 唤回 mainFlutterWindow。",
|
||||
"level": "mid",
|
||||
"tier": 3,
|
||||
"tags": [
|
||||
"mac",
|
||||
"前端"
|
||||
],
|
||||
"status": "accepted",
|
||||
"created_at": "2026-07-02T02:50:26.908Z",
|
||||
"done": true,
|
||||
"completed_at": "2026-07-02T03:21:30.418Z",
|
||||
"version": "v1.0.48",
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"title": "联系我们渠道二级页:Telegram/LINE 多频道/群组,DB 配置",
|
||||
"desc": "点渠道进二级页,按 kind 分组(频道/群组/Bot)列多条链接,内容 DB 配置。新表 contact_link + GET /v1/contact + 各端 UI。设计:docs/contact-telegram-channels-design.html。待用户统一交互后开发。",
|
||||
"level": "low",
|
||||
"tier": 1,
|
||||
"tags": [
|
||||
"前端",
|
||||
"后端",
|
||||
"数据库",
|
||||
"mac",
|
||||
"Windows",
|
||||
"Android",
|
||||
"iOS"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-07-02T04:22:44.667Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"title": "控制面上 TLS:域名 + 反代证书,客户端默认 https(F1)",
|
||||
"desc": "审查 F1(P0 安全):当前客户端默认 http://103.119.13.48:8080 明文,密码/JWT 裸奔公网。需先有域名/HTTP 服务:域名解析到 pangolin1 → Caddy/nginx 自动 Let's Encrypt 反代 :8080 → 客户端 api_config.dart 默认改 https → Android 移除 usesCleartextTraffic → 8080 收回 loopback。见 docs/code-review-2026-07.html",
|
||||
"level": "high",
|
||||
"tier": 2,
|
||||
"tags": [
|
||||
"后端",
|
||||
"前端",
|
||||
"CI/CD"
|
||||
],
|
||||
"status": "done",
|
||||
"created_at": "2026-07-02T05:07:08.281Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"gate": {
|
||||
"kind": "change",
|
||||
"note": "控制面上 TLS 走 CF Tunnel:cloudflared 出站隧道前置 api.yanmeiai.com→127.0.0.1:8080(不占 :443,sing-box REALITY 不动)。6 个 Task:①建隧道+装 cloudflared(加法上线,与旧口并存)②客户端默认切 https+去 Android 明文③CI 守护禁明文④PANGOLIN_PUBLIC_URL 切 https(规则集下载基址)⑤待客户端迁移后收 8080 loopback+关防火墙+修健康检查⑥文档。fallback 拆到 #32。",
|
||||
"ref": "docs/superpowers/plans/2026-07-06-control-plane-tls-tunnel.md",
|
||||
"approval": "granted",
|
||||
"proposed_at": "2026-07-06T08:24:55.562Z",
|
||||
"approved_at": "2026-07-06T08:27:20.492Z"
|
||||
},
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 26,
|
||||
"title": "SQLite 每日备份 + 异地容灾(F2)",
|
||||
"desc": "审查 F2(P0 运维):pangolin1 生产 SQLite 无任何备份,单盘单机。最简:cron 每日 sqlite3 .backup + rclone 推 R2/S3 异地保留 30 天;更优 Litestream 持续复制。恢复流程写 runbook 并演练。见 docs/code-review-2026-07.html",
|
||||
"level": "high",
|
||||
"tier": 3,
|
||||
"tags": [
|
||||
"后端",
|
||||
"CI/CD",
|
||||
"数据库"
|
||||
],
|
||||
"status": "done",
|
||||
"created_at": "2026-07-02T05:07:08.354Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"gate": {
|
||||
"kind": "change",
|
||||
"note": "定时 Gitea Actions 备份工作流(镜像 jiu backup.yml):scripts/ci/backup-db.sh(ssh pangolin1 → sqlite3 online .backup 取 WAL 一致快照 + 远端 integrity_check → gzip 流回 → 存 NAS /volume1/docker/backups/pangolin,保留30天)+ .gitea/workflows/backup.yml(每日02:00北京 cron + 手动,ubuntu-latest,复用 DEPLOY_SSH_KEY,Telegram 通知)。异地=家里NAS≠VPS机房。不动 pangolin1。",
|
||||
"ref": null,
|
||||
"approval": "none",
|
||||
"proposed_at": "2026-07-06T06:53:10.439Z",
|
||||
"approved_at": null
|
||||
},
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 27,
|
||||
"title": "同机换账号设备注册 403 死结:devices 唯一键改 (user_id,uuid)(F3)",
|
||||
"desc": "审查 F3:device_id 跨账号复用 + devices.uuid 全局 UNIQUE → 第二账号注册永远 403 → 连接被 DEVICE_NOT_REGISTERED 卡死。落地 migration16 注释里推迟的 UNIQUE(user_id,uuid) 表重建,注册查找改按 (user,uuid)。见 docs/code-review-2026-07.html",
|
||||
"level": "high",
|
||||
"tier": 1,
|
||||
"tags": [
|
||||
"后端",
|
||||
"数据库"
|
||||
],
|
||||
"status": "accepted",
|
||||
"created_at": "2026-07-02T05:07:56.717Z",
|
||||
"done": true,
|
||||
"completed_at": "2026-07-05T08:54:08.901Z",
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"title": "disconnect 撤销每设备凭证而非账户级(F4)",
|
||||
"desc": "审查 F4:ConnectNode 发每设备 devDp,DisconnectNode 却吊销账户级 ent.DpUUID 且无 device_id 入参——断开从未真正吊销,凭证活到 TTL。修:disconnect 收 device_id,吊销该设备 dp_uuid(账户级作遗留兜底);客户端带上 device_id。",
|
||||
"level": "mid",
|
||||
"tier": 3,
|
||||
"tags": [
|
||||
"后端",
|
||||
"前端"
|
||||
],
|
||||
"status": "accepted",
|
||||
"created_at": "2026-07-02T05:20:47.843Z",
|
||||
"done": true,
|
||||
"completed_at": "2026-07-05T08:54:08.986Z",
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"title": "给 pangolin1 挂 Cloudflare WARP 出站分流:信誉敏感站走 WARP 干净 IP",
|
||||
"desc": "背景与目标:\npangolin1 出口是机房脏 IP,访问 Reddit 会触发 403 / 验证码。用 Cloudflare WARP 作为 pangolin1 的一条出站(egress),按目的地分流——把信誉敏感流量(Reddit 等)从 WARP 出,出口 IP 变成 Cloudflare 干净 IP,验证码/403 基本消失;其余流量仍直出保满速。WARP 免费(住宅代理按 GB 收费)。参考本地知识库 /Users/wangjia/code/reddit-karma/docs/sni-throttle-warp.html。\n\n实现步骤(pangolin1,sing-box 数据面):\n1) 在 pangolin1 用 wgcf(或 warp-go)注册并生成 WARP 的 WireGuard 配置 profile。\n2) sing-box 增加一个 wireguard 类型 outbound,tag=warp。\n3) 增加路由规则:下方「走 WARP 的域名」匹配到 outbound=warp;其余走 direct。\n4) 重启 sing-box 并验证。\n\n走 WARP 的域名(用 domain_suffix,自动覆盖子域):\n- reddit.com(含 www / old / new / sh / oauth.reddit.com API)\n- redd.it(短链)\n- i.redd.it、v.redd.it(图片/视频媒体)\n- redditstatic.com(静态资源)\n- redditmedia.com(媒体)\n先只放 Reddit 全家桶;后续若遇其它易弹验证码的社交站,再按同样方式往这条规则里追加,规则集可扩展。\n\n保持直出(不走 WARP):\n- 其余所有流量,尤其大流量/大下载——避免 WARP 免费版吞吐瓶颈,保满速。\n\n约束:\n- 改机器前遵循 notify-before-system-changes:先只读勘察 pangolin1 现有 sing-box 配置与是否已装 wgcf → 给出改动清单请用户确认 → 再改 + 重启验证。\n- WARP 配置/密钥不入 git;wgcf 生成的 profile 落 pangolin1 本地(/etc 下),敏感值走 Bitwarden 记录,不提交明文。\n- WARP 本质仍是数据中心 IP,对最严反欺诈可能仍被标记,但对 Reddit 足够;WARP 不作翻墙用途。\n\n验收标准:\n- 经 pangolin 访问 reddit.com 不再出现 403 / 验证码;\n- curl 确认 reddit 路由的出口 IP 属 Cloudflare 段,而其它流量出口仍为 pangolin1;\n- 直出流量速度不受影响。",
|
||||
"level": "high",
|
||||
"tier": 1,
|
||||
"tags": [
|
||||
"warp",
|
||||
"network",
|
||||
"reddit",
|
||||
"pangolin1"
|
||||
],
|
||||
"status": "done",
|
||||
"created_at": "2026-07-02T05:25:38.314Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 30,
|
||||
"title": "CI/CD 全流程:tag 触发编译/发版/部署到 pangolin1(server+agent+client 产物+官网)",
|
||||
"desc": "参考 jiu 的 .gitea/workflows(checks/deploy-server/deploy-site/deploy-client/build-windows/backup),套路:tag 触发(server-v*/site-v*/client-v*)→ checkout → provision(幂等)→ compile(scripts/ci/*.sh)→ go test/flutter test → 建 Gitea/Forgejo release 传产物 → ssh 部署目标机;国内镜像 goproxy.cn/flutter-io.cn。pangolin 差异:①部署机=pangolin1(103.119.13.48,非 jiu 的 ali/EC2),走 ssh 别名;②runner label=nas;③server 端要跑 migrate(SQLite,先备份再迁);④client 产出 apk(split-per-abi arm64)+ macOS 公证 dmg + Windows exe + 未来 iOS,这些产物正是官网下载链接的来源(接 web/website Download.astro 的 href)。现有仅 .gitea/workflows/ci.yml(校验,无部署)。含:官网 Astro 构建+部署、server/agent/migrate 编译部署、客户端多端出包与 release 挂载。",
|
||||
"level": "high",
|
||||
"tier": 1,
|
||||
"tags": [
|
||||
"CI/CD",
|
||||
"后端",
|
||||
"前端",
|
||||
"mac",
|
||||
"Windows",
|
||||
"Android",
|
||||
"iOS"
|
||||
],
|
||||
"status": "done",
|
||||
"created_at": "2026-07-05T09:27:34.399Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"subtasks": [
|
||||
{
|
||||
"sid": "30A",
|
||||
"title": "官网入口接真实 URL:部署后恢复 Header 登录(→usercenter)+ 下载按钮 href(→客户端产物)",
|
||||
"tier": 2,
|
||||
"deps": [],
|
||||
"status": "done",
|
||||
"created_at": "2026-07-05T09:56:30.954Z"
|
||||
},
|
||||
{
|
||||
"sid": "30B",
|
||||
"title": "官网部署:静态站发布到 pangolin.yanmeiai.com + CF DNS 记录指向服务器",
|
||||
"tier": 2,
|
||||
"deps": [],
|
||||
"status": "done",
|
||||
"created_at": "2026-07-05T11:19:59.363Z"
|
||||
}
|
||||
],
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "三期 11 任务(基座+官网+服务端 / Android / macOS+Windows);镜像 jiu scripts/ci+workflows,runner nas/mac/windows,tag 触发;服务端部署固化 F3/F4 备份/迁移/回滚;下载链接接 release;密钥已建对齐 jiu。设计 docs/cicd-design.html,计划 docs/cicd-plan.html。",
|
||||
"ref": "docs/superpowers/plans/2026-07-05-cicd.md",
|
||||
"approval": "granted",
|
||||
"proposed_at": "2026-07-05T15:41:17.465Z",
|
||||
"approved_at": "2026-07-05T15:45:12.499Z"
|
||||
},
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 31,
|
||||
"title": "官网文档页:撰写 快速开始/FAQ/协议与安全/隐私政策 4 页,接回 Docs 卡片链接",
|
||||
"desc": "web/website Docs 区当前 4 张卡为占位信息卡(不可点)。需撰写真实文档页(可用 Astro content/MDX 或 docs 站),写好后把 Docs.astro 卡片改回 <a href> 并恢复「阅读」CTA、页脚 文档/FAQ/隐私政策 指向对应页。注意:隐私政策属法律文本,由创始人审定,Claude 仅出初稿;对「无日志」VPN,隐私政策是软性上线门槛。",
|
||||
"level": "mid",
|
||||
"tier": 2,
|
||||
"tags": [
|
||||
"Web",
|
||||
"文档"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-07-05T10:08:52.391Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 32,
|
||||
"title": "控制面 fallback:CF 域名被 SNI 封时客户端退回直连节点 IP 的 https 控制口",
|
||||
"desc": "#25 采用 CF Tunnel 前置控制面(api.yanmeiai.com)。已知弱点:该域名可被 GFW 单独 SNI 封锁,届时登录/拉配置不可用(已连隧道不受影响,数据面 REALITY:443 直连也不受影响)。加固:客户端 api 层保留一个直连某健康节点 IP 的 https 控制面 fallback——域名连不上/握手被 RST 时自动退回直连,保证仍能登录/刷新配置/换节点。服务端需在节点上也暴露一个可直连的 https 控制口(或复用现有端口+证书)。属 #25 的后续加固,不在 #25 本轮范围。",
|
||||
"level": "mid",
|
||||
"tier": 2,
|
||||
"tags": [
|
||||
"前端",
|
||||
"后端",
|
||||
"Android",
|
||||
"iOS"
|
||||
],
|
||||
"status": "open",
|
||||
"created_at": "2026-07-06T08:15:57.519Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"owner": "agent"
|
||||
},
|
||||
{
|
||||
"id": 33,
|
||||
"title": "三端多语言(6语)+ 默认英文",
|
||||
"desc": "客户端/官网/用户中心新增 日/韩/俄/西(共6语 zh/en/ja/ko/ru/es),默认语种改英文。官网根路由/=英文、中文挪/zh/、新增/ja//ko//ru//es/;用户中心补入 site-v* CI 部署。B1:硬编码UI文案6语化+修auth错误消息永远显中文bug;B2:语言选择持久化(shared_preferences)。红线扫描0违规。已发 client-v1.0.60 + site-v0.0.6;B1/B2 待 client-v1.0.61。",
|
||||
"level": "mid",
|
||||
"tier": 1,
|
||||
"tags": [
|
||||
"前端",
|
||||
"Web",
|
||||
"mac",
|
||||
"iOS",
|
||||
"Android",
|
||||
"Windows",
|
||||
"CI/CD"
|
||||
"Android",
|
||||
"iOS"
|
||||
],
|
||||
"owner": "agent",
|
||||
"status": "done",
|
||||
"created_at": "2026-07-07T15:41:25.760Z",
|
||||
"created_at": "2026-07-07T08:36:36.295Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null,
|
||||
"gate": {
|
||||
"kind": "plan",
|
||||
"note": "6 阶段 ds-flow 治理重构:Phase0 CLAUDE.md+计划落库 / Phase1 原型三件套(atoms.css/icons.js/index.html,收敛ui_kits) / Phase2 Web token同源闸 / Phase3 Web共享原子层去重(各自实现+同源闸,★工作量最大) / Phase4 Flutter收尾+golden补齐 / Phase5 静态闸挂满+启用pre-commit+fidelity体检。已定决策:Web各自实现+同源闸、ui_kits收敛纯HTML、先定稿再逐刀。主题保持light/dark。",
|
||||
"ref": "docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md",
|
||||
"approval": "granted",
|
||||
"proposed_at": "2026-07-07T15:41:36.536Z",
|
||||
"approved_at": "2026-07-07T15:54:54.386Z"
|
||||
}
|
||||
"version": null
|
||||
},
|
||||
{
|
||||
"id": 34,
|
||||
"title": "独角数卡 + USDT 收款闭环",
|
||||
"desc": "自建发卡网(独角数卡,独立小 VPS 隔离部署,不放 pangolin1)+ USDT(TRC20)收款,打通『下单→付款→自动发激活码→客户端/用户中心兑换→订阅生效』闭环。复用已就绪后端:POST /webhook/store/codes(HMAC+时间戳+nonce)、POST /v1/redeem(JWT)、批次生成/导出(server/internal/codes)。收款终点=单一自托管 USDT 钱包,变现经交易所出金到 US LLC(记账走 accounting)。真相源三文档:docs/payment-a-selfhosted-store-plan.html · payment-channels-overview.html · payment-reseller-fulfillment-design.html。tier-1:含新增 /internal/codes/mint(模型B 单源产码)+ 跨 server/发卡网/客户端/运维。待定:钱包(自托管热钱包 vs 交易所地址)、USDT 路子(自建 TronGrid watcher vs 加密网关)、起步用模型A(预充卡密,零胶水当天可卖)。开工前按 tier-1 走 plan→propose→approve。",
|
||||
"level": "mid",
|
||||
"tier": 1,
|
||||
"tags": [
|
||||
"后端",
|
||||
"支付",
|
||||
"运维"
|
||||
],
|
||||
"owner": "agent",
|
||||
"status": "open",
|
||||
"created_at": "2026-07-08T14:10:36.343Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
"version": null
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user