news 2026/9/12 19:27:27

手机掌控AI开发:Kiro+Claude Code+Codex规约协同实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手机掌控AI开发:Kiro+Claude Code+Codex规约协同实战

上周在地铁上,客户临时抛过来一个接口变更需求,我手边只有手机,电脑留在公司里。搁以前这事只能等回家再处理,但那天我用手机上的 Kiro 连上了家里的开发机,先让 Claude Code 做了一轮架构评审,再把评审结论转成 Codex 能直接执行的编码任务,下车前方案和主要代码骨架就已经躺在手机上了。这件事让我认真把“手机端掌控 Kiro + Claude 架构评审 + Codex 秒级编码”这套流程固化了下来,而且越用越觉得它像一套有规约的协作系统。

这篇文章写给谁?给那些总被“改个东西必须开电脑”锁死的开发者,给每天在评审会议和编码任务之间来回切换的技术负责人,也给所有想用 AI 干活但还没把工具串成流程的人。我会把环境怎么搭、评审规约怎么写、Codex 怎么秒级落地,以及这一路踩过的坑全部摊开说,保证你照着能复现出一套属于自己的移动开发中控台。

1. 这套“规约协同”到底在解决什么问题

1.1 从一个尴尬的移动场景说起

我先描述一个非常典型的场景,你大概率也遇到过:人在外面,手机响了,群里说线上接口出了幺蛾子,或者客户说要临时改一个交互逻辑。你打开电脑?电脑不在身边。你打开手机看代码?代码在 Git 仓库里,可你不一定想用手机屏幕翻代码。你想让同事处理,又担心说不清楚上下文,来回拉扯半小时,最后等回到电脑前才真正开始干活。

我试过很多“远程方案”,普通远程桌面卡顿严重,在手机上点鼠标本来就是反人类设计;网页版代码编辑器能用,但很难调起本地命令行环境,更别说让 Claude 或 Codex 跑起来。后来我发现问题的核心不是“能不能看到屏幕”,而是“能不能把任务和上下文安全地送到有计算能力的机器上,再把结果拿回来”。Kiro 这类工具解决的正是这个链路:手机只是一个遥控器,真正干活的还是家里或办公室那台开发机。

这一步想通了,整个思路就顺了。我不需要手机上有 IDE,只需要手机能创建任务、能发送指令、能收到结果。也正因为如此,这套流程对性能敏感的操作(比如跑测试、执行 CLI、编译)非常友好,重活全在远端机器上完成,手机只承担消息交换和确认工作。

1.2 Kiro、Claude、Codex 三者怎么分工

先说结论,我的分工方式是这样的:Kiro 管“连接和编排”,Claude Code 管“架构评审”,Codex 管“编码执行”。三者各干各擅长的活,谁也别越权。

我把职责整理成一张表,你一看就明白:

工具角色核心职责为什么是它
Kiro手机端中控、会话管理、任务下发与结果回传天然适配移动场景,能在手机与开发机之间建立稳定通道
Claude Code架构评审、方案设计、代码审查、风险识别长上下文推理强,适合读完整项目后输出结构化评审结论
Codex根据明确任务秒级生成/修改代码、执行命令指令遵循能力强,拿到清晰任务卡后能快速产出可运行代码

这个分工背后是有逻辑的。架构评审这件事非常依赖对全局上下文的理解,你让一个只看了几个文件片段的模型去评“这个接口改了对哪些模块有影响”,它一定评不准。Claude Code 可以直接在项目目录里跑起来,读文件、查依赖、对比 Git 记录,这些能力让它适合做“架构师”。

编码执行刚好相反,它需要的是快速把“已经定义清楚的任务”变成“具体代码改动”。Codex 的交互模式更偏向执行者和工程师,给它一个足够明确的任务卡,它能把改动落到文件里,甚至跑一遍相关命令。如果拿写代码这类活去问评审型模型,也不是不行,但效率不如专门工具。

1.3 为什么要把“规约”这个词搬进开发流程

