Update claude-review.yml

This commit is contained in:
pacnpal
2024-12-10 19:00:58 -05:00
committed by GitHub
parent 7282c199c6
commit d1541cda77

View File

@@ -5,8 +5,11 @@ permissions:
pull-requests: write pull-requests: write
on: on:
# Run on new/updated PRs
pull_request: pull_request:
types: [opened, reopened, synchronize] types: [opened, reopened, synchronize]
# Allow manual triggers for existing PRs
workflow_dispatch: workflow_dispatch:
inputs: inputs:
pr_number: pr_number:
@@ -17,173 +20,15 @@ on:
jobs: jobs:
code-review: code-review:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Get PR number
id: pr-number
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "number=${{ inputs.pr_number }}" >> $GITHUB_OUTPUT
else
echo "number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
fi
- name: Get PR details
id: pr-details
uses: actions/github-script@v7
with:
script: |
try {
const { owner, repo } = context.repo;
const prNumber = ${{ steps.pr-number.outputs.number }};
console.log(`Getting PR #${prNumber} from ${owner}/${repo}`);
const pr = await github.rest.pulls.get({
owner: owner,
repo: repo,
pull_number: prNumber
});
return {
base_sha: pr.data.base.sha,
head_sha: pr.data.head.sha,
base_ref: pr.data.base.ref,
head_ref: pr.data.head.ref
};
} catch (error) {
core.setFailed(`Failed to get PR details: ${error.message}`);
throw error;
}
- name: Generate diff and analyze
id: analysis
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
# Configure git to fetch PR refs
git config --local --add remote.origin.fetch "+refs/pull/*/head:refs/remotes/origin/pr/*"
git fetch origin
BASE_SHA="${{ fromJSON(steps.pr-details.outputs.result).base_sha }}" - name: Run Claude Review
HEAD_SHA="${{ fromJSON(steps.pr-details.outputs.result).head_sha }}" uses: pacnpal/claude-code-review@v1.0.6
echo "Comparing $BASE_SHA..$HEAD_SHA"
# Generate the full diff
git diff -U10 "$BASE_SHA" "$HEAD_SHA" > full_diff.txt
# Use awk to properly capture full context of relevant files
awk '
BEGIN { found=0; buffer="" }
/^diff --git/ {
if (found) { print buffer }
found=0; buffer=""
if ($0 ~ /\.(js|ts|py|cpp|h|java|cs)$/ && $0 !~ /(package-lock\.json|yarn\.lock|\.md|\.json)/) {
found=1
}
}
{ if (found) buffer = buffer $0 "\n" }
END { if (found) print buffer }
' full_diff.txt > filtered_diff.txt
# Check if we have any relevant changes
if [ ! -s filtered_diff.txt ]; then
echo "No relevant changes found"
echo "diff_size=0" >> $GITHUB_OUTPUT
exit 0
fi
# Get file size and content
DIFF_SIZE=$(wc -c < filtered_diff.txt)
echo "Found $DIFF_SIZE bytes of relevant changes"
echo "diff_size=$DIFF_SIZE" >> $GITHUB_OUTPUT
# Prepare content for API request
DIFF_CONTENT=$(cat filtered_diff.txt)
# Create prompt in a way that preserves formatting
PROMPT=$(cat << 'EOL'
You are performing a code review. Please analyze this code diff and provide a thorough review that covers:
1. Potential conflicts with existing codebase
2. Code correctness and potential bugs
3. Security vulnerabilities or risks
4. Performance implications
5. Maintainability and readability issues
6. Adherence to best practices and coding standards
7. Suggestions for improvements
For each issue found:
- Explain the problem clearly
- Rate the severity (Critical/High/Medium/Low)
- Provide specific recommendations for fixes
- Include code examples where helpful
If no issues are found in a particular area, explicitly state that.
Here is the code diff to review:
```
EOL
)
# Create API request
REQUEST=$(jq -n \
--arg prompt "$PROMPT" \
--arg diff "$DIFF_CONTENT" \
'{
model: "claude-3-sonnet-20240229",
max_tokens: 4096,
temperature: 0.7,
messages: [{
role: "user",
content: ($prompt + "\n" + $diff + "\n```")
}]
}')
# Call the API
echo "Sending request to Claude API..."
RESPONSE=$(curl -s https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d "$REQUEST")
# Process the response
if echo "$RESPONSE" | jq -e '.content[0].text' > /dev/null; then
{
echo 'review<<EOF'
echo "$RESPONSE" | jq -r '.content[0].text'
echo 'EOF'
} >> $GITHUB_OUTPUT
else
echo "Error in Claude API response: $RESPONSE"
echo "Request was: $REQUEST"
exit 1
fi
- name: Post review comment
if: success() && steps.analysis.outputs.diff_size != '0'
uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | anthropic-key: ${{ secrets.ANTHROPIC_API_KEY }}
const { owner, repo } = context.repo; pr-number: ${{ github.event.pull_request.number || inputs.pr_number }}
const prNumber = ${{ steps.pr-number.outputs.number }};
// Prepare review text
const reviewText = `${{ steps.analysis.outputs.review }}`
.replace(/(?<=[\s\n])`([^`]+)`(?=[\s\n])/g, '\\`$1\\`')
.replace(/```/g, '\\`\\`\\`')
.replace(/\${/g, '\\${');
await github.rest.issues.createComment({
owner,
repo,
issue_number: prNumber,
body: "# Claude Code Review\n\n" + reviewText
});