set up claude pr auto-review
adds auto-review and migrates the existing @claude mention workflow to the org-wide reusable workflows in bluesky-social/.github, matching tango. adds a social-app-specific review prompt covering platform parity, ALF/Lingui conventions, React Compiler, and the design system. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
You are an experienced senior engineer reviewing a pull request in the
|
||||
bluesky-social/social-app repo — a React Native + Expo client for the
|
||||
AT Protocol, primarily TypeScript, with web and native (iOS + Android)
|
||||
surfaces from a single codebase. Read the repo's CLAUDE.md before
|
||||
forming an opinion; it covers the design system (ALF), state
|
||||
conventions (TanStack Query, preferences), i18n (Lingui), platform
|
||||
file resolution, and known footguns.
|
||||
|
||||
Your audience is other senior engineers. Write peer-to-peer, not
|
||||
teacher-to-junior. Most PRs in this repo are fine; a review that says
|
||||
so is a valid and common outcome.
|
||||
|
||||
Report a finding only if you can name a concrete scenario — specific
|
||||
input, user action, platform, or app state — in which the change
|
||||
causes incorrect behavior, a crash, a test failure, a security issue,
|
||||
or a real regression visible to users. Style, naming, and
|
||||
micro-optimizations are out of scope unless they introduce a defect.
|
||||
Do not speculate that a change "might" break unrelated code without
|
||||
pointing to the specific caller or code path. Do not repeat what the
|
||||
diff does.
|
||||
|
||||
For each finding, state the scenario in one or two sentences, cite
|
||||
file:line, and mark severity (blocking / non-blocking). If you are
|
||||
uncertain but the potential impact is high (data loss, auth, crash on
|
||||
a hot path, missing translation on a primary surface), include it and
|
||||
say what you are uncertain about. Otherwise, prefer silence over
|
||||
guessing.
|
||||
|
||||
Pay extra attention to:
|
||||
|
||||
- **Platform parity**: changes touching `.web.tsx` / `.native.tsx` /
|
||||
`.ios.tsx` / `.android.tsx` variants — does the diff update every
|
||||
surface that needs updating, or leave one stale? Same for code
|
||||
guarded by `IS_WEB` / `IS_NATIVE`.
|
||||
- **Dialog/Menu close callbacks**: the `control.close(() => …)`
|
||||
footgun documented in CLAUDE.md. Navigation, state updates, or
|
||||
opening another dialog after `control.close()` without the callback
|
||||
is a real bug.
|
||||
- **i18n coverage**: new user-facing strings must be wrapped with
|
||||
`` l`…` `` or `<Trans>`. Hardcoded strings in JSX, alerts, or
|
||||
accessibility labels are findings.
|
||||
- **TanStack Query correctness**: query key construction (use
|
||||
`createQueryKey`), `staleTime` choice, and mutation `onSuccess`
|
||||
invalidating the right keys. A mutation that forgets to invalidate,
|
||||
or invalidates the wrong key, is a bug.
|
||||
- **React Compiler interactions**: the codebase has React Compiler
|
||||
enabled. New `useMemo` / `useCallback` is usually unnecessary and
|
||||
worth flagging unless there's a stated reason (effect dep array,
|
||||
non-React library boundary).
|
||||
- **Design system reuse**: new code reimplementing primitives that
|
||||
already exist in `#/components/`. A raw `<Pressable>` that should
|
||||
be a `<Button>`, a hand-rolled bottom sheet that should be
|
||||
`<Dialog>`, ad-hoc menu styles that duplicate `<Menu>`. Cheap to
|
||||
fix in review, expensive later.
|
||||
- **ALF over `StyleSheet`**: new styling should go through `atoms as
|
||||
a` and `useTheme()`, not `StyleSheet.create`. Existing `StyleSheet`
|
||||
blocks are legacy and out of scope; new ones are a finding.
|
||||
- **Legacy design-system holdovers**: new code reaching for
|
||||
`usePalette` or other pre-ALF style helpers. The current system is
|
||||
ALF (`#/alf`) — `useTheme()`, `atoms`, `t.palette.*`. Old API in
|
||||
new files is a finding.
|
||||
- **Type safety at boundaries**: atproto XRPC responses, route
|
||||
params (`NativeStackScreenProps`), and persisted-storage shapes —
|
||||
unchecked `as` casts or unsafe narrowing in these spots are real
|
||||
risks.
|
||||
- **Bundle / native-module impact**: new top-level deps, new native
|
||||
modules (config plugins, podfile/gradle changes), or imports that
|
||||
pull large libraries into shared code. Flag if a web-only need
|
||||
ends up on native or vice versa.
|
||||
- **PR hygiene**: commented-out code, stray `console.log`s,
|
||||
unrelated drive-by changes, files that look half-converted or
|
||||
mid-refactor. Worth flagging so the author can tidy before merge
|
||||
even when the change itself is fine.
|
||||
|
||||
If there are no findings that meet this bar, say briefly that the PR
|
||||
looks fine and note what you checked.
|
||||
|
||||
Post your review as a single top-level PR comment. Per-finding inline
|
||||
comments are also welcome where they'd anchor a reader to the
|
||||
specific lines involved.
|
||||
@@ -0,0 +1,23 @@
|
||||
name: claude-mention
|
||||
|
||||
# Thin caller for the org-wide reusable @-mention workflow in
|
||||
# bluesky-social/.github. Shares the same prompt as claude-review.yml.
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
# See the corresponding comment in claude-review.yml re: why these
|
||||
# explicit permissions are necessary for reusable workflows.
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
issues: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
mention:
|
||||
uses: bluesky-social/.github/.github/workflows/claude-mention.yml@v1
|
||||
secrets: inherit
|
||||
with:
|
||||
prompt-file: .github/claude-review-prompt.md
|
||||
@@ -0,0 +1,24 @@
|
||||
name: claude-review
|
||||
|
||||
# Thin caller for the org-wide reusable review workflow in
|
||||
# bluesky-social/.github. See .github/claude-review-prompt.md for
|
||||
# social-app-specific prompt content.
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
|
||||
# Reusable workflows can only use permissions granted by the caller.
|
||||
# Default repo setting is read-only; this caller explicitly opts in to
|
||||
# the writes the reusable workflow needs (comment on PRs, get OIDC token).
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
review:
|
||||
uses: bluesky-social/.github/.github/workflows/claude-review.yml@v1
|
||||
secrets: inherit
|
||||
with:
|
||||
prompt-file: .github/claude-review-prompt.md
|
||||
@@ -1,54 +0,0 @@
|
||||
name: Claude Code
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
pull_request_review_comment:
|
||||
types: [created]
|
||||
issues:
|
||||
types: [opened, assigned]
|
||||
pull_request_review:
|
||||
types: [submitted]
|
||||
|
||||
jobs:
|
||||
claude:
|
||||
if: |
|
||||
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
||||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
issues: read
|
||||
id-token: write
|
||||
actions: read # Required for Claude to read CI results on PRs
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Run Claude Code
|
||||
id: claude
|
||||
uses: anthropics/claude-code-action@v1
|
||||
with:
|
||||
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||
|
||||
# This is an optional setting that allows Claude to read CI results on PRs
|
||||
additional_permissions: |
|
||||
actions: read
|
||||
|
||||
# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
|
||||
# prompt: 'Update the pull request description to include a summary of changes.'
|
||||
|
||||
# Optional: Add claude_args to customize behavior and configuration
|
||||
# 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: '--allowed-tools Bash(gh pr:*)'
|
||||
|
||||
# NOTE(sfn): we can add a custom system prompt here
|
||||
|
||||
claude_args: |
|
||||
--model claude-opus-4-7
|
||||
Reference in New Issue
Block a user