你可能觉得“规约”这个词有点唬人,其实它来自工业通讯领域。玩过电力调度、工业自动化的人都知道,设备之间要通讯,不能各说各话,得有一套双方共同遵守的规则,比如 IEC 60870-5-104(常说的 104 规约),它规定了报文格式、传输顺序、超时重传等一系列参数。没有规约,两台设备即使物理接上了,也聊不到一块去。

AI 编码工具协作也是同一个道理。Claude Code、Codex、Kiro 之间如果各说各话,Claude 评完审输出一套格式,Codex 又看不懂,Kiro 夹在中间只能当传话筒,那这套系统根本转不起来。所以我借鉴规约的思路,给整套协作流程定义了“明文规则”:谁先说话、说什么格式、多长时间算超时、结果怎么确认。这就是标题里“规约协同范式”的来历。

这个类比不是硬拗。104 规约里的 k、w、t1、t2、t3 这些参数,本质上是处理“并发、确认、超时、保活”问题,而我在 Claude 和 Codex 的协作中遇到的恰恰也是这些问题——一次能派几个编码任务?评审结果多久算超时?空闲时候要不要发个探活信号?后面我会专门用一节来讲怎么把这些参数映射到 AI 工具协作里。

2. 环境准备:手机、电脑、CLI 三件套

2.1 Kiro 安装与手机端连接

我最早接触 Kiro 是因为它支持从手机管理远程开发会话,而且对 Windows、macOS、Linux 都有覆盖。安装这件事本身不复杂:手机端去应用商店下载 App,电脑端按官方文档装好配套组件。它还有一个比较友好的点,Kiro 提供了 Windows 安装方式,即使你主力机是 Windows 也能跑起来,不像有些开发工具天生偏向某类系统。

装完之后,第一次连接会有一系列授权步骤。手机 App 会要求绑定开发机,开发机上会生成一个连接标识,两边配对成功之后,你就拥有了一个“手机上能看、能下发命令”的通道。这里我要强调一个容易忽略的点:Kiro 连接的是开发机上已经装好的命令行工具,而不是手机直接去调用云服务。也就是说,Claude Code 和 Codex 必须安装在开发机上,手机只是它们的遥控面板。

实际使用中,我最常用的操作是:在手机 Kiro 里新建会话,选择连通到开发机的会话通道,然后输入自然语言指令。Kiro 会把指令送到开发机的终端环境里执行,然后把结果实时回传。这个过程有点像我按住对讲机喊话,对面那台机器收到指令后动手干活,再把工作日志一段段传回来。

2.2 Claude Code 安装与身份配置

Claude Code 是 Anthropic 官方推出的命令行编程工具,可以在项目目录里直接读代码、改文件、执行命令,天然适合做架构评审。安装方式基于 npm,一条命令就能搞定。我以 macOS/Linux 为例,Windows 的 PowerShell 下流程也差不多,关键是保证 Node.js 环境可用。

npm install -g @anthropic-ai/claude-code claude --version

这里有一个我踩过的坑:如果你在终端输入claude提示“无法将 claude 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,那不是安装错了,而是 npm 全局目录没有写进 PATH。解决方式很简单,先用npm prefix -g查全局路径,再把这个路径加入系统 PATH,最后重开终端就好了。

身份认证方面,Claude Code 首次运行会让你登录账号,按提示完成授权即可。认证通过后,在项目目录里直接敲claude就能进入交互式会话。我一般不会直接上来就让它写代码,而是先让它“看项目”:我先发一句“先不要改任何代码,请通读项目结构、README、核心模块,然后告诉我你对这个项目的整体理解”,这是整个评审流程的起点。

2.3 Codex 安装与登录校验

Codex 是 OpenAI 的编码助手,CLI 版本安装方式同样是 npm 全局安装。它的特点是执行指令非常果断,你说“给这个接口补单元测试”,它会快速生成测试代码,然后尝试跑测试。正因为这种“秒级编码”的特性,我在规约里把它定位成“执行者”。

npm install -g @openai/codex codex --version

