|
1 | 1 | # AGENTS Guide (vuefes-japan-speakers) |
2 | 2 |
|
3 | | -このドキュメントは、エージェントや貢献者が本リポジトリで効率よく作業するための実務ガイドです。セットアップ、構成、一般的なタスクの手順、テスト/デプロイの流れを簡潔にまとめています。 |
| 3 | +このドキュメントは、本リポジトリで作業するエージェントや貢献者向けの実務ガイドです。セットアップ、構成、よくある変更、検証、デプロイの要点をまとめています。 |
4 | 4 |
|
5 | 5 | ## プロジェクト概要 |
6 | 6 |
|
7 | 7 | - フレームワーク: Nuxt 4(Vue 3) |
8 | | -- 目的: 歴代の Vue Fes Japan スピーカー一覧を表示 |
9 | | -- UI/スタイル: Tailwind CSS 4(カスタムコンポーネント中心) |
10 | | -- データ供給: Nuxt サーバルート(`server/api`)から年別データを返却 |
| 8 | +- 目的: 歴代の Vue Fes Japan スピーカーと発表タイトルを一覧できる非公式アーカイブ |
| 9 | +- UI/スタイル: Nuxt UI 4 + Tailwind CSS 4 + カスタムコンポーネント |
| 10 | +- データ供給: Nuxt サーバルート(`server/api`)から年別・全件データを返却 |
| 11 | +- デプロイ: NuxtHub / Cloudflare 系の設定を利用 |
11 | 12 |
|
12 | 13 | ## 前提・セットアップ |
13 | 14 |
|
14 | | -- 推奨: Node.js LTS, pnpm(`packageManager: pnpm@10.33.1`) |
15 | | -- 依存関係のインストール: |
| 15 | +- 推奨: Node.js LTS。CI は Node.js 24 で動作します。 |
| 16 | +- パッケージマネージャー: `pnpm@10.33.2`(`package.json` の `packageManager` を参照) |
| 17 | +- このリポジトリでは Vite+(`vp`)経由の操作を基本にします。 |
16 | 18 |
|
17 | 19 | ```bash |
18 | | -pnpm install |
| 20 | +curl -fsSL https://vite.plus | bash |
| 21 | +vp install |
| 22 | +vp config |
19 | 23 | ``` |
20 | 24 |
|
21 | | -## よく使うスクリプト |
| 25 | +`vp install` は `packageManager` を見て依存関係を入れます。`vp config` は `vite.config.ts` の設定を反映します。通常は install 時にも実行されますが、生成設定や Vite+ 設定を変更した場合は手動で実行してください。 |
22 | 26 |
|
23 | | -- 開発サーバ: `pnpm dev` |
24 | | -- ビルド: `pnpm build` |
25 | | -- 静的生成: `pnpm generate` |
26 | | -- プレビュー: `pnpm preview` |
27 | | -- 型チェック: `pnpm vp:check` |
28 | | -- Lint: `pnpm vp:lint` |
29 | | -- フォーマット: `pnpm vp:fmt` |
30 | | -- テスト(全件): `pnpm vp:test` |
31 | | -- テスト(監視): `pnpm vp:test:watch` |
| 27 | +## よく使うコマンド |
| 28 | + |
| 29 | +| 用途 | 推奨コマンド | npm script | |
| 30 | +| --- | --- | --- | |
| 31 | +| 開発サーバ | `vp run dev` | `pnpm dev` | |
| 32 | +| ビルド | `vp run build` | `pnpm build` | |
| 33 | +| 静的生成 | `vp run generate` | `pnpm generate` | |
| 34 | +| プレビュー | `vp run preview` | `pnpm preview` | |
| 35 | +| Lint | `vp lint .` | `pnpm vp:lint` | |
| 36 | +| Format | `vp fmt .` | `pnpm vp:fmt` | |
| 37 | +| Format 確認 | `vp fmt . --check` | - | |
| 38 | +| Type Check | `vp check` | `pnpm vp:check` | |
| 39 | +| Test | `vp test run` | `pnpm vp:test` | |
| 40 | +| Test(watch) | `vp test` | `pnpm vp:test:watch` | |
| 41 | + |
| 42 | +作業前後の検証は、変更内容に応じて `vp lint .`、`vp fmt . --check`、`vp check`、`vp test run` を組み合わせます。 |
32 | 43 |
|
33 | 44 | ## ディレクトリ構成(要点) |
34 | 45 |
|
35 | 46 | - `app/` |
36 | | - - `pages/` ページ |
37 | | - - `components/` UI コンポーネント |
38 | | - - `composables/` アプリ用のロジック(`useVfjsI18n`, `useColorScheme`, `speaker` など) |
39 | | - - `utils/` ユーティリティ関数 |
40 | | - - `assets/css/main.css` グローバル CSS・カラートークン定義 |
| 47 | + - `app.vue`: ルート、SEO、フォント、アイコンなどの共通設定 |
| 48 | + - `pages/`: トップ、年別一覧、スピーカー詳細ページ |
| 49 | + - `components/`: ヘッダー、フッター、マストヘッド、一覧・タイムライン、フィルタ UI |
| 50 | + - `composables/`: `useVfjsI18n`、`useColorScheme`、スピーカー取得・絞り込みロジック |
| 51 | + - `utils/`: 年判定、文字列ソート、スピーカー集約などのユーティリティ |
| 52 | + - `assets/css/main.css`: Tailwind 読み込み、フォント、カラートークン、フォーカススタイル |
41 | 53 | - `server/` |
42 | | - - `api/` API ルート |
43 | | - - `data/` 年別スピーカーデータ(`speakers-YYYY.ts` とインデックス) |
44 | | -- `public/` 静的ファイル |
45 | | -- `nuxt.config.ts` Nuxt 設定ファイル |
46 | | -- `eslint.config.mjs`, `vitest.config.ts`, `tsconfig.json` ツール設定 |
| 54 | + - `api/`: `/api/speakers` と `/api/speakers/[year]` |
| 55 | + - `data/`: 年別スピーカーデータと集約ロジック |
| 56 | +- `types/`: `SpeakerInfo`、`SpeakerWithYear`、`YEARS` などの共有型 |
| 57 | +- `public/`: ロゴ、favicon、OG 画像などの静的ファイル |
| 58 | +- `pnpm-workspace.yaml`: catalog と依存バージョンの定義 |
| 59 | +- `vite.config.ts`: Vite+ の lint / staged 設定 |
| 60 | +- `vitest.config.ts`: Nuxt テスト環境と happy-dom 設定 |
| 61 | +- `nuxt.config.ts`: Nuxt モジュール、Nitro、NuxtHub、ESLint 設定 |
47 | 62 |
|
48 | 63 | ## API とデータ |
49 | 64 |
|
50 | | -- 一覧: `server/api/speakers.ts` |
| 65 | +- 全件: `server/api/speakers.ts` |
51 | 66 | - 年別: `server/api/speakers/[year].ts` |
52 | | -- データ源: `server/data/` 配下に `speakers-2018.ts` ~ `speakers-2025.ts` などを配置し、`server/data/index.ts` から集約・エクスポートします。 |
| 67 | +- データ源: `server/data/speakers-YYYY.ts` |
| 68 | +- 集約: `server/data/index.ts` |
| 69 | +- 有効年: `types/index.ts` の `YEARS` |
| 70 | + |
| 71 | +現在の有効年は `2018`、`2019`、`2022`、`2023`、`2024`、`2025` です。2020 年と 2021 年は含まれていません。 |
53 | 72 |
|
54 | | -### 変更に伴う確認ポイント: |
| 73 | +### 新しい開催年を追加するとき |
55 | 74 |
|
56 | | -- 新しい年を追加したら、API のレスポンスが期待通りかテストで検証(`server/api/speakers/[year].test.ts` など)。 |
57 | | -- UI 側で年選択や一覧表示が反映されるか(`app/utils/years.ts`, `YearFilterBar.vue`)を確認。 |
| 75 | +- `server/data/speakers-YYYY.ts` を作成し、`SpeakerInfo[]` に沿ってデータを定義する。 |
| 76 | +- `server/data/index.ts` に import と `speakersByYear` のエントリを追加する。 |
| 77 | +- `types/index.ts` の `YEARS` に年を追加する。UI の年表示はこの値を参照します。 |
| 78 | +- `server/api/speakers/[year].test.ts` の有効年・エラーメッセージ期待値を更新する。 |
| 79 | +- 必要に応じて `README.md` の参考リンクも更新する。 |
| 80 | +- `/`、`/[year]`、`/speakers/[name]` で表示とリンクを確認する。 |
58 | 81 |
|
59 | 82 | ## UI/ページの要点 |
60 | 83 |
|
61 | 84 | - ルーティング: |
62 | | - - `app/pages/[year]/index.vue` 年別一覧ページ |
63 | | - - `app/pages/speakers/[name]/index.vue` スピーカー詳細/個別ページ |
64 | | -- コンポーネント: |
65 | | - - `AppHeader.vue` ナビゲーション・言語切替・カラースキーム切替 |
66 | | - - `AppMasthead.vue` / `AppFooter.vue` ページ共通ヘッダ・フッタ |
67 | | - - `DirectoryView.vue` 全スピーカー一覧(開示行で年バッジ表示) |
68 | | - - `ChronicleView.vue` 年別タイムライン表示 |
69 | | - - `SpeakerFilterBar.vue` / `YearFilterBar.vue` フィルタ UI |
70 | | -- スタイル: Tailwind CSS 4 ユーティリティ + CSS カスタムプロパティ(`var(--paper)`, `var(--ink)`, `var(--accent)` 等) |
| 85 | + - `app/pages/index.vue`: 全体ビュー。タイムライン表示と一覧表示を切り替えます。 |
| 86 | + - `app/pages/[year]/index.vue`: 年別一覧ページ |
| 87 | + - `app/pages/speakers/[name]/index.vue`: スピーカー詳細ページ |
| 88 | +- 主要コンポーネント: |
| 89 | + - `AppHeader.vue`: ナビゲーション、言語切替、配色切替 |
| 90 | + - `AppMasthead.vue`: トップページの概要・統計表示 |
| 91 | + - `ChronicleView.vue`: 年別タイムライン表示 |
| 92 | + - `DirectoryView.vue`: スピーカー単位の一覧。並び替えと開閉行を持ちます。 |
| 93 | + - `SpeakerFilterBar.vue` / `YearFilterBar.vue`: 検索・年フィルタ UI |
| 94 | + - `AppFooter.vue`: フッター |
| 95 | +- 表示状態: |
| 96 | + - トップページの view は `localStorage('vfjs:view')` に保存されます。 |
| 97 | + - density は `localStorage('vfjs:density')` に保存されます。 |
| 98 | + - 言語は `localStorage('vfjs:lang')` に保存されます。 |
71 | 99 |
|
72 | 100 | ## カラースキーム |
73 | 101 |
|
74 | | -`useColorScheme` composable でライト / ダーク / システム の3段階を管理します。 |
| 102 | +`useColorScheme` composable で `light` / `dark` / `system` を管理します。 |
75 | 103 |
|
76 | | -- 状態: `'light' | 'dark' | 'system'`(デフォルト: `'system'`) |
| 104 | +- デフォルト: `system` |
77 | 105 | - 保存先: `localStorage('vfjs:color-scheme')` |
78 | | -- 適用方法: `:root` の `data-color-scheme` 属性を操作 |
79 | | - - `system` → 属性を削除し `@media (prefers-color-scheme: dark)` に委ねる |
80 | | - - `light` / `dark` → `data-color-scheme="light/dark"` をセット |
81 | | -- CSS 定義: `app/assets/css/main.css` にトークンを定義(ライト/ダーク両方) |
82 | | - - `@import 'tailwindcss'`(`theme(static)` は LightningCSS minify エラーを引き起こすため除去済み) |
| 106 | +- 適用方法: |
| 107 | + - `system`: `document.documentElement` の `data-color-scheme` 属性を削除し、`prefers-color-scheme` に委ねる。 |
| 108 | + - `light` / `dark`: `data-color-scheme="light"` または `data-color-scheme="dark"` をセットする。 |
| 109 | +- CSS 定義: `app/assets/css/main.css` |
| 110 | + - `@import 'tailwindcss' theme(static);` |
| 111 | + - `--paper`、`--ink`、`--accent`、`--rule` などの CSS カスタムプロパティを定義します。 |
83 | 112 |
|
84 | 113 | ## テスト |
85 | 114 |
|
86 | | -- ランナー: Vitest(DOM: happy-dom) |
87 | | -- 位置: `app/**.test.ts`, `server/**.test.ts` |
88 | | -- 実行: `pnpm vp:test:watch` |
| 115 | +- ランナー: Vitest(Vite+ 経由) |
| 116 | +- DOM: Nuxt テスト環境 + happy-dom |
| 117 | +- 設定: `vitest.config.ts` |
| 118 | +- テスト位置: |
| 119 | + - `app/**.test.ts` |
| 120 | + - `server/**.test.ts` |
| 121 | +- 実行: |
89 | 122 |
|
90 | | -## 型チェック |
| 123 | +```bash |
| 124 | +vp test run |
| 125 | +``` |
91 | 126 |
|
92 | | -- ランナー: vite-plus(`vp check`) |
93 | | -- 実行: `pnpm vp:check` |
94 | | -- 目的: 型の整合性を保ち、潜在的なバグを防止 |
| 127 | +ウォッチ実行は `vp test` を使います。 |
95 | 128 |
|
96 | | -### 書き方の指針: |
| 129 | +### テスト方針 |
97 | 130 |
|
98 | | -- ユニットテストは入出力と副作用の最小検証に集中。 |
99 | | -- ルート/API は境界値・異常系(存在しない年など)もカバー。 |
| 131 | +- ユニットテストは入出力と副作用の最小検証に集中する。 |
| 132 | +- API ルートは有効値、境界値、異常系を確認する。 |
| 133 | +- 年追加時は `YEARS`、API のエラーメッセージ、UI 側の年表示が連動しているか確認する。 |
| 134 | + |
| 135 | +## 型チェックと lint |
| 136 | + |
| 137 | +- 型チェック: `vp check` |
| 138 | +- Lint: `vp lint .` |
| 139 | +- Format: `vp fmt .` |
| 140 | +- Format 確認: `vp fmt . --check` |
| 141 | + |
| 142 | +型エラーを隠すための型削除や過度な型アサーションは避け、原因を直してください。`vite.config.ts` の staged 設定では `vp check --fix` が走る想定です。 |
100 | 143 |
|
101 | 144 | ## 典型タスクの手順 |
102 | 145 |
|
103 | | -### 1. 新しい開催年のスピーカーデータを追加 |
| 146 | +### スピーカー検索/フィルタを調整 |
| 147 | + |
| 148 | +- `SpeakerFilterBar.vue`、`YearFilterBar.vue`、`DirectoryView.vue`、`ChronicleView.vue` を確認する。 |
| 149 | +- 取得・絞り込みロジックが必要なら `app/composables/speaker.ts` を更新する。 |
| 150 | +- スピーカー集約や日本語判定に関わる場合は `app/utils/speakerMap.ts`、`app/utils/stringCollate.ts` も確認する。 |
| 151 | +- 影響範囲のテストを更新する。 |
104 | 152 |
|
105 | | -- `server/data/speakers-YYYY.ts` を作成し型に沿ってデータを定義。 |
106 | | -- `server/data/index.ts` にインポートとエクスポートを追加。 |
107 | | -- 必要に応じて `app/utils/years.ts` に年を追加(表示順の維持に注意)。 |
108 | | -- API テストを追加/更新(`server/api/speakers/[year].test.ts`)。 |
109 | | -- UI 表示を確認(`/[year]` ページ、年セレクタ)。 |
| 153 | +### コンポーネントを追加 |
110 | 154 |
|
111 | | -### 2. スピーカー検索/フィルタを調整 |
| 155 | +- `app/components/` に追加し、該当ページで利用する。 |
| 156 | +- 既存の CSS カスタムプロパティと Tailwind ユーティリティに合わせる。 |
| 157 | +- グローバルな見た目やフォーカススタイルは `app/assets/css/main.css` を確認する。 |
| 158 | +- UI の振る舞いは小さな単位でテストする。 |
112 | 159 |
|
113 | | -- `SpeakerFilterBar.vue` や `DirectoryView.vue` を変更。 |
114 | | -- 変更に合わせ `composables/speaker.ts` で取得ロジックやフィルタを調整。 |
115 | | -- 影響範囲のテスト更新(該当ページ/コンポーネントの test)。 |
| 160 | +### 表示文言や言語切替を変更 |
116 | 161 |
|
117 | | -### 3. コンポーネントを追加 |
| 162 | +- 文言は `app/composables/useVfjsI18n.ts` の `translations` を更新する。 |
| 163 | +- `ja` と `en` の両方を揃える。 |
| 164 | +- スピーカー名の英語表記はデータ側の `nameEn` を確認する。 |
| 165 | + |
| 166 | +## CI |
| 167 | + |
| 168 | +GitHub Actions は Vite+ セットアップ後に以下を実行します。 |
| 169 | + |
| 170 | +- `vp lint .` |
| 171 | +- `vp fmt . --check` |
| 172 | +- `vp check` |
| 173 | +- `vp test run` |
| 174 | + |
| 175 | +CI の対象 path は `app/**`、`server/**`、`types/**`、各種設定ファイル、lockfile などです。ドキュメントのみの変更では一部の workflow が走らない場合があります。 |
| 176 | + |
| 177 | +## デプロイ |
| 178 | + |
| 179 | +NuxtHub へのデプロイは以下を使います。 |
| 180 | + |
| 181 | +```bash |
| 182 | +vpx nuxthub deploy |
| 183 | +``` |
118 | 184 |
|
119 | | -- `app/components/` に追加し、該当ページで読み込み。 |
120 | | -- スタイルは Tailwind ユーティリティを優先。 |
121 | | -- UI の振る舞いは小さな単位でテスト。 |
| 185 | +NuxtHub / Cloudflare 関連の依存は `pnpm-workspace.yaml` の `cloudflare` catalog にまとまっています。 |
122 | 186 |
|
123 | 187 | ## 開発フロー(推奨) |
124 | 188 |
|
125 | | -- ブランチ: `feat/*`, `fix/*`, `chore/*` など用途別に作成。 |
126 | | -- 実装: 小さなコミットで進め、関連テストを同時に更新。 |
127 | | -- 検証: `pnpm vp:lint && pnpm vp:check && pnpm vp:test` で事前チェック。 |
128 | | - - 型チェックは特に重要。型を消すなどしてエラーを隠さないこと。その場合は詰めます。 |
129 | | -- レビュー: 変更点の要約、スクリーンショットや再現手順があると親切。 |
| 189 | +- ブランチ: `feat/*`、`fix/*`、`chore/*`、`docs/*` など用途別に作成する。 |
| 190 | +- コミット: Conventional Commits を使う。例: `docs: update agents guide` |
| 191 | +- 実装: 小さめの差分で進め、関連テストやドキュメントも合わせて更新する。 |
| 192 | +- 検証: 変更内容に応じて `vp lint . && vp fmt . --check && vp check && vp test run` を実行する。 |
| 193 | +- レビュー: 変更点の要約、確認したコマンド、必要に応じてスクリーンショットや再現手順を添える。 |
130 | 194 |
|
131 | 195 | ## トラブルシュート |
132 | 196 |
|
133 | | -- Node/pnpm の不整合: ローカルの pnpm を `pnpm -v` で確認(推奨 10 系)。 |
134 | | -- 型エラー: `pnpm vp:check` で事前に洗い出し。 |
135 | | - - 再三忠告しますが、型を消すなどしてエラーを隠さないこと。その場合は詰めます。 |
136 | | -- キャッシュ問題: Nuxt のキャッシュが怪しい場合は開発サーバ再起動で解消することがあります。 |
| 197 | +- 依存関係の不整合: `vp install` を実行し、必要なら `vp config` も実行する。 |
| 198 | +- パッケージマネージャーの確認: `pnpm -v` で `10.33.2` 系か確認する。 |
| 199 | +- 型エラー: `vp check` で原因を洗い出し、型定義・import・データ構造を直す。 |
| 200 | +- Nuxt 生成物の不整合: 開発サーバを再起動し、必要なら `vp config` を再実行する。 |
| 201 | +- テスト環境の差異: `vitest.config.ts` の Nuxt 環境と happy-dom 設定を確認する。 |
0 commit comments