agent-skills 实操:用语义检索和命令行让 AI 真正操作电脑

发布时间:2026/10/7 4:30:15

agent-skills 实操:用语义检索和命令行让 AI 真正操作电脑 最近我把 openai/agent-skills 这个开源项目从源码到跑通完整折腾了一遍说实话整个过程比我预想的要值得多。倒不是因为它本身有多难而是它把“给 AI 配工具”这件事的姿势完全换了个方向——不是做插件封装不是搞 function calling而是让 AI 自己读文档、自己写 bash 命令、自己去执行任务。这套思路一旦想明白你就再也不想回到那种“写死每个工具接口”的做法了。如果你平时也在玩 AI Agent、做自动化脚本或者单纯想让 ChatGPT 这类模型帮你处理本地文件、整理数据、批量转格式那 agent-skills 属于那种看一眼就挪不开眼睛的项目。它解决的痛点是大模型很会对话但不会操作你的电脑。而 agent-skills 提供了一套可行的方案让模型真正“上手”干活。下面我把自己的实操过程、设计理解、踩过的坑一次性讲清楚。1. agent-skills 到底是什么解决什么问题1.1 一句话说清它是个啥agent-skills 是 OpenAI 开源的一套 AI Agent 技能库仓库里放了 200 多个现成的“技能”。每个技能对应一个独立目录目录里装着一个核心文件 SKILL.md用 Markdown 写清楚这个技能是干什么的、什么时候该用、该怎么用、有哪些参数有些技能还会附带可执行的 Python 或 JavaScript 脚本。这套东西解决的问题很直接过去我们想让 AI 干活要么靠人工把每个操作封装成一个 API要么靠模型硬猜命令。agent-skills 换了个思路它把工具使用这件事变成了“文档检索 命令行执行”。AI 先从技能库里检索到合适的 SKILL.md读一遍说明书理解调用方法然后直接通过 bash 执行相关脚本或用 shell 命令完成任务。适合谁看三类人第一类是 AI 应用的开发者想研究 Agent 如何低成本获得动手能力第二类是自动化爱好者想用自然语言让 AI 帮忙整理文件夹、清洗表格、批量重命名第三类是普通用户只要愿意折腾一下环境也能让自己电脑里的 ChatGPT 桌面版变成半个“电脑管家”。1.2 为什么说它是“技能”而不是“插件”很多人第一次听说 agent-skills脑子里会自动把它归到插件、MCP 工具那一类。我一开始也是这么想的但真正看完设计之后发现差别非常大。插件、MCP 工具这类东西本质上是预先定义好的“函数接口”。每个工具你有固定的入参、固定的出参、固定的行为逻辑。AI 调用它就像按按钮按对了就有结果按错了就报错。这种方式的问题是每增加一个新能力你都要写一遍接口代码维护成本高而且能力边界完全由开发者提前圈死。agent-skills 不是这样做的。它更像是在给 AI 一本“菜谱”、一套“厨具说明书”。每个技能不是帮 AI 把事情做完而是告诉 AI“你可以怎么做这件事”具体执行细节交给模型自己临场发挥。agent 先用语义搜索找到相关技能然后完整读取 SKILL.md 文档理解操作步骤和注意事项最后自主写出 bash 命令去执行。打个比方传统插件是给厨师配一台全自动炒菜机按一下按钮出来一盘固定的菜agent-skills 是给厨师一本菜谱和一堆新鲜食材厨师自己决定怎么切、怎么炒、什么时候出锅。后者灵活得多菜谱也可以无限扩充而且扩充菜谱不用写代码写一篇文档就行。2. 技能库内部到底长什么样2.1 SKILL.md给人看更是给 AI 看的说明书我一开始冒出一个疑问技能不都是写代码吗怎么核心文件是个 Markdown等到真正跑起来才明白SKILL.md 就是整个 agent-skills 的灵魂。每个技能目录里SKILL.md 遵循一套约定俗成的结构前面是技能的元信息包括名称name、一句话描述description、适用场景正文部分是详细说明告诉模型这个技能在什么情况下应该被触发具体有哪些步骤有哪些参数可以调有什么坑要避开。有些技能还包含 examples 小节给出一两个完整的使用示例让模型照着学。这里描述写得好不好直接决定 AI 能不能准确命中这个技能。官方仓库里那些技能描述都写得非常“模型友好”。比如有一个技能描述大概是“Filter rows of a CSV file based on specified conditions”而不是简单写个“process CSV”。因为这串文字是要进语义检索的你写得越具体AI 在遇到类似任务时就越容易匹配到。我自己写技能时也踩过这个坑。刚开始我建了一个技能叫“文件整理”描述就五个字“整理文件”结果 Agent 处理“把下载目录里的 PDF 按年份归档”这种明确任务时根本没检索到这个技能反而去调了别的更泛的技能。后来我把描述改成“Sort .pdf files in a specified directory into year-based subfolders by file modification date”命中率立刻上来了。所以 SKILL.md 的 description 不是给人看的是给语义检索模型看的必须具体、可检索、包含关键名词。2.2 场景覆盖从 CSV 清洗到网页操作官方仓库里 200 多个技能覆盖的场景相当广我大概归了几个类文件系统操作批量重命名、归档、查找重复文件、整理下载目录数据清洗与格式转换CSV 条件筛选、JSON 结构解析、XML 转 YAML、Excel 合并文档处理HTML 转 PDF、Markdown 导出、批量加水印网页操作抓取网页正文、提取结构化信息、模拟点击跳转开发辅助初始化 Git 仓库、安装 npm 依赖、运行测试脚本、解析日志。这些技能绝大多数都不是重逻辑的“大功能”而是一层很薄的“引导壳”。真正干活的还是 bash 命令技能文档负责告诉 AI 该用什么命令、参数怎么组织、边界条件是什么。比如 HTML 转 PDF 这个技能SKILL.md 里可能就告诉 AI 用某个系统命令或 Node 脚本但会让模型注意中文编码、CSS 样式残留之类的问题。这种“薄封装 强文档”的思路好处明显技能之间可以自由组合。AI 可以先调用“CSV 筛选”技能拿出符合条件的行再调用“格式转换”技能把结果变成 JSON这期间不需要任何开发者干预全靠模型自己编排。2.3 技能本身不包含 AI还有一点容易理解错必须单独拎出来说这套技能库本身不包含任何大模型能力。它只是一堆文档加脚本真正干活的是 AI 模型、是 bash 解释器。仓库里没有模型推理代码没有联网对话模块也没有独立的执行引擎。这就带来一个很好的特性agent-skills 不绑定特定模型。只要你的 Agent 支持读取 Markdown 文档并且能调用 bash就能用这套技能体系。我用它接 ChatGPT 桌面版跑通过也见过有人拿它配合本地模型做实验效果差异主要取决于模型的上下文理解能力和指令遵循能力和技能库本身没太大关系。3. 本地部署与完整实操3.1 环境准备与安装先交代一下我自己的运行环境方便你对照MacBook ProApple Silicon系统是 macOSPython 3.11 已装好Node.js 18 以上Git 不用说肯定有。Windows 和 Linux 我也大概试过后面会单独讲跨平台踩坑。安装过程非常轻量不需要编译、不需要装很多依赖本质就是把仓库拉到本地。我执行的是git clone https://github.com/openai/agent-skills.git cd agent-skills仓库里除了一堆技能目录还会有一个用于连接 Agent 客户端的 MCP 服务配置模块具体入口和依赖管理以你 clone 下来的版本为准。我这边 clone 下来之后直接跑了一下自带的安装脚本装好 Python 依赖前后不到两分钟。这里要特别提醒一句仓库更新比较频繁你看到的目录结构或 MCP 配置方式可能和我当时不一样。所以别死记硬背我的步骤重点是理解配置逻辑——就是把你的 Agent 客户端指向本地技能库目录让它能检索和读取这些技能文件。3.2 通过 MCP 把技能库暴露给 Agentagent-skills 能跑通的另一关键环节是 MCPModel Context Protocol连接。简单理解MCP 是让 AI 模型访问外部工具和数据的标准协议它承担了“检索技能”“读取技能文档”这两个核心动作。我这边是在 ChatGPT 桌面版的设置里手动加了一个 MCP 服务配置大概是这样的不同客户端字段大同小异{ mcpServers: { agent-skills: { command: npx, args: [ -y, agent-skills-mcp, --skills-dir, /path/to/agent-skills/skills ], env: {} } } }这里 args 里的包名后面很可能会变你以官方 README 为准。我配置完重启客户端连接状态变成绿色就说明 MCP 服务已经正常起来了。接着我让 AI 随便说了一句“帮我看看技能库里有哪几个跟 CSV 相关的技能”它真的去调用了检索工具返回了一串技能路径和描述。这一下我心里就有底了链路是通的。再说一句MCP 服务本质上只是给 Agent 提供了“搜索技能”和“读取技能文档”的能力真正执行任务靠的是 Agent 自带的代码解释器或 bash 工具。所以你必须保证你的 Agent 客户端启用了代码执行能力否则只能读到文档干不了活。3.3 MCP 工具名与参数说明在 MCP 协议层agent-skills 暴露的核心能力通常是两个工具这是我实际调用时观察到的信息工具名作用主要入参返回内容search_skill根据任务描述语义搜索相关技能query自然语言任务描述匹配到的技能路径列表、名称、描述read_skill读取指定技能的完整 SKILL.md 内容path技能目录相对路径SKILL.md 全文以及关联脚本路径日常使用中Agent 会先调用 search_skill 把任务描述转成检索词筛出几个候选技能然后调用 read_skill 读取最匹配的那份文档。读完之后模型已经把“操作说明书”装进上下文了接下来它就可以放开手脚写命令、调脚本、跑任务。我还试过一个省事的玩法跳过 search_skill直接用 read_skill 指定路径读取某个技能文档把内容塞给模型当参考。这样适合调试某个具体技能但日常自动任务还是得靠语义检索因为那才体现“按需发现能力”的设计初衷。3.4 实测让 AI 整理下载文件夹理论讲再多不如跑一个真实任务。我的实测任务是“帮我把下载文件夹里的 PDF 文件按年份归档到对应子目录。”模型拿到任务后第一件事不是直接动文件夹而是调用 search_skill检索词大概围绕“organize files by year PDF”。很快它命中了官方库里的一个归档类技能接着 read_skill 读取了完整说明。之后它开始在终端里一步步操作列出下载目录内容、确认有哪些 PDF、按文件修改年份分组、创建目标子目录、移动文件。整个过程它没有问我任何问题。遇到文件名带空格的情况也会主动给命令加引号。大约三十秒后下载目录里的 PDF 已经按 2023、2024、2025 分好了文件夹并向我汇报了每个年份的文件数量。这个效果比我预想中流畅不少。我后来又试了更复杂的任务“把这个 CSV 按城市筛选出消费金额大于 500 的行再按日期排序输出成新文件。”模型先读 CSV 技能用 python 脚本做了数据处理最后在终端里用 wc -l 和 head 自查了输出结果。它还会在 SKILL.md 的提示下主动检查列名大小写和空行问题这一点很关键说明文档质量直接决定了执行质量。3.5 不同模型跑起来的差异agent-skills 既然不绑定模型我就顺手测了两种场景。一种是 ChatGPT 这类能力较强的云端模型语义检索命中准确、文档理解快、bash 命令组织得也比较稳。另一种是接本地模型跑效果就因人而异了上下文小的模型读完整篇 SKILL.md 之后容易忘记技能文档里的细节指令遵循弱的模型会把文档里的示例命令原样抄出去跑导致路径对不上。所以想玩这套体系我建议至少用一个上下文够大、代码能力过关的模型否则很容易把“技能不好用”归结为项目不行其实是模型撑不住。就像给一个新手厨师高级菜谱他操作不出来不能怪菜谱写错。4. 底层设计思路拆解为什么这么设计4.1 语义检索代替硬编码调用传统工具调用方式是“注册表模式”所有工具先写代码、定义 schema、注册到模型可用的列表里。每加一个工具都要发版、改配置、重新连接极其繁琐。agent-skills 走了完全不同的路所有技能以文档形式存在文件系统里模型通过语义检索“发现”技能的存在。这个设计最妙的地方在于技能的发现和使用是解耦的。你不用在启动时把所有技能全部加载进上下文——那 200 多份文档全塞进去上下文早就爆了。你只需要在模型需要的时候用一条检索命令把相关技能“捞”出来精准投喂。这比传统工具列表的方式省 token、比固定插件的方式更灵活。另外这个机制天然适合技能库持续扩充。任何一个人往仓库里新增一个目录、写一份 SKILL.md整个系统立刻具备这个新能力其他模型用户也能通过检索使用到它。这就是“文档即接口”的红利也是我后续愿意自己写技能往里放的原因。4.2 bash 作为万能运行时为什么技能文档最终都指向 bash 命令或可执行脚本因为 bash 几乎是任何操作系统上最通用的“胶水层”。文件操作、文本处理、网络请求、程序调用全都能用命令组合完成。把 bash 作为底层运行时等于技能库一出生就继承了整个命令行生态的威力。代价也很明显安全风险比 API 调用高得多。模型如果错误执行了 rm -rf或者被提示词注入引导去读取敏感文件后果很直接。所以社区和官方普遍推荐的做法是不要在宿主机器上裸跑加一层人工确认机制或者把执行环境放进容器、沙箱里。我自己的经验是至少满足两条第一Agent 执行命令前必须经过我确认第二技能库只读取和操作指定工作目录下的文件避免越界访问。4.3 与传统 MCP 工具的关系这里说清楚agent-skills 和 MCP 不是二选一的关系它实际上是搭在 MCP 之上的应用层。MCP 提供的是“模型访问文件系统工具”的通道agent-skills 定义的是“技能文档这种工具该长什么样、如何被检索使用”。你可以把 MCP 理解成 USB 接口agent-skills 是插在上面的一个具体设备。所以你在跑 agent-skills 时还是需要 MCP 环境但反过来说其他 MCP 工具比如连数据库、连 GitHub API依然可以继续使用它们和技能库并行不悖。这套体系并没有排斥旧的工具生态而是把“文档化技能”这个新物种引了进来。5. 常见问题与排查技巧实录5.1 Agent 检索不到技能总是不用你想要的技能这是我最开始遇到最多的问题。表象是你明确知道技能库里有个技能很匹配但模型就是去调了别的或者干脆说自己做不到。排查思路分三步先看技能描述description是否具体比如有没有包含文件扩展名、操作动词、场景名词再看技能目录命名是否和描述语义一致因为检索系统往往会把目录名和文档内容合并处理最后看任务描述本身如果你给 Agent 的指令太模糊它检索出来的 candidate 自然就偏。我修复过最典型的一个案例技能描述写的是“Extract text from PDF files using command-line tools”模型死活检索不到。后来我发现仓库里另一个技能描述里包含了“pdf”“text”“parse”这些词把检索结果抢走了。把目标技能的描述改成更明确的“Extract and parse text content from PDF files via pdftotext or similar CLI utilities”并补充“Use this when the task involves converting PDF to plain text”命中率立刻正常了。5.2 模型生成了命令执行却报错这个问题集中在两类环境跨平台差异和依赖缺失。macOS/Linux 下很顺的命令到 Windows 环境经常因为路径分隔符、换行符 CRLF、PowerShell 语法不兼容而失败。我在 Windows 上跑过一次模型生成的是 bash 语法客户端默认的解释器却不是 bash命令直接不可用。解决办法是在 Agent 的配置里明确指定使用 Git Bash 或 WSL确保命令解释环境和技能文档里假设的一致。依赖缺失也常见比如某个技能需要 jq但系统里没装。模型读了文档文档告诉它用 jq 解析 JSON结果一执行就 command not found。我的习惯是先跑一个环境检查技能把常用命令的可用状态报告给 Agent让它自己做降级处理比如没有 jq 就改用 Python 的 json 模块。实测下来这种“文档给方案、模型做取舍”的模式非常好用。5.3 安全边界应该怎么划agent-skills 很强大但强大意味着风险。我建议这几个原则必须守住不要给 Agent 无确认的 sudo 权限。如果某个技能需要管理员权限宁可中途中断也不要提前把密码挂在配置里。还有技能库里的脚本应该定期 review避免有恶意或异常逻辑混进来。只暴露指定的工作目录不要让 Agent 默认拥有整个文件系统的读写权限。我在配置 MCP 时把 skills 目录和工作目录放在同一个项目文件夹下并明确告诉模型只能操作这里面的内容。还有一点容易被忽略SKILL.md 本身就是外来的文本内容理论上可能包含恶意指令。当你让模型读取一个不熟悉的技能文档时它等于阅读了一份外部输入。务必确保技能都来自可信来源不要随手把网上陌生人分享的技能目录丢进你的生产环境。5.4 常见问题速查表现象常见原因处理方式检索不到技能描述太泛或关键词冲突细化描述加入扩展名词、场景词、动词模型读了文档但不会用上下文不足或文档步骤不清换更大上下文模型或重写 SKILL.md 步骤bash 命令执行失败跨平台语法差异固定 shell 环境Windows 用 WSL/Git Bash命令找不到依赖缺失先跑环境检查或让模型用 Python 替代执行前没有安全确认客户端未开确认钩子开启命令审批或隔离工作目录技能文档格式不对缺少元信息或正文不规范对照官方 skill 模板重写结构6. 我自己的实操体会整个项目跑下来最让我上头的不是某一个技能有多好用而是“文档即能力”这个范式带来的连锁反应。以前我加一个工具能力要写接口、注册 schema、处理错误、测试边界忙活一整天。现在加一个技能就是写一篇结构清晰的 Markdown把使用场景、操作步骤、注意事项讲清楚Agent 读完就会用。这个效率差距不是一点半点。我现在的使用习惯是把 agent-skills 当成一个自建 Agent 的“技能底座”往里丢自己写的脚本和文档让模型按需取用。比如我写了一个“批量压缩图片”的脚本配一份 SKILL.md说明什么时候用、输入输出路径怎么传、有哪些坑比如格式不支持、目录不存在自动创建。从这之后我只需要用一句自然语言描述任务Agent 自己就能找到这份技能、跑完整个流程。最后分享一个小技巧给技能目录起名时多用动词开头像 filter_csv、convert_html_to_pdf、archive_files_by_date 这种一眼清的风格。SKILL.md 的描述部分一定要写清楚“什么时候用”和“什么时候别用”后者尤其重要它能让模型在错误场景下主动放弃调用避免很多不必要的误操作。这是我折腾了这么多技能之后觉得性价比最高的一条经验。
延伸阅读

