You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .claude/skills/pr-review/SKILL.md
+85-2Lines changed: 85 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,7 +38,34 @@ If it fails, report as **Must Fix** before reviewing anything else.
38
38
39
39
7. Output a structured review (format below).
40
40
41
-
8. After the review output, print:
41
+
8. Post inline comments to the PR for every ⚠️ and ❌ finding that references a specific file and line number. Before posting, deduplicate against all existing comments (resolved or not) to avoid re-posting anything already raised:
42
+
43
+
```bash
44
+
# Get the head SHA, repo, and all existing review comments (resolved and unresolved)
For each finding, check whether any existing comment (resolved or not) already covers the same file + line (or contains substantially the same text). Skip any finding that is already covered. Then bundle the remaining new comments into a single review submission:
51
+
52
+
```bash
53
+
gh api repos/$REPO/pulls/$ARGUMENTS/reviews \
54
+
--method POST \
55
+
--field commit_id="$HEAD_SHA" \
56
+
--field event="COMMENT" \
57
+
--field "comments[][path]=<file path>" \
58
+
--field "comments[][line]=<line number>" \
59
+
--field "comments[][side]=RIGHT" \
60
+
--field "comments[][body]=<finding text>
61
+
62
+
🤖 Posted by [Claude Code](https://claude.ai/code)" \
63
+
# repeat --field "comments[]..." for each new finding
64
+
```
65
+
66
+
Use the exact file path from the diff and the line number in the current version of the file (RIGHT side). Each comment body should contain the full finding description. Always append the attribution footer `\n\n🤖 Posted by [Claude Code](https://claude.ai/code)` to each comment. If no new actionable findings exist (only ✅ items or all already commented), skip this step.
67
+
68
+
9. After the review output, print:
42
69
43
70
```
44
71
---
@@ -92,6 +119,15 @@ To dismiss a finding so it won't appear in future reviews, say:
92
119
-[ ]`UiEvent` is a `sealed interface` implementing `CircuitUiEvent`, marked `internal`
93
120
-[ ]`UiState` and `UiEvent` defined as nested types inside the Presenter
-[ ]`navigator.pop()` (or any navigation call) placed *inside* the `launch { }` block when it follows an async operation — `rememberCoroutineScope()` is canceled on composition disposal and can cancel an in-flight write before it completes
95
131
-[ ] Presenter contains no UI logic — pure state/event handling
96
132
97
133
**UI Composable**
@@ -130,6 +166,7 @@ To dismiss a finding so it won't appear in future reviews, say:
130
166
### Testing
131
167
132
168
-[ ] Presenter tests use `presenterTestOf { }` (Circuit test API)
169
+
-[ ] Interfaces with `@Composable` functions use a hand-written `Fake*` class in tests, not `mockk<>()` — mockposable delays Kotlin version uptake and is incompatible with newer compiler versions
133
170
-[ ] Paparazzi tests extend `BasePaparazziTest` from `:ui:base` testFixtures with `@TestParameter` night/accessibility matrix
134
171
-[ ] Snapshots not recorded locally — triggered via GitHub Actions workflow on the feature branch
135
172
@@ -190,4 +227,50 @@ When the user says `dismiss: <title> — <reason>` (in any form — "dismiss the
190
227
**Dismissed by**: <gituser.name>
191
228
```
192
229
193
-
4. Confirm to the user what was added and that it will be suppressed in future reviews.
230
+
4. If the current session reviewed a PR, find any open (unresolved) comment thread on that PR matching the dismissed issue. Use the GraphQL API to locate threads and resolve the matching one, replying with the dismissal reason first:
GodTools is a mobile discipleship app built by [Cru](https://www.cru.org/). This repository contains the Android client.
7
7
8
-
We use [Git LFS](https://git-lfs.com/) for storing Paparazzi snapshots. You will need to setup [Git LFS](https://git-lfs.com/) on your local machine in order to store new paparazzi snapshots or validate existing paparazzi snapshots.
8
+
## Requirements
9
9
10
-
# Crowdin
10
+
-**JDK 21** (Temurin) — version specified in `.tool-versions`
> **Paparazzi Snapshots:** Do not record snapshots locally. Trigger the manual GitHub Actions workflow on your feature branch to generate and commit updated screenshots.
54
+
55
+
## Project Structure
56
+
57
+
```
58
+
app/ # Main application module
59
+
build-logic/ # Gradle convention plugins
60
+
feature/ # Google Play Dynamic Feature modules
61
+
library/ # Core non-UI modules
62
+
ui/ # UI and tool-renderer modules
63
+
```
64
+
65
+
### `app/`
66
+
Main application module — `GodToolsApplication` (Hilt entry point), `DashboardActivity`, Dagger modules in `dagger/`.
67
+
68
+
### `library/`
69
+
| Module | Purpose |
70
+
|---|---|
71
+
|`model`| Data models and JSON:API type definitions |
72
+
|`db`| Room database, DAOs, and repositories |
73
+
|`api`| Retrofit REST and Scarlet WebSocket clients |
74
+
|`sync`| WorkManager-based data synchronization |
75
+
|`base`| Core utilities, settings, file system abstraction |
76
+
|`account`| User authentication |
77
+
|`analytics`| Event tracking |
78
+
|`download-manager`| Tool download management |
79
+
|`initial-content`| Bundled initial content |
80
+
|`user-data`| User preferences and state |
81
+
82
+
### `ui/`
83
+
| Module | Purpose |
84
+
|---|---|
85
+
|`base`| Shared Compose components and Material 3 theme |
86
+
|`base-tool`| Base tool rendering infrastructure |
| Dependency versions |`gradle/libs.versions.toml` version catalog |
115
+
116
+
**Circuit pattern:** Presenter/UI pairs annotated with `@CircuitInject`. Presenters are `@Composable` functions that return state objects; actions flow through `UiState.eventSink`.
- The `stage` flavor is only available for `debug` and `qa` builds
123
+
124
+
## Code Style
125
+
126
+
Style is enforced by [ktlint](https://pinterest.github.io/ktlint/) with the `android_studio` code style.
127
+
128
+
- Max line length: 120
129
+
- Indent: 4 spaces
130
+
131
+
Always run ktlint before committing:
132
+
133
+
```bash
134
+
./gradlew :build-logic:ktlintCheck ktlintCheck
135
+
```
136
+
137
+
## Translations (Crowdin)
138
+
139
+
Strings are managed via [Crowdin](https://crowdin.com/). To push/pull translations, install the [Crowdin CLI](https://crowdin.github.io/crowdin-cli/) and set the `CROWDIN_API_TOKEN` environment variable.
140
+
141
+
## Contributing
142
+
143
+
1. Branch from `develop` and open PRs against `develop` (the default branch).
144
+
2. Add unit tests for any new functionality.
145
+
3. Run ktlint and unit tests before opening a PR.
146
+
4. For UI changes, trigger the Paparazzi snapshot workflow on your branch rather than recording locally.
0 commit comments