安装之后需要登录或配置访问凭证。Codex 支持 ChatGPT 账号登录,也支持 API Key 方式,具体看你手里有什么资源。登录完成后,可以在项目目录里用codex exec "任务描述"执行一次性任务,也可以直接进入交互模式。每次跑完,Codex 会把它读过的文件、改动过的文件、执行过的命令都列出来,这个信息对后续在手机端做确认非常有用。

关于 Codex 的定位,我要多说一句。它更适合“任务已经非常明确”的场景,比如“把订单状态机的 TIMEOUT 状态加上,修改对应枚举和转换逻辑”。如果你给它一个模糊的“帮我优化一下系统”,它反而会手足无措。所以我在整套流程里,要求必须由 Claude Code 评审完、输出清晰任务卡之后,才轮到 Codex 上场,这就是规约的意义。

3. 规约协同核心:用 104 规约的思维设计 AI 协作规则

3.1 先看懂 104 规约里的 k、w、t1、t2、t3

我为什么一直提 104 规约?因为它把通讯协作里最难处理的几个问题——并发上限、确认窗口、超时判断、链路保活——都变成了明确定义的可配置参数。看懂这几个参数,你也就知道该怎么给 AI 工具之间定规则了。

  • k:最大未确认 APDU 数量。发送方最多能连续发多少个报文而不用等接收方确认,超过这个数就必须停下来等。它的作用是防止发送方把接收方冲垮。
  • w:接收方最后确认的 APDU 数量。接收方攒了多少报文后必须给出确认,避免确认报文太频繁,也避免攒太多导致发送方卡死。
  • t1:发送方等待确认的超时时间。发出去之后多久没收到确认就判定超时,然后启动重传或告警。
  • t2:接收方在没有新报文可确认时,多久必须主动发一个确认帧。防止发送方一直傻等。
  • t3:链路空闲时的测试帧发送周期。双方长时间没有业务报文时,发送测试帧确认链路还活着。

这组参数放在工业系统里是给设备和主站用的,但它的建模思路完全可以直接搬到 AI Agent 协作中。核心要点就一句话:不要把协作建立在“我以为对方理解了”之上,要建立在一套可量化的约定之上。

3.2 把规约参数映射到 Claude 与 Codex 的协作中

我在自己的流程里设计了一套“AI 协作规约”,完全仿照 104 规约的参数思路。一开始你可能觉得没必要,但跑一段时间就会明白,没有这套参数,Claude 和 Codex 甚至可能互相“等死”。

规约参数含义定义我的取值
k同一时间最多允许 Codex 并行的编码任务数1,一次只干一件大事,避免多任务互相干扰
wCodex 拿到评审结论后,必须回传确认信息的条数至少回传“改动文件清单”和“测试结果”两项
t1Claude 评审结果多久未回,判定评审超时30 分钟,超时后在手机端提醒我重新检查任务
t2Codex 执行任务后多久未回,判定执行超时10 分钟,超时后我直接在手机上终止并看日志
t3会话空闲时,多久发一次探活确认15 分钟,确认 Kiro 与开发机的通道还在

别小看这个表格,它让整套流程从“随机应变”变成了“有章可循”。比如以前我经常遇到的情况是:Codex 跑了一个多小时还没动静,我以为是它在深度思考,后来发现它卡在一个交互确认环节。现在我把 t2 设成 10 分钟,超时立刻看日志,问题马上暴露。k 设成 1 也很关键,因为一次派多个编码任务看起来效率高,实际上代码之间会互相踩踏,最后反而要花更多时间合并冲突。

3.3 规约文档怎么写才能让手机端真正跑起来

有了参数还不够,你还得把“评审应该输出什么”“编码任务卡应该长什么样”这些格式约定写清楚。我在手机备忘录里存了三套模板,用的时候直接复制到 Kiro 会话里,非常方便。

第一套是“项目上下文模板”,用于每次评审前给 Claude Code 喂背景信息:

请基于当前项目代码,不要修改任何文件。 项目背景:这是一个电商订单系统,采用前后端分离架构。 本次需求:订单状态机需要新增“待支付超时取消”状态。 请输出以下结构: 1. 涉及的关键模块与文件 2. 核心改动点建议 3. 潜在风险与影响范围 4. 建议的编码任务清单 输出格式:Markdown 列表,禁止冗余描述。

