diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml
index 254d9d4ce1b..86793b43084 100644
--- a/.github/workflows/claude-code-review.yml
+++ b/.github/workflows/claude-code-review.yml
@@ -3,21 +3,9 @@ name: Claude Code Review
on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]
- # Optional: Only run on specific file changes
- # paths:
- # - "src/**/*.ts"
- # - "src/**/*.tsx"
- # - "src/**/*.js"
- # - "src/**/*.jsx"
jobs:
claude-review:
- # Optional: Filter by PR author
- # if: |
- # github.event.pull_request.user.login == 'external-contributor' ||
- # github.event.pull_request.user.login == 'new-developer' ||
- # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
-
runs-on: ubuntu-latest
permissions:
contents: read
@@ -36,12 +24,17 @@ jobs:
uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
- plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
- plugins: 'code-review@claude-code-plugins'
- prompt: '/code-review:code-review --comment ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
- claude_args: '--allowedTools mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr review:*),Bash(gh pr view:*),Bash(git diff:*),Bash(git log:*),Bash(git show:*),Read,Glob,Grep'
- display_report: 'true'
use_sticky_comment: 'true'
- # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
- # or https://code.claude.com/docs/en/cli-reference for available options
+ claude_args: '--allowedTools Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr review:*),Bash(gh pr view:*),Bash(git diff:*),Bash(git log:*),Bash(git show:*),Read,Glob,Grep'
+ prompt: |
+ Review the code changes in PR #${{ github.event.pull_request.number }} of this repository.
+
+ Steps:
+ 1. Run `gh pr diff ${{ github.event.pull_request.number }}` to see the changes
+ 2. Run `gh pr view ${{ github.event.pull_request.number }}` to see the PR description
+ 3. Review the changes for bugs, security issues, and code quality problems
+ 4. Post your review using:
+ `gh pr review ${{ github.event.pull_request.number }} --comment --body "YOUR_REVIEW"`
+ Always post a review comment, even if the code looks good (write "LGTM" with a brief summary in that case).
+ Focus on real issues — not style nitpicks.
diff --git a/governance-app/app/delegate/page.tsx b/governance-app/app/delegate/page.tsx
deleted file mode 100644
index ac162719a18..00000000000
--- a/governance-app/app/delegate/page.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import Link from 'next/link'
-
-export default function DelegatePage() {
- return (
-
-
- Personal Delegation
-
-
- Wallet-specific delegation comes next
-
-
- This slice adds the public delegation leaderboard first. The next
- transaction-focused slice will wire connected-wallet delegation status,
- self-delegation messaging, and `UPToken.delegate()` writes.
-
-
-
- View delegate leaderboard
-
-
-
- )
-}
diff --git a/governance-app/app/delegates/page.tsx b/governance-app/app/delegates/page.tsx
index 410c48f2d4c..7bdbe934397 100644
--- a/governance-app/app/delegates/page.tsx
+++ b/governance-app/app/delegates/page.tsx
@@ -1,6 +1,16 @@
+// ABOUTME: Delegates page — personal delegation form (wallet-connected) and
+// the full delegate leaderboard ordered by voting power.
import { ProposalErrorState } from '~/components/proposals/ProposalErrorState'
-import { DelegateLeaderboardRow } from '~/components/delegates/DelegateLeaderboardRow'
-import { getDelegateOverview } from '~/lib/governance/delegates'
+import {
+ DelegateLeaderboardRow,
+ type DelegateRowData,
+} from '~/components/delegates/DelegateLeaderboardRow'
+import { DelegateFormSection } from '~/components/delegates/DelegateFormSection'
+import {
+ getDelegateOverview,
+ formatDelegatedShare,
+} from '~/lib/governance/delegates'
+import { formatTokenAmount } from '~/lib/governance/format'
export const dynamic = 'force-dynamic'
@@ -8,29 +18,35 @@ export default async function DelegatesPage() {
try {
const overview = await getDelegateOverview()
+ const rows: DelegateRowData[] = overview.delegates.map((d, index) => ({
+ address: d.address,
+ rank: index + 1,
+ votingPower: formatTokenAmount(d.votingPower),
+ tokenBalance: formatTokenAmount(d.tokenBalance),
+ delegatorCount: d.delegatorCount,
+ delegatedShare: formatDelegatedShare(d.votingPower, overview.totalSupply),
+ }))
+
return (
+
+
- Delegation Read Path
+ Delegate Leaderboard
-
- Delegate leaderboard
+
+ Top delegates by voting power
Current delegation relationships reconstructed from on-chain
- `DelegateChanged` events and hydrated with live voting power from
- the UP token contract.
+ DelegateChanged events and hydrated with live voting power from the
+ UP token contract.
+ {isNotDelegated
+ ? 'Voting power is inactive until you delegate, including self-delegation.'
+ : isSelfDelegated
+ ? 'Your voting power is active and delegated to your own wallet.'
+ : 'Your voting power is currently delegated to another address.'}
+
+
+
+
+
+
+ Change delegate
+
+
+ Delegate to an address or ENS name
+
+
+ The transaction will prompt your wallet to switch to Base before
+ submitting if needed.
+