Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .agents/rules/pr-sync.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
当前调用方:
- `create-pr`:首次创建或更新 PR 摘要评论
- `commit`:在已有 PR 上按需刷新摘要评论
- `complete-manual-validation`:人工验证完成后原地更新摘要评论,并写入可被后续聚合复用的验证产物

如果后续 skill 也需要刷新 PR 摘要,先在对应 skill 的 reference 中引用本 rule,再补充该 skill 自身的触发条件和失败语义。

Expand All @@ -26,17 +27,22 @@
- `plan.md` 或最新 `plan-r{N}.md`
- `code.md` 或最新 `code-r{N}.md`
- `review-code.md` 或最新 `review-code-r{N}.md`
- `manual-validation.md` 或最新 `manual-validation-r{N}.md`

聚合规则:
- 从 `plan*` 提取 2-4 条自包含的关键技术决策
- 用 `review-code*` 与 `code*` 构建审查历程表
- 从 `code*` 提取测试结果摘要
- 如果最新 `manual-validation*` 产物结论为通过,需人工校验段落优先渲染为 `### ✅ 人工验证已通过`,并摘要验证时间、验证范围和验证说明
- 某一类产物缺失时,按“无该阶段数据”处理并继续生成
- 需人工校验段落:只收进入 code 阶段后仍需人实际执行或判断、AI 无法自行关闭的校验点。
- **准入边界**:校验结论依赖真实环境、权限、账号、外部系统或人工判断,且无法通过 agent 重跑测试、补充检查或继续修复自行关闭。
- **来源**:`review-code*` 的「人工校验项」,以及 `code*` 中满足上述边界的校验点。
- **写法**:每条保留项至少写明「校验什么 + 定位(文件/改动/范围)+ 为什么只能由人校验」。
- **空集渲染**:无保留项时,不要使用 ⚠️ 告警样式(会让人误以为有问题)。整段降级渲染为:标题 `### ✅ 无需人工校验`,正文一行 `本次改动无需人工确认事项。`,不带条目列表。有保留项时才用 `### ⚠️ 需人工校验` 标题 + 条目列表。
- **渲染优先级**:
1. 最新 `manual-validation*` 产物结论为通过 -> 标题 `### ✅ 人工验证已通过` + 验证摘要。
2. 没有通过产物且有保留项 -> 标题 `### ⚠️ 需人工校验` + 条目列表。
3. 没有通过产物且无保留项 -> 标题 `### ✅ 无需人工校验`,正文一行 `本次改动无需人工确认事项。`,不带条目列表。

## 评论体模板

Expand Down Expand Up @@ -72,7 +78,7 @@
*由 {agent} 自动生成 · 内部追踪:{task-id}*
```

> `{manual-validation-section}` 按上文「需人工校验段落」聚合规则渲染:有保留项 → `### ⚠️ 需人工校验` 标题 + 引用说明 + 条目列表;无保留项 → `### ✅ 无需人工校验` 标题 + 一行 `本次改动无需人工确认事项。`(不带 ⚠️、不带列表)。
> `{manual-validation-section}` 按上文「需人工校验段落」聚合规则渲染:已通过产物 → `### ✅ 人工验证已通过` 标题 + 验证摘要;有保留项 → `### ⚠️ 需人工校验` 标题 + 引用说明 + 条目列表;无保留项 → `### ✅ 无需人工校验` 标题 + 一行 `本次改动无需人工确认事项。`(不带 ⚠️、不带列表)。

## 评论查找与更新

Expand Down
36 changes: 36 additions & 0 deletions .agents/scripts/platform-adapters/platform-sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ export function check({ taskDir, config, artifactFile }, shared) {
checkCommentMarker,
checkPrCommentMarker,
checkPrCommentLastCommit,
checkPrCommentRequiredPatterns,
checkCommentContent,
checkTaskCommentContent,
checkInLabelsComputed,
Expand Down Expand Up @@ -553,6 +554,41 @@ function checkPrCommentLastCommit(context, remoteData) {
);
}

