# 管理后台 UX 与管理功能评审 - 日期:2026-09-19 - 状态:**已全部修复**(2026-09-19,随 0.0.156 发布)。少数条目按代码查证结论做了调整:#7 角色删除需后端补 `DELETE /roles/:id`(前端已留 TODO);#6 按角色筛选用户需后端 `roleId` 参数(前端以提示条占位);#38 上传逐包失败明细需后端扩展返回结构;其余全部落地。 - 范围:`admin/src/views/` 全部 15 个路由页面(含子组件/对话框)+ 全局 Layout/SideMenu,并交叉对照 `backend-ts/src/` 对应路由与服务能力。 - 方法:逐页通读源码,标注问题;重点识别「后端已有能力、前端未暴露」与「前后端双重不一致」两类高价值缺陷。所有条目均有代码位置佐证,无臆测项。 ## 问题总览(按优先级) | 级别 | 数量 | 说明 | |---|---|---| | P0 | 1 | 安全/数据破坏风险 | | P1 | 8 | 管理能力缺口、后端已有能力未暴露 | | P2 | 12 | 前后端能力错配、信息展示缺失 | | P3 | 14+ | UX 一致性、表单校验、加载反馈等细节 | --- ## P0 安全与数据破坏 ### 1. 系统 Skill 的删除/上传完全没有权限控制 - 位置:`admin/src/views/skill/SkillListView.vue:111` + `backend-ts/src/skill/skill.routes.ts:110-135` - 问题:后端 `DELETE /v1/skill-docs/:name`、`POST /v1/skill-docs/upload` 只做 `requireUserId`,未校验任何权限码;对比同文件注册的个人 Skill 路由删除需 `agent:write`。即**任何登录用户都能删除或覆盖系统级技能**,且删除时级联从所有 Agent 中清理 `skillName`(`skill.routes.ts:122-135`),破坏面大。前端佐证:系统 tab 的删除按钮没有 `:disabled="!canWrite"`,而个人 tab 的删除按钮有,前后端双重不一致。 - 建议:后端给 skill-docs 写接口加 `agent:write`(或专用 `skill:write`);前端系统 tab 删除按钮补 `canWrite` 守卫,与个人 tab 对齐。 --- ## P1 管理能力缺口(含后端已有能力未暴露) ### 2. 审计日志缺时间范围与按用户筛选——后端已支持但前端未暴露 - 位置:`admin/src/views/audit/AuditLogView.vue:151-154`(filters 定义) - 问题:后端 `audit.routes.ts:11-14` 已解析 `userId`/`startDate`/`endDate`,`audit.repository.ts:42-60` 已实现对应 SQL 过滤,但前端 filters 只有 action/objectType/success,无日期选择器、无用户下拉。审计场景「某人在某段时间做了什么」是最高频追查诉求。`/admin/sessions/options/users` 接口在 SessionListView 已有现成调用可复用。 - 建议:补 `el-date-picker`(日期范围)与用户下拉,随查询参数透传。 ### 3. 运行态会话接口 `/v1/admin/runtime/sessions` 无任何前端调用方 - 位置:`backend-ts/src/admin/admin.routes.ts:107-141`(接口);`admin/src/views/analytics/tabs/OverviewTab.vue:158-164` - 问题:后端专门提供运行态会话列表接口(默认筛 RUNNING/RESUMING/WAITING_APPROVAL/FAILED/CANCELLED),admin 前端 grep 不到任何引用;Overview「运行态」卡只有数字,且只有「查看失败会话」链接(`/sessions?phase=FAILED`),「运行中」「等待审批」两个实时数字不可点击下钻。 - 建议:「运行中/待审批」数字加链接跳会话列表(SessionListView 已支持 `?phase=` query),或接入 runtime/sessions 做实时运行态面板。 ### 4. 会话列表无终止/归档/删除等运维操作 - 位置:`admin/src/views/session/SessionListView.vue:60-68, 193-200`;后端 `session.routes.ts:272-276, 316-321`、`session.service.ts:450, 728` - 问题:后端已有 `DELETE /v1/sessions/:id`、`PUT /v1/sessions/:id/archive|unarchive`(目前要求 owner,说明服务层 deleteSession/archiveSession 能力已具备),admin 列表只有「查看」。失败/卡死的会话(FAILED/RUNNING 挂起)既不能终止也不能清理。 - 建议:至少为失败会话提供删除(带确认弹窗),并在 admin 路由侧评估补 admin 鉴权的归档/删除端点。 ### 5. 飞书机器人无连通性状态与测试能力,配置错误只能靠消息失败暴露 - 位置:`admin/src/views/feishu-bot/FeishuBotListView.vue`(整页);后端 `feishu/monitor.service.ts:13-18` - 问题:后端 monitor 维护长连接并有 onFailure/onReconnecting 状态回调,但 admin 路由既不暴露连接运行状态,也没有 test 端点;前端只能看到「启用/停用」和「Secret 已配置」(只代表存了值,不代表正确)。appId/appSecret 填错后机器人静默重连失败,管理员无从发现。 - 建议:后端暴露每个 bot 的连接状态(ready/reconnecting/failed + 最近失败原因),前端列表加状态列与「重连/测试」操作。本页最有价值的缺口。 ### 6. 用户管理无删除、无批量操作、无角色/账号类型筛选 - 位置:`admin/src/views/user/` 整组;`backend-ts/src/user/user.routes.ts:33-40` - 问题:后端 listUsers 只支持 keyword/status;前端无批量启用/禁用,大量账号开停全部逐条操作。列表已展示角色标签与本地/LDAP 类型,却无法按角色(如「找出所有管理员」)或账号类型筛选,需后端先支持。 - 建议:补批量启停(复用 `PUT /users/:id/status` 或后端批量接口);后端增加按角色/账号类型筛选参数。 ### 7. 角色无删除能力,也无成员查看 - 位置:`admin/src/views/permission/RolePermissionView.vue:33-39` - 问题:前后端均无删除角色接口(permission.routes.ts 只有 create/update/assign),错误创建的角色永久残留;「用户数」列点不开,无法查看该角色下有哪些用户。 - 建议:后端补删除角色(校验角色下无用户);前端「查看成员」跳用户列表并按角色预筛(依赖问题 6 的角色筛选参数)。 ### 8. LLM 调用流水无导出,会话详情聊天记录无导出 - 位置:`admin/src/views/llm-call/LlmCallView.vue:85-96`;`admin/src/views/session/SessionDetailView.vue:18-23` - 问题:作为计费/排障核心的调用流水无 CSV 导出;会话完整记录(含工具调用、思考过程)只能逐轮「加载更多」浏览,排查纠纷时无法留存证据。 - 建议:两页提供「导出当前筛选/全量」按钮(前端循环拉取生成 CSV/JSON/Markdown 下载)。 ### 9. 系统设置页 secret 留空=不修改,但无法清除已设置的密钥 - 位置:`admin/src/views/settings/SystemSettingsView.vue:189-195`(saveCategory 的 secret 语义) - 问题:批量保存时 secret 空串提交 null 表示「不修改」,界面上没有任何途径把一个已设置的 secret 清空/作废(例如轮换密钥后想清掉旧 Key)。 - 建议:为 secret 字段提供「清除」操作(后端 batch 支持显式置空),并在 UI 区分「未修改/已清除」状态。 --- ## P2 前后端能力错配与信息展示缺失 ### 10. MCP 服务器列表无分页 - 位置:`admin/src/views/mcp/McpServerListView.vue:394-405`(loadData) - 问题:`GET /mcp-servers` 一次返回全量,前端无分页控件;服务器数量增长后首屏传输与渲染线性膨胀,与其他列表页的分页规范(ResponsivePagination)不一致。 - 建议:后端补分页参数,前端接入 ResponsivePagination。 ### 11. 定时任务缺「立即执行」与执行历史查看,且 sessionId 无跳转 - 位置:`admin/src/views/scheduled-tasks/index.vue:296-306`(handleDelete/handleToggleStatus) - 问题:列表只展示 `lastExecutionStatus` 聚合标签,无法查看历次执行的记录与失败原因;失败任务无「立即重试/立即执行」操作(若后端评估支持);`ScheduledTask` 结构中有 `sessionId`,但任务与触发产生的会话之间没有任何跳转入口,排障断链。 - 建议:操作列补「查看会话」链接;与后端确认执行历史查询接口(或按 sessionId 跳会话详情间接查看);评估立即执行能力。 ### 12. LLM 调用流水从行数据无法跳转会话,反向下钻同样缺失 - 位置:`admin/src/views/llm-call/LlmCallView.vue:97-101, 173`;`SessionDetailView.vue` 全文 - 问题:行数据中有 `sessionId`(仅详情弹窗展示纯文本),表格列和操作列都没有「查看会话」入口;反向(会话详情 → 该会话的调用流水)也缺失。 - 建议:操作列增加「查看会话」链接(sessionId 非空时);SessionDetail 信息卡增加「调用流水」入口。 ### 13. 审计日志无跨页跳转,用户名不可点击 - 位置:`admin/src/views/audit/AuditLogView.vue:24-28` - 问题:审计日志列出用户名但不可点击,无法跳到该用户的会话列表(`/sessions?userId=x`)或调用流水;对比 Analytics UserTab(`UserTab.vue:53, 63`)已实现同类跳转。objectType+objectId 也应能跳到对应管理页。 - 建议:用户名加下钻链接;详情弹窗补 `objectId` 展示(表落库字段,`audit.repository.ts:18`)。 ### 14. Agent 列表未展示后端已返回的创建人 - 位置:`admin/src/views/agent/AgentListView.vue:30-50`;`backend-ts/src/agent/agent.routes.ts:227-233` - 问题:后端 `toVO` 已查询并填充 `creatorName`(代价已付出),前端列表没有「创建人」列。「这个 Agent 是谁建的」是管理高频信息。顺带:后端 toVO 中 creator/experience/suggestedQuestion 是逐条查询(N+1)。 - 建议:列表增加创建人列;后端改批量查询。 ### 15. Agent 提示词版本历史只显示操作人裸 ID - 位置:`admin/src/views/agent/AgentPromptHistoryDialog.vue:27`;`backend-ts/src/agent/agent.routes.ts:100-104` - 问题:后端只回传 `operatorId`,前端直接显示数字;对照本项目 admin 路由成熟做法(`/v1/admin/user-commands`、`/v1/admin/user-skills` 用 `userLookup.findByIds` 批量补 username),审计价值打折。 - 建议:后端 VO 补 `operatorName`(或前端映射)。 ### 16. 模型列表无「默认模型」标识 - 位置:`admin/src/views/model/ModelListView.vue:65-77` - 问题:后端返回 `isDefault`,筛选器也提供「默认/非默认」筛选项,但表格名称列徽标只有视觉/启用/协议三种 icon,筛出来也认不出哪个是默认模型。 - 建议:名称列加「默认」tag(同 AgentListView 做法)。 ### 17. 用量分析明细被后端截断为 Top 20,前端无提示、无全量入口 - 位置:`admin/src/views/analytics/tabs/UserTab.vue / AgentTab.vue / ModelTab.vue`;`backend-ts/src/admin/admin.routes.ts:47` - 问题:users/agents scope 默认 `limit=20`(上限 100),前端只在 header 小字写「Top {{ userRows.length }}」,没有「查看全部」入口,各表也无导出。 - 建议:limit 提升/远程分页,或提供跳转会话列表按条件看全量的入口,并补 CSV 导出。 ### 18. 分析页下钻链接丢失统计周期上下文 - 位置:`admin/src/views/analytics/tabs/OverviewTab.vue:158-164` - 问题:所有下钻链接(`/sessions?phase=FAILED`、`/llm-call?success=false` 等)不带时间范围,分析页看到「近 7 天失败 12 个」,点过去是全量列表,口径不一致。LlmCallView 已支持日期参数,可直接透传。 - 建议:下钻链接按后端能力透传 startDate/endDate。 ### 19. 分析页跨页签模块级缓存永不失效 - 位置:`admin/src/views/analytics/composables/useScopeQuery.ts:16` - 问题:`cache`/`inflight` 是模块级 Map 且跨组件存活,切走再切回时只要 loadedKey 命中就直接用旧数据,`fetchedAt` 可能是数小时前;刷新按钮是唯一出路。 - 建议:加 TTL(如 5 分钟过期)或在 onActivated 时强制刷新。 ### 20. 飞书 Bot 编辑时可修改 appKey 且无唯一性预检 - 位置:`admin/src/views/feishu-bot/FeishuBotListView.vue:160, 240` - 问题:`appKey` 是机器人内部唯一标识(表单 hint 自述),编辑时允许修改并随 PUT 提交;若与其他 bot 冲突或被 webhook/绑定关系引用,变更影响面大且无二次确认。 - 建议:编辑模式将 appKey 置只读(同 UserFormDialog 对 username 的处理),或修改时强确认。 ### 21. 模型表单「供应商」纯自由文本,后端 providers 接口未复用 - 位置:`admin/src/views/model/ModelFormDialog.vue:24-30`;`backend-ts/src/model/model.routes.ts:60-63` - 问题:后端已有 `GET /v1/models/providers`(列表页已用于筛选下拉),但表单里 provider 是自由输入框,同一供应商易被拼成 "openai/OpenAI/Openai",导致筛选下拉碎片化。 - 建议:改为可输入的 `filterable allow-create` el-select,选项来自 providers 接口。 ### 22. 指令管理两个 tab 全量拉取 + 纯前端过滤分页 - 位置:`admin/src/views/system-commands/SystemCommandListView.vue:303-319, 112-121, 438-443` - 问题:系统指令和个人指令都是 GET 全量后前端 filter + slice 分页,后端 `listPersonalAll` 无任何条件参数;个人指令随用户增长持续膨胀。 - 建议:后端补 keyword/分页参数,前端真分页。 --- ## P3 UX 细节与一致性 ### 23. 全局布局无「修改密码」入口,退出登录无确认 - 位置:`admin/src/components/Layout.vue:57-67`(handleCommand) - 问题:右上角用户下拉只有「退出登录」一项,直接执行无确认;本地账号管理员无法在后台修改自己的密码(需回到桌面端或其他途径),也不展示当前登录账号的角色信息。 - 建议:下拉补「修改密码」与当前角色展示;退出加二次确认。 ### 24. 登录页无表单校验规则,错误提示依赖后端原文 - 位置:`admin/src/views/auth/LoginView.vue:12-27` - 问题:用户名/密码输入框未绑定 `rules`(仅手写判空提示),输入格式错误只能等后端返回原文 message 直接 toast,异常码无差异化文案(如「账号已禁用」与「密码错误」文案区分)。 - 建议补 el-form rules 与差异化错误提示。 ### 25. Agent 列表搜索框不支持回车触发查询 - 位置:`admin/src/views/agent/AgentListView.vue:19-25` - 问题:UserListView、ModelListView、SystemCommandListView 的关键词输入框都有 `@keyup.enter="handleSearch"`,唯独 Agent 列表没有,交互不一致。 - 建议:补 `@keyup.enter`。 ### 26. 默认 Agent 的删除按钮未前置禁用 - 位置:`admin/src/views/agent/AgentListView.vue:40, 217`;`backend-ts/src/agent/agent.service.ts:152-156` - 问题:后端对 `isDefault === 1` 的 Agent 直接抛 `AGENT_IS_DEFAULT`,前端仍渲染可点击的「删除」按钮,操作后才报错。 - 建议:`row.isDefault` 时禁用删除按钮并加 tooltip 说明。 ### 27. 模型表单 baseUrl 未设必填校验,编辑可随意切换模型类型 - 位置:`admin/src/views/model/ModelFormDialog.vue:162-165, 11-15` - 问题:`baseUrl` 只有 pattern 校验(async-validator 对空值跳过 pattern),而创建接口 `body.baseUrl!` 必填,留空提交会得到后端异常而非表单内联错误。编辑对话框中 modelType 的 radio-group 未禁用,把已投入使用的文本模型改成语音/文生图会把 `supportsVision`、`isDefault` 强制归零(:209-211),使所有引用该模型的 Agent/Bot 语义错位。 - 建议:baseUrl 补 `{ required: true }`;编辑模式禁用类型切换,或切换时弹确认说明后果。 ### 28. 权限勾选无分组、无搜索、无全选 - 位置:`admin/src/views/permission/RolePermissionView.vue:44-58` - 问题:权限平铺为两列 checkbox grid,权限码增长后只能逐个找;角色编码无格式校验(前端只校验非空,后端 createRole 也直接透传,「ops admin」这类编码都能建进去)。 - 建议:按权限码前缀分组折叠 + 域级全选;角色编码统一 pattern 校验(如 `^[A-Z0-9_]{2,32}$`)。 ### 29. 权限脏状态仅在切换角色时守卫,路由离开无守卫 - 位置:`admin/src/views/permission/RolePermissionView.vue:77-79, 110-117` - 问题:`dirtyPermissions` 只用于行点击确认;点侧边菜单切页、刷新浏览器时未保存的权限修改直接丢失且无提示。 - 建议:补 `onBeforeRouteLeave` + `beforeunload` 守卫,保存按钮在脏状态下高亮。 ### 30. 用户编辑对话框允许把自己禁用,报错时机后置 - 位置:`admin/src/views/user/UserFormDialog.vue:62-67`;`backend-ts/src/user/user.service.ts:69-71` - 问题:列表页行内「禁用」按钮对当前用户做了 `isCurrentUser` 禁用,但编辑对话框里的「状态」开关没有同样守卫;后端虽有兜底,用户要等提交失败才看到错误。 - 建议:编辑当前登录用户时禁用该开关并注明原因。 ### 31. 编辑模型可回填明文 API Key 的安全设计 - 位置:`admin/src/views/model/ModelFormDialog.vue:199-206` - 位置(后端):`backend-ts/src/model/model.routes.ts` - 问题:`model:write` 权限下后端直接返回明文 Key 并回填输入框,任何拥有模型写权限的管理员都能看到所有供应商的生产密钥。 - 建议:至少改为「点击查看」式按需揭示,并考虑在审计日志记录查看行为。 ### 32. 工具调用复制无成功反馈,复制的是截断文本 - 位置:`admin/src/views/session/components/ToolCallCard.vue:112-118, 131-133` - 问题:`copyText` 无 Promise 处理:成功无提示,失败(非 HTTPS/权限拒绝)静默吞掉,用户误以为已复制;`.filter()` 走 `truncatedResult` 截断到 4000 字符,复制按钮复制的是截断后文本而非完整输出,却无任何提示。 - 建议:复制成功/失败给 ElMessage 反馈;超限时提示「仅复制已截断内容」或提供完整下载。 ### 33. 用户消息折叠阈值仅按行数,单行超长文本不折叠 - 位置:`admin/src/views/session/components/MessageGroup.vue:139` - 问题:`isUserLong` 只统计换行数 > 10,一条 5000 字的单行粘贴内容不会被折叠,直接撑爆版面;助手最终回复也没有折叠机制。 - 建议:阈值改为「行数 > 10 或字符数 > 800」。 ### 34. 定时任务筛选区 UX 细节:状态开关行内混排、关键词不防抖 - 位置:`admin/src/views/scheduled-tasks/index.vue`(操作列与搜索表单) - 问题:操作列的 el-switch(启/停)与删除 popconfirm 混在同一格,移动端易误触;关键词输入仅回车/查询触发(McpServerListView 已有 300ms 防抖输入即查),两页交互不一致。 - 建议:开关与删除分列或间距拉开;关键词与 MCP 页对齐防抖输入即查。 ### 35. 指令/飞书 Bot 页写操作按钮无前端权限守卫 - 位置:`admin/src/views/system-commands/SystemCommandListView.vue:10, 70, 145`;`admin/src/views/feishu-bot/FeishuBotListView.vue` 整页 - 问题:新增/编辑/删除按钮无 `v-if` 权限/管理员显隐控制(后端 requireAdmin),有菜单访问权的管理员点击只会得到 403 提示;飞书 Bot 页还无任何搜索/筛选。 - 建议:按 isAdmin 或专用权限码控制按钮显隐;飞书 Bot 页补名称/appId 搜索。 ### 36. Agent 表单下拉加载失败静默留空,头像上传无失败反馈 - 位置:`admin/src/views/agent/AgentFormDialog.vue:633-646, 474-491` - 问题:Skills/MCP/模型下拉加载失败时仅清空数组,用户看到「没有可选项」而非「加载失败」,无法区分「系统没有技能」与「加载失败」;`uploadAvatar` 只有 try/finally 无 catch,上传失败无明确提示。 - 建议:下拉加 loading/失败重试;头像上传补 catch 提示。 ### 37. 分析页非首次加载为纯转圈面板,趋势图缺 dataZoom,选中行无高亮 - 位置:`admin/src/views/analytics/AnalyticsView.vue:52-54`;`tabs/TrendsTab.vue:100-135`;`tabs/ModelTab.vue:163-171` - 问题:非 overview 首次加载时整个区域是 280px 的 v-loading 空 div(白板转圈);TrendsTab 内联的 call/quality 趋势图无 dataZoom(chart-options.ts 的 series/token 图 >30 天时启用,90 天视图 X 轴拥挤);ModelTab 点击行切换 sceneModelId 后行无高亮、也无法清除选择查看全部模型。 - 建议:loading 区改 el-skeleton;趋势图抽公共 dataZoom 逻辑;选中行加 row-class-name 高亮 + hint 区「清除」按钮。 ### 38. Skill 列表「校验」与「状态」两列信息重复,上传失败无差异化反馈 - 位置:`admin/src/views/skill/SkillListView.vue:85-96, 97-105, 432-447` - 问题:两列都基于同一表达式 `row.filePath || row.folderPath` 判定("通过/异常" vs "可用/不可用"),浪费列宽;上传部分成功部分失败时只有一条整体成败提示,无法定位哪个目录包缺 SKILL.md。 - 建议:合并两列或让「状态」反映真实运行态;后端返回逐包校验明细,前端列表化展示失败原因。 ### 39. 审计日志列表无自动刷新选项 - 位置:`admin/src/views/audit/AuditLogView.vue:39-41` - 问题:列表仅在手动点刷新时更新,作为排障页面不便盯实时故障。 - 建议:提供「自动刷新」开关(30s/60s 轮询)或「最近 N 分钟」快捷过滤。 ### 40. 会话详情页信息卡无刷新、无关联下钻 - 位置:`admin/src/views/session/SessionDetailView.vue:41-52` - 问题:信息卡没有手动刷新按钮(仅 keep-alive 激活时刷新);用户名/Agent 名/模型名均为纯文本,不能跳用户会话列表、Agent 管理或调用流水。 - 建议:头部加刷新按钮;信息卡字段加下钻链接。 ### 41. LLM 流水移动端卡片丢关键字段,模型下拉硬编码 200 条上限 - 位置:`admin/src/views/llm-call/LlmCallView.vue:151(移动端卡片区), 380-384` - 问题:`effort`/`protocol`/`retryCount`/`cachedTokens` 在移动端卡片完全缺失,失败排障时移动端看不到错误信息;模型筛选用 `page:1, size:200` 拉选项,超 200 条静默缺失;Agent 筛选是手填 ID 输入框,与 SessionListView 的 Agent filterable 下拉体验不一致。 - 建议:移动端卡片补 errorMessage/耗时/重试字段;模型下拉改远程搜索;Agent 改下拉(复用 options 接口)。 ### 42. 会话列表顶部指标卡冗余 - 位置:`admin/src/views/session/SessionListView.vue:4-11, 353-366` - 问题:「匹配会话」指标卡只重复分页 total,无信息增量,且移动端 media query 下单卡占半宽、右侧留白错位。 - 建议:移除该卡片,或扩充为各 phase 计数等多指标。 ### 43. ThinkingBlock 无复制按钮,与其他组件不一致 - 位置:`admin/src/views/session/components/ThinkingBlock.vue:24-27` - 问题:thinking 长文本只有内部滚动(max-height 400px),没有复制/下载手段,与 ToolCallCard 有复制按钮形成不一致。 - 建议:补复制按钮。 ### 44. 分析页 SessionTab 执行模式直接渲染英文枚举 - 位置:`admin/src/views/analytics/tabs/SessionTab.vue:96-100` - 问题:「会话结构」卡的执行模式行直接显示 `item.executionMode`(CLOUD/LOCAL 原文),而 `utils/labels.ts` 已有 `executionModeLabel`;同一卡内类型行有 typeLabel 翻译、模式行没有。 - 建议:复用 `executionModeLabel`。 --- ## 修复路线建议 1. **第一批(安全 + 高价值缺口)**:#1 系统 Skill 权限、#2 审计日志筛选、#3 运行态会话下钻、#5 飞书 Bot 连接状态、#9 secret 清除。多数需要少量后端配合,前后端可同任务闭环。 2. **第二批(管理能力补齐)**:#4 会话运维操作、#6 用户批量/筛选、#7 角色删除与成员、#8 导出能力、#11 定时任务执行历史与跳转。 3. **第三批(体验一致性)**:P2/P3 中纯前端的条目(#10、#13、#14、#16、#19、#23、#25、#26、#27、#28、#29、#30、#32、#33、#34、#36、#37、#39、#40、#42、#43、#44),可按页面分批顺手修复。 4. **文档同步**:按 AGENTS.md 约定,实施修复时需同步 CHANGELOG.md 与 `skills/mao-cli/`(涉及 CLI 可见能力时)。