更多相关文章

2026/10/7 4:30:15

Vue3 + OpenSeadragon 实现 MRXS 病理切片大图预览实践

最近接了一个医学教学平台的前端改造&#xff0c;里面最头疼的需求之一就是在浏览器里直接预览病理切片。医生上传的扫描文件是 MRXS 格式&#xff0c;一张切片动不动就几个 GB&#xff0c;刚开始我用最原始的<img>标签去加载&#xff0c;浏览器直接卡死&#xff0c;白屏…

2026/10/7 4:30:15

Agent Skills 技能包实战:从概念、结构到团队资产落地

最近在好几个技术社群里都看到有人在聊 agent-skills&#xff0c;有人把它当成函数调用的升级版&#xff0c;有人觉得它就是一套带说明文档的脚本集合。这两种说法都对&#xff0c;但都没说到根子上。我自己的理解是&#xff1a;agent-skills 是把“提示词 可执行代码 参考资…

2026/10/7 4:30:15

微信小程序+SSM架构的维修工单系统设计与实践

1. 项目是做什么的&#xff1a;一张维修工单的生命周期接手“阳光电脑公司的维修服务微信小程序 SSM&#xff08;文档源码&#xff09;”这样一个项目&#xff0c;我第一反应是&#xff1a;这不就是典型的“小程序做前端触达&#xff0c;Java 做后台业务”的毕业设计/课程设计…

