summaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
context:
space:
mode:
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md55
1 files changed, 55 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..39fde4e
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,55 @@
+# 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 を再起動する。