一周时间100 个 PR一个原生桌面 App——Hermes 的 v0.16.0 Surface Release 就是这么被推出来的。这个版本把原本跑在终端里的 Hermes Agent 搬到了桌面从托盘常驻、全局快捷键到 Skill 面板和 MCP 服务管理全部以原生应用的形式交付。如果你正在做类似的 AI Agent 桌面化项目或者好奇一个团队如何在七天之内完成近百个 PR 的合并上线这篇文章就是为你准备的。我会从产品定位、架构拆解、工程节奏三个层面展开最后把实操中踩过的坑和排查思路一并放出来尽量做到你能直接照着复现。1. 先把项目交代清楚Hermes 是什么Surface 版本要解决什么问题1.1 从命令行工具到桌面应用的转折点Hermes 本质上是一个 AI Agent 运行时核心能力包括多轮对话、工具调用、技能Skill管理和 MCP 服务接入。在 v0.16.0 之前它主要运行在终端环境里用户敲一条命令Agent 就在后台开始分析、调工具、返回结果。这种形态对开发者很友好——毕竟大家本来就在终端里工作但对普通用户来说门槛太高了。你让一个非技术用户去记hermes run --skill pdf-summarize --input xxx.pdf这种命令他大概率会直接放弃。Surface Release 这个名字取得很贴切它的核心意图就是把 Hermes 从后台命令行工具推到桌面表面上来。这个版本集中做了四件大事原生桌面客户端包含系统托盘、窗口管理、全局快捷键、通知栏集成图形化配置面板模型服务地址、MCP 端点、Skill 开关全部可视化配置技能市场的雏形内置一批常用 Skill并支持在 UI 里直接安装启用自动更新链路解决之前下载压缩包、解压、手工配环境变量的安装噩梦。为什么选在这个时间点做桌面化我的判断是Agent 类应用和普通命令行工具有本质区别。命令行工具的交互模式是输入命令→看输出一次性的而 Agent 需要常驻、需要随时响应、需要和操作系统深度交互——读剪贴板、监视文件变化、弹通知、截屏理解屏幕内容。这些能力在终端里只能以残缺的方式模拟而且每次都要把上下文重新加载一遍效率很低。桌面化不是给 CLI 套一个壳而是把整个交互模型换掉。1.2 目标用户与使用场景做产品先想清楚给谁用。Hermes 桌面版瞄准的是三类人第一类是重度 AI 用户他们每天要处理大量文档、代码和网页内容希望有一个常驻的智能助理而不是每次打开浏览器去网页版问一句。第二类是自动化爱好者喜欢用 Skill 把重复性工作编排成流程比如每天早上汇总邮件并生成待办清单。第三类是开发者他们把 Hermes 当作一个可编程的 Agent 底座通过 MCP 接入自己团队的工具链。这三类人群有一个共同点他们不满足于聊天窗口他们需要 Agent 能操作电脑。这正是桌面 App 存在的意义——只有常住进程才能做到监控文件、响应快捷键、维护长连接。v0.16.0 的另一个隐含目标是借这个版本把本地优先的路线定下来模型可以接云端 API但工具执行、数据读写、任务编排全部在本地完成。这个定位对后续所有版本都有约束力属于那种早期必须做对的决策。2. 原生桌面 App 为什么值得这样做2.1 四条技术路线的取舍桌面应用的实现路线翻来覆去就是那么几条我把关键对比整理成一张表路线包体大小内存占用系统能力跨平台开发效率Electron80~150MB200MB强需桥接好高Tauri5~20MB50~100MB强Rust好中Qt/C20~50MB100MB强好低原生三套Win/mac/Linux小低最强需分三套低Electron 的问题在于Agent 应用要常驻后台内存占用是致命的。一个 Agent 进程本身就带着模型客户端、上下文缓存、工具执行引擎再叠加一个 Chromium16GB 内存的笔记本也会感到吃力。Tauri 的 Rust 后端加轻量 WebView 组合既保留了前端开发效率又把常驻成本压了下来。所以这个项目最终选择了 Tauri 这条路线系统能力层用 Rust 实现UI 层用 Web 技术渲染。选 Tauri 还有一个附带好处原生层的逻辑可以用 Rust 统一处理进程、文件、网络请求这些恰好是 Agent 运行时的重点依赖。前端只负责渲染和交互业务逻辑尽量下沉到 Rust 侧这让单元测试覆盖了大部分核心代码而 UI 测试只需要关心展示层。2.2 为什么纯 Web 版替代不了有人会问做个 Web 版不就行了浏览器又不是不能跑这个问题的答案藏在 Agent 的核心工作原理里。Agent 要调用本地工具就需要访问本机端口——比如 Ollama 的 11434、MCP 服务的自定义端口、文件系统的读写权限。浏览器出于安全模型对这些能力做了严格限制网页应用根本拿不到本地文件系统的完整访问权更不可能注册全局快捷键。退一步说即使 Web 版借助中间服务绕过了部分限制常驻和响应速度也做不到。Agent 的体验很大程度取决于它在不在你身边——按一个快捷键就能唤起而不是去浏览器开标签页。原生桌面 App 的价值就在这些不起眼的地方。另外桌面端还能拿到系统级通知能力任务完成后弹一条通知用户切到别的应用也能感知到状态变化这在 Web 里要么需要授权、要么直接不支持。3. 核心架构拆解Agent、Skill、MCP 三件套3.1 对话循环与工具调用的实现要点Agent 的核心是一个循环接收用户输入 → 组装上下文 → 调用大模型 → 解析响应 → 执行工具 → 把结果回填给模型 → 继续下一轮。桌面版要做的是把这个循环里的每一步可视化并保证用户随时能打断和接管。这里最容易踩坑的是工具调用tool calling的健壮性。模型返回的调用参数经常不合法比如 JSON 字段缺失、数字类型写成字符串。我的经验是在 Rust 解析层做严格校验还不够还要在生成函数 schema 时就把约束写清楚让模型在源头就少犯错。可以给每个工具加description和strict模式实测下来严格模式下参数合法性从 80% 出头提到了 95% 以上。另一个容易被忽视的点是超时控制。工具调用可能卡在外部服务上一个 HTTP 请求挂 3 分钟整个对话就废了。每个工具调用要设置独立的超时默认 30 秒可在配置里调整超时后把错误信息回传给模型让模型自行决定重试还是换方案。这个设计让 Agent 在真实环境里的存活率提高了不少。3.2 Skill 体系怎么设计Skill 是预定义的能力包每个 Skill 包含提示词模板、工具绑定和默认参数。比如一个PDF 摘要Skill绑定的是 PDF 解析工具和摘要模型配置用户只需要选文件剩下的流程由 Skill 编排。在 UI 层面Skill 面板做成了列表形式每个 Skill 卡片显示名称、描述、依赖的工具数量和启用状态。启用状态不是摆设——Agent 在决策时会优先推荐已启用的 Skill避免模型在几十个 Skill 里选错。这个推荐优先的机制其实用了很朴素的选择策略按 Skill 的描述和当前任务的语义相似度排序。设计 Skill 体系时要记住一个原则Skill 是给模型用的脚手架不是给用户看的黑盒。所以描述信息要写清楚它擅长什么、不擅长什么最好带上正反例。我在测试中发现描述里带适用于长文档超过 20 页这种约束比只写处理 PDF的 Skill 选错率低一半。Skill 之间的命名冲突也要提前治理两个 Skill 都注册了同名工具时以最近启用者优先并且要给出冲突提示不能静默覆盖。3.3 MCP 接入层的界面化改造MCPModel Context Protocol是让 Agent 接入外部工具和数据服务的标准协议。v0.16.0 最有价值的改进之一就是把 MCP 客户端配置从手写 JSON 变成了图形化界面。之前用户要编辑配置文件理解mcpServers的结构还得处理 JSON 里细微的逗号和引号错误现在在设置页里填名称、地址、认证 token点保存就行。但界面化不意味着屏蔽底层。配置保存后依然会生成标准格式的配置文件这个设计很关键图形界面是入口文件是真相。用户可以把配置文件导入导出团队协作时直接共享配置而不需要每个人都去 UI 里点一遍。MCP 接入还有一个隐藏细节就是服务健康检查。配置面板里加了一个测试连接按钮实际上是对每个 MCP 端点发一次tools/list请求能及时暴露地址不通、认证失败这类问题不用等 Agent 运行到一半才发现工具不可用。调试 MCP 服务时我习惯先在命令行里单独启动它用mcp-sdk之类的客户端发一个初始化请求确认握手正常再接进 Hermes。这样能把服务本身的问题和Hermes 配置的问题快速切开省掉很多两头找原因的时间。3.4 桌面壳层的那些细活桌面 App 的眼里不是 UI 组件而是壳层——托盘、快捷键、通知、开机自启、自动更新。这些功能单独看都不难合在一起坑很多。先说托盘图标。Windows 上托盘图标有个著名的缓存问题应用更新后图标可能不刷新得重启资源管理器才正常。规避的办法是更新时换一个图标资源 ID或者主动触发一次Shell_NotifyIcon的删除和重加。其次全局快捷键要考虑冲突CtrlShiftSpace 这种组合在很多输入法里被占用了需要在设置里允许用户改键同时在注册失败时给出明确提示。自动更新是最容易翻车的模块。更新包下载了一半断网怎么办下载完了校验失败怎么办安装时需要退出当前进程用户正在对话怎么处理成熟的方案是静默下载 提示安装 强制更新兜底三段式后台静默下载更新包下载完成后弹通知让用户选择立即或稍后如果版本过旧则启动时强制走更新流程。还有一个细节更新包要带签名和哈希校验否则很容易被中间人替换。4. 一周百 PR 的工程节奏是如何炼成的4.1 流水线把检查全部自动化一周合入 100 个 PR平均每天 14 个以上这背后没有一套高效的 CI 是撑不下来的。这个项目的 GitHub Actions 流水线分层很清晰第一层checkPR 一打开就并行跑 lint、格式检查、单元测试5 分钟内出结果第二层build主分支合并前跑完整构建产出 Windows、macOS、Linux 三平台的安装包第三层e2e桌面端的冒烟测试启动应用、打开设置页、调用一个 mock 的 MCP 服务确认基本链路通第四层release打 tag 时触发产出带签名的正式发布包并生成变更日志。这一套跑下来的核心设计是分层卡点。检查类任务放在 PR 阶段构建和 E2E 放在合并阶段发布任务放在 tag 阶段。每一层只承担自己的职责互不阻塞才能保证一天十几二十次合入而不堵车。另外CI 的超时设置也很重要check 层我设了 10 分钟上限超时自动失败避免某个慢测试拖住整条队列。4.2 PR 规范小步提交是快节奏的前提一周百 PR 能实现最根本的原因是 PR 足够小。这个项目的 PR 平均改动量控制在 200 到 400 行主题必须单一要么是一个功能模块要么是一个 bug 修复不做顺手改一下别处格式这种事。PR 模板也很讲究要求包含四块改动目的、影响范围、测试记录、截图UI 相关强制。截图这条看似繁琐但对桌面端尤其必要——很多 UI 问题只在特定平台或分辨率下出现贴图能让 reviewer 快速判断是否正常。标题规范是feat(scope): description这种 Conventional Commits 格式例如feat(mcp): add health check for mcp endpoints。看着是小事但规范后变更日志可以自动生成release 页面的说明基本不用人工写。4.3 分支策略与特性开关这个项目采用主干开发trunk-based development日常直接在 main 上开分支、快速合入而不是维护一堆长期 release 分支。能撑得起这种激进策略的是完善的特性开关feature flag机制。所有新功能默认藏在开关后面代码合入 main 但功能不生效。按照功能成熟度逐步打开先在内部环境验证再灰度给 5% 用户最后全量开放。一旦出现问题最快速的修复不是回滚代码而是把开关关掉——一个配置操作几秒钟生效对用户几乎没有感知。特性开关的粒度也有讲究不能粗到一个版本一个开关那样退不了半步也不能细到每个按钮一个开关管理成本爆炸。建议按能力域划分比如desktop.tray、mcp.ui、skill.market这个级别。每个开关要注明负责人和预期开放时间避免开关越积越多最后变成无人认领的僵尸配置。4.4 自动化的边界哪些必须人肉自动化不是万能的。这个项目里UI 走查、交互细节、模型效果评估这三块完全依赖人工。UI 走查靠的是每周一次的视觉检查日所有人把各自负责的界面截图贴出来一群人看。交互细节由产品经理和核心开发者逐屏体验重点看空状态、加载态、错误态。模型效果评估是 Agent 项目特有的——改了提示词或工具描述必须跑一批固定的评测用例人工对比输出质量。这一步没法全自动因为好不好是主观判断。所以一周百 PR 不是全自动化的功劳而是自动化处理客观检查 人工聚焦主观判断的分工结果。把人的精力从机器能做的事里解放出来集中投放到机器做不了的事上节奏就自然快了。5. 实操过程复现一个桌面 Agent 的核心链路5.1 环境准备想自己动手试的需要准备三样东西构建工具链、模型服务、Hermes 源码或发行包。构建工具链Node.js 18前端构建、Rust 工具链原生层、各自的包管理器模型服务可以用 Ollama 跑本地模型也可以直接用云端 API。建议本地模型用 Qwen2.5 或 Llama 3.x 的 7B~14B 档位桌面交互够用Hermes 本体直接把 v0.16.0 的 release 包装上快速体验要改代码就 clone 源码走 dev 模式。第一次跑本地模型时注意显存和内存的占用。7B 模型量化后大概需要 6~8GB 内存如果机器紧张可以把上下文长度调短或者换 3B 档位。模型响应速度直接影响 Agent 的体验加载慢的模型会让整个对话循环显得呆滞。5.2 构建桌面端源码构建的步骤大致是这样git clone https://github.com/your-fork/hermes.git cd hermes npm ci # 安装前端依赖 npm run build:web cargo build --release前两步构建的是 UI 资源第三步编译原生壳。第一次编译 Rust 会比较慢要拉几百个 crate建议先跑一遍确认依赖缓存完整后续开发会快很多。启动开发模式可以用cargo tauri dev它会同时起前端开发服务器和原生窗口前端改了热更新原生层改了重新编译。如果只想调试后端逻辑不关心 UI也可以直接跑cargo run --bin hermes-core用一个简单的 REPL 入口来调用 Agent 核心。5.3 配置 MCP 端点与 Skill在 UI 设置页里添加一个 MCP 服务填上名称和地址点击测试连接确认返回正常然后保存。配置文件会落到用户目录下结构大概是这样的{ mcpServers: { filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem], env: {} } }, skills: { enabled: [pdf-summarize, web-clip], disabled: [] } }这里有个容易忽视的点MCP 服务的command字段如果是npx或uvx第一次启动会现拉依赖卡上几十秒。建议先用mcp-sdk的命令行工具把服务测通确认没有依赖问题再接进 Hermes。5.4 调试技巧桌面 Agent 的调试主要靠三层日志前端 console、原生层日志、Agent 运行日志。前端日志在开发者工具里看Tauri 里默认 CtrlShiftI 打开原生层日志要设置RUST_LOGdebug环境变量再启动Agent 运行日志会写到本地文件包含每一轮对话的上下文组装过程和工具调用结果。排查问题的时候先把这三层日志的时间戳对齐按时间线走一遍。我见过不少看起来是 Agent 行为异常的问题最后都定位到了前端把参数传错了——所以先别怀疑模型先怀疑数据链路。6. 高频问题排查实录6.1 问题速查表下面是我在这一周高强度迭代里遇到的典型问题整理成速查表多数问题在 v0.16.0 里都遇到并修过。现象可能原因排查思路解决办法桌面版点更新没反应更新通道签名校验失败或本机权限不足看更新日志确认下载和校验阶段是否通过重新下载安装包检查安装目录写权限打开后无法加载模型模型服务地址配置错误或服务未启动在设置页点测试连接确认模型服务端口本地模型看 Ollama 日志首次启动提示缺语言资源语言包或模型资源未下载完成检查资源目录和网络状态重新触发资源下载或手动放置语言包MCP 服务连接超时地址写了 localhost但服务监听在 127.0.0.1 的 IPv6用nc -vz测试端口统一使用 127.0.0.1或在配置里指定 host全局快捷键没反应快捷键被其他应用占用打开设置页看注册状态提示换成默认的 CtrlShiftH 或自定义键位托盘图标不刷新Windows 图标缓存问题无明显报错但图标是旧的更新时更换图标资源 ID或重启资源管理器配置保存后不生效配置文件写入路径不对多实例并发写检查配置文件路径和环境变量统一用应用数据目录加单实例锁Skill 列表为空技能目录读取失败或权限不对看原生层日志的目录扫描报错检查技能目录的读写权限6.2 几个易被忽略的坑除了表格里的这些还有一个多次踩坑的细节Windows 上如果之前装过旧版本注册表里残留的配置项会让新版本行为异常。升级前最好先跑一遍官方提供的卸载脚本或者手动删除应用数据目录里的旧配置。这个问题在开发环境旧版覆盖新版时特别常见很多人误以为是代码 bug实际上是被旧配置带偏了。另一个坑是并发场景。桌面应用同时开了多个窗口每个窗口各自加载一遍配置当用户在 A 窗口改了模型地址B 窗口还持有旧值保存时互相覆盖。解决办法是把配置读取收敛到一个单例服务里用事件通知各窗口刷新。这个改动不大但能省掉一大类配置改了没生效的工单。7. 最后再说几句实际体会这一周高强度合入 PR 的经历留给我最深的一个印象是速度快不等于粗制滥造。100 个 PR 之所以能安全落地靠的不是无脑合而是每一环都有清晰的边界——CI 卡客观标准Reviewer 卡设计质量特性开关卡发布风险。这套机制一旦建立起来团队的速度会自然地上去而不是靠加班催出来。另一个体会是关于桌面 Agent 的形态。很多人觉得 Agent 的未来在网页里但这段时间做下来我越来越确定桌面端才是 Agent 的主场。原因很简单Agent 的杀手级能力是操作你的电脑这件事必须发生在本地进程里。剪贴板、文件、窗口、屏幕——这些都只在桌面端有完整权限。v0.16.0 只是把壳子立起来了往后真正的深水区在Agent 如何更安全地操作桌面权限面板、操作确认、沙箱隔离这些才是下一轮迭代的重头戏。最后分享一个小建议如果你想在自己的项目里复制这套节奏不要一开始就追求全自动化。先把手动流程跑顺再把最疼的环节自动化——通常是从构建产物一键生成开始然后加单元测试卡点最后才是 E2E 和发布流水线。工程体系是长出来的不是一步到位装出来的。
企业数字化 ERP 产品动态
相关推荐
原生AI桌面应用如何一周合入100个PR?Hermes v0.16.0工程拆解 如果你最近在关注 Agent 类产品的桌面化,大概率绕不开 Hermes 这个名字。它从一套命令行工具和远程接口,硬生生长成了一个原生桌面 App,并且以 v0.16.0 Surface Release 作为新阶段的标记。这个版本最让我感兴趣的不是某个新功能,… · 2026/11/3 21:29:42
MFC老项目Tab控件封装:CTabSheet原理与避坑指南 简介:这份资源面向使用 VC2008 与 MFC 开发桌面程序的初学者和中级开发者,聚焦多选项卡界面的实现问题。它以 CTabSheet 类为核心,演示如何封装 TabCtrl 控件、派生选项卡页面、通过 CPropertySheet 组织多个页面并完成消息映射,最… · 2026/11/3 22:03:49
跨Agent记忆层:把记忆从上下文窗口解放出来 做 Agent 开发大半年,我最大的感受是:模型能力已经不是瓶颈,记忆才是。单跑一个 Demo 很容易,给个 prompt 就能完成任务;但一旦到了多 Agent 协作的场景,比如一个负责规划的主 Agent 带着几个执行 Agent 干… · 2026/11/4 3:54:29
antd-mobile 从 0 到 1:5 分钟跑通,4 个页面场景搭出你的第一个 H5 antd-mobile 从 0 到 1:5 分钟跑通,4 个页面场景搭出你的第一个 H5 【免费下载链接】ant-design-mobile Essential UI blocks for building mobile web apps. 项目地址: https://gitcode.com/gh_mirrors/an/ant-design-mobile
做移动端 H5&#x… · 2026/11/4 11:09:45
三月七小助手:星穹铁道清体力与日常任务自动化实践笔记 三月七小助手:星穹铁道清体力与日常任务自动化实践笔记 【免费下载链接】March7thAssistant 日常交给三月七,开拓留给你。《崩坏:星穹铁道》开源自动化助手。 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant
三月七小… · 2026/11/4 11:09:45
TA-Lib Python 蜡烛图形态识别完全指南:61 个 CDL 形态一次讲透 TA-Lib Python 蜡烛图形态识别完全指南:61 个 CDL 形态一次讲透 【免费下载链接】ta-lib-python Python wrapper for TA-Lib (http://ta-lib.org/). 项目地址: https://gitcode.com/gh_mirrors/ta/ta-lib-python
拿到一段 open/high/low/close 数据后&#x… · 2026/11/4 11:09:45
星穹铁道自动清体力:March7thAssistant 让每天上线的重复劳动变成后台任务 星穹铁道自动清体力:March7thAssistant 让每天上线的重复劳动变成后台任务 【免费下载链接】March7thAssistant 日常交给三月七,开拓留给你。《崩坏:星穹铁道》开源自动化助手。 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssi… · 2026/11/4 11:09:45
bandwhich 终端带宽监控工具:从源码编译到安装排错一次跑通 bandwhich 终端带宽监控工具:从源码编译到安装排错一次跑通 【免费下载链接】bandwhich Terminal bandwidth utilization tool 项目地址: https://gitcode.com/gh_mirrors/ba/bandwhich
bandwhich 是一款终端带宽监控工具,能按进程、连接、远端 I… · 2026/11/4 11:09:45
优化Hermes Agent的并发编程模型:多线程与异步IO比较 优化Hermes Agent的并发编程模型:多线程与异步IO比较
在现代AI代理系统中,高效处理并发任务是提升性能的关键。Hermes Agent作为一款强大的AI代理框架,采用了多线程与异步IO相结合的并发编程模型,以应对复杂的任务处理需求。本文将… · 2026/11/4 11:08:43
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38