function checkPrCommentRequiredPatterns(context, remoteData) {
const patterns = context.config.expected_pr_comment_required_patterns || [];
if (!Array.isArray(patterns) || patterns.length === 0) {
return null;
}

if (!context.prMarker) {
return failResult(CHECK_TYPE,
"expected_pr_comment_required_patterns requires expected_pr_comment_marker",
"check_failed"
);
}

const comment = findCommentByMarker(remoteData.prComments, context.prMarker);
if (!comment) {
return failResult(CHECK_TYPE,
`Expected PR comment marker '${context.prMarker}' not found on PR #${context.prNumber}`,
"check_failed"
);
}

const body = String(comment.body || "");
for (const pattern of patterns) {
const regex = new RegExp(pattern, "m");
if (!regex.test(body)) {
return failResult(CHECK_TYPE,
`PR #${context.prNumber} summary comment is missing required pattern: ${pattern}`,
"check_failed"
);
}
}

return null;
}

function checkCommentContent(context, remoteData) {
if (!context.config.verify_comment_content) {
return null;
Expand Down
142 changes: 142 additions & 0 deletions .agents/skills/complete-manual-validation/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
---
name: complete-manual-validation
description: >
标记 PR 人工验证已完成,并原地更新 PR 摘要评论中的人工校验段落。
当维护者已完成真实环境或权限相关人工验证、需要统一收尾 PR 摘要时使用。
---

# 完成人工验证

## 行为边界 / 关键规则

- 本技能用于收尾已有 PR 摘要评论中的人工校验状态,不创建并行的普通验证留言。
- 必须写入 `manual-validation.md` 或 `manual-validation-r{N}.md`,让后续 PR 摘要刷新可复用人工验证结果。
- 找不到 `sync-pr` 摘要评论时失败,不创建部分摘要兜底。
- 执行本技能后必须立即更新 `task.md`。

版本戳规则:创建或更新 `task.md` frontmatter 时,先读取 `.agents/rules/version-stamp.md`,并写入或刷新 `agent_infra_version`。

## 第 0 步:状态核对(执行前硬约束)

在加载 workflow / skill / rules 指令之后、做任何任务状态判断或用户可见结论之前,必须先执行状态核对。指令类文件读取不算对外动作或结论。

运行以下命令,并把原文粘贴到回复正文和本轮产物的 `## 状态核对` 段:

```bash
git status -s
ls -la .agents/workspace/active/{task-id}/
tail .agents/workspace/active/{task-id}/task.md
```

## 任务入参短号别名

> 如果 `{task-id}` 入参匹配 `^[#]?[0-9]+$`(裸数字或带 `#` 前缀),先读取 `.agents/rules/task-short-id.md` 的「SKILL 入参解析」段执行解析;后续命令视 `{task-id}` 为解析后的全长 `TASK-YYYYMMDD-HHMMSS` 形式。

## 步骤开始:写入 started 标记

确认前置条件和产物轮次后、本轮第一个产出动作之前,向 task.md `## 活动日志` 追加一条 started 标记:

```
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Complete Manual Validation [started]** by {agent} — started
```

格式与配对规则见 `.agents/rules/task-management.md` 的「Activity Log started / done 双标记约定」。

## 执行步骤

### 1. 解析入参

输入格式:

```text
complete-manual-validation {task-ref} [{pr-ref}] {verification-summary}
```

- `{task-ref}` 必填。
- `{pr-ref}` 可选,支持 `#NN`、`NN` 或完整 PR URL。
- `{verification-summary}` 必填。若缺失,立即停止并提示补充验证说明;不写产物、不更新 PR。

### 2. 验证前置条件

检查:
- `.agents/workspace/active/{task-id}/task.md`
- 有效 PR:优先使用显式 `{pr-ref}`,否则读取 task.md frontmatter 的 `pr_number`

如果任务不存在、验证说明缺失,或无法解析有效 PR,立即停止。

### 3. 确定产物轮次

扫描任务目录:
- 不存在 `manual-validation.md` 且不存在 `manual-validation-r*.md` -> 本轮产物为 `manual-validation.md`
- 已存在 `manual-validation.md` 且不存在 `manual-validation-r*.md` -> 本轮产物为 `manual-validation-r2.md`
- 已存在 `manual-validation-r{N}.md` -> 本轮产物为 `manual-validation-r{N+1}.md`

### 4. 更新 PR 摘要

执行此步骤前,先读取:
- `.agents/rules/issue-sync.md`
- `.agents/rules/pr-sync.md`
- `reference/summary-update.md`

按 `reference/summary-update.md` 解析 PR 号、查找 `sync-pr` 摘要评论、提取待人工校验范围,并把人工校验段落更新为 `### ✅ 人工验证已通过`。

### 5. 创建人工验证产物

执行此步骤前,先读取 `reference/report-template.md`。创建 `{manual-validation-artifact}`,记录:
- 状态核对
- 验证结论
- 验证范围
- 验证详情
- PR 摘要同步结果

### 6. 更新 task.md

获取当前时间:

```bash
date "+%Y-%m-%d %H:%M:%S%:z"
```

更新 `.agents/workspace/active/{task-id}/task.md`:
- `updated_at`:{当前时间}
- `assigned_to`:{当前代理}
- `agent_infra_version`:按 `.agents/rules/version-stamp.md` 取值
- 保持 `current_step` 不变
- 在 `## 实现备注` 中追加 `{manual-validation-artifact}` 链接和 PR 摘要同步结果
- 追加 Activity Log:
```
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Complete Manual Validation** by {agent} — Manual validation passed → {manual-validation-artifact}; {summary-result}
```

如任务存在有效 `issue_number`,按 `.agents/rules/issue-sync.md` 更新 task 评论并发布 `{manual-validation-artifact}` 评论。

### 7. 完成校验

运行完成校验:

```bash
node .agents/scripts/validate-artifact.js gate complete-manual-validation .agents/workspace/active/{task-id} {manual-validation-artifact} --format text
```

处理结果:
- 退出码 0 -> 告知用户
- 退出码 1 -> 修复问题后重新运行
- 退出码 2 -> 停止并告知需要人工介入

### 8. 告知用户

输出:
- 产物路径
- PR 摘要同步结果
- 当次完成校验输出
- 下一步建议:继续 `commit` / `create-pr` 或进入最终审查流程

渲染最终输出前,先读取 `.agents/rules/next-step-output.md`,并在绝对最后一行追加 `Completed at: YYYY-MM-DD HH:mm:ss`。

## 完成检查清单

- [ ] 已读取 `reference/summary-update.md`
- [ ] 已创建人工验证产物
- [ ] 已更新同一条 PR 摘要评论,或按失败语义停止
- [ ] 已更新 task.md 并追加 Activity Log
- [ ] 已运行完成校验
49 changes: 49 additions & 0 deletions .agents/skills/complete-manual-validation/config/verify.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"skill": "complete-manual-validation",
"checks": {
"task-meta": {
"required_fields": [
"id",
"type",
"workflow",
"status",
"created_at",
"updated_at",
"agent_infra_version",
"current_step",
"assigned_to"
]
},
"artifact": {
"file_pattern": "manual-validation.md|manual-validation-r{N}.md",
"required_sections": [
"状态核对",
"验证结论",
"验证范围",
"验证详情",
"PR 摘要同步"
],
"freshness_minutes": 30,
"required_patterns": [
"^\\$ "
]
},
"activity-log": {
"expected_action_pattern": "Complete Manual Validation",
"freshness_minutes": 30
},
"review-ledger": {
"stage_scope": ["analysis", "plan", "code"]
},
"platform-sync": {
"when": "pr_number_exists",
"expected_pr_comment_marker_key": "prSummary",
"expected_pr_comment_required_patterns": [
"^### ✅ 人工验证已通过$"
],
"verify_task_comment_content": true,
"verify_issue_type": true,
"verify_issue_fields": false
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 人工验证完成报告模板

创建 `manual-validation.md` / `manual-validation-r{N}.md` 前先读取本文件。

````markdown
# 人工验证完成报告

- **验证轮次**:Round {N}
- **产物文件**:`manual-validation.md`

## 状态核对

```text
$ git status -s
$ ls -la .agents/workspace/active/{task-id}/
$ tail .agents/workspace/active/{task-id}/task.md
```

## 验证结论

- 结论:通过
- 验证时间:{YYYY-MM-DD HH:mm:ss±HH:MM}
- 执行者:{agent}

## 验证范围

- PR:#{pr-number}
- 摘要评论:{comment-id 或 URL}
- 待人工校验项:
- {item-1}

## 验证详情

{verification-summary}

## PR 摘要同步

- 结果:{summary-result}
- 摘要评论:{comment-id 或 URL}
- 更新状态:`### ✅ 人工验证已通过`
````

## 填写规则

- `验证详情` 保留用户提供的人工验证说明,不改写成未经确认的结论。
- `验证范围` 来自 PR 摘要评论中的 `### ⚠️ 需人工校验` 段。
- `PR 摘要同步` 必须记录成功、跳过或失败结果。
- 只有在摘要评论已成功更新或无 diff 跳过时,才写入通过产物。
Loading
Loading