10 KiB
10 KiB
開発エージェント向け指示
適用順序
このリポジトリでは、次の優先順位で判断してください。
- ユーザーの明示的な依頼と安全上の制約
- 実際の
package.json、yarn.lock、app.json、既存コードの現在の構成 - この
AGENTS.mdにあるJR四国アプリ固有のガードレール .agents/skills/animate-expo/にある外部Skillの一般的な設計指針
Skillの例や推奨と実際のプロジェクト構成が衝突する場合は、アプリの構成とこのファイルを優先してください。互換性が不明な場合は、依存関係やnavigationを変更せず、まず現在のバージョンで利用可能なAPIを確認してください。
animate-expo Skill
- Expo / React Nativeのanimation、gesture、sheet、screen transition、press feedback、hapticsを実装またはレビューするときは、まず
.agents/skills/animate-expo/SKILL.mdを読み、該当する場合はRECIPES.mdも読みます。 - これは開発エージェント向けのinstruction-only Skillです。アプリのruntime依存関係ではありません。Skill内のインストール例を理由に、依存関係、native設定、Babel設定、navigationを自動変更しないでください。
- 導入元は emilkowalski/skills の
animate-expo、確認時点の固定コミットはd23d7f88a2e21c9e4b1418c7abe420f5c1052ba7(2026-08-29)です。今回導入するSkillはanimate-expoの2ファイルだけです。 animate、ask-sonner、pick-ui-libraryなど他のSkillは、このリポジトリへ導入済みとは扱いません。
現在の構成(current valuesは正本から確認)
- 現行の主要世代は Expo SDK 57、React Native 0.86系、React 19系です。patch/minorをこのファイルへ固定せず、正確な値は
package.jsonとyarn.lockから確認してください。 - Reanimated、Worklets、Gesture Handlerなどのnative依存も、宣言値は
package.json、解決値はyarn.lockを正本とします。 - Expo Routerは未導入です。現行はReact Navigation 7(
NavigationContainer、bottom tabs、stack)を直接構成しています。 - Expo SDK 57 / React Native 0.86ではNew Architectureが既定です。現在の
app.jsonにnewArchEnabledの明示設定はありません。 - ルートの
App.tsxには既にGestureHandlerRootViewがあります。 babel.config.jsには既存のbabel-preset-expoとreact-native-reanimated/pluginの設定があります。既存設定をSkillの説明だけで置き換えないでください。expo-hapticsは依存していますが、ソースコードでのruntime使用は確認できていません。依存の正確なversionは正本から確認してください。
animate-expo導入時のHistorical note
animate-expo Skill導入時に参照したSDK・依存関係の基準は過去の検証記録です。現在のversionを示すものではなく、現在値は必ず package.json / yarn.lock を確認してください。
Source of truth
- Expo、React、React Native、Reanimated、Worklets、その他の依存関係は、宣言値を
package.json、解決値をyarn.lockで確認する。AGENTS.mdへpatch/minor versionを転記して正本にしない。 - app version、iOS build number、Android versionCode、runtimeVersion、permission、entitlement、target、config pluginは
app.jsonを確認する。 - EAS profile、distribution、channel、environmentは
eas.jsonを確認する。 - 実際に配布されたbinary、runtime、channel、Update、audienceは、確認日付きのEAS CLI / EAS Dashboard観測を正本とする。リポジトリ設定からlive状態を推測しない。
JR四国アプリ固有のanimation / compatibilityガードレール
- animationは目的ではなくUX改善の手段です。頻度、目的、情報理解への効果を確認し、不要なら追加しないでください。
- 100回/日以上使う操作(タブ切替、スクロール、設定toggle、頻繁なデータ更新)に目立つanimationを追加しないでください。列車走行位置、運行情報、駅・列車データの更新や表示をanimationで遅延させないでください。
- Reduced Motion / accessibilityを考慮し、translation、scale、parallax、overshootを含むanimationにはシステム設定に応じた低減経路を用意してください。既存のfont scaling制御もanimation導入のついでに変更しないでください。
- gesture / scrollのframeごとにReactの
setState、RN runtimeへのcallback、hapticsを実行しないでください。JS threadを不要にブロックせず、連続値はUI runtime側で処理します。 - 高頻度更新UIでは再レンダリング、worklet、layout pass、メモリ、WebView負荷を確認し、animationを足す前後で体感と計測を比較してください。
- 既存のReanimated、core
Animated、LayoutAnimation、WebView内CSS animationは、それぞれの互換性・用途を確認せず一括移行しないでください。特に既存のcoreAnimatedやrunOnJS/.valueの書き換えは別タスクとして扱います。 - 新規のgesture / scroll連動の連続animationでは、現在のReanimated / Gesture HandlerのAPIを確認してUI thread駆動を優先します。現在のGesture Handlerはv2系なので、Skillのv3専用APIへ移行しないでください。
- 既存のキーボード回避実装(
lib/useKeyboardAvoid.ts)は、iOS/Androidのタイミング対策を含む保護された挙動です。react-native-keyboard-controllerの追加や置き換えは、明示的な別依頼と実機検証なしに行わないでください。 - 既存のnavigation設定とクラッシュ回避策を壊さないでください。とくに
App.tsxのnative screens設定、lib/stackOption.tsのAndroid stack animation無効化、WebViewのライフサイクル制御をanimation改善だけで変更しないでください。 - Expo Routerへの移行、native tabs /
formSheet/Link.Menuの導入、navigationの大規模変更は今回のSkill適用範囲外です。 - Expo SDK、React Native、Reanimatedのmajor version、New Architecture、既存navigationを、UI改善やSkill適用だけを理由に変更しないでください。新しい依存関係を追加する場合は、明示的な依頼と現在のSDKに対する互換性確認が必要です。
- 画面遷移は既存のReact Navigation構成とプラットフォーム別設定を基準にし、既存のAndroid
animationEnabled: falseをSkillのRouter例で上書きしないでください。 - hapticsは必要なユーザー操作に限り、視覚的なfeedbackの代替ではなく補助として1操作1回までにしてください。現在
expo-hapticsは依存済みですが、今回の導入で使用箇所を新設しないでください。
変更範囲
animate-expo Skill導入時の変更範囲は、上記Skillファイルとこの AGENTS.md だけでした。各タスクの変更範囲は、現在のユーザー依頼と対象ファイルを基準に決め、未依頼のアプリコード、Expo設定、dependencies、lockfile、native treeを変更しないでください。
Phase 0〜1.5で確定した恒久アーキテクチャルール
- React Navigationを、明示的な依頼なしにExpo Routerへ移行しない。
- Navigation workaroundを削除・変更する前に、git historyと回帰テストを確認する。
- API responseをScreenから直接長期保持しない。通信・parser・domain adapterの境界を通し、Screenは必要な表示状態だけを購読する。
station numberをPhysical Stationのcanonical IDとして新規利用しない。Physical Station、Station Stop、Station Numberを分離する。- 列車番号だけを長期的なcanonical train identityとして新規利用しない。少なくともService Date、line、sourceを組み合わせる。
- Native code、local module、target、config plugin、permission、entitlementの変更時は、OTA互換性を確認する。
- Native変更を含む場合は、runtimeVersionと対象binary/buildの互換性を確認してからreleaseする。
- 既存fallback APIを、代替経路と観測・回帰確認なしに削除しない。
- pollingやsource切替のrequestは所有者を一つにし、in-flight重複、late response、unmount後のcommitを防ぐ。
- 24時台・25時台などの鉄道時刻をJavaScript
Dateだけで表現しない。Calendar Date、Service Date、Wall Clock Time、Service Minuteを分離する。 - release/runtimeの現在値は
app.json、eas.json、package manifest/lockfile、EASの実測を確認する。現在のversionをskillの恒久ルールへ固定しない。 - architecture/domainの契約変更は、
docs/architecture/とpure fixture testを先に更新し、全データ移行を同じ変更へ混ぜない。
Network transport policy
- 現在の通信baselineは標準の
fetchです。Nitro Fetch用のdependency、runtime code、共通transport実装は現行treeにありません。 react-native-nitro-fetch/react-native-nitro-modulesはSDK57で別branch・別binaryの検証を行いましたが、Nitro経路を有効にしたiOS/Android双方で起動時クラッシュを確認したため、7.2では採用しませんでした。- Nitro Fetchを明示的な新規検証依頼なしに再導入しないでください。過去の検証文書はactive roadmapではなく、historical experiment recordとして扱います。
- これは永久禁止ではありません。library、Expo、React Native側の互換性が変わり、クラッシュ原因を隔離できる専用検証を行える場合に限り、標準fetchをbaselineとして別branch・別binaryで再評価します。
Git運用
- ブランチを
developへ統合するときは、原則として明示的なマージコミットを作成する。git merge --no-ffを使用し、fast-forwardだけで統合しない。 - マージ前に対象ブランチ、ベースコミット、作業ツリーの状態を確認し、既存の変更履歴をrebaseやsquashで書き換えない。