Skip to content
Open
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
34 changes: 34 additions & 0 deletions .github/workflows/pi-multi-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Pi Multi-Review

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
issue_comment:
types: [created]

jobs:
multi-review:
# Skip draft PRs and cross-repo PRs; only trigger on /multi-review comments
if: >
(github.event_name == 'pull_request' && github.event.pull_request.draft == false && github.event.pull_request.head.repo.full_name == github.repository) ||
(github.event_name == 'issue_comment' && github.event.issue.pull_request != null && startsWith(github.event.comment.body, '/multi-review'))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
steps:
- name: Checkout PR head
uses: actions/checkout@v6
with:
repository: ${{ github.event.pull_request.head.repo.full_name || github.event.issue.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.ref || github.event.issue.pull_request.head.ref }}

- name: Run Pi Multi-Review
uses: ./pi-multi-review
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
provider: ${{ vars.PI_PROVIDER || 'anthropic' }}
model: ${{ vars.PI_MODEL || 'claude-sonnet-4-6' }}
api-key: ${{ secrets.PI_API_KEY }}
language: Chinese
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ npx skills add sun-praise/opencode-actions
- `architect-review`: architecture-level PR review focusing on coupling, layering, and structural concerns
- `feature-missing`: audits PR implementation against linked issue spec to find missing features
- `spec-coverage`: cross-references project spec/task files against PR implementation to find planned but unimplemented features
- `pi-multi-review`: multi-agent parallel PR review using pi-coding-agent-action with pi-parallel-agents team mode
- `github-run-opencode`: one-step wrapper for the common `opencode github run` workflow
- `setup-opencode`: installs OpenCode, restores a dedicated cache, and exports the binary path
- `run-opencode`: runs `opencode` with optional retry logic for flaky GitHub network failures
Expand Down Expand Up @@ -150,6 +151,7 @@ Unlike `feature-missing` (which checks PR self-described scope), `spec-coverage`
| `architect-review` | PR diff + project conventions | Coupling, layering, module placement, structural concerns |
| `feature-missing` | PR title/body + linked issues | PR self-described scope completeness |
| `spec-coverage` | Project spec/task files | Full planned scope vs implementation |
| `pi-multi-review` | PR diff (via pi-agent) | Multi-reviewer parallel review: quality, security, performance, architecture |

## setup-opencode

Expand Down Expand Up @@ -205,6 +207,7 @@ uses: sun-praise/opencode-actions/review@v2
uses: sun-praise/opencode-actions/architect-review@v2
uses: sun-praise/opencode-actions/feature-missing@v2
uses: sun-praise/opencode-actions/spec-coverage@v2
uses: sun-praise/opencode-actions/pi-multi-review@v2
uses: sun-praise/opencode-actions/github-run-opencode@v2
uses: sun-praise/opencode-actions/setup-opencode@v2
uses: sun-praise/opencode-actions/run-opencode@v2
Expand Down
130 changes: 130 additions & 0 deletions pi-multi-review/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# Pi Multi-Review Action

