본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

mobile-demo-record

iOS 시뮬레이터에서 로컬 서비스에 연결해 앱을 실행하고 Maestro로 실제 화면 흐름을 재현해 녹화나 스크린샷을 만듭니다. 실제 앱 동작 시연과 변경 사항 확인에 쓸 수 있습니다.

원문원문 설명 보기

Run apps/mobile on the iOS simulator against the local stack, drive it with Maestro, and capture clean screen recordings. Use when asked to record, film, screenshot, or demo the mobile app, or to verify a mobile change in the real app.

ParadevAI/Paradev스타 15,724(GitHub 15,724 + cccskills 0)
연동 도구AWS

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • 모바일 앱 데모 영상 녹화
  • 앱 화면 스크린샷 촬영
  • Maestro로 조작 흐름 재현
  • 실행 중인 앱에서 변경 사항 확인

한국어 소개

할 수 있는 일

iOS 시뮬레이터에서 로컬 API 등의 서비스에 연결해 apps/mobile을 실행하고, Maestro 흐름으로 앱을 조작해 화면 녹화나 스크린샷을 만듭니다. 실제 앱 상태를 사용하며, 촬영 전에 데모 내용에 필요한 데이터를 준비합니다. 녹화 전에는 시뮬레이터 화면과 상태 표시줄을 정돈할 수 있고, 녹화 후에는 영상을 일정한 프레임률로 변환해 편집하기 쉽게 만들 수 있습니다. 촬영에 사용한 데이터와 서비스, 시뮬레이터 설정을 정리하는 절차도 포함됩니다.

이럴 때 유용합니다

앱의 실제 조작을 짧은 영상이나 이미지로 공유하거나, 시뮬레이터에서 앱을 직접 조작해 변경 사항을 확인할 때 유용합니다. 매번 같은 데모 흐름으로 촬영하려는 경우에도 사용할 수 있습니다.

사용 예시

  • “이 앱의 조작 데모를 녹화해 주세요.”
  • “이 화면의 스크린샷을 찍어 주세요.”
  • “Maestro로 변경된 화면을 조작해 확인해 주세요.”

주의 사항

iOS 시뮬레이터, Xcode의 simctl, Maestro, Java, FFmpeg를 사용합니다. 촬영 내용에 따라 로컬 API나 데이터베이스 같은 서비스도 준비해야 합니다. 녹화 화면에 실제 데이터가 나오지 않는지 확인하고, 촬영용으로 만든 데이터와 설정은 이후 삭제하거나 원래대로 복원합니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
A양호화면에 실제 데이터가 없는지 확인하고 촬영 데이터와 설정을 정리하도록 명시합니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족여러 도구와 로컬 서비스가 필요하지만 준비 방법은 일부만 설명되어 있습니다.

점수에는 넣지 않았습니다. 2026년 10월 29일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(1)

  • SKILL.md8.7 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Recording the mobile app

There is no CDP for mobile. The equivalent is the iOS simulator, booted headless, driven by Maestro, recorded with simctl. Nothing here opens a window on the user's display.

Rules

  1. Real app state only. Record real sessions, real pull requests, real pages. No mockups, no DOM-style fakery. Seed the data the story needs, then delete it.
  2. No real data in frame. Use the dev account (admin@local.test) and a demo org with demo projects. Read every frame of the contact sheet for names, emails, repo names, and tokens before sharing anything.
  3. One take per story. A host that has connected once is no longer "never connected", a read page is no longer unread. Reset or reseed state before each take.
  4. Report what you recorded against: worktree, API port, simulator UDID, app build date.

Stack

Start each in its own Paradev terminal (superset terminals create --local --workspace $SUPERSET_WORKSPACE_ID --command "..."; without --local the call silently returns nothing). Ports come from .superset/ports.json and the root .env.

ServiceCommandTrap
APIcd apps/api && bun run devA 500 "password authentication failed" means the worktree's Neon branch was cleaned up. Recreate it and rewrite the "# Workspace Database" lines in .env.
Relaycd apps/relay && while true; do CI=1 WRANGLER_SEND_METRICS=false node_modules/.bin/wrangler dev --port $RELAY_PORT --var NEXT_PUBLIC_API_URL:http://localhost:$API_PORT --local; donewrangler dev dies with an empty error whenever a client aborts mid-request, which every app relaunch does. Hence the loop.
Metrocd apps/mobile && CI=1 bunx expo start --dev-client --port 8081CI=1 disables file watching: restart Metro after code edits. Pre-warm the first bundle by curling the launchAsset.url from curl -H 'expo-platform: ios' localhost:8081, or the dev client times out.

apps/mobile/app.config.ts loads the repo-root .env with override: true, so every local bundle points at this workspace's API no matter what apps/mobile/.env says.