2026/10/7 5:30:18

固态硬盘主控维修实战:SM2258XT与PS3111开卡救砖全攻略

固态硬盘用着用着突然不认盘、BIOS 里能识别但系统里死活不出现、容量变成 0 字节、盘符还在但双击提示格式化——这些场景我基本每个月都要遇到几次。很多人第一反应是闪存颗粒坏了&#xff0c;或者直接认定数据没救了&#xff0c;但根据我这几年的维修经验&#xff0c;至少一…

2026/10/7 5:30:18

Cadence Allegro差分对设置常见错误与排查方法详解

做硬件的人大都绕不开高速信号。USB、PCIe、以太网、DDR&#xff0c;板子一旦跑到几百兆甚至Gbps级别&#xff0c;Cadence Allegro里的差分对设置就是天天要打交道的活。我见过不少新同事抱着PCB设计教程啃了半天&#xff0c;一上手画高速板&#xff0c;Constraint Manager里飘…

2026/10/7 5:30:18

USB3.0集线器移动硬盘掉线?供电不足诊断与PMOS改造方案

插上移动硬盘的那一刻&#xff0c;我得到的是连续几声“叮咚、叮咚”&#xff0c;盘符在电脑右下角闪了两次又消失&#xff0c;最后彻底无声。拔下来直插主板&#xff0c;硬盘在半秒内正常识别。这种“USB3.0集线器一接硬盘就掉线”的毛病&#xff0c;用过扩展坞、多口Hub的人多…

