skills/golem-powers/eas-prebuild-check/SKILL.md
Validate Expo iOS/Android sync BEFORE the first EAS build. Catches missing .easignore (2GB archive), wrong bundle ID, outdated eas-cli, missing device registration, unsynced Apple credentials, missing P8 push keys, versionCode drift, concurrency queue surprises. Run this before `eas build` on any new project or after a major branch change. Triggers on: 'eas build', 'first eas build', 'prebuild check', 'expo build validation', 'before eas', 'eas credentials', 'preview build'. NOT for: runtime debugging of a build that already started (use eas build:inspect).
npx skillsauth add etanhey/golems eas-prebuild-checkInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Mission: catch the 9 pain points that wasted 2+ hours on MeHayom Sprint 2 (April 8, 2026) BEFORE they waste any more time on future builds.
Runs 9 discrete checks against an Expo project, each reporting PASS / FAIL / WARN / SKIP / INFO with specific remediation commands.
| # | Check | Prevents |
|---|-------|----------|
| 1 | .easignore exists and excludes node_modules, .expo, build dirs | 2.1GB archive upload (real: MeHayom first attempt) |
| 2 | Archive size estimate < 100MB | Concurrency waste, slow uploads |
| 3 | eas-cli is latest | Warnings + compat bugs |
| 4 | Bundle ID not a suspicious default (e.g., com.yourname.fromtoday) | Building under wrong App Store ID |
| 5 | version, ios.buildNumber, android.versionCode present and consistent | Apple Connect conflicts, re-submit blockers |
| 6 | At least 1 iOS device registered (for preview ad-hoc builds) | "No registered devices" blocker |
| 7 | iOS credentials (cert + provisioning profile) pre-synced | Mid-build Apple 2FA surprises |
| 8 | Android keystore ready (or EAS-managed configured) | Mid-build keystore prompt |
| 9 | Concurrency awareness (free vs paid tier) | Surprise serial queue |
Bonus warnings: P8 APNs key presence (if push enabled), active eas whoami matches app.json owner, managed vs bare workflow detection.
app.json or native projectsDo NOT use for: debugging an in-progress build (use eas build:inspect), post-build validation, or issues unrelated to EAS submission.
# Run all checks for both platforms, preview profile (default)
/eas-prebuild-check
# Scope to iOS or Android
/eas-prebuild-check --platform ios
/eas-prebuild-check --platform android
# Auto-fix safe items (writes .easignore, prompts for eas-cli upgrade)
/eas-prebuild-check --fix
# Production profile (skips device-registration check)
/eas-prebuild-check --profile production
# Machine-readable JSON output for CI/CD
/eas-prebuild-check --json
Exit codes:
0 — all checks pass (or only WARN/INFO)1 — at least one FAIL (do NOT run eas build)2 — script error (missing eas-cli, not in an Expo project)--fix applies only LOSSLESS, REVERSIBLE changes:
| Auto-fix | Skill does it? | Why |
|----------|----------------|-----|
| Write missing .easignore | ✓ YES | New file, no data loss |
| Upgrade eas-cli | ✓ YES (with user confirm) | Reversible via npm install -g eas-cli@<prev> |
| Change bundle ID | ✗ NO | Requires human judgment (branding, App Store reservations) |
| Register devices | ✗ NO | Needs physical device UDID |
| Configure credentials | ✗ NO | Apple 2FA flow, user must be present |
| Bump version/buildNumber | ✗ NO | Release decisions need human approval |
Any file change triggers a diff preview + backup to .eas-prebuild-check.backup/.
# EAS Prebuild Check — mehayom-app
Profile: preview | Platform: both | Account: [email protected]
[1/9] .easignore exists ........................... ✗ FAIL
node_modules not excluded. Estimated archive: 2.1 GB
Fix: /eas-prebuild-check --fix
(writes canonical .easignore from template)
[2/9] Archive size <100MB ......................... ⊘ SKIPPED
Depends on [1]
[3/9] eas-cli up to date .......................... ⚠ WARN
Installed: 17.2.1 | Latest: 18.5.0
Fix: npm install -g eas-cli@latest
[4/9] Bundle ID consistency ....................... ⚠ WARN
iOS: com.yuvalnir.fromtoday ← suspicious scaffold default
Android: com.yuvalnir.fromtoday
Fix: edit app.json expo.ios.bundleIdentifier and expo.android.package
[5/9] Version sync ................................ ✓ OK
version: 1.0.0 | iOS buildNumber: 1 | Android versionCode: 1
[6/9] iOS devices registered ...................... ✗ FAIL
0 devices registered. Preview = ad-hoc distribution; needs ≥1 UDID.
Fix: eas device:create
[7/9] iOS credentials synced ...................... ✗ FAIL
No distribution certificate. No provisioning profile.
Fix: eas credentials:configure -p ios --profile preview
[8/9] Android keystore ready ...................... ✓ OK
EAS-managed keystore configured.
[9/9] Concurrency awareness ....................... ℹ INFO
Account tier: FREE (1 concurrent build)
iOS + Android together ≈ 40-60min queue time.
## Summary
✓ Passed: 2 ⚠ Warnings: 2 ✗ Failed: 3 ⊘ Skipped: 1 ℹ Info: 1
## Recommended order
1. /eas-prebuild-check --fix (auto-fixes 1, 3)
2. Edit app.json bundle IDs (check 4)
3. eas device:create (check 6)
4. eas credentials:configure -p ios --profile preview (check 7)
5. Re-run /eas-prebuild-check
DO NOT run `eas build` until all FAIL items are resolved.
eas-prebuild-check/
├── SKILL.md # This file
├── scripts/
│ ├── check.sh # Main dispatcher (runs all checks)
│ └── checks/
│ ├── 01-easignore.sh
│ ├── 02-archive-size.sh
│ ├── 03-eas-cli-version.sh
│ ├── 04-bundle-id.sh
│ ├── 05-version-sync.sh
│ ├── 06-ios-devices.sh
│ ├── 07-ios-credentials.sh
│ ├── 08-android-keystore.sh
│ └── 09-concurrency.sh
└── templates/
└── .easignore # Canonical template
/pr-loop — run this BEFORE the PR loop when a PR touches native build config/never-fabricate — Read() the actual eas build output, don't trust "looks fine" from this skill alone/superpowers:verification-before-completion — run this skill, verify exit 0, THEN claim ready to buildBuilt from MeHayom Sprint 2 EAS build lessons (April 8, 2026), BrainLayer tags: eas-build, mehayom, skill-needed, lessons-learned. Plan: ~/Gits/orchestrator/docs.local/plans/eas-build-v1/README.md.
tools
The human-eval UX contract for Phoenix views: turn-by-turn scrollable replay (not a scorecard), hide-but-copyable IDs, collapsed thinking, identity chips, tool filters, tiny frozen starter datasets, mark-wrong-in-thread, mobile-first. Use when: building or reviewing ANY Phoenix/eval view, annotation UI, session replay, or human-grading surface. Triggers: phoenix view, eval UI, annotation view, session replay, human eval UX, grading interface. NOT for: Phoenix data pipelines/ingest (capture scripts have their own specs).
tools
macOS systems specialist — AppKit NSPanel architecture, launchd services, socket activation, MCP bridge resilience, syspolicyd, and high-frequency SwiftUI dashboards. Use when building menu-bar apps, LaunchAgents, debugging syspolicyd/Gatekeeper/TCC, resilient UDS/MCP bridges, or SwiftUI dashboards at 10Hz+.
development
Bulk LLM-judging protocol for fleet-dispatched verdict runs (KG cluster, eval harness). Use when: dispatching or running judge workers (J1/J2/RT), planning bulk-apply from verdict JSONL, or triaging evidence_degraded outputs. Triggers: judge fleet, bulk judge, R3 verdicts, kg-judge, RT gate, evidence_degraded. NOT for: single-item code review, Phoenix view UX (use phoenix-human-view), or non-judge eval pipelines.
development
Quiet-down protocol for sprint close: when the fleet wraps, delete ALL polling crons and monitors, send ONE final dashboard + ONE message, then go SILENT. Use when: fleet wraps, all workers done, overnight queue exhausted, sprint close, Etan asleep/away with nothing approved left. Triggers: fleet wrap, wrap the fleet, stand down, going quiet, sprint close. NOT for: mid-sprint monitoring (keep your loops), spawning a successor (use /session-handoff first).