Skip to content

Commit 1689bbd

Browse files
authored
Merge pull request #413 from opendocument-app/add-claude-github-actions-1752993020704
Add Claude Code GitHub Workflow
2 parents ff72cfa + 7c20dec commit 1689bbd

3 files changed

Lines changed: 240 additions & 0 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
name: Claude Code Review
2+
3+
on:
4+
pull_request:
5+
types: [opened, synchronize]
6+
# Optional: Only run on specific file changes
7+
# paths:
8+
# - "src/**/*.ts"
9+
# - "src/**/*.tsx"
10+
# - "src/**/*.js"
11+
# - "src/**/*.jsx"
12+
13+
jobs:
14+
claude-review:
15+
# Optional: Filter by PR author
16+
# if: |
17+
# github.event.pull_request.user.login == 'external-contributor' ||
18+
# github.event.pull_request.user.login == 'new-developer' ||
19+
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
20+
21+
runs-on: ubuntu-latest
22+
permissions:
23+
contents: read
24+
pull-requests: read
25+
issues: read
26+
id-token: write
27+
28+
steps:
29+
- name: Checkout repository
30+
uses: actions/checkout@v4
31+
with:
32+
fetch-depth: 1
33+
34+
- name: Run Claude Code Review
35+
id: claude-review
36+
uses: anthropics/claude-code-action@beta
37+
with:
38+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
39+
40+
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4)
41+
model: "claude-opus-4-20250514"
42+
43+
# Direct prompt for automated review (no @claude mention needed)
44+
direct_prompt: |
45+
Please review this pull request and provide feedback on:
46+
- Code quality and best practices
47+
- Potential bugs or issues
48+
- Performance considerations
49+
- Security concerns
50+
- Test coverage
51+
52+
Be constructive and helpful in your feedback.
53+
54+
# Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR
55+
# use_sticky_comment: true
56+
57+
# Optional: Customize review based on file types
58+
# direct_prompt: |
59+
# Review this PR focusing on:
60+
# - For TypeScript files: Type safety and proper interface usage
61+
# - For API endpoints: Security, input validation, and error handling
62+
# - For React components: Performance, accessibility, and best practices
63+
# - For tests: Coverage, edge cases, and test quality
64+
65+
# Optional: Different prompts for different authors
66+
# direct_prompt: |
67+
# ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' &&
68+
# 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' ||
69+
# 'Please provide a thorough code review focusing on our coding standards and best practices.' }}
70+
71+
# Optional: Add specific tools for running tests or linting
72+
# allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)"
73+
74+
# Optional: Skip review for certain conditions
75+
# if: |
76+
# !contains(github.event.pull_request.title, '[skip-review]') &&
77+
# !contains(github.event.pull_request.title, '[WIP]')
78+

.github/workflows/claude.yml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
name: Claude Code
2+
3+
on:
4+
issue_comment:
5+
types: [created]
6+
pull_request_review_comment:
7+
types: [created]
8+
issues:
9+
types: [opened, assigned]
10+
pull_request_review:
11+
types: [submitted]
12+
13+
jobs:
14+
claude:
15+
if: |
16+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
17+
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
18+
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
19+
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
20+
runs-on: ubuntu-latest
21+
permissions:
22+
contents: read
23+
pull-requests: read
24+
issues: read
25+
id-token: write
26+
actions: read # Required for Claude to read CI results on PRs
27+
steps:
28+
- name: Checkout repository
29+
uses: actions/checkout@v4
30+
with:
31+
fetch-depth: 1
32+
33+
- name: Run Claude Code
34+
id: claude
35+
uses: anthropics/claude-code-action@beta
36+
with:
37+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
38+
39+
# This is an optional setting that allows Claude to read CI results on PRs
40+
additional_permissions: |
41+
actions: read
42+
43+
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4)
44+
model: "claude-opus-4-20250514"
45+
46+
# Optional: Customize the trigger phrase (default: @claude)
47+
# trigger_phrase: "/claude"
48+
49+
# Optional: Trigger when specific user is assigned to an issue
50+
# assignee_trigger: "claude-bot"
51+
52+
# Optional: Allow Claude to run specific commands
53+
# allowed_tools: "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*)"
54+
55+
# Optional: Add custom instructions for Claude to customize its behavior for your project
56+
# custom_instructions: |
57+
# Follow our coding standards
58+
# Ensure all new code has tests
59+
# Use TypeScript for new files
60+
61+
# Optional: Custom environment variables for Claude
62+
# claude_env: |
63+
# NODE_ENV: test
64+