Simulator

U=$(xcrun simctl list devices available | grep -m1 "iPhone 17 Pro (" | grep -oE '[0-9A-F-]{36}')
xcrun simctl boot $U && xcrun simctl bootstatus $U -b
xcrun simctl ui $U appearance light
xcrun simctl status_bar $U override --time "9:41" --batteryState discharging \
  --batteryLevel 100 --cellularBars 4 --wifiBars 3 --dataNetwork wifi
xcrun simctl spawn $U defaults write sh.superset.mobile EXDevMenuIsOnboardingFinished -bool YES
xcrun simctl openurl $U "superset://expo-development-client/?url=http%3A%2F%2Flocalhost%3A8081&disableAutoLaunch=1&disableFab=1"
  • simctl boot does not launch Simulator.app. Keep it that way.
  • The status bar override resets on shutdown. Reapply it after every boot.
  • No dev client installed, or it crashes on launch after a native dependency change? Rebuild: From apps/mobile (cd apps/mobile from the repo root), run bunx expo prebuild -p ios, then xcodebuild -workspace ios/Superset.xcworkspace -scheme Superset -configuration Debug -sdk iphonesimulator -derivedDataPath <scratch>/dd (about 10 minutes), then xcrun simctl install $U <path to Superset.app>. Set SENTRY_DISABLE_AUTO_UPLOAD=true. Never set CODE_SIGNING_ALLOWED=NO: it drops the keychain entitlement and the app crashes on first SecureStore read. Pure JS changes need no rebuild.

Driving

Maestro needs JAVA_HOME=/opt/homebrew/opt/openjdk/libexec/openjdk.jdk/Contents/Home. Flows live in apps/mobile/.maestro/flows/. Sign in with tapOn: { id: dev-sign-in-button }.

  • Write one flow per story. Prefer tapOn by visible text, add a testID when text is ambiguous. inputText types character by character, which reads as a person typing on film.

  • Maestro takes 7 to 25 seconds to start. Launch it before you start recording, and begin the flow with a waitForAnimationToEnd or a short extendedWaitUntil so the take opens on a settled screen.

  • The dev session has plan: null, so Home shows the paywall. Seed a subscriptions row on the worktree's Neon branch (plan pro, reference_id = the org id, stripe_subscription_id sub_temp_...) and delete it after.

  • Need a host without a second machine? POST /api/trpc/host.ensure with the session JWT registers one, and holding ws://localhost:$RELAY_PORT/v2/control?hostId=<org>:<machineId> open with Authorization: Bearer <jwt> marks it online. Delete the v2_users_hosts and v2_hosts rows after. For a story with a real agent working, point the app at a real local host-service instead.

  • Maestro matches the whole accessibility label, and rows carry extra text (the Settings row is , Pages, ). Match with a regex: tapOn: ".*Pages.*". Dump what it sees with maestro --udid $U hierarchy.

  • Metro fails with ENOENT ... react-native-worklets/.worklets/<n>.js? Its cache outlived the generated files. Restart it with --clear.

Pages in the app

Pages need three more things locally, none of which setup provides:

  • Object storage. The API writes page files to R2_ENDPOINT (localhost:9000, nothing listens there) while the usercontent Worker reads its own local R2. Run a minimal S3 stand-in on :9000 (PUT with x-amz-copy-source, GET, HEAD, POST ?delete), publish through page.assets.upload then page.publish, then copy every stored object across with bunx wrangler r2 object put superset-private-dev/<key> --local --env dev --file <f> --content-type <type> from apps/usercontent.
  • The Worker's secret. apps/usercontent/.dev.vars needs USERCONTENT_TOKEN_SECRET set to the value in the root .env, or every page answers 500. Start it with cd apps/usercontent && bun run dev.
  • Transport security. The dev build allows local networking only, and <id>.frame.usercontent.localhost does not count, so the page fails with error -1022. On the simulator's installed copy only: PlistBuddy -c "Set :NSAppTransportSecurity:NSAllowsArbitraryLoads true" -c "Add :NSAppTransportSecurity:NSAllowsArbitraryLoadsInWebContent bool true" "$(xcrun simctl get_app_container $U sh.superset.mobile app)/Info.plist", then relaunch. Revert it after.

tRPC calls from a script need authorization: Bearer <jwt> plus x-superset-organization-id, because the JWT carries no active organization. Tap to comment did not open the comment popover under Maestro on the simulator (2026-09-19, cause unknown); film comments through "Show all comments" and Reply instead.

Capturing

Run capture commands from a scratch directory. Use an absolute path to the Maestro flow when recording outside the repo.

