E2E
callstack/react-native-pager-view
Agentic end-to-end tests with e2e, the e2e runner. An agent skill from callstack/react-native-pager-view.
Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior.
$ npx skills add Shopify/flash-list --skill review-and-test -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Shopify/flash-list review-and-test --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/review-and-test .claude/skills/review-and-test && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "review-and-test" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/review-and-test into .claude/skills/review-and-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-and-test", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Shopify/flash-list/tree/main/.claude/skills/review-and-testType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Shopify/flash-list --skill review-and-test -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Shopify/flash-list review-and-test --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/review-and-test .agents/skills/review-and-test && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "review-and-test" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/review-and-test into .agents/skills/review-and-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-and-test", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Shopify/flash-list --skill review-and-test -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Shopify/flash-list review-and-test --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/review-and-test .cursor/skills/review-and-test && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "review-and-test" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/review-and-test into .cursor/skills/review-and-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-and-test", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Shopify/flash-list.git --path .claude/skills/review-and-test--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Shopify/flash-list --skill review-and-test -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Shopify/flash-list review-and-test --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/review-and-test .gemini/skills/review-and-test && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "review-and-test" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/review-and-test into .gemini/skills/review-and-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-and-test", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Shopify/flash-list review-and-testInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Shopify/flash-list --skill review-and-test -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/review-and-test .github/skills/review-and-test && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "review-and-test" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/review-and-test into .github/skills/review-and-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-and-test", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Shopify/flash-list --skill review-and-test -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Shopify/flash-list review-and-test --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/review-and-test .opencode/skills/review-and-test && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "review-and-test" agent skill from https://github.com/Shopify/flash-list/tree/main/.claude/skills/review-and-test into .opencode/skills/review-and-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-and-test", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
review-and-testReview a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior.
Review And Test is an agent skill from Shopify/flash-list, published by the product's own GitHub organization. Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior. Shared context with fix-github-issue skill.
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Unit testing and End-to-end testing. It works with iOS, GitHub and React Native. The repository describes itself as: A better list for React Native. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 527d767. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
yarngitxcrunghcurlnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use yarn, git, gh and curl, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Review And Test loads about 3.6k tokens when it runs. Until then it costs about 40 tokens; SKILL.md has 1,517 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Shopify/flash-list at commit 527d767, republished under its MIT licence (© Shopify). 1,517 words, ~3,627 tokens.
.claude/skills/review-and-test/SKILL.md (or your agent's skills folder).which agent-device && which gh && yarn test --versionEnsure Metro is running from fixture/react-native/:
curl -s http://localhost:8081/statusgh pr view <pr-number> --repo Shopify/flash-list
gh pr diff <pr-number> --repo Shopify/flash-list
gh pr view <pr-number> --repo Shopify/flash-list --commentsgit log main..HEAD --oneline
git diff main...HEADIdentify:
All three must pass:
yarn test
yarn type-check
yarn lintRoot yarn type-check only covers src/ — the fixture has a separate tsconfig.json. Root yarn lint does cover fixture files.
If any files in fixture/react-native/ were modified, also run:
git diff main...HEAD --name-only | grep 'fixture/react-native/'
# If matches found:
cd fixture/react-native && yarn build # tsc -b — catches type errors in fixture codeRun E2E tests if any of these changed in the PR/branch:
*.e2e.*)fixture/react-native/src/# Check if e2e-relevant files were changed
git diff main...HEAD --name-only | grep -E '\.e2e\.|fixture/react-native/src/'
# If yes, run e2e tests on iOS
yarn e2e:iosE2E tests use Detox. The yarn e2e:ios script handles both build and test.
Warning: E2E builds a release app that replaces the debug app on the simulator. After running E2E, rebuild debug to continue interactive testing:
cd fixture/react-native && yarn react-native run-iosIf tests fail, investigate before proceeding to device testing.
CRITICAL: The fixture app uses compiled output from dist/. Source changes in src/ have NO effect until built.
yarn build # runs tsc -bBefore building the native app, check if it's already installed on the simulator. Only build if it's not installed:
xcrun simctl get_app_container booted org.reactjs.native.example.FlatListPro 2>/dev/nullrun-ios — just relaunch it.cd fixture/react-native && yarn react-native run-iosAfter yarn build, relaunch the app (kill + reopen) so Metro serves the new bundle:
agent-device close --platform ios
xcrun simctl launch --terminate-running-process <UDID> org.reactjs.native.example.FlatListPro
agent-device open "FlatListPro" --platform iosFind the simulator UDID with:
xcrun simctl list devices | grep BootedUse the agent-device skill to navigate and take screenshots. Screens are listed on the Examples page. Common ones:
| Screen | What to check |
|---|---|
| Sticky Header Example | Headers pin correctly, no duplicate overlays |
| Horizontal List | Items scroll, header reachable, initialScrollIndex works |
| Grid | Multi-column layout correct |
| Masonry | Variable heights, columns balanced |
| Chat | Bottom-rendering, prepend behavior |
| Contacts | Section headers, fast scrolling |
| Grid with Separator | Last row items same height, separators between rows only |
Navigate to each affected screen, scroll through content, verify no visual regressions.
If an Android emulator is available (e.g., on the android-agent CI runner), test there too. Android uses a native RecyclerView bridge so behavior can differ from iOS.
yarn build
cd fixture/react-native && yarn react-native run-androidUse agent-device with --platform android --session droid:
agent-device snapshot -i -c --json --session droid
agent-device press <x> <y> --session droid
agent-device screenshot /tmp/android-screen.png --session droidonEndReached / onStartReached fire at the same thresholds as iOSThe ONLY reliable method: change fixture/react-native/index.js:
// Change this:
I18nManager.forceRTL(false);
// To this:
I18nManager.forceRTL(true);Then kill and relaunch the app (a JS reload is NOT sufficient):
agent-device close --platform ios
xcrun simctl launch --terminate-running-process <UDID> org.reactjs.native.example.FlatListPro
agent-device open "FlatListPro" --platform iosDo NOT use:
DevSettings.reload() — does not properly apply RTLIn RTL, the scroll direction is reversed:
Use agent-device swipe with coordinates at the list center:
# Swipe right-to-left at y=30% (list center on HorizontalList screen)
agent-device swipe 350 256 50 256 --platform iosI18nManager.forceRTL(false);firstItemOffset Values (for layout/measurement changes)If the PR touches measureLayout, measureParentSize, firstItemOffset, or RecyclerView.tsx layout logic, verify the actual runtime values match expected values.
| Scenario | firstItemOffset (adjusted) |
|---|---|
| Vertical, no header | 0 |
| Vertical, with ListHeaderComponent | headerHeight |
| Vertical, content above FlashList | 0 (NOT the parent's y position) |
| Horizontal LTR, with header | headerWidth |
| Horizontal RTL, with header (1st render) | headerWidth |
| Horizontal RTL, with header (stable) | headerWidth |
console.log does NOT work on Fabric/Hermes (output goes to CDP debugger, not Metro).
Use a local HTTP server instead:
# Terminal 1: start server
node -e "
const http=require('http'),fs=require('fs');
http.createServer((q,r)=>{
if(q.method==='POST'){let b='';q.on('data',c=>b+=c);q.on('end',()=>{
fs.appendFileSync('/tmp/rv-debug.log',b+'\n');console.log(b);r.end('ok');})}
else r.end('ok');
}).listen(9876,()=>console.log('on :9876'));
"Add to source (remember to remove after):
try {
fetch("http://localhost:9876", {
method: "POST",
body: JSON.stringify({ tag: "myDebug", ...values }),
}).catch(() => {});
} catch (e) {}Then rebuild (yarn build), relaunch, navigate, and read /tmp/rv-debug.log.
measureParentSize x/y behaviorOn RN 0.84 Fabric, view.measureLayout(view) returns x=0, y=0 (the Fabric self-measurement bug from #2017 does NOT reproduce on this version). The defensive fix that strips x/y is a no-op here but protects other RN versions.
After testing, provide:
firstItemOffset verification (if applicable): actual vs expected valuesRun through relevant entries after any fix or review. This is the single source of truth for edge case checklists — the fix-github-issue skill references this.
stickyHeaderOffset > 0 combined with content above FlashListmeasureParentSize x/y values — on RN 0.84 Fabric these are (0,0), but on other RN versions they may be non-zeronumColumns > 1 with ItemSeparatorComponent — last row items must have same height (no separator height mismatch)numColumns > 1 with ItemSeparatorComponent and overrideItemLayout (variable spans) — separator suppression must use layout y-coordinates, not index arithmeticHorizontalList in RTL — items right-to-left, header reachable by swiping right-to-leftGrid in RTL — column ordering reversedStickyHeaderExample in RTL — header must pin to correct edgeChat in RTL — messages align correctlyMasonry in RTLstickyHeaderOffset > 0maintainVisibleContentPosition / startRenderingFromBottomhideRelatedCell: true — overlay hides original cell without jumpingmeasureLayout/measureParentSize call — verify behaviour matches PaperfirstItemOffset after fix — confirm it equals ListHeaderComponent height/widthmeasureParentSize(view) returns x=0, y=0 on RN 0.84 Fabric — the #2017 bug may only manifest on other RN versionsManualBenchmarkExample)yarn build and relaunch? The dist/ folder may be staledist/ is NOT rebuilt on branch switch. You MUST run yarn build after every git checkout. Verify with grep in dist/ that the expected code is present before testing.forceRTL(true) in index.js and do a full kill+relaunch?agent-device swipe gives "drag" error — delete ~/.agent-device/ios-runner/derived/ and re-run agent-device open to rebuild the iOS runnerlsof -p $(lsof -ti :8081) | grep "1w" to find where Metro stdout goes (often /private/tmp/metro_fixture.log)agent-device swipe 350 256 50 256. To scroll toward higher items, swipe left-to-right.org.reactjs.native.example.FlatListPro. Use with xcrun simctl launch.estimatedItemSize does not exist — this FlashList does NOT have this prop. Do not use it.Cmd+D → "Configure Bundler" → set host localhost and the correct port. Then reload.snapshot -i -c --json as the primary method for finding elements (returns exact coordinates). Fall back to screenshot + percentage-based press when elements aren't in the accessibility tree. See the agent-device skill for details.main, build (yarn build), relaunch, and reproduce the bugyarn build), relaunch, and verify the fixgrep "expected_code" dist/path/to/file.js — if the old code is still there, the build didn't run or didn't pick up the changeWithout step 1, you can't confirm the fix actually changed anything. Without verifying dist, you might test stale code on both branches and conclude "no difference" incorrectly.
When testing callback-based behavior (e.g., onStartReached, onEndReached, onViewableItemsChanged), add a visible counter to the fixture screen:
const [count, setCount] = useState(0);
// In the callback:
onStartReached={() => setCount(c => c + 1)}
// In the UI:
<View style={{ backgroundColor: count > 0 ? '#ff4444' : '#cccccc', ... }}>
<Text>Start: {count}</Text>
</View>This gives immediate visual feedback in screenshots without needing console.log or debug servers.
Any masonry layout PR that adds Array.sort() or sorted copies is a red flag for performance. getVisibleLayouts runs on every scroll frame (60fps). O(N log N) sorting per layout change is expensive. Items within each column are naturally sorted — per-column binary search is O(log N) without sorting.
This skill is the single source of truth for testing knowledge, edge cases, and debug techniques. The fix-github-issue skill delegates here for Steps 6-7.
After each session, update this file with:
© Shopify, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/review-and-test of Shopify/flash-list.
Open the folder on GitHubat commit 527d767
Review And Test next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Review And Test this skillShopify/flash-list | 7.2k | — | ~3.6k | Automated safety check: Pass | MIT | |
| E2Ecallstack/react-native-pager-view | 3.4k | 1 repos | ~2.1k | Automated safety check: Pass | MIT | |
| Engine E2Ewix/react-native-navigation | 13k | — | ~1.1k | Automated safety check: Pass | MIT | |
| E2Egronxb/hot-updater | 1.8k | — | ~1.6k | Automated safety check: Pass | Custom licence | |
| E2E Current PRgronxb/hot-updater | 1.8k | — | ~1k | Automated safety check: Pass | Custom licence | |
| Kane CLI Browser TestingLambdaTest/kane-cli | 248 | — | ~8.4k | Automated safety check: Pass | Apache-2.0 |
callstack/react-native-pager-view
Agentic end-to-end tests with e2e, the e2e runner. An agent skill from callstack/react-native-pager-view.
wix/react-native-navigation
Run Wix Engine (mobile-apps-engine) iOS E2E tests locally to validate RNN changes.
gronxb/hot-updater
Run end-to-end OTA verification for examples/v0.85.0 with agent-device.
gronxb/hot-updater
Generate and execute PR-aware OTA E2E scenarios for examples/v0.85.0 by diffing the checked-out branch against its PR base branch or default branch, inferring the affected runtime, rollout, and…
LambdaTest/kane-cli
Drives a real browser through the kane-cli tool and designs requirement-linked test suites from a PRD or a plain description, with mobile and cloud-grid runs.
gronxb/hot-updater
Run a fixed OTA regression flow for examples/v0.85.0 with agent-device.
Shopify/flash-list
Interact with iOS simulator or Android emulator/device using snapshot-based coordinates.
Shopify/flash-list
Analyze agent feedback artifacts from GitHub Actions workflow runs, extract actionable learnings, and incorporate them into skill files and CLAUDE.md.
Shopify/flash-list
Full workflow for fixing a GitHub issue - understand the problem, reproduce, diagnose root cause, fix, test on iOS/Android simulators, review, and raise a PR
Shopify/flash-list
Create a GitHub PR for FlashList. An agent skill from Shopify/flash-list.
Shopify/flash-list
Triage a GitHub issue — classify priority (P0/P1/P2), search for duplicates, and apply labels.
Shopify/flash-list
Upgrade the React Native fixture app to a new version. An agent skill from Shopify/flash-list.
Works with
Categories
Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior. Review And Test is an agent skill from Shopify/flash-list, published by the product's own GitHub organization. Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior.
Review And Test fits situations like: tasks that involve Unit testing; tasks that involve End-to-end testing.
Run `npx skills add Shopify/flash-list --skill review-and-test -a claude-code`. Or copy the skill folder (.claude/skills/review-and-test in Shopify/flash-list) into .claude/skills/review-and-test in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Shopify/flash-list --skill review-and-test -a codex`. Or copy the skill folder (.claude/skills/review-and-test in Shopify/flash-list) into .agents/skills/review-and-test in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Shopify/flash-list --skill review-and-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/review-and-test, .gemini/skills/review-and-test, .github/skills/review-and-test and .opencode/skills/review-and-test in your project.
Going by SKILL.md and its folder, Review And Test needs the command-line tools its instructions call (yarn, git, xcrun, gh, curl and node).
SKILL.md contains no URLs. Its commands use git, gh and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Review And Test is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Review And Test: E2E (callstack/react-native-pager-view, 3.4k stars), Engine E2E (wix/react-native-navigation, 13k stars), E2E (gronxb/hot-updater, 1.8k stars) and E2E Current PR (gronxb/hot-updater, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Shopify (a GitHub organization, an official publisher) maintains it in Shopify/flash-list, which has 7,245 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 1, 2026.
Source: Shopify/flash-list on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.