AgentSkillsCN

resolve-conversation

处理/refactor评审线程中的[批准]与[忽略]回复。 将已批准的修复应用到代码库,解决GitHub上所有已回复的线程, 提交并推送更改。采用顺序单人代理的工作流程。 所有输出均以英语呈现。

SKILL.md
--- frontmatter
name: resolve-conversation
description: |
  Process [APPROVE] and [IGNORE] replies on /refactor review threads.
  Applies approved fixes to the codebase, resolves all responded threads on GitHub,
  commits and pushes changes. Sequential single-agent workflow.
  All output is in English.
allowed-tools:
  - Bash
  - Read
  - Write
  - Edit
  - Grep
  - Glob

/resolve-conversation -- Process /refactor Review Thread Replies

You process human replies on /refactor inline PR comments. Follow these 8 steps exactly.

Step 1: Verify PR Exists

Run:

bash
gh pr view --json number,url,title,headRefName,baseRefName

If the command fails, exit immediately:

No PR found on the current branch. Create a PR first.

Extract and remember these values:

  • PR_NUMBER -- the PR number
  • PR_URL -- the PR URL
  • PR_TITLE -- the PR title
  • HEAD_REF -- head branch name
  • BASE_REF -- base branch name

Step 2: Get Repository Identity

Run these commands in parallel:

bash
git remote get-url origin
git rev-parse HEAD

Parse the remote URL to extract OWNER/REPO (handle both HTTPS and SSH formats). Store:

  • OWNER_REPO -- e.g. owner/repo
  • HEAD_SHA -- current HEAD commit SHA

Step 3: Fetch All Review Threads via GraphQL

Run a single GraphQL query to fetch all review threads with their comments:

bash
gh api graphql -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
  repository(owner: $owner, name: $repo) {
    pullRequest(number: $pr) {
      reviewThreads(first: 100) {
        nodes {
          id
          isResolved
          comments(first: 50) {
            nodes {
              body
              author {
                login
              }
            }
          }
          path
          line
          startLine
        }
      }
    }
  }
}' -F owner='{OWNER}' -F repo='{REPO}' -F pr={PR_NUMBER}

Replace {OWNER}, {REPO}, and {PR_NUMBER} with the values from Steps 1-2.

If the query fails, exit immediately:

GraphQL query failed. Check your GitHub authentication and permissions.

Step 4: Identify Actionable Threads

From the GraphQL response, filter threads that meet ALL of these criteria:

  1. Thread is unresolved (isResolved == false)
  2. A reply exists with a human action -- any comment after the first contains:
    • [APPROVE] -- human approves the suggested fix
    • [IGNORE] -- human wants to ignore this finding

Precedence rule: If a thread has both [APPROVE] and [IGNORE] in different replies, [APPROVE] takes precedence.

Classify each actionable thread as either APPROVE or IGNORE.

If no actionable threads are found, exit immediately:

No actionable threads found. Reply with [APPROVE] or [IGNORE] on /refactor review comments first.

Step 5: Process APPROVE Threads

For each thread classified as APPROVE, in order:

5a. Extract the Suggested Fix

From the first comment (the /refactor comment), extract the text after **Suggested Fix**:. This is the code change to apply.

Also extract:

  • path -- the file path from the thread
  • line / startLine -- the line number(s) from the thread

5b. Check File Exists

If the target file no longer exists:

  • Note in report: "File {path} no longer exists, skipping fix"
  • Still mark this thread for resolution in Step 6
  • Continue to next thread

5c. Apply the Fix

  1. Read the target file using the Read tool
  2. Apply the suggested fix using the Edit tool
  3. Run make check to validate

5d. Validate

If make check fails:

  • Revert the file: git checkout -- {path}
  • Note in report: "Fix for {path}:{line} failed validation, reverted"
  • Still mark this thread for resolution in Step 6

If make check passes:

  • Note in report: "Fix applied to {path}:{line}"

Step 6: Resolve All Actionable Threads

For EVERY actionable thread (both APPROVE and IGNORE), resolve it via GraphQL mutation:

bash
gh api graphql -f query='
mutation($threadId: ID!) {
  resolveReviewThread(input: {threadId: $threadId}) {
    thread {
      isResolved
    }
  }
}' -f threadId='{THREAD_ID}'

Replace {THREAD_ID} with the thread's id from the GraphQL response.

Process all threads. If a resolve mutation fails for a specific thread:

  • Log the error
  • Continue with remaining threads
  • Note in report: "Failed to resolve thread for {path}:{line}"

Step 7: Commit and Push

If any fixes were successfully applied (not reverted) in Step 5:

bash
git add <list of fixed files>
git commit -m "fix: apply approved review suggestions from /resolve-conversation"
git push

If git push fails:

  • Inform user: "Commit created locally but push failed. Run git push manually."

If no fixes were applied (all were IGNORE or all APPROVE fixes failed validation):

  • Skip this step entirely

Step 8: Report to User

Print a final summary to the console. No emojis. Include:

code
/resolve-conversation complete.

Threads processed: {total_actionable}
  APPROVE: {approve_count} ({fixes_applied} applied, {fixes_failed} failed validation)
  IGNORE: {ignore_count}
Threads resolved: {resolved_count} ({resolve_failed} failed to resolve)

{If fixes_applied > 0:}
Changes committed and pushed.

{If fixes_applied > 0 and push_failed:}
Changes committed locally. Run `git push` manually.

PR: {PR_URL}

If any fixes failed validation, list them:

code
Failed fixes:
  - {path}:{line}: {reason}

If any files no longer exist, list them:

code
Skipped (file missing):
  - {path}

Error Handling

ScenarioAction
No PR foundExit with message
GraphQL query failsExit with message
No actionable threadsExit with message
make check fails after fixRevert file, still resolve thread, note in report
Resolve mutation failsLog error, continue with remaining
git push failsInform user to push manually
File no longer existsSkip fix, still resolve, note in report