frontend-workflow
web/(React + TypeScript + Vite フロントエンド)実装時に守る規約と検証手順。新規コンポーネント・hook・API連携・UI変更を行う際に必ず使う。
SKILL.md.claude/skills/frontend-workflow/SKILL.md
GitHubフロントエンド実装ワークフロー(web/)
ディレクトリ構成
web/src/
components/
screener/ 株式スクリーニング画面
watchlist/ ウォッチリスト・銘柄詳細(チャート含む)
portfolio/ ポートフォリオ
market/ マーケットレポート・為替
chat/ AIチャット(企業分析・一般質問の入り口)
common/ 画面横断の共通コンポーネント
hooks/ 画面ごとの状態管理フック(useScreener / useMarket 等)
api/client.ts バックエンドAPI呼び出しの一箇所集約
types/api.ts バックエンド(Pydantic/TypedDict)に対応する型定義
utils/ フォーマット等の純粋関数
状態管理パターン
画面の状態・API呼び出しは hooks/useXxx.ts に閉じ込め、components/ 側は
表示に専念させる(useMarket.ts・
useScreener.ts が実例)。新規画面も
このペアリング(useXxx フック + 表示コンポーネント)に合わせる。
- Job非同期パターン: バックエンドが
services/jobs経由の非同期処理を返す エンドポイントは、create*Job()→job_idを受けてgetJob(job_id)を 一定間隔でポーリング →status: 'done' | 'error'で終了、という形を踏襲する (useMarket.tsのgenerateReportが実例)。進捗表示は既存のAgentProgressコンポーネント(chat/AgentProgress.tsx)を再利用する。 - 競合状態への注意: 非同期処理中に別の操作(画面遷移・別リクエスト)で
上書きされないよう、
runIdRefのような「現在実行中の処理か」を判定する ref パターンを使う(useMarket.tsを参照)。setState は次のレンダーまで 反映されないため、同一関数内で直後に最新値を参照したい場合は state ではなく ref のミラーを見る。 - 部分更新: 一覧・辞書状態(
Record<string, T>)の1エントリだけ更新する ときはpatchXxxのようなヘルパを用意し、スプレッドで浅いマージをする。
型
types/api.ts はバックエンドのPydantic(API境界)/TypedDict(内部状態)に
1:1で対応させる。バックエンド側の型を変更した場合、レスポンス形が変わって
いないか(フィールド追加・nullable化等)を確認してから types/api.ts を
更新する。
検証手順(完了前に必ず実行)
web/ ディレクトリで:
npm run lint # eslint
npm run build # tsc -b && vite build(型チェック含む)
開発サーバでの動作確認: npm run dev(:5173、/api を :8000 のバックエンドに
プロキシ)。バックエンドは EXTERNAL_API_MODE=mock で起動していればネット
ワーク非依存で確認できる。
完了時
作業が一区切りついたら git-workflow スキルに従い commit + push まで行う。