Skip to content

feat: ACNA-4515 add pr-reviewer workflow#129

Merged
chsrimanaswi merged 1 commit into
masterfrom
ACNA-4515-Add-pr-reviewer-workflow
Apr 21, 2026
Merged

feat: ACNA-4515 add pr-reviewer workflow#129
chsrimanaswi merged 1 commit into
masterfrom
ACNA-4515-Add-pr-reviewer-workflow

Conversation

@chsrimanaswi

Copy link
Copy Markdown
Contributor

Description

Adds an AI-powered PR reviewer workflow that automatically reviews pull requests using Claude via AWS Bedrock. Triggers on PR open/reopen/synchronize and on /review or /pr-reviewer comments by admins or maintainers.

Related Issue

ACNA-4515

Motivation and Context

Reduces code review toil by providing automated first-pass reviews with inline suggestions. Part of a broader rollout across App Builder repos.

How Has This Been Tested?

Tested end-to-end in adobe/generator-aio-app — workflow triggers correctly on PR events and /review comments, posts inline suggestions and summary reviews via github-actions[bot].

Screenshots (if appropriate):

N/A

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • I have signed the Adobe Open Source CLA.
  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have read the CONTRIBUTING document.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 PR Reviewer

The workflow is well-structured with clear gate logic and security-conscious permission checks. A few minor robustness and security concerns exist around comment body matching, the use of @main for an external reusable workflow, and potential injection risk from environment variables passed into shell conditionals.

📝 4 suggestion(s) - Please review inline comments below.


💡 How to re-trigger

Comment /review or /pr-reviewer on this PR

if: |
(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == false) ||
(github.event_name == 'issue_comment' && github.event.issue.pull_request != null &&
(github.event.comment.body == '/review' || github.event.comment.body == '/pr-reviewer'))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exact string matching on comment body is fragile — comments with trailing newlines, spaces, or carriage returns (common from some clients) will silently not match. Consider using a contains() or trimming approach. Also, this check runs before the collaborator gate, so any user can trigger the check job just by commenting (even if they're denied in the gate). This is low-risk but worth noting.

Suggested change
(github.event.comment.body == '/review' || github.event.comment.body == '/pr-reviewer'))
(github.event.comment.body == '/review' || github.event.comment.body == '/pr-reviewer' ||
startsWith(github.event.comment.body, '/review
') || startsWith(github.event.comment.body, '/pr-reviewer
'))

# Intentionally require admin or maintain; write collaborators are excluded to
# limit who can trigger potentially expensive/sensitive review automation.
if [ "$PERM" = "admin" ] || [ "$PERM" = "maintain" ]; then
DATA=$(gh api repos/$GITHUB_REPOSITORY/pulls/$ISSUE_NUMBER)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The gh api call uses $GITHUB_REPOSITORY directly in a shell string. While this value is set by GitHub Actions and is generally safe, using it unquoted inside a path segment in a shell command is a best-practice risk. Prefer quoting or using the --repo flag.

Suggested change
DATA=$(gh api repos/$GITHUB_REPOSITORY/pulls/$ISSUE_NUMBER)
PERM=$(gh api "repos/$GITHUB_REPOSITORY/collaborators/$COMMENT_USER_LOGIN/permission" --jq '.permission' 2>/dev/null || echo "none")

if [ "$PERM" = "admin" ] || [ "$PERM" = "maintain" ]; then
DATA=$(gh api repos/$GITHUB_REPOSITORY/pulls/$ISSUE_NUMBER)
echo "allowed=true" >> $GITHUB_OUTPUT
echo "pr_number=$ISSUE_NUMBER" >> $GITHUB_OUTPUT

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same quoting concern for the pulls API call — quote the URL to prevent word splitting.

Suggested change
echo "pr_number=$ISSUE_NUMBER" >> $GITHUB_OUTPUT
DATA=$(gh api "repos/$GITHUB_REPOSITORY/pulls/$ISSUE_NUMBER")

review:
needs: check
if: needs.check.outputs.allowed == 'true'
uses: adobe/aio-reusable-workflows/.github/workflows/pr-review.yml@main

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pinning an external reusable workflow to @main is a supply-chain security risk. A compromised or unintended change to the main branch of adobe/aio-reusable-workflows could affect this workflow. Pin to a specific SHA or at minimum a release tag.

Suggested change
uses: adobe/aio-reusable-workflows/.github/workflows/pr-review.yml@main
uses: adobe/aio-reusable-workflows/.github/workflows/pr-review.yml@<commit-sha-or-tag>

@codecov

codecov Bot commented Apr 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@chsrimanaswi chsrimanaswi dismissed github-actions[bot]’s stale review April 20, 2026 23:05

Proposed changes not required

@chsrimanaswi chsrimanaswi merged commit ef1c3b7 into master Apr 21, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants