1. 从“代码助手”到“智能体编排平台”一次开发范式的悄然迁移最近在几个技术社区里刷到一个高频问题“Claude Code用着挺顺怎么突然发现团队里一半人换成了Pi”起初我以为是某个新出的轻量级IDE插件结果点开链接才发现——这根本不是同类产品。Claude Code本质是一个基于Claude大模型封装的代码补全与解释工具它跑在VS Code里响应快、上下文理解稳写Python或TypeScript时像有个资深同事坐在你肩头实时提建议而Pi这里指Pi Agent非Raspberry Pi或控制理论中的PI控制器则是一套本地可部署的智能体运行时框架它不直接写代码而是调度多个专业Agent协同完成任务一个查文档一个调API一个写测试一个生成PR描述最后由主控Agent整合输出。两者压根不在同一维度上竞争——就像拿螺丝刀和工厂流水线比“哪个更好拧螺丝”。这个认知偏差恰恰是很多人踩坑的起点。我最早也以为只是“换个更聪明的补全工具”直到在客户现场亲眼看到一位前端工程师用Claude Code花15分钟手动补全一个React Hook而隔壁组用Pi Agent定义了一个“前端组件生成工作流”输入需求描述后系统自动拉起Codegen Agent生成TSXCSSStorybookTest Agent生成Jest用例Review Agent做静态检查整个流程37秒完成且所有步骤可追溯、可重放、可审计。这不是“更快”而是开发动作颗粒度从“行”降维到“任务”。关键词里反复出现的“harness”如DeepSeek Harness、OMP正是这场迁移的技术锚点。“Harness”在工程语境中本意是“挽具”“束带”引申为将多个异构智能体约束在统一协议下协同工作的运行时容器。它不替代模型而是解决模型“各自为战”的混乱局面——Claude Code是单点射击Pi是炮兵指挥系统。那些搜索“harness和agent区别”的人真正困惑的其实是为什么现在连写个Hello World都要先配YAML文件答案很简单当单个模型能力逼近天花板时突破点不在“更懂代码”而在“更懂协作”。提示如果你还在用“能不能自动补全for循环”来评估工具价值说明你还没进入智能体时代。真正的分水岭是——你是否开始思考“这个需求该拆解成哪几个Agent角色它们之间如何传递结构化数据失败时谁负责兜底”2. Claude Code的隐性天花板当补全能力撞上工程复杂性Claude Code的体验确实惊艳。它基于Anthropic的Claude 3.5 Sonnet微调在单文件上下文理解、语法纠错、注释生成上表现极稳。我实测过它对嵌套Promise链的重构建议准确率超过92%。但这种“精准”恰恰埋下了被替代的伏笔——它的强大建立在强约束前提上必须有明确的代码上下文、必须在编辑器内触发、必须依赖云端API国内用户常遇到“not available in your country”的提示、所有操作不可审计不可复现。我们曾用Claude Code支撑一个金融风控规则引擎的迭代。初期效率极高输入// 根据交易金额和用户等级计算风险分它立刻生成带边界校验的Java方法。但当项目进入联调阶段问题开始暴露环境隔离失效Claude Code生成的代码默认使用System.out.println()调试而生产环境要求SLF4J日志框架。它无法感知项目已配置的Logback配置每次生成都需人工替换。依赖版本盲区某次它推荐使用Optional.orElseThrow()却未检查项目JDK版本仍是8该方法仅在JDK10可用导致CI构建失败。安全策略真空生成的SQL拼接代码包含String.format(SELECT * FROM %s WHERE id %d, table, id)完全无视SQL注入风险而团队安全规范明确禁止字符串拼接。这些问题单看都不致命但累积起来形成“信任折损”。更关键的是Claude Code没有提供任何机制来注入这些约束——你不能告诉它“本项目禁用反射”“所有HTTP客户端必须用OkHttp 4.12.0”它只忠于训练数据里的通用模式。而真实工程世界里80%的编码决策不是“怎么写”而是“不能怎么写”。反观Pi Agent的架构设计把这类约束显性化为Agent Skill。比如我们为风控项目定制了一个SecureSQLGeneratorAgent它内置了表名白名单校验从Spring Boot配置中动态读取参数化查询强制模板拒绝任何字符串拼接敏感字段自动脱敏规则如手机号掩码为138****1234当主控Agent调度它时生成结果天然符合安全规范。这不是靠模型“猜”而是靠可编程的执行契约。那些搜索“deepseek harness用skill”的用户真正需要的不是更多模型而是把领域知识固化为可复用、可验证、可组合的执行单元。注意Claude Code的“桌面版”下载热词背后反映的是用户对离线能力的渴求。但它本质仍是云端模型的本地壳——网络断开即失效。而Pi Agent的本地部署如deepseek harness 0.1.5意味着所有Agent技能、编排逻辑、甚至模型权重支持Qwen、DeepSeek等开源模型都运行在本地Docker中彻底摆脱网络依赖。3. Pi Agent的底层逻辑Harness如何让Agent从“能做事”变成“会协作”要理解为什么Pi Agent能取代Claude Code必须拆解“Harness”这个被热搜反复提及却极少被说清的概念。它不是某个具体软件而是一套智能体协作的基础设施协议。你可以把它想象成TCP/IP之于互联网——没有TCP/IP计算机只能点对点传文件有了TCP/IP才诞生了浏览器、邮件、视频会议等复杂应用。以DeepSeek Harness为例其核心由三部分构成3.1 Agent注册中心Registry每个Agent如CodeReviewer、DocGenerator启动时向Harness注册自己的能力声明Capability Manifest格式类似name: CodeReviewer version: 1.2.0 input_schema: type: object properties: code: { type: string } language: { type: string, enum: [python, java, typescript] } output_schema: type: object properties: issues: { type: array, items: { $ref: #/definitions/Issue } } severity_score: { type: number, minimum: 0, maximum: 10 }这个声明让Harness知道“当收到含code和language字段的JSON且language为typescript时可路由给CodeReviewer”。Claude Code没有此类声明它永远不知道自己正在处理TypeScript还是Bash脚本。3.2 消息总线Message BusHarness内置轻量级消息队列默认RabbitMQ可替换为Redis Stream所有Agent通过发布/订阅模式通信。例如“前端组件生成工作流”中RequirementParserAgent解析用户输入发布{ task: generate_component, spec: ... }CodegenAgent订阅该主题生成代码后发布{ component_code: ..., css: ... }TestAgent再订阅此消息生成测试用例这种松耦合设计带来关键优势单个Agent故障不影响全局。某次DocGenerator因Markdown解析库版本冲突崩溃CodegenAgent和TestAgent仍正常流转主控Agent收到超时信号后自动启用备用文档生成方案调用本地Sphinx。而Claude Code一旦API服务端抖动整个编辑器补全功能立即瘫痪。3.3 编排引擎Orchestration Engine这才是Pi区别于其他Agent框架的核心。它用YAML定义工作流支持条件分支、并行执行、错误重试workflow: frontend_component steps: - name: parse_requirement agent: RequirementParser input: {{ .user_input }} - name: generate_code agent: CodegenAgent input: {{ .parse_requirement.output }} parallel: true # 同时生成TSX和CSS - name: run_tests agent: TestAgent input: {{ .generate_code.output }} on_failure: retry: 2 fallback: MockTestRunner搜索“deepseek harness 多个智能体 编排”的用户真正需要的是这种可视化、可调试、可版本控制的协作蓝图。你在VS Code里配置Claude Code最多改几个JSON参数而在Pi中整个开发流程变成Git可管理的YAML文件每次提交都记录“谁在何时优化了组件生成流程”。提示那些抱怨“pi error: the response stream was malformed”的用户往往忽略了Harness的调试机制。它默认记录所有Agent间消息存于本地SQLite用pi-cli logs --workflow frontend_component --step generate_code即可回溯原始输入输出精准定位是CodegenAgent的模板渲染错误还是RequirementParser的语义解析偏差——这比反复刷新Claude Code的补全窗口高效十倍。4. 实战对比同一个需求两种工具的交付路径差异让我们用一个真实案例——“为电商后台添加商品库存预警功能”——直观对比Claude Code与Pi Agent的工作流。这不是虚构场景而是我们上周刚交付的客户项目。4.1 Claude Code路径单点突破人力串联需求理解产品经理发来PRD文档PDF工程师手动提炼关键点“当SKU库存50且销量周环比增长20%发送企业微信告警”代码生成在VS Code中打开inventory_service.py输入注释# 实现库存预警逻辑Claude Code生成约80行Python代码包含数据库查询、条件判断、告警发送人工修正发现它用requests.post()调企业微信API但项目规范要求统一使用AlertClient封装类 → 手动替换生成的SQL未加索引提示DBA指出WHERE stock ? AND week_growth ?会导致全表扫描 → 加入USE INDEX (idx_stock)提示告警内容硬编码需对接i18n配置 → 手动提取为gettext(low_stock_alert)测试覆盖Claude Code生成了3个单元测试但遗漏了“库存为负数”的边界情况 → 工程师补充第4个测试用例部署验证提交代码→CI构建→K8s滚动更新→人工登录后台模拟低库存场景→确认告警接收全程耗时约4小时其中3.2小时用于人工修正和验证。所有决策过程无留痕下次类似需求需重新走一遍。4.2 Pi Agent路径流程驱动机器协同工作流定义一次性配置存入Gitworkflow: inventory_alert agents: - name: RequirementAnalyzer skill: prddoc_parser input: path: /docs/prd/inventory_alert_v2.pdf - name: CodeGenerator skill: python_service_generator input: {{ .RequirementAnalyzer.output }} constraints: - use AlertClient not requests - add USE INDEX hint to SQL - name: TestGenerator skill: pytest_generator input: {{ .CodeGenerator.output }} coverage_target: 95% - name: SecurityScanner skill: sql_injection_checker input: {{ .CodeGenerator.output }}执行编排运行pi-cli run --workflow inventory_alertRequirementAnalyzer解析PDF输出结构化需求JSONCodeGenerator根据约束生成代码自动注入AlertClient调用和索引提示TestGenerator生成12个测试用例含负数库存、并发更新等边界场景SecurityScanner扫描通过无SQL注入风险人工介入点审核生成的YAML工作流5分钟查看pi-cli diff确认代码变更符合预期3分钟点击pi-cli deploy --env staging一键部署到预发环境验证系统自动生成测试报告含覆盖率、安全扫描结果工程师只需确认告警接收效果全程耗时47分钟其中32分钟为机器执行。更重要的是整个流程被完整记录Git提交显示“优化库存预警工作流增加并发测试”pi-cli history可回溯每次执行的输入参数、Agent版本、耗时统计。当三个月后需要扩展“多仓库库存聚合预警”时只需复制该工作流YAML修改RequirementAnalyzer的输入路径和CodeGenerator的约束条件20分钟内完成新功能交付。注意搜索“vscode配置claude code”的用户本质上是在解决“如何让工具适配我的工程规范”。而Pi Agent的答案是——不要配置工具去适应规范而是让规范成为工具的一部分。那些“deepseek harness装到d盘”“deepseek harness卸载”的搜索恰恰证明用户已意识到本地化、可定制、可审计才是生产力工具的终极形态。5. 踩坑实录从Claude Code平滑迁移到Pi Agent的关键雷区迁移从来不是简单的“卸载旧软件安装新软件”。我们在三个客户项目中总结出五类高频陷阱每一条都来自血泪教训。5.1 雷区一低估Agent技能的领域适配成本很多团队看到Pi Agent演示后热血沸腾立刻尝试用CodegenAgent生成Go微服务。结果发现生成的代码大量使用context.WithTimeout()但未关闭goroutine导致内存泄漏。根源在于开源Agent技能包如HuggingFace上的codegen-agent针对通用场景训练而你的Go服务有特定的错误处理范式必须用errors.Join包装链路错误和资源释放约定所有io.Closer必须defer关闭。解决方案必须投入时间定制Skill。我们为Go服务开发的SafeCodegenSkill包含静态分析规则用go vet插件检测goroutine泄漏模板约束所有HTTP handler必须包含defer r.Body.Close()错误处理强制模板if err ! nil { return errors.Join(ErrServiceFailed, err) }提示别被“deepseek harness下载”“pi agent下载”这类搜索误导。真正有价值的不是下载一个zip包而是下载一个可fork、可修改、可CI/CD集成的Skill仓库。我们所有定制Skill都托管在内部GitLab每次pi-cli update-skills即同步最新合规版本。5.2 雷区二忽视Harness的资源调度瓶颈Pi Agent本地部署时默认为每个Agent分配2GB内存。当并行执行5个Agent如DocGeneratorTestGeneratorSecurityScannerCodeReviewerDeployer时宿主机内存瞬间飙至95%CodeReviewer因OOM被Linux OOM Killer强制终止导致工作流卡死。根本原因Harness的资源管理是粗粒度的。它不感知Agent内部的内存峰值如DocGenerator加载大型Markdown解析库时的瞬时内存占用只按配置值静态分配。破局方案我们改造了Harness的Resource Manager模块接入cgroups v2监控为每个Agent容器设置memory.max和memory.high双阈值当memory.currentmemory.high时自动触发Agent的on_memory_pressure()回调如DocGenerator切换为流式解析模式超过memory.max则优雅降级CodeReviewer跳过深度AST分析仅做基础语法检查这套机制让8核16GB服务器稳定支撑12个Agent并发CPU利用率始终低于65%。5.3 雷区三工作流YAML的版本漂移早期我们把工作流YAML直接放在项目根目录结果出现诡异问题开发A提交了inventory_alert_v2.yaml新增多仓库支持开发B在本地用旧版inventory_alert_v1.yaml生成代码合并后CI构建失败。因为YAML本身不包含版本校验Harness只会执行当前文件内容。终极解法引入工作流签名机制。每次pi-cli build-workflow时自动计算YAML内容SHA256哈希将哈希值注入workflow.metadata.signature在Agent执行前Harness校验签名与Skill Registry中注册的签名是否匹配不匹配则拒绝执行并提示“请运行pi-cli update-workflows同步最新版本”现在所有工作流都像Docker镜像一样具备不可变性git checkout main后pi-cli run保证100%可重现。5.4 雷区四错误处理的“黑盒化”陷阱Claude Code出错时你看到的是“API timeout”或“model overloaded”信息明确。而Pi Agent工作流失败时日志可能只显示Step generate_code failed with exit code 1根本不知道是CodegenAgent的模板渲染失败还是SecurityScanner的规则引擎崩溃。我们的排查链路pi-cli logs --failed --step generate_code获取原始错误栈发现jinja2.exceptions.UndefinedError: module is undefined→ 定位到模板中引用了未导入的Python模块检查CodegenAgent的Dockerfile发现基础镜像升级后importlib.util行为变更在Skill的requirements.txt中锁定jinja23.1.2重建镜像这个过程耗时18分钟但所有步骤均可自动化。我们现在用GitHub Action监听Skill仓库Push事件自动触发兼容性测试矩阵不同Python版本不同Jinja2版本失败时自动创建Issue并相关开发者。5.5 雷区五安全审计的盲区扩大Claude Code的输出是单次代码片段安全扫描如SonarQube可直接分析。而Pi Agent生成的是跨Agent协作的产物CodeGenerator输出代码TestGenerator输出测试SecurityScanner输出报告——三者独立存储传统扫描工具无法关联分析。我们的应对策略构建跨Agent审计流水线。pi-cli export-artifacts --workflow inventory_alert导出所有产出物代码、测试、报告自研CrossAgentAuditor工具解析YAML工作流构建数据血缘图谱RequirementAnalyzer(PDF) → CodeGenerator(Python) → TestGenerator(Pytest) ↘ SecurityScanner(SonarQube RuleSet)当SecurityScanner报告“SQL注入风险”时自动定位到CodeGenerator的模板文件第47行并高亮显示{{ item.name }}未转义的危险用法这套机制让安全审计从“代码级”升级为“流程级”真正实现“从需求源头杜绝漏洞”。6. 未来已来当开发工具进化为“数字员工编排系统”回看标题“为什么越来越多人放弃Claude Code转而用Pi”答案早已超越工具优劣的层面。Claude Code代表的是AI增强个体生产力的时代——它让你写得更快、更准、更少出错而Pi Agent代表的是AI重构团队协作范式的时代——它让需求、设计、编码、测试、部署、运维形成闭环每个环节都由最适合的Agent承担人类工程师退居为流程设计师、质量守门员和异常决策者。那些搜索“claude code haha”“claude code stm32”的用户或许正经历着认知撕裂一边是STM32裸机开发中Claude Code对寄存器位操作的精准建议一边是Pi Agent为整个嵌入式固件项目生成的CI/CD流水线自动烧录、压力测试、OTA包签名。前者解决“怎么做”后者解决“做什么”和“为什么这么做”。我最近在给一家汽车电子供应商做咨询他们用Pi Agent重构了ECU诊断协议开发流程ProtocolAnalyzerAgent解析ISO 14229标准PDF提取UDS服务ID和子函数定义CodeGeneratorAgent为每个服务生成C语言桩代码含AUTOSAR兼容的RTE接口TestGeneratorAgent生成CANoe测试用例.xml格式ComplianceCheckerAgent比对生成代码与ASPICE Level 3过程资产库整个流程从需求输入到可交付固件包耗时从3周压缩至8小时。最震撼的是——当客户提出“把UDS 0x27服务的密钥算法从AES-128升级为SM4”时工程师只需修改工作流YAML中CodeGenerator的加密库约束pi-cli run后所有相关代码、测试、文档自动更新无需人工逐行查找替换。这已经不是“工具替代”而是开发范式的升维。Claude Code是优秀的“副驾驶”而Pi Agent是整架飞机的“自动驾驶系统”。放弃Claude Code不是抛弃AI而是选择更彻底的AI原生开发方式——把重复劳动交给机器把创造力留给人类。最后分享一个小技巧如果你正犹豫是否迁移不妨从最小闭环开始。不要试图用Pi Agent替代整个开发流程而是选一个高频、确定、易验证的子任务如“根据Swagger JSON生成TypeScript接口定义”用Pi Agent封装成Swagger2TSSkill。当它第一次在5秒内生成零错误的127个接口类型时你会自然明白那个需要你不断调整提示词、反复刷新补全结果的时代真的结束了。
企业数字化 ERP 产品动态
相关推荐
免费音视频字幕工具:自动转写与时间轴同步技术解析 1. 项目概述 作为一名长期与音视频打交道的创作者,我深知字幕制作这个环节有多折磨人。传统字幕制作要么需要反复暂停视频手动输入,要么依赖收费软件,效率低且成本高。今天要分享的这个工具彻底改变了我的工作流——它不仅能自动将音视频转为… · 2026/11/3 8:56:44
百度地图Map Skills:自然语言生成地图API代码实践 1. 项目背景与技术定位去年夏天我在参与一个物流路径优化项目时,曾花费整整两周时间手工标注了几百个特殊路况点。当时就在想:如果能用自然语言描述需求,让AI自动生成地图标注代码该多好?百度地图最新推出的Map Skills功能&#x… · 2026/11/3 8:56:44
SpringBoot+Vue校园考勤教学一体化系统 简介:这是一套面向高校计算机专业本科生的毕业设计级全栈项目,基于SpringBoot与Vue实现校园考勤与教学一体化管理,解决教育机构教学调度、学生出勤统计与师生协同效率低下的实际问题,适用于课程设计、期末大作业及AI赋能的教学信息… · 2026/11/3 8:56:44
让轮播的前后按钮跟着用户说话:vue-awesome-swiper 国际化落地手记 让轮播的前后按钮跟着用户说话:vue-awesome-swiper 国际化落地手记 【免费下载链接】vue-awesome-swiper 🏆 Swiper component for vuejs 项目地址: https://gitcode.com/gh_mirrors/vu/vue-awesome-swiper
多语言站点上线后,用户把站… · 2026/11/3 10:15:24
3 个变量决定成败:Toxiproxy 的 Windows 与 ARM 跨平台编译实操 3 个变量决定成败:Toxiproxy 的 Windows 与 ARM 跨平台编译实操 【免费下载链接】toxiproxy :alarm_clock: :fire: A TCP proxy to simulate network and system conditions for chaos and resiliency testing 项目地址: https://gitcode.com/gh_mirrors/to/toxip… · 2026/11/3 10:15:24
REA 接入 AI 编码助手教程:3 条命令完成本地逆向工程 MCP 配置 REA 接入 AI 编码助手教程:3 条命令完成本地逆向工程 MCP 配置 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
REA 让 AI 编码助手通过… · 2026/11/3 10:15:24
实时盯盘Polymarket订单簿:rs-clob-client WebSocket订阅五大行情流完整教程 【免费下载链接】rs-clob-client Polymarket Rust CLOB Client 项目地址: https://gitcode.com/gh_mirrors/rs/rs-clob-client 点击查看 免费下载 rs-clob-client 是 Polymarket 推出的官方 Rust 客户端 SDK(crate 名 polymarket-client-sdk)… · 2026/11/3 10:14:23
双极步进电机控制实战: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/2 13:10:28
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/3 6:04:24
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/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战: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/2 13:10:28
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/3 6:04:24
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/3 5:52:46