agentsclimarketplace

Eas

Skill Shankulkarni/react-native-ai-plugin/plugins/rn-ai/skills/eas

Write better React Native code from day one - opinionated Claude Code rules, New Architecture ready.

Install
npx -y skills add Shankulkarni/react-native-ai-plugin --skill eas

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Use when configuring EAS Build, Submit, or Update -- eas.json profiles, OTA updates, App Store/Play Store submission, GitHub Actions CI, EAS secrets.

SKILL.md

4.8 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it

EAS -- Build + Submit + Update

Expo Application Services. Builds, submits, and updates your app.

eas.json

{
  "cli": { "version": ">= 12.0.0", "appVersionSource": "remote" },
  "build": {
    "base": {
      "node": "22.0.0",
      "env": {
        "EXPO_PUBLIC_API_URL": "https://api.example.com"
      }
    },
    "development": {
      "extends": "base",
      "developmentClient": true,
      "distribution": "internal",
      "env": { "EXPO_PUBLIC_API_URL": "https://dev-api.example.com" },
      "ios": { "simulator": true }
    },
    "preview": {
      "extends": "base",
      "distribution": "internal",
      "channel": "preview"
    },
    "production": {
      "extends": "base",
      "autoIncrement": true,
      "channel": "production"
    }
  },
  "submit": {
    "production": {
      "ios": { "appleId": "[email protected]", "ascAppId": "1234567890" },
      "android": { "serviceAccountKeyPath": "./service-account.json", "track": "internal" }
    }
  }
}

Build Commands

# Development build (custom dev client)
bunx eas build --profile development --platform ios
bunx eas build --profile development --platform android

# Preview (internal distribution)
bunx eas build --profile preview --platform all

# Production
bunx eas build --profile production --platform all

# Local build (no EAS servers)
bunx eas build --profile development --platform ios --local

OTA Updates

# Publish update to a channel
bunx eas update --channel preview --message "Fix login crash"
bunx eas update --channel production --message "v1.2.3 release"

# Check update status
bunx eas update:list

app.json update config:

{
  "expo": {
    "updates": {
      "url": "https://u.expo.dev/YOUR-PROJECT-ID",
      "enabled": true,
      "fallbackToCacheTimeout": 0,
      "checkAutomatically": "ON_LOAD"
    },
    "runtimeVersion": { "policy": "appVersion" }
  }
}

Handle updates in root _layout.tsx:

import * as Updates from 'expo-updates'
import { useEffect } from 'react'

export default function RootLayout() {
  // OTA update check is an SDK imperative call, not server data fetching --
  // React Query doesn't apply here. This is the only acceptable useEffect+async pattern.
  useEffect(() => {
    async function checkUpdate() {
      if (__DEV__) return
      const update = await Updates.checkForUpdateAsync()
      if (update.isAvailable) {
        await Updates.fetchUpdateAsync()
        await Updates.reloadAsync()
      }
    }
    checkUpdate()
  }, [])
  // ...
}

Submit to Stores

# After a production build
bunx eas submit --platform ios --latest
bunx eas submit --platform android --latest

# Submit specific build
bunx eas submit --platform ios --id BUILD_ID

EAS Secrets

# Set secrets (never commit these)
bunx eas secret:create --scope project --name API_SECRET_KEY --value "..."
bunx eas secret:create --scope project --name SENTRY_DSN --value "..."

# List secrets
bunx eas secret:list

Access in build via eas.json env:

{ "build": { "production": { "env": { "SENTRY_DSN": "$SENTRY_DSN" } } } }

GitHub Actions CI

.github/workflows/eas-build.yml:

name: EAS Build
on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
      cancel-in-progress: false
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 22 }
      - uses: oven-sh/setup-bun@v2
      - run: bun install --frozen-lockfile
      - uses: expo/expo-github-action@v8
        with:
          eas-version: latest
          token: ${{ secrets.EXPO_TOKEN }}
      - run: bunx eas build --profile production --platform all --non-interactive

.github/workflows/eas-update.yml:

name: EAS Update
on:
  push:
    branches: [main]

jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: oven-sh/setup-bun@v2
      - run: bun install --frozen-lockfile
      - uses: expo/expo-github-action@v8
        with: { eas-version: latest, token: '${{ secrets.EXPO_TOKEN }}' }
      - run: bunx eas update --channel production --message "${{ github.event.head_commit.message }}" --non-interactive

Rules

  • eas.json must have development, preview, and production profiles
  • Never hardcode API URLs in eas.json -- use EAS secrets or env vars
  • Never commit service-account.json or Apple credentials -- use EAS secrets
  • concurrency.cancel-in-progress: false in CI -- never cancel in-flight builds
  • runtimeVersion policy must be consistent across OTA updates and builds
  • Always test OTA update compatibility before shipping to production

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,970. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.