E2B 仓库协作规范全解析:从 pnpm/uv 工具链到代码生成与 SDK 双实现工程约束
人工智能AI AgentAgent 沙箱后端【免费下载链接】E2BOpen-source, secure environment with real-world tools for enterprise-grade agents.项目地址https://gitcode.com/gh_mirrors/e2/E2B点击查看免费下载导读本文以 E2B 开源仓库根目录的 AGENTS.md 为骨架逐条拆解该仓库面向人类开发者与 AI Agent 的协作约定——包括 Node/Python 依赖管理选型、提交前质量门禁、JS 与 Python SDK 的双实现同步要求、spec/目录的只读与代码生成闭环、changeset 版本管理、PR 流程以及本地凭据存放位置。读完本文你将能理解 E2B 仓库的工程纪律从何而来知道在改动其 SDK 与 CLI 时每一步应执行哪些命令、维护哪些文件并能在自己的多语言仓库中复用这套规范 源码佐证的协作模式。一、这份规范覆盖了什么AGENTS.md 的定位与总体脉络E2B 是一个为 Agent 提供安全云沙箱环境的开源项目仓库描述为 Open-source, secure environment with real-world tools for enterprise-grade agents仓库采用 pnpm workspace 组织多个 npm 包并同时维护 Python 版 SDK。根目录的 AGENTS.md 只有十条规则却精确地规定了项目协作中的高频关键节点依赖安装Node 用 pnpm、Python 用 uv提交前必须通过 format、lint、typecheck修改 SDK 时 JS 与 Python 同步/异步实现必须等价变更spec/下的 API 规范文件禁止手改只能通过固定 commit make codegen同步测试覆盖受影响代码路径并以pnpm run test运行变更 CLI、JS SDK、Python SDK 公共接口时生成 changeset创建 PR 时为面向用户的变更补充 usage examples新建 PR 时用 Linear MCP 关联 issuePR 描述要与变更保持同步默认凭据存放在仓库根.env.local或~/.e2b/config.json。与常见的社区行为准则不同这份文档的每一条都指向仓库中真实存在的脚本、配置与代码路径属于可直接执行的操作约束。下面按主题分组逐一展开并给出仓库内的实现证据。二、依赖管理约定Node 用 pnpmPython 用 uvAGENTS.md 第 1 条规定Use pnpm for node and uv for python to install and update dependencies.仓库的根 package.json 通过packageManager字段把 pnpm 版本固定为pnpm10.34.5同时在engines中声明pnpm: 10.16.0 11保证贡献者与 CI 使用一致的包管理器版本。pnpm-workspace.yaml 声明了packages/*作为 workspace 成员并借助 catalog 机制统一管理typescript、vitest、tsdown等跨包共享依赖的版本。Python 侧的证据同样明确packages/python-sdk、packages/code-interpreter-python、packages/desktop-python、packages/dockerfile-utils-python均带有pyproject.toml与uv.lock依赖锁定文件由 uv 维护。packages/python-sdk/Makefile中的init目标使用uv sync --group codegen安装代码生成工具链测试目标则使用uv run pytest --verbose --numprocesses4与用 uv 安装和更新依赖的规范完全一致。实践要点在仓库根执行pnpm install安装全部 Node 依赖Python 包内如需开发环境使用uv sync并搭配uv run执行命令避免混用 npm/conda 等其他工具导致 lock 文件失配。三、提交前质量门禁format、lint、typecheckAGENTS.md 第 2 条要求提交前依次运行pnpm run format pnpm run lint pnpm run typecheck这三个脚本都定义在根 package.json 中采用pnpm --if-present --recursive run script的形式向下递归到各包执行format根层调用 prettier各包如 packages/cli/package.json、packages/js-sdk/package.json也定义了format: prettier --write src之类的脚本lintTypeScript 包使用 oxlint如packages/cli的lint: oxlint --config ../../.oxlintrc.json srcPython 包则使用 ruffpackages/python-sdk/Makefile中ruff check .与ruff format --check .typecheckJS SDK 先执行pnpm --dir packages/js-sdk build作为前置构建再递归运行各包 typecheckCLI 为tsc --noEmit --skipLibCheckPython 侧对应ty check。实践要点这是提交前的最后一公里自检若任一命令失败应视为未完成。值得注意的是根脚本依赖--if-present因此未定义相应脚本的包会被跳过贡献者仍应确保自己改动的包存在对应的质量脚本新增包时需自行补充。四、SDK 双实现同步JS 与 Python 的 sync/async 四象限AGENTS.md 第 3 条是仓库最具特色的工程约束When modifying the SDK packages, ensure equivalent changes are applied to both JS as well as sync and async Python implementations.仓库中的 SDK 包分为两大族JS SDKpackages/js-sdknpm 包名e2b包含 sandbox、template、volume、envd 等模块Python SDKpackages/python-sdk其目录结构明显按同步/异步拆分为e2b/sandbox_async/与e2b/sandbox_sync/两套实现packages/python-sdk/e2b/sandbox_async/commands/、packages/python-sdk/e2b/sandbox_sync/commands/等CLI 测试中亦可看到对两种模式的覆盖。这意味着一个功能改动往往要落在四个位置JS 实现、Python 同步实现、Python 异步实现以及对应的测试。仓库甚至为此编写了跨语言的 parity 测试packages/python-sdk/tests/shared/git/test_parity.py来校验同步与异步行为的一致性。从源码结构可以推断该约束的目的是确保不同语言与编程范式下 Agent 拿到的 SDK 体验完全等价避免文档与示例因语言而出现行为漂移。实践要点改动packages/js-sdk或packages/python-sdk的公开行为时先在两个语言里找到功能对应的入口Python 侧务必同时检查sandbox_async与sandbox_sync保持参数名、默认值、异常语义一致。五、spec/ 只读原则与代码生成闭环Copybara pin codegenAGENTS.md 第 4 条是整个仓库自动化程度最高的一条规则Never edit the API, envd, or volume-content specs in spec/ by hand; they are synced with Copybara from e2b-dev/runtime and e2b-dev/belt at the commits pinned in spec/runtime-ref and spec/belt-ref. To update the specs, bump the pins and re-runmake codegen, which re-fetches them before generating.结合仓库文件可以还原出完整的同步链路源仓库与 pinspec/runtime-ref 记录e2b-dev/runtime的 commit90ad3bd…spec/belt-ref 记录e2b-dev/belt的 commit13ca196…两个 pin 文件是 spec 同步的锚点。Copybara 配置copy.bara.sky 定义了三个 workflowapi-specspec/openapi.yml、envd-specspec/envd/下的 envd.yaml 与 protobuf、volume-api-specspec/openapi-volumecontent.yml并声明每个 workflow 拥有的目标路径同步成功后只会替换这些路径其余仓库自有文件如spec/mcp-server.json、spec/envd/buf-*.gen.yaml不受影响。抓取脚本scripts/fetch-spec.sh 读取 pin可通过E2B_RUNTIME_REFmain、E2B_BELT_REFmain临时覆盖、自动从GITHUB_TOKEN或gh auth token获取认证belt 是私有仓库必须带 token随后以 Docker 方式运行 Copybara 的migrate命令。生成入口Makefile 中make codegen会先执行fetch-specs抓取三个 spec再用 codegen.Dockerfile 构建内置 buf、protoc 插件、openapi 工具的镜像在容器内执行make generate最终分别触发 JSpackages/js-sdk pnpm generate与 Pythonpackages/python-sdk make generate的代码生成。生成前的过滤redocly.yaml 使用 Redocly CLI 把同步下来的spec/openapi.yml按 tag 过滤JS 保留sandboxes, snapshots, templates, tags, auth, volumes, secretsPython 少一个auth再交由openapi-typescript/openapi-python-client生成客户端类型与代码。spec/README.md 补充了更精细的操作方式只想抓取不生成时可分别执行pnpm fetch:api-spec、pnpm fetch:envd-spec、pnpm fetch:volume-spec抓取失败时make codegen会警告并回退到 spec/ 中已跟踪的副本。另外生成文件的 CI 检查会在跟踪副本与 pin 不一致时失败从而保证 spec 与代码永远严格对应。实践要点永远不要在 spec/ 下手动改 OpenAPI、envd.yaml 或 proto 文件。正确的流程是在上游仓库修复 → bumpspec/runtime-ref或spec/belt-ref中的 commit → 在仓库根执行make codegen如需跳过镜像构建可设置CODEGEN_IMAGE指向预构建镜像→ 提交生成的客户端代码。六、测试覆盖与运行方式AGENTS.md 第 5 条要求Create or update tests covering affected codepaths and run them usingpnpm run test.根 package.json 的测试脚本为test: pnpm --dir packages/js-sdk build pnpm --recursive --if-present run test即先构建 JS SDK因为多数包以 workspace 方式依赖它再递归运行所有声明了 test 脚本的包。各包的测试命令各异CLI 用vitest run测试入口见 packages/cli/tests/setup.ts会先pnpm build再 spawndist/index.jsJS SDK 用vitest run并额外提供 Cloudflare Workers、浏览器、Deno 等运行时测试见packages/js-sdk/package.json的test:cf、test:browser、test:denoPython SDK 则通过uv run pytest --verbose --numprocesses4并行执行。仓库的测试资产相当丰富packages/js-sdk/tests/sandbox/、packages/js-sdk/tests/template/、packages/python-sdk/tests/async/、packages/python-sdk/tests/sync/等目录分别覆盖命令执行、文件系统、Git、模板构建、卷volume等模块。实践要点为改动补充对应层的测试JS 测试 Python sync/async 双份测试并保证pnpm run test全绿后再提交。七、changeset 版本管理什么变更必须生成 changesetAGENTS.md 第 6 条划定了 changeset 的适用范围Generate a changeset withpnpm changesetin the repository root when changing the public surface of packages/cli, packages/js-sdk, or packages/python-sdk; internal scripts, devtools, and tests dont need one.仓库的 changeset 配置位于 .changeset/config.jsonaccess: public、baseBranch: main、updateInternalDependencies: patch并允许私有包参与版本化。根 package.json 提供了changeset: changeset脚本与配套的version、publish脚本pnpm changeset version pnpm run -r postVersion pnpm run -r lock说明整个发布流程由 changeset 驱动。.changeset/README.md 给出了生成方法仓库中已有的 changeset 示例如 .changeset/python-3-11.md展示了标准格式——frontmatter 声明受影响包及 semver 级别minor/patch正文描述变更内容。实践要点只有改动packages/cli、packages/js-sdk、packages/python-sdk的公开接口时才需要 changeset内部脚本、开发工具、测试的变更明确豁免。生成后会在.changeset/下新增一个 markdown 文件随 PR 一起提交。八、PR 流程usage examples、Linear MCP 与描述维护AGENTS.md 第 79 条规范了拉取请求的创建与维护第 7 条创建 PR 时面向用户user-facing的变更必须在 PR 描述中附上 usage examples方便 reviewer 与下游用户快速理解新行为第 8 条新建 PR 时若可用 Linear MCP应链接相关 issue或从 PR 描述创建新 issue——这是仓库将 issue 追踪工具Linear接入 MCP 的体现使 Agent 工作流也能自动建立任务关联第 9 条PR 描述需随变更持续更新避免描述与实际 diff 脱节。需要说明的是仓库根目录的 CONTRIBUTING.md 非常简短仅引导到 Discord 与 GitHub 讨论因此 AGENTS.md 实际上是贡献流程细节的主要载体。实践要点提交 PR 前自检——描述中是否包含示例代码、是否关联了对应 issue、描述是否与最终改动同步。九、凭据存放约定.env.local 与 ~/.e2b/config.jsonAGENTS.md 第 10 条说明默认凭据的两处存放位置仓库根目录的.env.local本地文件不入库或用户主目录下的~/.e2b/config.json。~/.e2b/config.json的读写逻辑集中在 packages/cli/src/user.ts路径常量USER_CONFIG_PATH path.join(os.homedir(), .e2b, config.json)user.ts配置采用version: 2格式包含identityemail、oauthtoken/revoke endpoint 与 client_id、tokensaccess/refresh token、last_refresh以及projectName/projectId/projectApiKeyuser.ts代码中还保留了 v1 配置team*字段的内存迁移逻辑写入时通过writeUserConfig将目录权限设为0o700、文件权限设为0o600user.ts因为文件内含 OAuth 凭据必须限制为仅属主可读写。CLI 的 API 密钥解析顺序见 packages/cli/src/api.tsE2B_API_KEY环境变量优先其次回退到用户配置中的projectApiKeyE2B_PROJECT_ID或旧的E2B_TEAM_ID用于指定项目。auth login浏览器 OAuth 回环登录见 packages/cli/src/commands/auth/login.ts、auth configure选择项目见 configure.ts、auth logout调用 revoke endpoint 撤销 refresh token 并删除配置见 logout.ts等命令都以该文件为读写中心token 到期前 60 秒会自动通过refreshOAuthToken刷新见 packages/cli/src/utils/token-refresh.ts。实践要点不要在代码或 PR 中提交真实凭据。本地开发使用仓库根.env.local设置E2B_API_KEY、E2B_PROJECT_ID交互式开发则用e2b auth login生成~/.e2b/config.jsonCI/CD 环境优先通过E2B_API_KEY环境变量注入。十、提交前自检清单面向贡献者与 Agent将 AGENTS.md 十条规则落成一张可执行的核对表供提交 PR 前逐项勾选#检查项对应命令 / 文件1Node 依赖用 pnpm、Python 依赖用 uv 安装更新pnpm install/uv sync2格式化、Lint、类型检查全部通过pnpm run format pnpm run lint pnpm run typecheck3SDK 改动同步到 JS、Python sync、Python async 三处实现packages/js-sdk与packages/python-sdk/e2b/sandbox_{async,sync}/4未手改spec/如需更新bump pin 后make codegenspec/runtime-ref、spec/belt-ref、Makefile5补充受影响路径的测试并全量运行pnpm run test6CLI/JS SDK/Python SDK 公共接口变更已生成 changesetpnpm changeset7PR 描述包含面向用户变更的 usage examples—8已通过 Linear MCP 关联或创建 issue—9PR 描述与最终改动一致—10未泄露凭据本地凭据仅在.env.local或~/.e2b/config.jsonpackages/cli/src/user.ts小结E2B 仓库的 AGENTS.md 虽然篇幅极短却是一条高度可执行的工程约束它以 pnpm/uv 划定工具边界用 format/lint/typecheck 守住质量门禁用JS Python sync/async四象限约定保证多语言 SDK 行为一致用 Copybara commit pin make codegen的闭环让生成代码永远紧跟上游规范再用 changeset 与 PR 流程串联版本发布与变更沟通。对于想要参与 E2B 开发或借鉴其多语言 monorepo 治理模式的团队来说这份文件本身就是一个优秀的规范与实现一一对应的范例——每一条规则都能在仓库的脚本、配置与源码中找到落点这也是它能够被 AI Agent 直接理解和执行的根本原因。赞分享人工智能AI AgentAgent 沙箱后端【免费下载链接】E2BOpen-source, secure environment with real-world tools for enterprise-grade agents.项目地址https://gitcode.com/gh_mirrors/e2/E2B点击查看免费下载相关推荐E2B 仓库开发协作规范从依赖管理到代码生成的完整工程工作流E2B 仓库开发协作规范从依赖管理到代码生成的完整工程工作流 本篇文章以 E2B 仓库根目录的 CLAUDE.md https://link.gitcode.人工智能AI AgentAgent 沙箱后端三步移除 Windows AI 组件RemoveWindowsAI 完整使用指南三步移除 Windows AI 组件RemoveWindowsAI 完整使用指南 刚升级完 Windows 11你发现任务栏多了一个关不掉的 Copilot隐私合规应用安全Guzzle PSR-7 工程规范全解读懂 AGENTS.md 的代码与工具链约束Guzzle PSR 7 工程规范全解读懂 AGENTS.md 的代码与工具链约束 本文以 guzzlehttp/psr7 PSR 7 HTTP messa后端上一篇gh_mirrors/sh1/sh的代码评审自动化使用Bot进行初步检查下一篇GraphQL Code Generator 与 Apollo Client React 实战client preset 端到端类型安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

