diff options
| author | yyamashita <yyamashita@mosquit.one> | 2026-05-09 00:27:19 +0900 |
|---|---|---|
| committer | yyamashita <yyamashita@mosquit.one> | 2026-05-09 00:27:19 +0900 |
| commit | b8d24d292d99c8da285092ce923b5e2b546d8f45 (patch) | |
| tree | c8cde36d7a109dd8eb75b62a6aefd81e80d1f5ee /CLAUDE.md | |
| parent | 859e6d8ed530daac1180c7b03182d9389be084dc (diff) | |
Implement band/artist management with version history
Full CRUD for bands and artists: UUID + slug URLs, dynamic link
editor, band-artist associations with roles, per-edit revision
snapshots (message + IP). Add README and CLAUDE.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'CLAUDE.md')
| -rw-r--r-- | CLAUDE.md | 55 |
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 を再起動する。 |
