322 lines
11 KiB
Markdown
322 lines
11 KiB
Markdown
|
|
# 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"
|
|||
|
|
|
|||
|
|
結果を報告してください。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## カラー使用ルール(クイックリファレンス)
|
|||
|
|
|
|||
|
|
### ✅ 使用すべきもの
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
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
|