All Skills
W
review
Test, Deploy & Monitor
Review code changes against project architecture, style, and conventions
Wreview
$
npx skills add woocommerce/woocommerce-android --skill reviewReview Changes
Review the current changes against the project's conventions and architecture rules. Works with uncommitted changes, staged changes, or the full branch diff against trunk.
Steps
- Determine the diff to review. First check
git diff trunk...HEADfor branch changes (most common: pre-PR review). If empty, fall back togit diff --cachedfor staged changes, thengit difffor unstaged changes. - Read the changed files in full to understand context, not just the diff hunks.
- Check against each category below. Only report actual issues found — do not report categories with no issues.
Architecture
- ViewModels extend
ScopedViewModeland do NOT import Android framework classes (Context,View, etc.) - Compose screens live inside Fragments via
ComposeViewwithDisposeOnViewTreeLifecycleDestroyed - ViewModels use
@HiltViewModel+@Inject constructorwithSavedStateHandleas the last parameter - Data flows through repositories — ViewModels never access Room or network directly
- Navigation uses
NavControllervia XML nav graphs
Kotlin Style
- Max 120 character line length (test names excepted)
- No wildcard imports
- No
FIXME(useTODO) - Comments should be rare — only when they explain business logic not clearly captured in the code
- Constants use
UPPER_SNAKE_CASE - Companion objects at the bottom of the class
- No
!!force unwraps — use safe calls orrequireNotNull() - Prefer
val, immutable collections, sealed classes, data classes
Jetpack Compose
@Composablefunctions returning Unit use PascalCase noun namesModifieris the first optional parameter, namedmodifier- State hoisting: state up, events down via lambdas
- No ViewModel acquisition inside composables
- Content wrapped in a container (
Column,Row,Box) remember {}around allmutableStateOf/derivedStateOf- Only immutable types as parameters
Testing
- Tests extend
BaseUnitTest - BDD naming:
`given X, when Y, then Z`(backtick-wrapped) - Body has
// GIVEN,// WHEN,// THENcomment sections - AssertJ assertions, mockito-kotlin mocks
- Compose tests use
waitUntil, neverThread.sleep
Analytics
- New events added to
AnalyticsEventenum - Tracking uses injected
AnalyticsTrackerWrapper, not the singleton - Event names use
UPPER_SNAKE_CASEwith proper token suffixes
Output Format
## Blockers
- [file:line] Description of blocking issue
## Suggestions
- [file:line] Description of improvement suggestion
## Positives
- Description of what was done well