109_母线电压利用率与调制比上限对高速区的影响

109_母线电压利用率与调制比上限对高速区的影响

一个让我赔进去两周的深夜产线事故 前年冬天,给一个做高速离心设备的客户调一台自研控制器。样机在实验室里跑到额定转速一切正常,拉到产线上带载测试,转速一过某个阈值就开始抖,电流波形像被啃过一样缺口不齐,母线电压采样纹波突然变大,偶尔还触发过流保护。当时第一反…

2026/10/14 6:13:24 阅读更多 →
鸿蒙+蓝耘MaaS:轻量级端云协同AI行程规划实践

鸿蒙+蓝耘MaaS:轻量级端云协同AI行程规划实践

1. 项目概述:这不是一个“节日营销Demo”,而是一次端云协同的轻量化AI落地实践“当国庆黄金周遇上大模型:我用蓝耘元生代 MaaS 鸿蒙,给 8 亿人装了一个‘AI 行程规划师’”——这个标题里藏着三个被大众误读最深的关键词&#xf…

2026/10/14 6:13:24 阅读更多 →
详解 FastICA

详解 FastICA

FastICA(Fast Independent Component Analysis,快速独立成分分析)是一种盲源分离方法,用于从混合信号中分离出相互独立的原始信号。下面我从概念、原理、代码实现、典型场景几个方面来讲。一、FastICA 是做什么的?经典…

