# CLAUDE.md ## 概要 バンドとアーティストの情報管理サイト。React Router v7 (SSR) + SQLite + Tailwind CSS v4。 ## コマンド ```bash npm run dev # 開発サーバー (http://localhost:5173) npm run build # プロダクションビルド npm run typecheck # react-router typegen + tsc ``` ## 重要ファイル - `app/lib/db.server.ts` — DB 接続・スキーマ初期化・全 CRUD 関数 - `app/routes.ts` — ルート定義 - `app/root.tsx` — ルートレイアウト (nav バー含む) - `app/routes/` — 各ページのルートファイル ## DB スキーマ SQLite (`whois.db`)。テーブル: `bands`, `band_links`, `artists`, `artist_links`, `band_artists`, `band_revisions`, `artist_revisions`。 - バンドとアーティストは N:M 関係 (`band_artists` 中間テーブル) - 編集のたびに `*_revisions` テーブルに JSON スナップショット + 更新メッセージ + IP を記録 ## ルートファイルの命名 `routes.ts` で明示的に設定しているため、ファイル名はルート構造と無関係。 | ファイル | URL | |---|---| | `band-by-uuid.tsx` | `/bands/of/:uuid` | | `band-by-slug.tsx` | `/bands/named/:slug` (UUID へリダイレクト) | | `band-new.tsx` | `/bands/new` | | `band-edit.tsx` | `/bands/of/:uuid/edit` | | `band-history.tsx` | `/bands/of/:uuid/history` | | artist 系も同様 | `/artists/...` | ## コーディング規約 - `loader` / `action` のみ `~/lib/db.server` をインポートする (クライアントバンドルに含めないため) - フォームの動的フィールド (リンク・メンバー) は React `useState` で管理し、hidden input に JSON シリアライズして送信 - slug は自動生成 (バンド名/アーティスト名から) かつ手動上書き可能 - IP アドレスは `x-forwarded-for` → `x-real-ip` の順で取得 (nginx リバースプロキシ環境) ## デプロイ ```bash git push hetzner master ``` `server-setup.sh` で設定した post-receive フックが自動で `npm ci && npm run build` して PM2 を再起動する。