CLAUDE.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# CLAUDE.md
2+
3+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4+
5+
## Development Commands
6+
7+
### Building
8+
- `./gradlew assembleProDebug` - Build the Pro debug variant
9+
- `./gradlew assembleProDebugAndroidTest` - Build the Pro debug test APK
10+
- `./gradlew assembleLiteDebug` - Build the Lite debug variant
11+
- `./gradlew bundleProRelease` - Build Pro release bundle for Play Store
12+
- `./gradlew bundleLiteRelease` - Build Lite release bundle for Play Store
13+
- `./build-test.sh` - Convenience script to build Pro debug and test APKs
14+
15+
### Testing
16+
- `./gradlew connectedAndroidTest` - Run instrumented tests on connected device
17+
- `fastlane android tests` - Alternative way to run connected tests
18+
19+
### Linting
20+
- `./gradlew lint` - Run Android lint checks (configured to not abort on errors)
21+
22+
### Deployment
23+
- `fastlane android deployPro` - Deploy Pro version to Google Play internal track
24+
- `fastlane android deployLite` - Deploy Lite version to Google Play internal track
25+
26+
### Clean
27+
- `./gradlew clean` - Clean build artifacts (includes custom .cxx directory cleanup)
28+
29+
## Architecture Overview
30+
31+
### Core Components
32+
33+
**Document Processing Pipeline:**
34+
- `CoreLoader` - Primary document processor using the native C++ ODR core library
35+
- `WvwareDocLoader` - MS Word document processor using wvware library
36+
- `RawLoader` - Plain text and other raw file processor
37+
- `OnlineLoader` - Remote document fetcher
38+
- `MetadataLoader` - Document metadata extractor
39+
40+
**Service Architecture:**
41+
- `LoaderService` - Background service managing all document loading operations
42+
- `LoaderServiceQueue` - Queue management for multiple document loading requests
43+
- Document loaders implement `FileLoaderListener` interface for async communication
44+
45+
**UI Architecture:**
46+
- `MainActivity` - Main activity with service binding and menu management
47+
- `DocumentFragment` - Primary document display fragment using WebView
48+
- `PageView` - Custom WebView for document rendering
49+
- Action mode callbacks for edit, find, and TTS functionality
50+
51+
### Build System
52+
53+
**Multi-flavor Android App:**
54+
- **Lite flavor**: Free version with ads and tracking enabled
55+
- **Pro flavor**: Paid version with ads disabled and tracking disabled
56+
57+
**Native Dependencies:**
58+
- Uses Conan package manager for C++ dependencies
59+
- CMake build system for native C++ core library (`odr-core`)
60+
- NDK version 26.3.11579264 required
61+
- C++20 standard
62+
63+
**Core Library Integration:**
64+
- Native C++ wrapper (`CoreWrapper.cpp`) provides JNI interface
65+
- Supports multiple architectures: armv8, armv7, x86, x86_64
66+
- Assets deployed to `assets/core` directory via custom Conan deployer
67+
68+
### Key Directories
69+
70+
- `app/src/main/java/at/tomtasche/reader/background/` - Document processing services
71+
- `app/src/main/java/at/tomtasche/reader/ui/` - UI components and activities
72+
- `app/src/main/java/at/tomtasche/reader/nonfree/` - Analytics, billing, and ads
73+
- `app/src/main/cpp/` - Native C++ JNI wrapper
74+
- `app/src/main/assets/` - HTML templates and fonts for document rendering
75+
76+
### Dependencies
77+
78+
**Core Android:**
79+
- AndroidX libraries (AppCompat, Core, Material, WebKit)
80+
- Firebase (Analytics, Crashlytics, Storage, Auth, Remote Config)
81+
- Google Play Services (Ads, Review, User Messaging Platform)
82+
83+
**Document Processing:**
84+
- `app.opendocument:wvware-android` - MS Word document support
85+
- Custom ODR core library via Conan
86+
87+
**Testing:**
88+
- Espresso for UI testing
89+
- JUnit for unit testing
90+
- Test APKs require connected device/emulator
91+
92+
### Configuration Notes
93+
94+
- Minimum SDK: 23, Target SDK: 34
95+
- MultiDex enabled for large dependency set
96+
- R8/ProGuard enabled for release builds with resource shrinking
97+
- Configuration cache enabled for parallel Conan installs
98+
- Custom lint configuration allows non-fatal errors

0 commit comments

Comments
 (0)