Loading...
Loading...
Compare original and translation side by side
ghpwshghpwshGitarApprovedApproved with SuggestionsChanges RequestedBlockedNeeds ReviewGitarGitarApprovedGitarApproved with SuggestionsChanges RequestedBlockedNeeds ReviewAGENTS.mdresolveReviewThreadunresolveReviewThreadgitar fixgitar auto-apply:onAGENTS.mdresolveReviewThreadunresolveReviewThreadgitar fixgitar auto-apply:ongit status --short
git rev-parse --abbrev-ref HEAD
git rev-parse HEAD
gh --version
gh auth status
gh pr view --json number,title,url,body,author,headRefName,headRefOid,headRepository,headRepositoryOwner,isCrossRepository,baseRefName,baseRefOid,mergeable,mergeStateStatus,reviews,commentsgit commit --onlygh pr statusGitarheadRepository.nameWithOwnerghheadRefName$pr = gh pr view --json number,url,headRefName,headRefOid,headRepository,headRepositoryOwner |
ConvertFrom-Json
$prNumber = [int]$pr.number
$prUri = [uri]$pr.url
$pathSegments = $prUri.AbsolutePath.Trim("/").Split("/")
$githubHostname = $prUri.Authority
$baseRepositoryName = "$($pathSegments[0])/$($pathSegments[1])"
$baseRepository = "$githubHostname/$baseRepositoryName"
$baseMetadata = gh api --hostname $githubHostname "repos/$baseRepositoryName" |
ConvertFrom-Json
$headMetadata = gh api --hostname $githubHostname "repos/$($pr.headRepository.nameWithOwner)" |
ConvertFrom-Json
gh auth setup-git --hostname $githubHostname
$baseFetchUrl = [string]$baseMetadata.clone_url
$headPushUrl = [string]$headMetadata.clone_urlclone_urlgh auth setup-gitorigingit fetch $headPushUrl $pr.headRefName
$remoteHeadSha = (git rev-parse FETCH_HEAD).Trim()
$lastObservedPrHeadSha = $remoteHeadSha
$localHeadSha = (git rev-parse HEAD).Trim()
git merge-base --is-ancestor $remoteHeadSha $localHeadSha
$localContainsRemoteHead = $LASTEXITCODE -eq 0
if ($localContainsRemoteHead -and $localHeadSha -ne $remoteHeadSha) {
$initialLocalAheadCommits = git log --oneline "$remoteHeadSha..$localHeadSha"
# Validate and record every commit against the recovered user intent and full PR diff.
# Stop for confirmation if any commit is unrelated, unfinished, or ambiguous.
}
if (-not $localContainsRemoteHead) {
git merge-base --is-ancestor $localHeadSha $remoteHeadSha
$canFastForward = $LASTEXITCODE -eq 0 -and -not (git status --porcelain)
if (-not $canFastForward) {
throw "Local HEAD is stale or diverged from the PR head; stop before mutation."
}
git merge --ff-only $remoteHeadSha
}HEAD$runStateDirectory = Join-Path ([IO.Path]::GetTempPath()) (
"finish-pr-{0}-{1}" -f $prNumber, [guid]::NewGuid().ToString("N")
)
New-Item -ItemType Directory -Path $runStateDirectory | Out-Nullgit status --short
git rev-parse --abbrev-ref HEAD
git rev-parse HEAD
gh --version
gh auth status
gh pr view --json number,title,url,body,author,headRefName,headRefOid,headRepository,headRepositoryOwner,isCrossRepository,baseRefName,baseRefOid,mergeable,mergeStateStatus,reviews,commentsgit commit --onlygh pr statusGitarheadRepository.nameWithOwnerghheadRefName$pr = gh pr view --json number,url,headRefName,headRefOid,headRepository,headRepositoryOwner |
ConvertFrom-Json
$prNumber = [int]$pr.number
$prUri = [uri]$pr.url
$pathSegments = $prUri.AbsolutePath.Trim("/").Split("/")
$githubHostname = $prUri.Authority
$baseRepositoryName = "$($pathSegments[0])/$($pathSegments[1])"
$baseRepository = "$githubHostname/$baseRepositoryName"
$baseMetadata = gh api --hostname $githubHostname "repos/$baseRepositoryName" |
ConvertFrom-Json
$headMetadata = gh api --hostname $githubHostname "repos/$($pr.headRepository.nameWithOwner)" |
ConvertFrom-Json
gh auth setup-git --hostname $githubHostname
$baseFetchUrl = [string]$baseMetadata.clone_url
$headPushUrl = [string]$headMetadata.clone_urlclone_urlgh auth setup-gitorigingit fetch $headPushUrl $pr.headRefName
$remoteHeadSha = (git rev-parse FETCH_HEAD).Trim()
$lastObservedPrHeadSha = $remoteHeadSha
$localHeadSha = (git rev-parse HEAD).Trim()
git merge-base --is-ancestor $remoteHeadSha $localHeadSha
$localContainsRemoteHead = $LASTEXITCODE -eq 0
if ($localContainsRemoteHead -and $localHeadSha -ne $remoteHeadSha) {
$initialLocalAheadCommits = git log --oneline "$remoteHeadSha..$localHeadSha"
# 根据还原的用户意图和完整PR差异验证并记录每个提交。
# 如果任何提交无关、未完成或不明确,则停止并确认。
}
if (-not $localContainsRemoteHead) {
git merge-base --is-ancestor $localHeadSha $remoteHeadSha
$canFastForward = $LASTEXITCODE -eq 0 -and -not (git status --porcelain)
if (-not $canFastForward) {
throw "Local HEAD is stale or diverged from the PR head; stop before mutation."
}
git merge --ff-only $remoteHeadSha
}HEAD$runStateDirectory = Join-Path ([IO.Path]::GetTempPath()) (
"finish-pr-{0}-{1}" -f $prNumber, [guid]::NewGuid().ToString("N")
)
New-Item -ItemType Directory -Path $runStateDirectory | Out-Null$pr = gh pr view $prNumber --repo $baseRepository --json number,url,baseRefName,baseRefOid,headRefName,headRefOid,headRepository,headRepositoryOwner,mergeable,mergeStateStatus |
ConvertFrom-Json
git fetch $baseFetchUrl $pr.baseRefName
$baseCommit = (git rev-parse FETCH_HEAD).Trim()
git merge-tree --write-tree --messages HEAD $baseCommitCONFLICTINGDIRTYUNKNOWN--autostashgit merge --no-ff $baseCommit$pr = gh pr view $prNumber --repo $baseRepository --json number,url,baseRefName,baseRefOid,headRefName,headRefOid,headRepository,headRepositoryOwner,mergeable,mergeStateStatus |
ConvertFrom-Json
git fetch $baseFetchUrl $pr.baseRefName
$baseCommit = (git rev-parse FETCH_HEAD).Trim()
git merge-tree --write-tree --messages HEAD $baseCommitCONFLICTINGDIRTYUNKNOWN--autostashgit merge --no-ff $baseCommitgh pr checks $prNumber --repo $baseRepository --json bucket,completedAt,description,event,link,name,startedAt,state,workflow
gh pr checks $prNumber --repo $baseRepository --required --json bucket,completedAt,description,event,link,name,startedAt,state,workflowgh run list --repo $baseRepository --branch $pr.headRefName --commit $pr.headRefOid --json databaseId,name,workflowName,status,conclusion,url,headSha,event,createdAt -L 50
gh run view <run-id> --repo $baseRepository --json name,status,conclusion,jobs,url
gh run view <run-id> --repo $baseRepository --log-failedgit commit --only -m "fix(ci): address <failed check>" -- <exact-ci-fix-paths>gh pr checks $prNumber --repo $baseRepository --json bucket,completedAt,description,event,link,name,startedAt,state,workflow
gh pr checks $prNumber --repo $baseRepository --required --json bucket,completedAt,description,event,link,name,startedAt,state,workflowgh run list --repo $baseRepository --branch $pr.headRefName --commit $pr.headRefOid --json databaseId,name,workflowName,status,conclusion,url,headSha,event,createdAt -L 50
gh run view <run-id> --repo $baseRepository --json name,status,conclusion,jobs,url
gh run view <run-id> --repo $baseRepository --log-failedgit commit --only -m "fix(ci): address <failed check>" -- <exact-ci-fix-paths>$threadBaseline = Join-Path $runStateDirectory "thread-resolution.json"
$threadSnapshot = Join-Path $runStateDirectory "unresolved-threads.json"
pwsh <skill-directory>/scripts/get-unresolved-pr-threads.ps1 -PrNumber $prNumber -Repository $baseRepository -Hostname $githubHostname -All |
Set-Content -Encoding utf8 $threadBaseline
pwsh <skill-directory>/scripts/get-unresolved-pr-threads.ps1 -PrNumber $prNumber -Repository $baseRepository -Hostname $githubHostname |
Set-Content -Encoding utf8 $threadSnapshotpullRequestReview.state != PENDINGsubmittedAt$threadBaseline = Join-Path $runStateDirectory "thread-resolution.json"
$threadSnapshot = Join-Path $runStateDirectory "unresolved-threads.json"
pwsh <skill-directory>/scripts/get-unresolved-pr-threads.ps1 -PrNumber $prNumber -Repository $baseRepository -Hostname $githubHostname -All |
Set-Content -Encoding utf8 $threadBaseline
pwsh <skill-directory>/scripts/get-unresolved-pr-threads.ps1 -PrNumber $prNumber -Repository $baseRepository -Hostname $githubHostname |
Set-Content -Encoding utf8 $threadSnapshotpullRequestReview.state != PENDINGsubmittedAtgit status --short
git diff
git add <paths>
git diff --cachedgit commit --onlygit commit --only -m "fix(pr): address <thread summary>" -- <exact-thread-fix-paths>--allow-empty$body = @"
Agreed. I fixed this in commit <sha> by <specific change>.
Verification: <command and result>.
"@
pwsh <skill-directory>/scripts/reply-to-review-thread.ps1 -ThreadId "<thread-id>" -Hostname $githubHostname -Body $body$body = @"
Regarding [this feedback](<feedback-permalink>): agreed. I fixed this in commit <sha> by <specific change>.
Verification: <command and result>.
"@
gh pr comment $prNumber --repo $baseRepository --body $bodyI don't think this change is correct for this PR.
Reason: <specific reason grounded in requirements, conversation, or code>.
No code change made.Gitar,no commit — disagreementstate != PENDINGsubmittedAt-AllisResolvedgit status --short
git diff
git add <paths>
git diff --cachedgit commit --onlygit commit --only -m "fix(pr): address <thread summary>" -- <exact-thread-fix-paths>--allow-empty$body = @"
Agreed. I fixed this in commit <sha> by <specific change>.
Verification: <command and result>.
"@
pwsh <skill-directory>/scripts/reply-to-review-thread.ps1 -ThreadId "<thread-id>" -Hostname $githubHostname -Body $body$body = @"
Regarding [this feedback](<feedback-permalink>): agreed. I fixed this in commit <sha> by <specific change>.
Verification: <command and result>.
"@
gh pr comment $prNumber --repo $baseRepository --body $bodyI don't think this change is correct for this PR.
Reason: <specific reason grounded in requirements, conversation, or code>.
No code change made.Gitar,no commit — disagreementstate != PENDINGsubmittedAt-AllisResolvedgit log --oneline <starting-sha>..HEAD
git fetch $headPushUrl $pr.headRefName
$remoteHeadSha = (git rev-parse FETCH_HEAD).Trim()
$localHeadSha = (git rev-parse HEAD).Trim()
$currentPrHeadSha = (gh pr view $prNumber --repo $baseRepository --json headRefOid --jq .headRefOid).Trim()
$pushRequired = $localHeadSha -ne $remoteHeadSha
git status --short --branch$remoteHeadSha$currentPrHeadSha$lastObservedPrHeadSha$lastObservedPrHeadSha$pushRequired$pushRequired$reviewRound$reviewRound++
$reviewState = Join-Path $runStateDirectory ("review-round-{0}.json" -f $reviewRound)
pwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-CaptureBaseline `
-StatePath $reviewState `
-PrNumber $prNumber `
-Repository $baseRepository `
-Hostname $githubHostname$reviewRequestedAt = [DateTimeOffset]::UtcNow
git push $headPushUrl "HEAD:refs/heads/$($pr.headRefName)"
$expectedHeadSha = git rev-parse HEAD
$lastObservedPrHeadSha = $expectedHeadShaGitarpwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-Wait `
-StatePath $reviewState `
-ExpectedHeadSha $expectedHeadSha `
-ReviewRequestedAt $reviewRequestedAt `
-ReviewStartGraceSeconds 60 `
-TimeoutMinutes 25 `
-PollSeconds 10review_not_startedgh pr comment $prNumber --repo $baseRepository --body "gitar review"review_not_startedpwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-Wait `
-StatePath $reviewState `
-ExpectedHeadSha $expectedHeadSha `
-ReviewRequestedAt $reviewRequestedAt `
-TimeoutMinutes 25 `
-PollSeconds 20feedbacknewFeedbackApproved with SuggestionsChanges RequestedBlockedNeeds ReviewapprovedApprovedgitar_failedreview_not_startedgitar reviewtimeouthead_changedpr_closedgitar reviewGitarApproved$expectedHeadSha = (git rev-parse HEAD).Trim()
$reviewRound++
$reviewState = Join-Path $runStateDirectory ("review-round-{0}.json" -f $reviewRound)
pwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-CaptureBaseline `
-StatePath $reviewState `
-PrNumber $prNumber `
-Repository $baseRepository `
-Hostname $githubHostname
pwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-Wait `
-StatePath $reviewState `
-ExpectedHeadSha $expectedHeadSha `
-ReviewRequestedAt ([DateTimeOffset]::MinValue) `
-TimeoutMinutes 25 `
-PollSeconds 20git log --oneline <starting-sha>..HEAD
git fetch $headPushUrl $pr.headRefName
$remoteHeadSha = (git rev-parse FETCH_HEAD).Trim()
$localHeadSha = (git rev-parse HEAD).Trim()
$currentPrHeadSha = (gh pr view $prNumber --repo $baseRepository --json headRefOid --jq .headRefOid).Trim()
$pushRequired = $localHeadSha -ne $remoteHeadSha
git status --short --branch$remoteHeadSha$currentPrHeadSha$lastObservedPrHeadSha$lastObservedPrHeadSha$pushRequired$pushRequired$reviewRound$reviewRound++
$reviewState = Join-Path $runStateDirectory ("review-round-{0}.json" -f $reviewRound)
pwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-CaptureBaseline `
-StatePath $reviewState `
-PrNumber $prNumber `
-Repository $baseRepository `
-Hostname $githubHostname$reviewRequestedAt = [DateTimeOffset]::UtcNow
git push $headPushUrl "HEAD:refs/heads/$($pr.headRefName)"
$expectedHeadSha = git rev-parse HEAD
$lastObservedPrHeadSha = $expectedHeadShaGitarpwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-Wait `
-StatePath $reviewState `
-ExpectedHeadSha $expectedHeadSha `
-ReviewRequestedAt $reviewRequestedAt `
-ReviewStartGraceSeconds 60 `
-TimeoutMinutes 25 `
-PollSeconds 10review_not_startedgh pr comment $prNumber --repo $baseRepository --body "gitar review"review_not_startedpwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-Wait `
-StatePath $reviewState `
-ExpectedHeadSha $expectedHeadSha `
-ReviewRequestedAt $reviewRequestedAt `
-TimeoutMinutes 25 `
-PollSeconds 20feedbacknewFeedbackApproved with SuggestionsChanges RequestedBlockedNeeds ReviewapprovedApprovedgitar_failedreview_not_startedgitar reviewtimeouthead_changedpr_closedgitar reviewGitarApproved$expectedHeadSha = (git rev-parse HEAD).Trim()
$reviewRound++
$reviewState = Join-Path $runStateDirectory ("review-round-{0}.json" -f $reviewRound)
pwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-CaptureBaseline `
-StatePath $reviewState `
-PrNumber $prNumber `
-Repository $baseRepository `
-Hostname $githubHostname
pwsh <skill-directory>/scripts/wait-for-pr-review.ps1 `
-Wait `
-StatePath $reviewState `
-ExpectedHeadSha $expectedHeadSha `
-ReviewRequestedAt ([DateTimeOffset]::MinValue) `
-TimeoutMinutes 25 `
-PollSeconds 20git merge-tree --write-tree --messages HEAD <base-commit>gh pr checks --requiredApproved00git merge-tree --write-tree --messages HEAD <base-commit>gh pr checks --requiredApproved00