Agent skill
update-store
ストア情報の更新自動化 — スクリーンショット撮影(シミュレーター × モック画面 × Marionette MCP)とメタデータテキスト更新。ストア更新、スクショ更新、App Store / Google Play のメタデータ更新、リリースノート作成の際に使用すること。
Install this agent skill to your Project
npx add-skill https://github.com/K9i-0/ccpocket/tree/main/.claude/skills/update-store
SKILL.md
Update Store
ストアスクリーンショットの自動撮影・合成と、メタデータテキスト(description, release_notes等)の更新を行う。
前提
- デバッグモードのアプリにはストアスクショ用のカスタムエクステンション(
ccpocket.navigateToStoreScenario)が登録済み - Marionette MCPの
call_custom_extensionが使用可能 - ImageMagickがインストール済み(
compose.shで使用) - sim-tap.swift: 同梱のSwiftスクリプト(
scripts/sim-tap.swift)。macOSアクセシビリティAPIでSimulatorのネイティブダイアログ(通知許可等)をラベル指定でタップできる
ワークフロー
Step 1: バージョン確認 & 変更分析
# 最新リリースタグ
git tag -l 'ios/v*' --sort=-v:refname | head -1
# 現在のバージョン
grep '^version:' apps/mobile/pubspec.yaml
# 前回リリースからの変更コミット
git log $(git tag -l 'ios/v*' --sort=-v:refname | head -1)..HEAD --oneline -- apps/mobile/
CHANGELOGの最新セクションも確認:
head -80 CHANGELOG.md
変更内容を分析し、UI変更があったかどうかを判断する。
Step 2: 更新対象の選択
AskUserQuestion(multiSelect)で更新対象を確認する。 変更分析結果に基づいて推奨をdescriptionに含める。
スクリーンショット(8シナリオ):
| Key | シナリオ名 | 内容 | テーマ |
|---|---|---|---|
01_session_list |
Session List (Recent) | ホーム画面(名前付きセッション) | ライト |
02_approval_list |
Session List | 承認待ち一覧(3セッション) | ライト |
03_multi_question |
Multi-Question Approval | 質問UI(3問) | ライト |
04_markdown_input |
Markdown Input | Markdown箇条書き入力 | ライト |
05_image_attach |
Image Attach | 画像添付UI | ライト |
06_git_diff |
Git Diff | Diff表示画面 | ライト |
07_new_session |
New Session | 新規セッションシート | ライト |
08_dark_theme |
Session List | 承認待ち一覧(ダークモード訴求) | ダーク |
メタデータテキスト:
| ファイル | 対象 |
|---|---|
fastlane/metadata/en-US/release_notes.txt |
iOS リリースノート (EN) |
fastlane/metadata/ja/release_notes.txt |
iOS リリースノート (JA) |
fastlane/metadata/en-US/description.txt |
App Store 説明文 (EN) |
fastlane/metadata/ja/description.txt |
App Store 説明文 (JA) |
fastlane/metadata/en-US/promotional_text.txt |
プロモーションテキスト (EN) |
fastlane/metadata/android/en-US/full_description.txt |
Play Store 説明文 (EN) |
fastlane/metadata/android/ja-JP/full_description.txt |
Play Store 説明文 (JA) |
fastlane/metadata/android/en-US/changelogs/default.txt |
Play Store リリースノート (EN) |
fastlane/metadata/android/ja-JP/changelogs/default.txt |
Play Store リリースノート (JA) |
上記のファイルパスは apps/mobile/ からの相対パス。
Step 3: メタデータテキスト更新(選択された場合)
CHANGELOGの内容をベースに:
- release_notes — CHANGELOG最新セクションを簡潔にまとめる
- description — 新機能に応じて追記・修正
- promotional_text — キャッチコピーを更新
更新後、AskUserQuestionで内容確認を挟む。
Step 4: iPhone スクリーンショット撮影(選択された場合)
4-1. デバイス確認 & シミュレーター起動
xcrun simctl list devices available | grep -E "iPhone 17|iPad Pro.*13"
ソフトウェアキーボードを無効化(全デバイス共通、セッション冒頭で1回実行):
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool true
これによりソフトウェアキーボードが表示されなくなり、日本語キーボードがスクショに映り込む問題を防止する。
iPhone 17 Proシミュレーターを起動し、ライトモードに設定:
xcrun simctl boot "iPhone 17 Pro" 2>/dev/null || true
xcrun simctl ui booted appearance light
4-2. アプリ起動 & Marionette接続
dart-mcp launch_app でアプリを起動:
root: /Users/k9i-mini/Workspace/ccpocket/apps/mobile
device: <iPhone 17 Pro の device ID>
起動後、dart-mcp list_running_apps でDTD URIを取得し、connect_dart_tooling_daemon で接続。
dart-mcp get_app_logs でVM Service URIを取得し、marionette connect で接続。
4-3. 各シナリオのスクショ撮影
テーマ設定: アプリ起動後、カスタムエクステンションでテーマを切り替える(01〜07はライトテーマ):
- marionette
call_custom_extension:ccpocket.setTheme/{ "theme": "light" } - 値:
light,dark,system
言語設定: 必要に応じてカスタムエクステンションで言語を切り替える:
- marionette
call_custom_extension:ccpocket.setLocale/{ "locale": "en" } - 値:
en,ja,zh,""(システムデフォルト)
選択された各シナリオに対して:
-
遷移: marionette
call_custom_extension- extension:
ccpocket.navigateToStoreScenario - params:
{ "scenario": "<シナリオ名>" }
- extension:
-
待機: 2-3秒(描画完了を待つ。New SessionやImage Attachなど複雑なUIは3秒推奨)
-
撮影:
bashxcrun simctl io booted screenshot apps/mobile/fastlane/screenshots/en-US/<key>.png -
戻る: marionette
call_custom_extension- extension:
ccpocket.popToRoot
- extension:
-
待機: 1秒(ルートへの遷移完了)
08_dark_theme の撮影: 01〜07撮影後、ccpocket.setTheme で dark に切り替え、Session List シナリオを撮影する。
4-4. アプリ停止
dart-mcp stop_app でアプリを停止。
シミュレーターはシャットダウンしない。次のデバイスの起動に進む。
Step 5: iPad スクリーンショット撮影(選択された場合)
Step 4と同じフローをiPadで実行。
5-1. iPadシミュレーターの全画面表示を保証
iPadでアプリが互換モード(iPhone用の小さいウィンドウ + 黒帯)で起動する場合がある。 これはシミュレーターのキャッシュが原因のため、撮影前にシミュレーターをリセットする:
# シミュレーターをシャットダウン(起動中の場合)
xcrun simctl shutdown "iPad Pro 13-inch (M4)" 2>/dev/null || true
# シミュレーターのコンテンツとキャッシュをリセット
xcrun simctl erase "iPad Pro 13-inch (M4)"
# 起動 & ダークモード設定
xcrun simctl boot "iPad Pro 13-inch (M4)" 2>/dev/null || true
xcrun simctl ui booted appearance dark
重要: erase を実行するとアプリもアンインストールされるため、必ずクリーンインストールが行われる。これにより互換モード問題を防止する。
ネイティブダイアログの自動dismiss: erase 後は通知・音声認識・マイク等のパーミッションダイアログが再度表示される。
事前権限付与 (erase 直後、アプリ起動前に実行):
xcrun simctl privacy booted grant notifications com.k9i.ccpocket
xcrun simctl privacy booted grant speech-recognition com.k9i.ccpocket
xcrun simctl privacy booted grant microphone com.k9i.ccpocket
これによりダイアログの表示自体を防止できる。simctl privacy が失敗する場合は以下のフォールバックを使う。
フォールバック: sim-tap.swift の dismiss-dialogs コマンド:
ダイアログはホーム画面ではなくセッション画面遷移後に表示されることがある。
最初のシナリオ遷移後にdismissし、必要なら撮り直す。
AX API でボタンが見つからない場合(特にiPad)、CGEvent ベースのクリックで自動フォールバックする:
swift .claude/skills/update-store/scripts/sim-tap.swift dismiss-dialogs ipad
swift .claude/skills/update-store/scripts/sim-tap.swift dismiss-dialogs iphone
従来の個別タップも引き続き使用可能:
while swift .claude/skills/update-store/scripts/sim-tap.swift tap "許可" 2>/dev/null; do sleep 1; done
5-2. スクショ撮影 & 解像度検証
撮影後、スクショの解像度がiPadのネイティブ解像度と一致するか検証する:
xcrun simctl io booted screenshot apps/mobile/fastlane/screenshots/en-US/ipad_<key>.png
# 解像度検証(互換モード検出)
WIDTH=$(sips -g pixelWidth apps/mobile/fastlane/screenshots/en-US/ipad_<key>.png | tail -1 | awk '{print $2}')
HEIGHT=$(sips -g pixelHeight apps/mobile/fastlane/screenshots/en-US/ipad_<key>.png | tail -1 | awk '{print $2}')
echo "Screenshot: ${WIDTH}x${HEIGHT}"
# iPad Pro 13-inch (M4): 2064x2752 が期待値
# 解像度が大幅に小さい場合は互換モードで起動しているため、eraseからやり直す
もし解像度が期待値と異なる場合は、flutter clean → flutter build ios --simulator でクリーンビルドしてやり直すこと。
5-3. アプリ停止
dart-mcp stop_app でアプリを停止。
シミュレーターはシャットダウンしない(compose.sh 実行や確認に支障はない)。
Step 6: スクリーンショット合成 & 配置
cd apps/mobile && bash fastlane/screenshots/compose.sh
このスクリプトが行うこと:
- iPhone/iPad の raw スクショにデバイスフレーム・テキストオーバーレイを追加
- en-US と ja の両方のframed画像を生成
fastlane/screenshots/store/へコピー(fastlane deliver用)fastlane/metadata/android/へコピー(Google Play用)docs/images/screenshots.pngを更新(READMEバナー)
Step 7: 確認
# 生成画像の確認
ls -la apps/mobile/fastlane/screenshots/store/en-US/
ls -la apps/mobile/fastlane/screenshots/store/ja/
# 変更ファイル一覧
git diff --stat
シナリオ名 ↔ ファイルキー対応表
| シナリオ名(extension引数) | ファイルキー(スクショファイル名) | テーマ |
|---|---|---|
| Session List (Recent) | 01_session_list |
ライト |
| Session List | 02_approval_list |
ライト |
| Multi-Question Approval | 03_multi_question |
ライト |
| Markdown Input | 04_markdown_input |
ライト |
| Image Attach | 05_image_attach |
ライト |
| Git Diff | 06_git_diff |
ライト |
| New Session | 07_new_session |
ライト |
| Session List | 08_dark_theme |
ダーク |
注意事項
- New Session シナリオ: ボトムシートが
addPostFrameCallbackで自動表示されるため、3秒待機推奨 - Markdown Input シナリオ: DraftServiceで入力欄にテキストが事前セットされる。キーボードは非表示のまま撮影すること(
ConnectHardwareKeyboardを有効化済み) - Image Attach シナリオ: モック画像が自動的に添付される
- シミュレーターデバイス名: Xcode バージョンにより正確な名前が異なる場合がある。
xcrun simctl list devices availableで確認 - compose.sh: ImageMagick (
convert/magick) が必要。PNGタイムスタンプを除去して不要なgit diffを防止
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
triage
GitHub Issue・PRのトリアージ。番号を渡すと、要望の要約・実現難易度・既存機能との重複チェック・対応判断を調査してレポートする。Issue/PRの番号が出てきたとき、トリアージ、優先度判断、対応判断と言われたときに使用する。
self-review
タスク完了前のセルフレビュー。Claude subagentで別コンテキストから客観的にコード変更を検証。
release-bridge
Bridge Server のリリース(バージョンbump + CHANGELOG + タグ → GH Actions で npm publish)
flutter-upgrade
Flutter SDKバージョンアップグレード対応。新バージョンのリリースノート・Breaking Changes調査、コードベース影響分析、mise/CI/Shorebird含むプロジェクト全体の対応タスクリスト作成と実行。「Flutterアップグレード」「Flutter X.Y.Zがリリースされた」「Flutter最新化」「Flutter更新」と言われたとき、またはFlutterの新バージョンについて言及されたときに使用する。
flutter-ui-design
Flutter UI実装のアーキテクチャ規約・コンポーネント分割・状態管理ガイド(Bloc/Cubit版)
test-bridge
Bridge Server (TypeScript) のテスト実行・型チェック・テスト記述ガイド
Didn't find tool you were looking for?