2026/10/14 6:12:24 阅读更多 →

最新新闻

Python静态检查实战:pychecker原理、配置与CI接入指南

Python静态检查实战:pychecker原理、配置与CI接入指南

简介: pychecker 是一款面向 Python 开发者的静态代码分析工具,能在程序运行前检查语法错误、类型不匹配、未定义引用、未使用变量、循环依赖等问题。压缩包对应 pychecker-0.8.19 版本,除可直接执行的脚本外,还包含完整源代码…

2026/10/14 6:58:33 阅读更多 →
香港人读内地金融EMBA-管理类联考和港澳证件

香港人读内地金融EMBA-管理类联考和港澳证件

香港人读内地金融EMBA-管理类联考和港澳证件 香港人读这一支,证件和笔试是两行,不要并成一句。复旦国金EMBA(https://fisf.fudan.edu.cn/femba/)的申请步骤是预报名、填写材料、面谈,然后参加全国硕士研究生招生考试里…

2026/10/14 6:58:33 阅读更多 →
Shor算法如何动摇RSA加密?原理、模拟器实操与后量子迁移

Shor算法如何动摇RSA加密?原理、模拟器实操与后量子迁移

RSA加密至今还在撑起互联网的信任体系。你的每一次HTTPS握手、每一封签名邮件、每一份电子合同背后,几乎都有一个“大整数分解难题”在把关。这个把关逻辑很直接:让普通人和攻击者都难以分解一个几千比特的大数。但Shor分解算法的出现,让“难…

2026/10/14 6:58:33 阅读更多 →
推测解码实战:大模型推理加速300%的原理与踩坑指南

推测解码实战:大模型推理加速300%的原理与踩坑指南

在 LLM 推理这条路上,我踩过的最大一个坑就是“看起来很快,用起来很慢”。模型推理的延迟一直是上线前最头疼的问题,尤其是自回归生成,一个 token 一个 token 往外蹦,想快都快不起来。直到我认真把 Speculative Decodi…

2026/10/14 6:58:33 阅读更多 →
Llama 3 FP8量化与长上下文实战:从原理到生产部署

Llama 3 FP8量化与长上下文实战:从原理到生产部署

1. 项目概述:为什么现在必须重新精读 Llama 3,且不能跳过 FP8 和长上下文这两块硬骨头Llama 3 这个名字最近在技术社区里几乎成了“默认配置”——不是因为它突然变得多神秘,而是因为太多人把它当成了“能跑就行”的基础模型,随手…

2026/10/14 6:58:33 阅读更多 →
麦语言函数手册实战:从零构建可复现的量化指标脚本

麦语言函数手册实战:从零构建可复现的量化指标脚本

简介:麦语言函数手册是文华财经推出的程序化函数库参考文档,面向使用文华平台进行量化策略开发的交易者与编程初学者,帮助其快速查阅函数用法、理解模型编写逻辑。手册系统梳理了自编策略模型支持的各类函数,涵盖历史数据引用&…

2026/10/14 6:57:33 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →