diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 205b0fe2..d2daffa9 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -21,8 +21,8 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - pull-requests: read - issues: read + pull-requests: write + issues: write id-token: write steps: @@ -36,6 +36,9 @@ jobs: uses: anthropics/claude-code-action@v1 with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + use_sticky_comment: true + additional_permissions: | + actions: read prompt: | REPO: ${{ github.repository }} PR NUMBER: ${{ github.event.pull_request.number }} @@ -49,9 +52,7 @@ jobs: Use the repository's CLAUDE.md for guidance on style and conventions. Be constructive and helpful in your feedback. - Use `gh pr comment` with your Bash tool to leave your review as a comment on the PR. - # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md # or https://docs.claude.com/en/docs/claude-code/cli-reference for available options - claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"' + claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"' diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 412cef9e..cbf21193 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -12,23 +12,28 @@ on: jobs: claude: + # Only allow trusted actors (OWNER, MEMBER, COLLABORATOR) to trigger Claude with write permissions 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'))) + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude') && + contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude') && + contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude') && + contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.review.author_association)) || + (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')) && + contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.issue.author_association)) runs-on: ubuntu-latest permissions: - contents: read - pull-requests: read - issues: read + contents: write # Allow creating branches/commits + pull-requests: write # Allow pushing to PR branches + issues: write # Allow updating issue comments id-token: write - actions: read # Required for Claude to read CI results on PRs + actions: read # Required for Claude to read CI results on PRs steps: - name: Checkout repository uses: actions/checkout@v4 with: - fetch-depth: 1 + fetch-depth: 0 # Full history for git operations - name: Run Claude Code id: claude @@ -47,4 +52,3 @@ jobs: # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md # or https://docs.claude.com/en/docs/claude-code/cli-reference for available options # claude_args: '--allowed-tools Bash(gh pr:*)' - diff --git a/.gitignore b/.gitignore index 9546893d..4b36f8cf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,16 +4,19 @@ # Xcode Bitkit.xcodeproj/project.xcworkspace/xcuserdata/ Bitkit.xcodeproj/xcuserdata/ +build # Node scripts/node_modules/ -# Transaction +# Transifex tx # Sweetpad buildServer.json +# IntelliJ IDEs +.idea + # VSCode .vscode/ - diff --git a/README.md b/README.md index f567ca39..e67b9d8c 100644 --- a/README.md +++ b/README.md @@ -94,3 +94,46 @@ This installs a pre-commit hook that lints Swift files with SwiftFormat. ### Xcode Previews Due to the Rust dependencies in the project, Xcode previews are only compatible with iOS 17 and below. + +## Contributing + +### AI Code Review with Claude + +This repository has Claude Code integrated for on-demand AI assistance on issues and pull requests. + +#### How to Use + +Mention `@claude` in any PR comment, issue, or review to trigger Claude: + +| Command | Description | +|---------|-------------| +| `@claude review` | Request a code review of the PR | +| `@claude /review` | Same as above (slash command) | +| `@claude review focus on security` | Review with specific focus | +| `@claude explain this change` | Ask questions about the code | +| `@claude fix the null pointer issue` | Request Claude to implement a fix | +| `@claude /help` | Show available commands | + +#### Notes + +- Claude follows the project guidelines defined in `CLAUDE.md` +- **Automatic reviews** run on every PR open and push (updates same comment) +- **On-demand assistance** via `@claude` mentions in comments/issues +- Claude can read CI results to provide context-aware feedback +- For implementation requests, Claude will create commits on your branch + +#### Example + +``` +@claude review + +Please focus on: +- SwiftUI idioms and best practices +- @Observable patterns and memory management (retain cycles) +- Thread safety with async/await and actors +``` + +## License + +This project is licensed under the MIT License. +See the [LICENSE](./LICENSE) file for more details.