diff --git a/agents/bharmalhusen__rn-prerelease-audit/README.md b/agents/bharmalhusen__rn-prerelease-audit/README.md new file mode 100644 index 0000000..3015e11 --- /dev/null +++ b/agents/bharmalhusen__rn-prerelease-audit/README.md @@ -0,0 +1,65 @@ +# RN Pre-Release Audit Agent + +> Catch every App Store & Play Store rejection reason before you submit โ€” a Claude AI agent for React Native developers. + +**Author:** [bharmalhusen](https://github.com/bharmalhusen) ยท **License:** MIT ยท **Version:** 1.0.0 + +--- + +## What It Does + +This Claude Code agent performs a deep, automated pre-release audit of any React Native project. It reads your native config files, manifest files, and all TypeScript/JavaScript source, then runs **30+ structured compliance checks** across 20 categories. The output is a prioritised severity report: + +- ๐Ÿ”ด **Error** โ€” will cause a store rejection +- ๐ŸŸก **Warning** โ€” likely rejection risk +- ๐Ÿ”ต **Info** โ€” good to know +- โœ… **Passed** โ€” clean + +No more last-minute rejections. No more store policy rules you didn't know existed. + +--- + +## Run + +```bash +npx @open-gitagent/gitagent run -r https://github.com/bharmalhusen/rn-prerelease-audit +``` + +Or install as a Claude Code plugin and invoke: + +``` +/rn-prerelease-audit +``` + +--- + +## Checks โ€” 30+ Across 20 Categories + +| Category | What It Catches | +|---|---| +| ๐Ÿ“ก **ATT** | Missing `NSUserTrackingUsageDescription`, no `requestTrackingAuthorization` | +| ๐ŸŽ **Sign in with Apple** | Third-party login without Apple login (guideline 4.8) | +| ๐Ÿ” **Auth Sessions** | Token not cleared on logout, missing refresh, no re-auth on destructive actions | +| ๐Ÿ’ณ **Payments & Billing** | No IAP for digital goods, external payment links on iOS | +| ๐Ÿ” **Permissions** | Declared but unused, used but undeclared, missing runtime handling | +| ๐Ÿ–ผ **Icons & Assets** | Missing densities, alpha channel on iOS icons (hard rejection) | +| ๐ŸŒ… **Splash Screen** | Missing config, broken image paths | +| ๐Ÿ”’ **iOS Privacy Descriptions** | Missing `NS*UsageDescription` keys | +| ๐ŸŒ **Network Security** | `usesCleartextTraffic=true`, `NSAllowsArbitraryLoads=true` | +| ๐Ÿ”‘ **Secrets & API Keys** | Hardcoded tokens in config/source; tokens in AsyncStorage | +| ๐Ÿ“Š **Crash Monitoring** | No Sentry/Crashlytics installed or initialised | +| ๐Ÿ— **New Architecture** | Inconsistent `newArchEnabled` across Gradle and app.json | +| ๐Ÿ” **Network Resilience** | No timeout, no retry, no offline handling | +| ๐Ÿ”— **Deep Links** | Missing `autoVerify`, single-platform-only config | +| ๐Ÿ“ฆ **Deprecated Dependencies** | Known rejected packages, unpinned `"*"` versions | +| ๐Ÿ—‘๏ธ **Account Deletion** | Apps with sign-up but no delete flow (Play Store policy) | +| ๐Ÿ”’ **Privacy Policy** | No in-app privacy policy link | +| ๐Ÿ“‚ **Target SDK** | `targetSdkVersion` below Play Store floor (โ‰ฅ 34) | +| ๐Ÿ“ **Privacy Manifests** | Missing `PrivacyInfo.xcprivacy`, empty `NSPrivacyAccessedAPITypes` | +| ๐ŸŽฏ **Version Consistency** | `versionCode`/`versionName`/`CFBundleVersion` out of sync | + +--- + +## Repository + +https://github.com/bharmalhusen/rn-prerelease-audit diff --git a/agents/bharmalhusen__rn-prerelease-audit/metadata.json b/agents/bharmalhusen__rn-prerelease-audit/metadata.json new file mode 100644 index 0000000..25e2fe0 --- /dev/null +++ b/agents/bharmalhusen__rn-prerelease-audit/metadata.json @@ -0,0 +1,14 @@ +{ + "name": "rn-prerelease-audit", + "author": "bharmalhusen", + "description": "Claude Code agent running 30+ compliance checks on React Native apps โ€” permissions, secrets, ATT, IAP, ProGuard, Privacy Manifests โ€” producing a prioritised severity report before store submission.", + "repository": "https://github.com/bharmalhusen/rn-prerelease-audit", + "version": "1.0.0", + "category": "testing", + "tags": ["react-native", "ios", "android", "app-store", "play-store", "audit", "compliance", "expo"], + "license": "MIT", + "model": "claude-sonnet-4-6", + "adapters": ["claude-code", "system-prompt"], + "icon": false, + "banner": false +}