.cursor/skills/record-clips/SKILL.md
Record scene video clips for a TOML video project. Reads the android.toml or ios.toml to get the scene list and min_clip_duration, navigates to each screen via ADB (Android) or simctl (iOS), and records individual clips. Use when the user says /record-clips and provides a TOML path.
npx skillsauth add baijum/ukulele-companion record-clipsInstall 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.
Record per-scene video clips for a TOML video project. Each clip is a short screen recording of one scene's interactions on the Android emulator or iOS Simulator.
~/Library/Android/sdk/platform-tools/adbadb devices)./gradlew installDebug if needed)xcrun simctl availablexcrun simctl list devices booted)Before recording clips, generate the voiceover audio first so you know exactly how long each clip needs to be:
source ~/.secrets
python3 scripts/assemble_video.py <android.toml or ios.toml> --audio-only
This prints a table showing the required min_clip_duration for each scene. Record clips at least that long.
Parse the android.toml to get the scene list. For each scene, note:
name -- what the scene showsvideo -- where to save the clip (under clips/android/)min_clip_duration -- minimum recording length (or use 30s default)recording_notes -- step-by-step instructions for what to do on screen during recording. Follow these precisely to avoid navigating away from the target screen or triggering unwanted intents. If recording_notes is absent, infer interactions from the narration text.ADB=~/Library/Android/sdk/platform-tools/adb
$ADB shell am force-stop com.baijum.ukufretboard
sleep 1
$ADB shell am start -n com.baijum.ukufretboard/.MainActivity
sleep 3
For each scene:
recording_notes field for explicit interaction instructionsrecording_notesmin_clip_duration as the time limitrecording_notes (respect any "Do NOT" warnings)# Navigate to screen (use uiautomator to find coordinates)
$ADB shell input tap 80 200 # hamburger menu
sleep 1
$ADB shell uiautomator dump /sdcard/ui.xml 2>/dev/null
$ADB shell cat /sdcard/ui.xml | tr '>' '\n' | grep 'text="<ScreenName>"'
$ADB shell input tap <x> <y>
sleep 2
# Record clip
$ADB shell screenrecord --time-limit <min_clip_duration> --size 1080x2424 /sdcard/scene.mp4 &
PID=$!
sleep 2
# Perform interactions for this scene
# ...
sleep <remaining_time>
# Stop and pull
kill $PID 2>/dev/null
sleep 3
$ADB pull /sdcard/scene.mp4 <project_dir>/clips/android/<scene_file>.mp4
$ADB shell rm /sdcard/scene.mp4
After recording all clips, check that every one has a valid duration:
for clip in <project_dir>/clips/android/*.mp4; do
dur=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$clip")
echo "$(basename $clip): ${dur}s"
done
Any clip showing N/A is corrupt and must be re-recorded. Common causes:
Parse the ios.toml to get the scene list. For each scene, note:
name -- what the scene showsvideo -- where to save the clip (under clips/ios/)min_clip_duration -- minimum recording length (or use 30s default)recording_notes -- step-by-step instructions for iOS-specific interactionsSIM_UUID=$(xcrun simctl list devices booted -j | python3 -c "import sys,json; devs=json.load(sys.stdin)['devices']; print([d['udid'] for ds in devs.values() for d in ds if d['state']=='Booted'][0])")
xcrun simctl terminate $SIM_UUID com.baijum.ukufretboard.ios
sleep 1
xcrun simctl launch $SIM_UUID com.baijum.ukufretboard.ios
sleep 3
# Start recording
xcrun simctl io $SIM_UUID recordVideo --codec=h264 /tmp/scene.mp4 &
PID=$!
sleep 2
# Perform interactions (navigate manually or via accessibility automation)
# ...
sleep <remaining_time>
# Stop and move
kill -INT $PID 2>/dev/null
sleep 3
mv /tmp/scene.mp4 <project_dir>/clips/ios/<scene_file>.mp4
for clip in <project_dir>/clips/ios/*.mp4; do
dur=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$clip")
echo "$(basename $clip): ${dur}s"
done
Use uiautomator dump for precise coordinates. See android-screenshot-capture for details.
Drawer items: Open drawer with input tap 80 200, then find items by text.
Collapsible sections: If a drawer section is collapsed, expand it first:
$ADB shell cat /sdcard/ui.xml | tr '>' '\n' | grep 'content-desc="Expand'
Below the fold: Scroll down in the drawer for Reference section items:
$ADB shell input swipe 400 1800 400 400 500
Settings: Tap the gear icon (top-right, not in drawer):
$ADB shell input tap 1007 200
recording_notes precisely -- These instructions prevent common errors like accidentally navigating away from the screen, tapping share buttons that launch intent pickers, or ending up on the home screen.tpad if they're short, but clips that are too short (< 3s) may be corrupt.--time-limit generously (Android) -- Set it to min_clip_duration + 5 for safety. You can always kill the recording early if the interactions finish sooner.python3 scripts/assemble_video.py <toml-file>.tools
Upload a release AAB to Google Play Store using the Gradle Play Publisher plugin. Use when the user asks to upload to Play Store, publish to Google Play, deploy to internal testing, promote a release, or mentions Play Console.
development
Promote a release from Google Play internal testing to a closed testing track (Alpha or App Hive Testing). Use when the user asks to promote a release, move to closed testing, push to alpha, push to App Hive Testing, or mentions track promotion.
development
Promote a release to Google Play open testing or production tracks. Supports full rollout and staged rollout to production. Use when the user asks to promote to open testing, beta, go to production, release to all users, staged rollout, or increase rollout percentage.
development
Audit iOS port parity against the Android app. Compares ViewModels, Views, Settings, and Navigation at the code level, verifies features from docs/videos/ TOML project files, and optionally captures side-by-side screenshots. Use when the user asks to compare iOS vs Android, check iOS parity, find missing iOS features, audit the port, or mentions feature gaps.