第二套是“Codex 任务卡模板”,由 Claude Code 的评审结论整理而来:

请完成以下编码任务,完成后列出改动文件清单和测试结果。 任务目标:新增订单状态“TIME_OUT_CANCELED”。 改动要求: - 在订单状态枚举中增加新状态 - 在状态流转逻辑中添加“PAY_TIMEOUT -> TIME_OUT_CANCELED” - 更新状态机配置表 验收标准:相关单元测试全部通过,不破坏现有状态流转。

第三套是“结果确认模板”,用于 Codex 执行完之后的闭环确认:

请核对以下清单并逐项说明: - 是否所有改动文件都已列出? - 是否执行了相关测试? - 是否存在未完成的 TODO? - 是否引入了新的外部依赖?

这套模板的价值在于:手机端输入受限,不可能每次打一大段话;有了模板,我只需要在 Kiro 上改几个关键字段,剩下的格式全部现成。Claude 知道该怎么评,Codex 知道该怎么干,我知道该怎么验收。

4. 实操全流程:手机发起评审,Codex 秒级编码

4.1 从手机端发起一次架构评审

理论讲完,来一次实战。假设我现在在地铁上,收到需求:订单状态机要新增一个“待支付超时取消”的状态,客户端要能在订单详情页看到这个状态,后台定时任务要自动把超时未支付的订单流转过去。

我打开手机上的 Kiro,连上开发机,在项目目录下新建一个会话,把项目上下文模板粘贴进去,然后补上本次需求的一句话描述。Kiro 会把这段话原样推给开发机上的 Claude Code。Claude Code 开始工作后,我在手机上能实时看到它的输出日志:它先列目录、读状态机定义文件、查数据库表结构,然后给出评审结论。

评审结论大概是这样的:涉及订单主表、状态机配置、定时任务、订单详情接口四块;核心改动点是状态枚举和状态流转表;潜在风险是历史订单里有“已支付但状态未更新”的脏数据,需要加兼容逻辑;建议的编码任务清单分三步:枚举新增、流转逻辑补充、定时任务调整。整个过程大约十分钟,比起我坐地铁干瞪眼,不知道高到哪里去了。

4.2 评审结论如何变成 Codex 的编码指令

评审结论出来后,我不会直接让 Codex 一股脑全做。按规约里的 k=1,我只挑第一步“状态枚举新增 + 流转逻辑补充”派给 Codex。这一步改动小、影响范围清晰,适合验证整条链路。

我把 Claude 的评审结论整理成 Codex 任务卡,通过 Kiro 下发。命令大概是:

codex exec "请完成以下编码任务:在订单状态枚举中新增 TIME_OUT_CANCELED 状态;在状态流转逻辑中添加 PAY_TIMEOUT -> TIME_OUT_CANCELED 的流转;更新状态机配置表。完成后列出改动文件清单和测试结果。"

Codex 收到任务后开始秒级编码,Kiro 上会滚动显示它在读取哪些文件、改动了哪些位置、跑了什么命令。我在手机上看着这些日志,心里大概有数:如果它 10 分钟内没有回传确认信息,按 t2 参数就该告警了。实测下来,这个任务大概三分钟就完成了,回传信息里列了三个改动文件、一行数据库变更脚本,以及测试通过的结果。

这里有个经验:不要嫌任务卡啰嗦。Codex 的能力再强,也需要明确边界。你让它“顺便优化一下”,它就敢给你重构整个模块;你让它“只改枚举和流转逻辑”,它会老老实实不碰别的东西。规约里的边界设定,是保证它不跑偏的关键。

4.3 结果回传手机端,闭环确认

Codex 完成任务后,我会把结果确认模板下发给它,让它逐项自检。这一步很多人会跳过,但我强烈建议保留。它做的是“自查”,我做的是“最终确认”,两者加在一起才算一个完整的闭环。

