用途
该技能用于处理 Hubble 评审评论。Hubble 将评审状态以 CriticMarkup 形式存储在 Markdown 文件正文中,本技能可对指定评论进行回复、标记为已解决或重新打开。当用户要求处理某条 Hubble 评审评论时使用。
评论格式
Hubble 使用以下可移植子集在 Markdown 正文中存储评审状态:
{==anchored text==}{>>comment body<<}{#c1}
{++suggested insertion++}
{--suggested deletion--}
{~~original text~>replacement text~~}
评论锚点之后可能跟随一个 HTML 注释,其中包含原始 JSON,用于表示线程状态。该 JSON 不进行 URI 编码;Hubble 直接使用 JSON.parse 解析,因此编码后的负载会解析失败,并在笔记中显示为字面文本:
<!-- hubble-review:{"v":1,"replies":[],"resolved":false}-->
Hubble 使用 v、replies 和 resolved 字段;允许其他顶层键。始终写入 "v": 1。JSON 内部的任何 -- 需转义为 \u002d\u002d,因为字面 -- 会提前终止 HTML 注释。回复的结构如下:
{
"id": "r1",
"body": "Agent response",
"author": "agent",
"createdAt": "2026-01-01T00:00:00.000Z"
}
行内代码或围栏代码中的评审标记是字面文本,不是评论。
处理评论
读取完整文件。定位请求的紧凑 id,例如 {#c7};如果用户只给出锚定文本,则定位精确的 CriticMarkup 锚点。确认锚定文本和评论正文与用户请求匹配。如果 id 或精确锚点不存在或有歧义,停止并报告歧义。
解析紧跟在逻辑评论之后的 JSON 元数据。如果不存在,从空对象开始。如果格式错误,停止而不是覆盖它。
对元数据进行往返处理:仅修改回复列表和 resolved,然后重新序列化完整对象——其他所有键和现有回复保持不变。回复是仅追加的:使用下一个未使用的 rN id 添加回复,author 为 "agent",包含响应正文,以及当前 UTC 时间作为 ISO-8601 createdAt。
仅当用户请求实际已处理时,才设置 resolved: true。对于明确的重新打开请求,设置 resolved: false。确认、测试、问题和部分工作保持为 false。
将元数据块紧跟在评论的 {#cN} 标记之后写入(参见碎片化锚点)。保持锚定文本逐字节不变,以及评论正文、CriticMarkup 分隔符、建议编辑和所有无关 Markdown 不变。
碎片化锚点
一个逻辑评论 id 可能出现在多个 CriticMarkup 片段中。最后一个片段是权威的:保留每个标记,保留单个元数据块,并将其放在最后一个片段之后——如果它当前位于较早片段之后,则将其移动到那里。如果碎片化可能影响用户的格式,请报告。
验证
编辑后:
重新读取文件,确认请求的 id 和精确锚定文本仍然存在。
解析最后一个片段之后的元数据,验证它是有效的 JSON,新回复是最后一条回复,旧回复和其他键已往返,resolved 具有预期值。确认笔记渲染评论而不是将原始块显示为文本。
检查周围 Markdown 是否有意外更改:对于已跟踪文件,检查 git diff -- <file>;对于忽略/生成的文件,比较前后文本。
报告你留下的回复以及是否解决了评论。