2026/10/7 5:30:18

2026智能体规模化落地:从概念到工程实战指南

2026年确实可以称得上是智能体规模化落地的元年。我最近在整理这一周的AI圈动向时&#xff0c;感受特别明显&#xff1a;大家讨论的重点已经从“哪个模型又刷了多少分”转移到“智能体到底能帮我完成哪些真实任务”。从对话工具到可自主执行的智能体&#xff0c;这个跳跃比很多…

2026/10/7 5:30:18

GitHub月榜怎么看?从访问加速到项目评估,筛选高价值开源项目

每天刷一遍 GitHub 热榜&#xff0c;已经成了我雷打不动的习惯。说得矫情一点&#xff0c;这就像订报时代的人翻头版&#xff0c;只不过现在的“头版”一天一换&#xff0c;而且经常失真——今天的日榜第一&#xff0c;可能只是因为一个梗、一次转发、或者一个新模型 Demo 的截…

2026/10/7 5:25:18

Claude Code 卡住转圈?从 Spinner 状态识别到完整排查方案

说实话&#xff0c;用Claude Code最让人血压上升的画面&#xff0c;就是那个spinner一直在转&#xff1a;转十秒、转三十秒、转一分钟&#xff0c;屏幕上一行字都没多。不管你是刚装好claude code的新手&#xff0c;还是已经在VSCode里配好插件的老手&#xff0c;遇到这种"…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起&#xff1a;为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高&#xff0c;很多人第一次听到会以为是某个新模型的名字&#xff0c;其实它更像是一种思路——把Jev模型的能力当作底座&#xff0c;通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同"&#xff1a;多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西&#xff0c;大概率会有一种感觉&#xff1a;单个 Agent 能做的事情&#xff0c;其实很快就摸到天花板了。你给它一个提示词&#xff0c;挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