Multi-agent parallel PR review using [pi-coding-agent-action](https://github.com/shaftoe/pi-coding-agent-action) with [pi-parallel-agents](https://github.com/messense/pi-parallel-agents) team mode.

Multiple reviewer agents (quality, security, performance, architecture) review your PR simultaneously, then a synthesizer agent produces a single consolidated review comment.

## Usage

```yaml
name: Pi Multi-Review

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
issue_comment:
types: [created]

jobs:
multi-review:
if: >
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'issue_comment' && github.event.issue.pull_request != null && startsWith(github.event.comment.body, '/multi-review'))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
steps:
- uses: actions/checkout@v6

- uses: sun-praise/opencode-actions/pi-multi-review@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
provider: anthropic
model: claude-sonnet-4-6
api-key: ${{ secrets.PI_API_KEY }}
language: Chinese
```

## Inputs

| Input | Required | Default | Description |
|-------|----------|---------|-------------|
| `github-token` | Yes | - | GitHub token for API access |
| `provider` | Yes | - | LLM provider (openai, anthropic, google, etc.) |
| `model` | No | `claude-sonnet-4-6` | Default model for all reviewers |
| `api-key` | No | - | LLM provider API key |
| `reviewers-config` | No | `""` | Inline YAML to override default reviewer personas |
| `max-tokens` | No | `4096` | Max tokens per reviewer response |
| `diff-max-lines` | No | `2000` | Max diff lines included in review |
| `diff-ignore-patterns` | No | `""` | File patterns to exclude from diffs |
| `base-url` | No | `""` | Provider base URL override (for proxies) |
| `thinking-level` | No | `medium` | Model thinking level (off, low, medium, high) |
| `language` | No | `Chinese` | Output language for reviews |

## Default Reviewers

When no `reviewers-config` is provided, 4 built-in reviewers run in parallel:

| Reviewer | Focus |
|----------|-------|
| **quality** | Readability, naming, error handling, DRY, dead code |
| **security** | Input validation, injection, OWASP Top 10, secrets exposure |
| **performance** | Algorithmic complexity, N+1 queries, memory, caching |
| **architecture** | Coupling, separation of concerns, API design, scalability |

A **synthesizer** agent merges all findings into one structured PR comment with:
- Merge decision (可合并 / 有条件合并 / 不可合并)
- Critical issues, warnings, suggestions
- Cross-validated findings (flagged by multiple reviewers)

## Custom Reviewers

Provide your own reviewers via `reviewers-config`:

```yaml
- uses: sun-praise/opencode-actions/pi-multi-review@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
provider: anthropic
api-key: ${{ secrets.PI_API_KEY }}
reviewers-config: |
reviewers:
- name: security
role: Security Expert
prompt: |
Focus only on security vulnerabilities in this diff:
{{diff}}

Report critical, warning, and info findings.
- name: testing
role: Test Coverage Analyst
prompt: |
Check test coverage for changes in this diff:
{{diff}}

Are new code paths adequately tested?
synthesizer:
name: synthesizer
role: Review Synthesizer
prompt: |
Combine these findings into a structured review:
{task:security-review}
{task:testing-review}
Output as markdown.
```

## Template Variables

Reviewer prompts support these placeholders:

| Variable | Description |
|----------|-------------|
| `{{diff}}` | Full PR diff |
| `{{title}}` | PR title |
| `{{body}}` | PR description |
| `{{files}}` | List of changed files |
| `{{language}}` | Configured output language |

Synthesizer prompts can reference reviewer outputs with `{task:<name>-review}`.

## Requirements

- Linux runner (GitHub Actions `ubuntu-latest`)
- Python 3 with PyYAML (pre-installed on GitHub-hosted runners)
- A valid LLM API key for the configured provider

## Security Note

This action delegates to `shaftoe/pi-coding-agent-action@v2`. For production use, consider pinning to a specific commit SHA instead of the `v2` tag to protect against supply-chain attacks. See the [GitHub Actions security guide](https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#using-third-party-actions).
93 changes: 93 additions & 0 deletions pi-multi-review/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
name: Pi Multi-Review
description: Multi-agent parallel PR review using pi-coding-agent-action with pi-parallel-agents team mode.

inputs:
github-token:
description: GitHub token for API access.
required: true
provider:
description: LLM provider (e.g. openai, anthropic, google).
required: true
model:
description: Default model for all reviewers (e.g. claude-sonnet-4-6, gpt-4o).
required: false
default: "claude-sonnet-4-6"
api-key:
description: API key for the LLM provider. Can also be set via provider-specific env vars.
required: false
default: ""
reviewers-config:
description: >-
Inline YAML string defining custom reviewer personas. When empty, uses the 4 built-in
reviewers (quality, security, performance, architecture). Each reviewer has: name, role,
prompt, model (optional).
required: false
default: ""
max-tokens:
description: Maximum tokens per reviewer response.
required: false
default: "4096"
diff-max-lines:
description: Maximum number of diff lines to include in PR diff.
required: false
default: "2000"
diff-ignore-patterns:
description: Space-separated file patterns to exclude from PR diffs.
required: false
default: ""
base-url:
description: Optional override for the provider base URL (e.g. for proxies or compatible gateways).
required: false
default: ""
thinking-level:
description: Thinking level for the model (off, low, medium, high).
required: false
default: "medium"
language:
description: Language for review output (e.g. Chinese, English).
required: false
default: "Chinese"

runs:
using: composite
steps:
- if: ${{ runner.os != 'Linux' }}
shell: bash
run: |
set -euo pipefail
printf 'pi-multi-review currently supports Linux runners only\n' >&2
exit 1

- name: Build multi-review prompt
id: build-prompt
shell: bash
env:
INPUT_REVIEWERS_CONFIG: ${{ inputs.reviewers-config }}
INPUT_MODEL: ${{ inputs.model }}
INPUT_LANGUAGE: ${{ inputs.language }}
INPUT_MAX_TOKENS: ${{ inputs.max-tokens }}
ACTION_PATH: ${{ github.action_path }}
run: |
set -euo pipefail
python3 "$ACTION_PATH/scripts/build-prompt.py" \
--reviewers-config "$INPUT_REVIEWERS_CONFIG" \
--default-model "$INPUT_MODEL" \
--language "$INPUT_LANGUAGE" \
--max-tokens "$INPUT_MAX_TOKENS" \
--action-path "$ACTION_PATH" \
--output "$RUNNER_TEMP/pi-multi-review-prompt.txt"
echo "prompt-file=$RUNNER_TEMP/pi-multi-review-prompt.txt" >> "$GITHUB_OUTPUT"

- name: Run pi multi-review
uses: shaftoe/pi-coding-agent-action@v2
with:
github_token: ${{ inputs.github-token }}
provider: ${{ inputs.provider }}
model: ${{ inputs.model }}
token: ${{ inputs.api-key }}
prompt: ${{ steps.build-prompt.outputs.prompt-file }}
extensions: "npm:pi-parallel-agents"
thinking_level: ${{ inputs.thinking-level }}
diff_max_lines: ${{ inputs.diff-max-lines }}
diff_ignore_patterns: ${{ inputs.diff-ignore-patterns }}
base_url: ${{ inputs.base-url }}
Loading
Loading