Skip to content

refactor: 全仓死代码与杂物清理并开启 noUnusedLocals(约 −11k 行) - #1849

Merged
deepcoldy merged 7 commits into
masterfrom
chore/prune-dead-code
Oct 13, 2026
Merged

deepcoldy merged 7 commits into
masterfrom
chore/prune-dead-code

Conversation

@deepcoldy

Copy link
Copy Markdown
Owner

叠在 #1848 之上(base 为其分支),请先合并 #1848。#1848 合并后本 PR 的 base 改回 master 即可。

改了什么

全仓死代码与杂物清理,并开启 noUnusedLocals,净删约 11k 行。分 5 个提交,可逐个 review:

  1. chore(repo):仓库卫生
    • 删除误提交的 tmux-client-*.log(并加入 .gitignore)、无引用的 ROLE_PROFILE_PLAN.md、pm2 时代的 ecosystem.config.cjs。
    • 删除 11 个全仓零引用的一次性脚本、v2 演示 workflows/*.workflow.json 与只调用已下线命令的 dogfood-o1.sh、docs/pr-803-round5-* 评审产物。
    • docs-site workflow 文档:去掉已下线的 v0.2 模板章节(/template run、workflow ls/tail/resume/validate 现均报错),改为现行的 Saved Workflow 与 v2 离线迁移说明,并注明 Workflow 默认关闭。
    • 依赖:删除已无 import 的 smol-toml;@xterm/addon-unicode11 降为 devDependency(web 终端走 CDN)。bun.lock 手工最小编辑,已用 bun install --frozen-lockfile --dry-run 校验。@playwright/test 保留,因为 @midscene/web/playwright 入口静态 import 它。
  2. refactor:生产不可达的孤儿模块
    • 以 26 个生产入口建 import 图,加全仓 grep 双重核实。删除 codex-app-turn-controller、append-system-discovery(及 buildPiArgs.appendSystemPrompt)、traex-user-input、ask-hook/codex(与无 adapter 行为等价)、cli/{log-tail,pm2-env,supervisor-shutdown-client} 等。
    • TmuxBackend:选择器对 tmux 一律 new TmuxPipeBackend,删其实例实现约 415 行,保留生产在用的静态方法。测试改写到 TmuxPipeBackend。
  3. refactor:daemon / worker-pool / IM 层的死函数、死分支与死配置
    • case 'tui_prompt':唯一生产者 ScreenAnalyzer 已在 7 月删除。
    • VC consumer 指令构建、suspendActiveSessionsForBot、buildReforkPrompt、单 bot .env 时代的 config.lark / daemon.allowedUsers 等。
    • 从未发布过的 herdr spec 迁移。
  4. refactor(dashboard):Dashboard 死代码
    • 死 endpoint:PUT summary-trigger、PUT default-oncall。
    • 12 个零引用导出。
    • 死 i18n key:web 127 个,后端 zh/en 各 74 个;可能被动态拼出的 key 按前缀整组保留。
    • 死 CSS:78 个 class 的 210 条规则;组合选择器只要有一部分存活就整条保留。
  5. chore(tsconfig):开启 noUnusedLocals

刻意保留:dispatch-launch-*(预留协议)、sqlite-durable-coordination(在建)、POST recover-permissions(权限恢复状态机唯一 HTTP 入口)、docs/assets 下未引用图片(历史 PR 描述可能按 master 路径引用)。

影响面

纯删除,不改任何存活路径的行为。动到的公共层:core/(worker-pool、session-manager、command-handler)、config.ts、bot-registry.ts、im/lark/。每处删除前都核实过全仓(src / test / scripts / packages)无生产引用,并检查了字符串路径引用、动态 import、打包脚本入口、按 dist/*.js 路径 spawn 等间接引用。会话后端只动了 TmuxBackend 的不可达实例部分,tmux 会话一直走 TmuxPipeBackend。

验证

  • 三套 tsconfig(主 / scripts / test-mocks)在 noUnusedLocals: true 下零错误。
  • 全量 vitest --project unit:用 --reporter=json 分别跑未改动的 master 与本分支,按用例做差集,零新增失败。本机 master 自带约 58 个环境性失败文件(react 副本重复、缺 dist 等),本分支降到 49 个,减少的是随死代码一并删除的测试。
  • npx vitest run --project e2e test/tmux-backend.e2e.ts:5 通过、1 跳过(bwrap 仅 Linux)。
  • 与 fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848 及另外 3 个优化分支合并后的整树:bun run build 通过,生成物与已提交版本逐字节一致。
  • 死 CSS 删除后用 esbuild 与 postcss 重新解析 style.css,语法完整。删除的都是零引用 class,不应有视觉变化。

@deepcoldy

Copy link
Copy Markdown
Owner Author

自动评审初步意见(维护者审阅为准):

整体结论:0 个阻断项(P1/P2),1 个 P3 小尾巴,可以进入合码流程(需先合 #1848)。

核验方式与结果:

  • 本 PR 是叠在 fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848 上的 6 个纯清理提交(净删约 11k 行,159 文件),评审只看相对 fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848 head(bdb60a15)的增量,未重复评 fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848。
  • 依赖/杂物:smol-toml、11 个脚本、workflow 演示 json、文档在 base 树零引用,frozen-lockfile dry-run 一致;docs-site 的 workflow 文档与现行代码(cmdWorkflow/cmdTemplate 退役路由、默认关闭开关)逐条对得上。
  • 孤儿模块:删除的 11 个模块在 base 生产代码全部零引用(只被各自测试引用);ask-hook/codex 删除与「无 adapter」路径行为等价(parseQuestions 恒 null → 同一 passthrough 出口)。
  • TmuxBackend:selector 对 tmux 一律构造 TmuxPipeBackend,全仓无 new/extends TmuxBackend(仅测试);保留的全部是生产在用的静态方法,实例字段以注释说明仅供 worker 的联合类型 cast 使用;改写后的 tmux e2e 本机 6/6 通过。
  • 死配置:config.lark / cliPathOverride / allowedUsers(env) / 两个 getter 均无生产读取方;cd 命令删除的 'inject' 分支与 daemon 实际只返回 respawn-resume/cold-restart 相符;herdr spec 迁移的写入面(dashboard/UI)从未发布过该字段,删除安全。
  • tui_prompt:唯一生产者(ScreenAnalyzer,27305e623)已删;resolved/submit_failed 与 stuck_warning 路径完好保留。
  • Dashboard:两个 PUT endpoint 在前端/CLI/脚本均无调用方(前端早已改打 summary-range / working-dir-mode);201 条删除的 CSS 规则用 postcss 重建选择器集合并与 head 全部 tsx/ts/html 的 class token 交叉核对:零可匹配规则、零动态拼接风险;删除的 web/后端 i18n key 零精确引用,且不落入任何动态 key 前缀组。
  • noUnusedLocals:重点抽查了 write-only 嫌疑变量(isZellijMode / codexAppControlActiveIdentity / bridgePendingTail / scratchMergedHost),base 上确认只写不读;保留项(dispatch/tray/fifoFd/类型断言)均有对应读者并加了 void 与注释。
  • 验证:三套 tsconfig 主/scripts/test-mocks 零错误;bun run build 通过;全量 unit(30178 用例)与 base(fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848 head)同机同批跑用例级差集,零新增确定性失败——strict-env 的 tmux 真机探针、bwrap 沙箱、workflow-feature-gate 等失败在 base 同样复现,属本机共享环境问题;CI 上 build/bun-binary×3/test×3/bun-test/network-boundary 全绿(Midscene 真机飞书流失败为今日各 PR 普遍的环境抖动:topic entry 找不到,与本 PR 无关)。

P3(不阻断,顺手清理):
src/services/oncall-store.ts 的 updateBotDefaultOncall 因本 PR 删除唯一生产调用方(PUT /api/bot-default-oncall)而变成「仅测试引用」,按本 PR 自己的清理标准建议一并删除(连同 oncall-store.test.ts 中对应 2 个用例),或加注释说明刻意保留。

合码注意(非代码问题):

  1. 顺序:先合 fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848,再合本 PR。
  2. fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848 落 master 后本分支需 rebase:与最新 master 仅 2 处冲突——.gitignore(双方各自追加,纯 additive)与 src/im/lark/event-dispatcher.ts(feat(lark): 执行持久会话控制动作 #1837 的持久会话控制改动 vs 本 PR 删除 mentionMatchesBot 本地函数,语义上不冲突,机械合并即可)。

@deepcoldy

Copy link
Copy Markdown
Owner Author

自动复审(独立验证,与首审并行):

结论:0 个阻断项,同意可进入合码流程(先合 #1848)。复现并确认了首审的结论,另把几处首审未展开的点查实如下。

审查范围:仅看本分支 6 个 commit 相对 #1848 head(bdb60a15)的增量,未重复评 #1848。

独立复现的验证

  • 三套 tsconfig 零错误(主 / scripts / test-mocks),本地 node v22.21.1 确认 noUnusedLocals: true 生效后 tsc -p tsconfig.json --noEmit 通过;test/midscene、test/e2e-browser 两个继承主配置的 tsconfig 唯一报错是缺 @midscene/test* 依赖(环境性),本 PR 删除的 feishu-schedule.e2e.ts 未用 import 已处理。
  • packages/workflow-core/tsconfig.build.json 也继承主配置,但设了 noCheck: true,noUnusedLocals 不参与,无遗漏。
  • tmux e2e:npx vitest run --project e2e test/tmux-backend.e2e.ts → 6/6 通过。
  • 全量 unit 差集(同机基线 worktree detach 到 bdb60a15、共享同一 node_modules):以用例级(suite::test)对比,PR 侧 30074 例对 base 30167 例,确定性新增失败 0;base 上复现相同失败的文件(bwrap 探针、真机 tmux、sqlite-bun、plugin-mcp-sandbox 等)在本机同样红。首审「零新增失败」结论复现。
  • plugin-mcp-sandbox.test.ts 单独复现:本机 base 与 PR 均 2 failed / 1 passed,且是 bwrap 环境相关(chmod .../g.sock ENOENT / Connection closed),非本 PR 引入。CI 上同样 bwrap 用例要么真跑要么 loud skip。
  • 单个 flaky 辨析:首轮全量跑里 bridge-final-output-retry.test.ts :: keeps the reply-card write fence... 红、第二轮绿;该文件单独跑 base/PR 皆 172/172 全绿。判断为并行 shard 下的偶发抖动,与本次删除无关(该文件相对 base 仅删了 2 处 type: 'tui_prompt' 的 emit)。

补充核实的删除安全性(首审未展开的点)

  • tui_prompt 分支确已无生产者:在 bdb60a15 全仓搜 type: 'tui_prompt',除类型定义 + worker-pool 的 case 外无任何 send({type:'tui_prompt'...});tuiPromptOptions / tuiPromptCardId 在 base 的写点只有该 case,ds.tuiPromptCardId 的 publishAttentionPatch 读者、session-owner-reminder 的 tui_prompt 状态、card-handler 的 tui_keys 分支也因此恒空。删除分支同时移除 ds.tuiPromptCardId 的唯一写入者,未遗留读到死字段的活路径(仅 session-owner-reminder / workspace-recycle-runtime 读取,均会优雅退化)。
  • TS 联合类型收窄 + 字符串构造兜底:把 tui_prompt 从 WorkerToDaemon 移除后,card.dashboard.schedules.delivery.disabled.silent 这个 i18n key 的「潜在动态前缀」是误报——mapDeliveryDisabledReason(schedules-card.ts)undefined 分支会直接跳过,且 delivery.silent 字面量全仓(src/test/scripts)零引用,删除安全。
  • i18n 动态前缀:清点了删掉的 web 127 key / 后端 74 key:字面量命中 0;按「模板串 \prefix.${...}`提取的前缀」交叉核对,唯一疑似命中的就是上面那个card.dashboard.schedules.delivery.disabled.silent(已判死)。真前缀组(insights.advice.、schedules.calendarDayType.、botDefaults.avatarWarn.` 等)整组保留。
  • 死 CSS:用 esbuild 重新 parse style.css 成功(822KB);对删除规则里出现的 class 与全仓动态前缀(outcome-${...}、is-${...}、phase-${...} 等)做交叉,只有 phase-* / is-* 属组合选择器部件的保留项,未发现误删仍存活的动态类(.lphase/.lmet/.ldom 本身在 base 即已无 tsx 引用)。
  • 孤儿模块:codex-app-turn-controller、append-system-discovery(+buildPiArgs.appendSystemPrompt)、traex-user-input、cli/{log-tail,pm2-env,supervisor-shutdown-client}、core/supervisor-shutdown-protocol.ts、im/types.ts、substitute-targets.ts、hostExecutors/index.ts、ask-hook/codex 在 base 生产树零引用(仅其自身测试);ask-hook/codex 的 parseQuestions 恒 null、passthrough 恒返回空串,与 registry 未命中走 {stdout:''} 同一出口,删除等价。
  • 保留的静态面完好:TmuxBackend 的 hasSession/killSession/探针/诊断等静态方法保留,实例部分删除后 worker-pool / daemon / persistent-backend 仍走这些静态方法;ZellijBackend 只删 paneId/configPath 从未被读的私有字段(selector 从不传 paneId)。
  • 死配置:config.lark(全仓无 config.lark. 读取)、daemon.cliPathOverride、daemon.allowedUsers(env 版)、herdrTraexPlugin/cardBrandLabelEnabled getter 在 base 均无生产读者;resolveHerdrTraexPluginConfig 仍被 dashboard / ensure-herdr-integrations 直接调用,动作未中断。
  • 11 个脚本 + workflow json + 文档:全仓(含 package.json / docs-site / CI yml)零引用。

P3(同首审,不阻断)

src/services/oncall-store.ts 的 updateBotDefaultOncall 因本 PR 删除唯一生产调用方(PUT /api/bot-default-oncall)后仅剩 test/oncall-store.test.ts 引用。按本 PR 自己的死代码标准可一并删除(含那 2 个用例),或加注释标注刻意保留。不阻断合码。

合码注意

  1. 先合 fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848 再合本 PR。
  2. fix(core): 恢复三处合并/重构中丢失的接线(/effort 切档确认、trigger 隔离检查、替身冷启动透传) #1848 落 master 后需 rebase;与最新 master 冲突按首审所述为 .gitignore(纯追加)与 event-dispatcher.ts(语义不冲突)。

未改动作者提交、未 force-push。

deepcoldy and others added 7 commits October 13, 2026 12:19
- 删除根目录误提交的 tmux-client-2881929.log(并加入 .gitignore)、无引用的
  ROLE_PROFILE_PLAN.md、pm2 时代的 ecosystem.config.cjs
- 删除 11 个全仓零引用的一次性脚本(probe / verify / dogfood / 迁移脚本)
- 删除 v2 演示 workflows/*.workflow.json 及只调用已下线命令的 dogfood-o1.sh
- 删除 docs/pr-803-round5-* 评审过程产物(git 历史保留)
- docs-site workflow 文档:去掉已下线的 v0.2 模板章节(/template run、
  workflow ls/tail/resume/validate 现均报错),改为现行的 Saved Workflow
  与 v2 离线迁移说明,并注明 Workflow 默认关闭及开启方式
- 依赖:删除 10-10 起已无 import 的 smol-toml;@xterm/addon-unicode11 仅被
  脚本与测试使用(web 终端走 CDN),降为 devDependency。bun.lock 手工最小
  编辑,已用 `bun install --frozen-lockfile --dry-run` 校验一致
- 保留 @playwright/test:@midscene/web/playwright 入口静态 import 它
以 import 图(26 个生产入口)+ 全仓 grep 双重核实,以下模块只被测试引用:
- services/codex-app-turn-controller.ts(逻辑已内联进 codex-app-runner)
- adapters/cli/append-system-discovery.ts 及 buildPiArgs 的 appendSystemPrompt
  选项(pi 已改走扩展注入,生产从不传该选项)
- services/traex-user-input.ts(已由 RPC 桥接取代)
- core/ask-hook/codex.ts:parseQuestions 恒 null、passthrough 恒空串,与
  "无 adapter" 路径对外行为一致,同步从 registry 去掉注册
- cli/log-tail.ts、cli/pm2-env.ts、cli/supervisor-shutdown-client.ts、
  core/supervisor-shutdown-protocol.ts、dashboard/web/substitute-targets.ts、
  im/types.ts、workflows/hostExecutors/index.ts(零引用 barrel)

TmuxBackend:session-backend-selector 对 tmux 一律 new TmuxPipeBackend,全仓
无 new/extends TmuxBackend。删除其实例部分(构造器、spawn/write/paste/
copy-mode/attach 等约 415 行),保留生产仍在用的静态方法与导出工具函数。
测试:TmuxPipeBackend 已有等价覆盖的用例直接删除;POSIX 启动 argv 与 e2e
用例改写到 TmuxPipeBackend 上。

刻意保留:dispatch-launch-*(预留协议)、sqlite-durable-coordination(在建)。
均经全仓 grep(src/test/scripts/packages)核实无生产调用方:
- daemon:VC consumer 指令构建与注入标记(buildVcMeetingConsumerInstruction、
  markVcMeetingConsumerTranscriptItemsInjected)及只服务它们的常量/间隔函数
- worker-pool:case 'tui_prompt' —— 唯一生产者 ScreenAnalyzer 已于 27305e6
  删除,ds.tuiPromptCardId 此后不再被写入;同步从 WorkerToDaemon 联合移除该
  成员(tui_prompt_resolved / _submit_failed 仍在用,保留)。另删零调用的
  reparkUnsubmittedQueuedActivation 与两个零引用 __testOnly_ 导出
- session-manager:suspendActiveSessionsForBot(调用方已不存在)、
  buildReforkPrompt(已被 buildReforkCliInput 取代)
- card-builder:buildDetouredPendingResponseCard、buildGrantNotifyCard
- bot-registry:isChatOncallBoundForAnyBot、从未实现的 idleDays 字段
- ws-proxy-agent:createLarkWsAgent;overload-nonce:_overloadNonceCountForTest
- types:botClassifyDeadlineAt;command-handler:6 个无人 import 的类型再导出
- config:单 bot .env 时代残留的 config.lark / daemon.cliPathOverride /
  daemon.allowedUsers,以及无读取方的 herdrTraexPlugin、cardBrandLabelEnabled
  getter(生产走 bot-registry.isCardBrandLabelEnabled)
- global-config:herdr `spec` 字段迁移 —— 该 schema 引入与修复之间无任何
  发布 tag,从未对外发布
- cli:cd 命令对旧 daemon 'inject' 模式的兼容分支(daemon 只返回
  respawn-resume / cold-restart)

测试同步:删除驱动已删 tui_prompt handler 的用例(含一条已变成恒真的
doc-native 用例),其余改测仍存活的等价函数。
- 死 endpoint(前端/CLI/脚本/文档均无调用方):
  PUT /api/bots/:id/summary-trigger(自称 short-lived 兼容别名,前端已改用
  summary-range)及其 IPC 路由;PUT /api/bots/:id/default-oncall 及其 IPC
  路由(GET 仍被 /api/bots 使用,保留)
- 12 个零引用导出及随之变孤儿的内部组件/函数(SplitPane、PaneTree*、
  localizeEvidence 等)
- 死 i18n key:web 字典 127 个、后端 zh/en 各 74 个。以 AST 提取模板/拼接
  调用做前缀匹配,凡可能被动态拼出的 key 整组保留(web 212 个、后端 57 个)
- 死 CSS:78 个 class 的 210 条规则。动态拼接前后缀命中的 class、:root/主题
  选择器、组合选择器中任一部分仍存活的规则一律保留;已用 esbuild 与 postcss
  重新解析校验

刻意保留:POST /api/bot-onboarding/recover-permissions(MOSA 权限恢复状态机
唯一 HTTP 入口,外部 wrapper 依赖)、dashboard-command/stub.ts 兜底(有测试钉住)。
/effort 切档确认框的回归(唯一调用点在合并中被冲掉,函数沦为未使用的局部
函数、功能静默失效)说明:未使用的局部符号既可能是死代码,也可能是丢失的
接线。开启 noUnusedLocals 让这类"孤儿"在编译期暴露,并逐个溯源处理:

- 删除 104 个未使用的 import(无 verbatimModuleSyntax,编译产物本就会丢弃,
  不存在副作用 import 被误删)
- 删除 36 个死局部符号:每个都用 git log -S / -L 查到最后一个读者消失于哪次
  有意重构(或"出生即未读")。其中 cli.ts 一批 pm2 时代残留(#873)、
  event-dispatcher 的 mentionMatchesBot(#617 收敛为 messageMentionsBot)、
  codex-app-runner 从未被读取的 private 构造参数属性、zellij-backend 从未被
  读取的 paneId / configPath 字段等
- 保留并标记:cli.ts 的 dispatch(有源码锁测试)、desktop 的 tray(持有引用
  防 GC)、tmux-pipe 的 fifoFd(测试 fixture 读取)、session-commands 的编译期
  类型断言
- 审查中另发现两处丢失接线,已作为独立修复提交在本分支之前:trigger-session
  新建会话绕过 setActiveSessionIfActive 的隔离路由检查;daemon 冷启动透传丢弃
  substitute 标记
- tsconfig.scripts.json 继承主配置后暴露的 2 处脚本未用 import 一并删除

三套 tsconfig(主 / scripts / test-mocks)均零错误。
test/e2e-browser 与 test/midscene 的 tsconfig 继承主 tsconfig,开启
noUnusedLocals 后 feishu-schedule.e2e.ts 未使用的 sendThreadReply import
让 test:midscene:typecheck 失败。逐个核对了所有继承主配置的 tsconfig,
仅此一处。
rebase 合入最新 master 后,主干经 c25f073 新增的 mock-llm-server 两个文件
未满足本分支开启的 noUnusedLocals:recorder.ts 未用的 extractMarkerFromMessages
导入、server.ts handleOpenAiChat 内从未读取的 lastMsg 局部变量。

Co-Authored-By: Claude Code <noreply@anthropic.com>
@deepcoldy
deepcoldy force-pushed the chore/prune-dead-code branch from bbe44c2 to 367254f Compare October 13, 2026 04:31
@deepcoldy
deepcoldy changed the base branch from fix/effort-confirm-and-audit-bugs to master October 13, 2026 04:33
@deepcoldy
deepcoldy merged commit 38eb078 into master Oct 13, 2026
12 checks passed
@github-actions

Copy link
Copy Markdown

🚀 Released in v3.43.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant