summaryrefslogtreecommitdiff
path: root/CLAUDE.md
blob: 39fde4e18bba8aab4bd179cf0317bb5cb4670677 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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 を再起動する。