确认信息回来之后,我在手机上查看改动文件清单,对照 Claude 的评审结论里提到的几个文件,确认该改的都改了、不该动的都没动。然后我再做一件事:把新状态机流转路径发给客户端同事,让他确认前端展示逻辑是否匹配。整个确认动作不需要打开电脑,我在手机上就能完成。

这套闭环给我最大的感受是:原来远程开发最怕“不知道干了什么”,现在每一步都有记录,每一步都有确认。规约协同不是说让 AI 完全替代人,而是让人在最少的精力消耗下,掌握最多的关键信息。

5. 高频报错与避坑实录

5.1 安装与命令层面的常见坑

整套流程最劝退新人的往往是环境问题,而不是 AI 能力问题。我整理几个高频坑,你遇到可以少走弯路。

“claude”命令找不到。这是最普遍的,原因就是 npm 全局路径不在 PATH 里。处理方式:先执行npm prefix -g,把输出路径加进 PATH,重开终端再试。在 Windows PowerShell 里还有个额外坑,执行脚本可能被策略限制,需要管理员权限放开执行策略或者直接用脚本相对路径。这不是什么复杂问题,但每次换了新电脑都会遇到一次。

Codex 装好后打不开。常见原因是版本太旧或者依赖没装全。先codex --version看版本,再检查 Node.js 版本是否满足要求。Codex CLI 的日志通常很详细,第一次启动失败时,把终端里的完整报错信息复制出来去搜,比自己猜效率高得多。

还有一个容易被忽略的点:Kiro 和命令行工具之间的环境变量不完全同步。比如开发机的终端里能正常用codex,但在 Kiro 创建的会话里提示命令不存在,那多半是 Kiro 启动会话时没有加载 shell 的配置文件。解决方式是在 Kiro 会话里先执行一次source ~/.bashrcsource ~/.zshrc,或者把 npm 全局目录直接配置到 Kiro 的环境变量里。

5.2 Codex 和 Claude 会话层的报错处理

环境没问题之后,真正难排查的是 AI 工具在会话过程中抛出来的报错。我把这套流程跑通的过程中,前前后后遇到不少,这里挑几个有代表性的。

Codex 在处理本地转发时遇到的连接类报错。我遇到的那次,报错信息出现在调用 Codex 接口的环节,看起来是本地某个转发服务的配置出了岔子。排查思路很简单:先检查系统环境变量里有没有残留的转发地址配置,再确认本地服务端口是否正常监听,最后把 Codex CLI 升级到最新版本。这类问题十有八九是配置残留和版本不一致导致的,跟项目代码没关系。

模型兼容性报错。比如 Codex 绑定的模型在当前账号下不可用,提示信息会包含“model is not supported”或“not supported when using”字样。这种问题基本只能按照报错提示换模型:具体做法是检查账号类型和模型名是否匹配,如果用默认模型报错,就换成账号支持的近似型号。我在切换账号后踩过这个坑,重登并清理本地配置就恢复了。

上下文窗口超限报错。Codex 在处理长任务时报“ran out of room in the model's context window”,本质是塞进上下文的资料太多。解决方式就是拆分任务:把一个大需求拆成几个小任务,每个任务只带和它相关的文件路径和评审结论。这也是我为什么在规约里坚持 k=1 的原因——任务一次派太多,上下文很快就会爆。

Claude 的可用性报错。偶尔会碰到类似“currently not available to new users”的提示,这是服务方对新账号的访问限制,不是我们能改的。我的处理方式是先确认账号是否在可用范围内,再看服务状态页,如果确实不可用就先用备用工具顶上,等恢复了再切回来。

5.3 Kiro 授权与连接稳定性问题

Kiro 本身比较稳,但有一个问题几乎人人都遇到:每次建立新会话都要点一次 Allow 授权。第一次你觉得只是多一步,用久了会烦。解决办法是在 Kiro 的设备或会话配置里,找到授权管理,把对应的开发机设为信任设备,以后新会话就不会每次都弹授权框。注意这个操作会降低安全门槛,适合开发机和个人设备之间配置,公共设备别这么干。