mkdir -p raw shots cfr
xcrun simctl io $U recordVideo --codec h264 --force raw/01-story.mov & REC=$!
maestro test <repo>/apps/mobile/.maestro/flows/<story>.yml
kill -INT $REC; wait $REC
xcrun simctl io $U screenshot shots/01.png
  • Stop with SIGINT only. Any other signal leaves an unplayable file.
  • recordVideo writes a frame only when the screen changes, so the file is variable frame rate and wall-clock marks do not map to video time. Normalize before choosing cut points: ffmpeg -i raw/01-story.mov -vf fps=30 -an -c:v libx264 -crf 14 -pix_fmt yuv420p cfr/01.mp4.
  • A screenshot after a sleep never catches a sub-second flash. Record, then extract frames with ffmpeg -vf fps=10.
  • Before changing simulator variants, record the existing appearance, content size, and AppleLanguages value (including whether it was unset) so cleanup can restore them.
  • Variants: simctl ui $U appearance dark, simctl ui $U content_size extra-extra-extra-large, and simctl spawn $U defaults write "Apple Global Domain" AppleLanguages -array de-DE followed by a relaunch.

For a framed demo video, use the shared mobile-demo-film skill after recording.

Cleanup

Delete only the rows and objects created for this recording: subscriptions, hosts, demo sessions, and, for Pages, published pages, comments, and their objects in the S3 stand-in and local R2. Restore any organization or user names changed for the demo.

Stop every service started for the recording, including the usercontent Worker and storage stand-in when used. Restore the simulator's prior appearance, content size, and AppleLanguages value (remove the override if it was originally unset), revert any installed app transport-security changes, clear status-bar overrides, then xcrun simctl shutdown $U. Recordings and screenshots stay in the scratch directory unless the user asks for them in the repo.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

10x

무료요약 있음

Superset 사용 현황을 살펴보고 아직 쓰지 않는 기능 중 업무 방식에 맞는 항목을 제안합니다. 각 기능을 설명하고, 사용자가 고른 예약 실행 에이전트나 병렬 작업 공간, 공유 작업 등을 설정합니다.

  • 사용하지 않는 Superset 기능 찾기
  • 에이전트 예약 실행 설정
  • 여러 작업 공간에서 병렬 작업
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

automate

무료요약 있음

반복 작업을 Superset 자동화로 설정합니다. 에이전트 지침, 일정 또는 이벤트 조건, 실행 작업 공간을 정리하고 명시적인 확인을 받은 뒤 자동화를 만듭니다. 저장된 조건과 첫 실행 결과를 살펴 지침을 조정합니다.

  • 매일 또는 매주 작업 예약
  • GitHub에서 풀 리퀘스트가 열릴 때 실행
  • Slack의 지정된 반응을 계기로 실행
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

browser

무료요약 있음

Superset 작업 공간의 브라우저에서 페이지를 열고 클릭하거나 입력하며, 화면과 콘솔 정보를 확인합니다. 개발 중인 웹 앱 미리 보기, 폼 동작 및 화면 이동 점검에 활용할 수 있습니다.

  • 로컬 웹 앱 미리 보기
  • 페이지 화면 캡처
  • 콘솔 오류 확인
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

build-a-stripe-integration

무료요약 있음

Stripe 공식 문서와 API 매개변수 정의를 확인해 결제, 구독, 청구서, 웹훅 연동을 구현합니다. 적절한 제품 선택부터 샌드박스 테스트와 웹훅 처리까지 다루며, 결제와 구독 상태를 웹훅 이벤트로 판단합니다.

  • 정기 결제에 맞는 Stripe 제품 선택
  • Checkout 또는 청구서 처리 구현
  • 오작동하는 Stripe 연동 조사
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

cdp-verification

무료요약 있음

Chrome DevTools Protocol로 실행 중인 Electron 데스크톱 앱을 조작해 UI 변경을 확인하고 문제를 재현합니다. 실제 사용 흐름을 따라 화면 전환을 검증하고, 스크린샷과 경로·스크롤 위치·포커스·저장 상태를 기록해 비교합니다.

  • 실행 중인 앱에서 UI 문제 재현
  • 수정 후 화면 동작 확인
  • 화면 전환이 포함된 흐름 검증
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

ci-triage

무료요약 있음

GitHub Actions 실패 로그에서 최초 오류를 찾아 코드 결함, 환경 문제, 간헐적 실패, 기존 장애로 구분합니다. 기준 브랜치와 PR 변경 사항을 비교해 관련성을 설명하고 다음 조치를 정리합니다.

  • PR 검사 실패 원인 조사
  • 불안정한 테스트와 코드 결함 구분
  • 기준 브랜치의 기존 장애 확인
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

ParadevAI의 스킬 모두 보기

이 스킬의 문제 신고