11 KiB
11 KiB
Cursor / AI エージェント向け 作業依頼プロンプトテンプレート
このファイルをコピーして Cursor に貼り付けてください。 タスクを1つずつ渡すことで、確実に実装が進みます。
【必須】全タスク共通の前置き
まず AI_MASTER_ROADMAP.md を読んでください。
特に「4. 開発ルール」のハードコード色の例外一覧を必ず確認してから作業を開始してください。
作業完了後は必ず以下を実行・報告してください:
1. flutter analyze を実行してエラーが0件であることを確認
2. 変更したファイルの一覧と変更概要を報告
タスク別プロンプト
🟥 v1.0.16-A: onboarding_dialog.dart のハードコード色修正
まず AI_MASTER_ROADMAP.md を読んでください。
【タスク】
lib/widgets/onboarding_dialog.dart の以下2箇所を修正してください:
- 113行目付近: Colors.grey → appColors.textSecondary
- 136行目付近: Colors.grey[300] → appColors.textSecondary
【注意】
- 同ファイル内の Colors.black.withValues(alpha:...) はシャドウのため変更禁止
- AppColors は Theme.of(context).extension<AppColors>()! で取得すること
【完了条件】
flutter analyze でエラー0件
🟥 v1.0.16-B: pending_analysis_screen.dart のハードコード色修正
まず AI_MASTER_ROADMAP.md を読んでください。
【タスク】
lib/screens/pending_analysis_screen.dart の色を以下の方針で修正してください:
変更対象(appColorsに置換):
- Colors.red (エラーテキスト・アイコン) → appColors.error
- Colors.green.shade400 (成功アイコン) → appColors.success
変更禁止(意図的なハードコード・AI_MASTER_ROADMAP.mdの例外一覧参照):
- Colors.grey.shade400 (disabledBackgroundColor) → Material Design標準のため維持
- Colors.grey.shade300 (プレースホルダー背景) → プレースホルダー標準色のため維持
- Colors.white (画像オーバーレイ) → カメラUI要件のため維持
- Colors.black.withValues(alpha:...) → シャドウのため維持
【完了条件】
flutter analyze でエラー0件
🟧 v1.0.16-C: sake_detail_screen.dart から _PhotoEditModal を分離
まず AI_MASTER_ROADMAP.md と FILE_SPLIT_RECOMMENDATIONS_v1.0.16.md を読んでください。
【タスク】
lib/screens/sake_detail_screen.dart の末尾にある _PhotoEditModal クラス(約266行)を
新規ファイル lib/screens/sake_detail/widgets/sake_photo_edit_modal.dart に切り出してください。
方針:
- StatefulWidget として独立させる
- 元の sake_detail_screen.dart からは import して呼び出す形にする
- Widget のシグネチャ(引数)は変えない
- ディレクトリ lib/screens/sake_detail/widgets/ を新規作成する
【完了条件】
- flutter analyze でエラー0件
- アプリの挙動が変わらないこと(写真編集モーダルが正常に開くこと)
🟧 v1.0.16-D: sake_detail_screen.dart から SakeMBTIStampSection を分離
まず AI_MASTER_ROADMAP.md と FILE_SPLIT_RECOMMENDATIONS_v1.0.16.md を読んでください。
【タスク】
lib/screens/sake_detail_screen.dart 内の MBTI スタンプセクション(約187行)を
新規ファイル lib/screens/sake_detail/sections/sake_mbti_stamp_section.dart に切り出してください。
方針:
- ConsumerWidget として独立させる
- 必要な引数(SakeItem など)はコンストラクタで受け取る
- 元ファイルは import して使用する形にする
【完了条件】
flutter analyze でエラー0件
🟨 v1.0.16-E: 基本テストの追加
まず AI_MASTER_ROADMAP.md を読んでください。
【タスク】
以下の2つのテストファイルを新規作成してください:
1. test/models/sake_item_test.dart
- SakeItem の toJson() / fromJson() ラウンドトリップテスト
- name, brewery, tasteStats フィールドの正確性確認
2. test/services/analysis_cache_service_test.dart
- computeImageHash() が同じ入力に対して同じハッシュを返すこと
- _normalizeBrandName() のスペース除去・小文字化の確認
【完了条件】
flutter test でテストがすべてパスすること
flutter analyze でエラー0件
🟩 v1.1.0-A: チャート手動編集機能
まず AI_MASTER_ROADMAP.md を読んでください。
【タスク】
sake_detail_screen.dart の五味チャートセクションに、
ユーザーが AI 生成値を手動で微調整できる機能を追加してください。
仕様:
- 編集ボタン(鉛筆アイコン)をチャートの右上に配置
- タップするとスライダー付きの編集モーダルが開く
- 5軸(香り/甘み/酸味/キレ/コク)それぞれを 0〜5 の範囲で調整可能
- 保存時は SakeItem.tasteStats を更新し Hive に永続化
- キャンセルで元の値に戻る
- UI は AppColors を使用すること(ハードコード色禁止・例外一覧参照)
【完了条件】
flutter analyze でエラー0件
チャートの値が実際に変わりアプリ再起動後も保持されること
🔵 Synology Proxy 構築(SSH全自動)
以下の手順でSynology NAS上にGemini APIプロキシサーバーを構築してください。
Agentとして自律的に進め、不明な情報は最初にまとめて質問してください。
【事前確認】作業開始前に以下を私に確認してください:
1. SynologyのSSHユーザー名 (例: admin, maita など)
2. SynologyのTailscale IP (NASのターミナルで `tailscale ip -4` を実行すると確認できます)
3. Gemini APIキー (lib/secrets.local.dart の geminiApiKey の値)
【タスク】
上記の情報が揃ったら、以下を順番に実行してください:
Step 1: SSH接続確認
ターミナルで以下を実行し、接続できることを確認する:
ssh [ユーザー名]@[TailscaleIP] "echo 'SSH OK'"
Step 2: プロキシ用ディレクトリ作成
ssh [ユーザー名]@[TailscaleIP] "mkdir -p /docker/ponshu_proxy"
Step 3: ファイル転送
以下の3ファイルをSCPでNASに転送する:
scp tools/proxy/server.js [ユーザー名]@[TailscaleIP]:/docker/ponshu_proxy/
scp tools/proxy/package.json [ユーザー名]@[TailscaleIP]:/docker/ponshu_proxy/
scp tools/proxy/Dockerfile [ユーザー名]@[TailscaleIP]:/docker/ponshu_proxy/
Step 4: Dockerイメージのビルド
ssh [ユーザー名]@[TailscaleIP] "cd /docker/ponshu_proxy && docker build -t ponshu-proxy:latest ."
Step 5: 既存コンテナの停止・削除(再構築時のみ)
ssh [ユーザー名]@[TailscaleIP] "docker rm -f ponshu-proxy-server 2>/dev/null || true"
Step 6: コンテナ起動
ssh [ユーザー名]@[TailscaleIP] "docker run -d \
--name ponshu-proxy-server \
--restart unless-stopped \
-p 8080:8080 \
-e GEMINI_API_KEY='[APIキー]' \
-e DAILY_LIMIT=50 \
-e PORT=8080 \
ponshu-proxy:latest"
Step 7: 動作確認
curl http://[TailscaleIP]:8080/health
→ "OK" が返れば成功
Step 8: Flutter側の設定更新
lib/secrets.local.dart を以下のように更新する:
- aiProxyBaseUrl を "http://[TailscaleIP]:8080" に変更
- useProxy を true に変更
Step 9: 完了報告
以下を報告してください:
- 各Stepの実行結果
- コンテナが正常起動しているか (docker ps の出力)
- healthチェックの結果
- secrets.local.dart の変更内容
【注意事項】
- Tailscale経由のためVPN(Tailscale)が接続中でないとアクセスできない
- DAILY_LIMIT=50 は後から変更可能(コンテナ再起動で反映)
- APIキーはStep 6実行前にCursorのターミナルには表示されない形で入力すること
【完了条件】
- curl http://[TailscaleIP]:8080/health → "OK"
- flutter analyze でエラー0件
🔵 Synology Proxy 動作確認・再起動(構築済みの場合)
Synology上のponshu-proxyコンテナの状態を確認・必要なら再起動してください。
【事前確認】
1. SynologyのSSHユーザー名
2. SynologyのTailscale IP
【タスク】
Step 1: コンテナ状態確認
ssh [ユーザー名]@[TailscaleIP] "docker ps -a | grep ponshu-proxy"
Step 2: ヘルスチェック
curl http://[TailscaleIP]:8080/health
Step 3: ログ確認(問題がある場合)
ssh [ユーザー名]@[TailscaleIP] "docker logs ponshu-proxy-server --tail 50"
Step 4: 再起動(必要な場合)
ssh [ユーザー名]@[TailscaleIP] "docker restart ponshu-proxy-server"
結果を報告してください。
カラー使用ルール(クイックリファレンス)
✅ 使用すべきもの
final appColors = Theme.of(context).extension<AppColors>()!;
appColors.textPrimary // メインテキスト
appColors.textSecondary // サブテキスト・ヒント
appColors.textTertiary // 薄いテキスト
appColors.brandPrimary // ブランドカラー(ボタン等)
appColors.brandAccent // アクセントカラー
appColors.error // エラー表示(Colors.red の代替)
appColors.success // 成功表示(Colors.green の代替)
appColors.warning // 警告表示
appColors.surfaceElevated // カード背景
appColors.surfaceSubtle // 薄い背景
appColors.divider // 区切り線
❌ 変更禁止のハードコード色
camera_screen.dart 全体
→ Colors.white / black / white54 / transparent
→ 理由: カメラUIはテーマ非依存で視認性確保が必須
pending_analysis_screen.dart:387
→ Colors.grey.shade400 (disabledBackgroundColor)
→ 理由: Material Design の disabled ボタン標準
pending_analysis_screen.dart:341
→ Colors.grey.shade300 (プレースホルダー背景)
→ 理由: 画像未選択状態の標準色
main_screen.dart:65
→ Colors.grey.shade400 (Pro機能ロックアイコン)
→ 理由: 無効化状態の意図的な灰色表現
各所の boxShadow
→ Colors.black.withValues(alpha: ...)
→ 理由: シャドウは黒固定が自然
トラブルシューティング
flutter analyze でエラーが出た場合
AI_MASTER_ROADMAP.md を再度確認し、以下をチェックしてください:
1. AppColors のプロパティ名が正しいか(lib/theme/app_colors.dart を参照)
2. ConsumerWidget を使っているか
3. ハードコード色の例外一覧に該当していないか
エラーメッセージを貼り付けて修正してください。
巨大ファイル (sake_detail_screen.dart) を編集する場合
1872行あるため、一度に全体を把握しようとしないこと。
対象のクラス・メソッドの範囲だけをピンポイントで読み込み編集すること。
最終更新: 2026-02-13