连接断线的问题也很常见。手机锁屏一段时间后,Kiro 与开发机的连接会中断,任务日志停在半路。如果你需要长时间跑任务,建议把开发机的休眠策略关掉,同时让 Kiro 在前台运行,或者在设置里允许后台连接。还有个技巧:把任务拆成小批次,即使中途断了,已经完成的部分不会丢,重新连接后从断点继续。

多设备并发会话也要注意。我有一次手机和电脑同时开着 Kiro,同一台开发机两个会话指向同一个项目目录,结果两边都让 Codex 写同一个文件,产生了一堆冲突。现在我的规约里明确加了一条:同一项目同一时刻只允许一个会话处于执行态。宁可排队,也不要并行踩踏。

6. 规约协同范式还能怎么扩展

6.1 从 104 规约扩展到其他规约思维

104 规约只是工业通讯里的一种,懂行的人还知道 101 规约、698 规约等等。它们各有特点:有些偏重报文结构,有些偏重安全认证,有些偏重大数据量传输。这些思路放到 AI 工具协作里,能催生出更多的协同范式。

比如 698 规约里的安全认证机制,对应到 AI 协作里就是“权限分级”。可以让 Claude 只能读文件、不能写文件,Codex 只能改指定目录、不能碰配置文件,这些权限约束把 AI 工具可能造成的破坏范围限制在可控区间。

再比如规约里的数据域结构,对应到 AI 协作就是“任务内容的格式化”。我现在的任务卡只有标题、目标、改动要求、验收标准四个字段。你可以扩展出更复杂的字段,比如“涉及上下游系统”“需要同步的文档”“回滚方案”,这样 Codex 在动手前就对全局有完整认知。

6.2 把评审 Agent 和编码 Agent 做成可插拔组件

我在设计这套流程时特意做了解耦。Kiro 只负责连接和消息传输,Claude Code 只是当前选定的评审 Agent,Codex 只是当前选定的编码 Agent。也就是说,这三位不是绑定关系,而是可以替换的。

将来如果有一个更好的评审模型出现,我只需要在开发机上把 Claude Code 替换成新的 CLI 工具,手机端 Kiro 的会话模板可能都不用动。同样的道理,如果某个编码工具对特定语言支持得更好,我可以把编码 Agent 切到那一个。规约协同范式真正的价值不在于绑定某一款工具,而在于定义了一组“角色应该输出什么”的标准,标准不变,工具随便换。

我下一步打算把这套规约文档直接写进项目仓库,新增一个 AI_COLLABORATION.md 文件。这样团队里任何人在手机端发起任务时,都知道该给 Claude 什么上下文、该给 Codex 什么任务卡、验收要检查哪几项。AI 工具会越来越强,但把人和工具的协作方式用规约固定下来,才能保证流程不会因为工具升级而散架。

最后再分享一个我实际用下来的小技巧:整个流程跑顺之后,别急着追求“全自动”。我现在依然保留人工确认这个环节,每次 Codex 跑完,我都会把改动文件清单和验收标准逐一核对。这套“手机发任务、Claude 评审、Codex 执行、人确认”的规约协同,最核心的收获不是省了多少时间,而是让我在任何地方都能对项目保持掌控。工具会更新,模型会换代,但“任务有定义、过程有记录、结果有确认”这套底层逻辑,在什么时代都不会过时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 19:24:34

配电网故障恢复:统一建模与Matlab实现

1. 项目背景与核心价值配电网故障恢复一直是电力系统运维中的关键难题。传统方法往往将网络重构和孤岛运行分开处理,导致恢复方案可能不是全局最优。这个项目提出了一种创新思路——将孤岛划分与网络重构统一建模,通过Matlab实现了一套完整的解决方案。我…

作者头像 李华
网站建设 2026/9/12 19:24:12

LeetCode hot100——994.腐烂的橘子

题目在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到单元格中没有新…

作者头像 李华
网站建设 2026/9/12 19:24:10

小程序体验优化提升带货转化率的7个关键点

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

作者头像 李华
网站建设 2026/9/12 19:23:03

手表App开发选型不踩坑:平台、跨端框架与UI交互指南

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

作者头像 李华