AI駆動開発でWEBサービスを作ってみる(実装編)

はじめに
この記事は「AI駆動開発でWEBサービスを作ってみる」の続きの記事です。 v0で実装までが終わったのでリポジトリを作成し可能であればデプロイまでを行います。
ゴール
以下の工程全てAIを使い作成することとします。 細かい調整は適宜手動で行います。
- 要求定義(済)
- 要件定義(済)
- 基本設計(済)
- 製造(実施中)
- 単体(結合)テスト
- 総合テスト
詳細設計については個人的に実装と変わらなくない?と思ってる人間なのでやりません
リポジトリの作成
今回は以下の二つのリポジトリを作成します。 v0とリポジトリの連携ができるのですが、フォルダ構造を弄りたいので別々で運用する形にします。 指定したフォルダとv0で作ったアプリを連携出来たらいいなぁと思ってます。
リポジトリの作成についてはAIにお願いするほどではないので手動で作成します。
v0側のリポジトリはv0の画面でポチポチしたら連携できるのでそちらで済ませます。
- thumbnail_prompt
- こっちが実作業用のリポジトリです。 ポートフォリオとしても使いたいのでpublicにしています。 https://github.com/itora09/thumbnail_prompt 今後の作業はすべて上記のリポジトリで行うものとします。
- thumbnail_prompt_v0
- こっちがv0と連携するリポジトリ
- デザインの調整があった時にv0で更新&pushして実作業用のリポジトリに反映する運用を取ります。
GitHub Copilot用のカスタム命令ファイルの作成
はじめにAIコーディングを行うための土台作りをします。 AIコーディングツールはGitHub Copilotのエージェントモードを使います。 コーディング規約などの情報を持たせてv0の実装と整合性が合うようにします。 ※完璧に合うとかはわからないです。
せっかくなのでこのカスタム命令ファイルもAIに作ってもらいます。
1github copilot用のカスタム命令ファイル(.github/copilot-instructions.md)の作成をお願いします。
2空ファイルのみ作成して内容は私と質疑しながら埋めてください。
以下が出来上がったカスタム命令ファイルです。 しっかり動くかわからないので一旦この定義で実装を進めてみます。 定義については実装しながら適宜修正していきます。
また設計書の配置場所を「/document」Next.jsの配置場所を「/app」にするようにしました。
1# GitHub Copilot カスタム命令
2
3## 役割と目的
4
5あなたは実装支援のアシスタントです。コードの作成、バグ修正、機能実装に関する質問に対して明確で実用的な回答を提供してください。
6
7## 実装スタイル
8
9- クリーンで読みやすいコードを生成してください。
10- コードはモジュール化し、再利用可能にしてください。
11- パフォーマンスを考慮したコードを提案してください。
12- セキュリティのベストプラクティスに従ってください。
13- コメントは日本語で書いてください。
14
15## コード生成に関するガイドライン
16
17- 完全なコード例を提供してください。部分的なコードやスニペットではなく、実行可能な完全なソリューションを優先してください。
18- エラー処理とエッジケースを適切に処理してください。
19- 複雑なロジックには説明コメントを追加してください。
20- テスト可能なコードを生成してください。
21- コードと共に使用例も提供してください。
22
23## 回答フォーマット
24
251. 提案するアプローチの概要
262. 完全なコード実装
273. 実装に関する説明(必要に応じて)
284. 使用例(適切な場合)
295. 考慮すべき注意点やトレードオフ
30
31## 避けるべきこと
32
33- 実行不可能または不完全なコードの提供
34- 過度に複雑な解決策
35- セキュリティリスクのあるコード
36- 非効率なアルゴリズムやデータ構造
37- ドキュメントや説明なしのコード
38
39## プロジェクト固有のガイドライン
40
41### フロントエンド実装ルール (Next.js)
42
43- appディレクトリにNext.jsの実装を行います。
44- TailwindCSSは使用せず、すべてカスタマイズしたCSSで実装してください。
45- shadcn/uiは使用せず、すべてカスタマイズしたコンポーネントで実装してください。
46
47### ディレクトリ構成
48```
49/app/
50 ├── components/
51 │ ├── atoms/
52 │ │ ├── button/
53 │ │ │ ├── index.tsx
54 │ │ │ ├── style.css
55 │ │ ├── badge/
56 │ │ │ ├── index.tsx
57 │ │ │ ├── style.css
58 │ ├── molecules/
59 │ ├── organisms/
60 │ ├── templates/
61 ├── pages/
62 │ ├── index.tsx
63 │ ├── style.css
64 ├── models/
65 │ ├── hoge.ts
66 ├── repositories/
67 │ ├── factory.ts
68 │ ├── hogeRepository.ts
69 ├── utils/
70 │ ├── date.ts
71 │ ├── file.ts
72/document/
73 └── 設計書類
74```
75
76### Atomic Designの実装規約
77
78#### atoms
79- 最も基本的なUI要素(例:ボタン、入力フィールド、ラベル)
80- components/atomsディレクトリに配置
81- 基本的にサーバーコンポーネントとして実装する
82- 基本的にステートレスコンポーネントとして実装する
83- 単にプロップスを受け取り、UIをレンダリングする役割とする
84
85#### molecules
86- 複数の原子を組み合わせた機能的なUIグループ(例:フォーム、カード)
87- components/moleculesディレクトリに配置
88- 基本的にサーバーコンポーネントとして実装する
89- 基本的にステートレスコンポーネントとして実装する
90- 単にプロップスを受け取り、UIをレンダリングする役割とする
91
92#### organisms
93- 複数の分子(場合によっては原子も)を組み合わせて、より複雑なUIセクションを形成(例:ヘッダー、フッター)
94- components/organismsディレクトリに配置
95- ステート管理が不要であれば、サーバーコンポーネントとして実装する
96
97#### templates
98- ページのレイアウトを定義し、実際のコンテンツを配置する前の構造を提供
99- components/templatesディレクトリに配置
100
101#### pages
102- 各種ルーティング用のページ
103
104### その他実装規約
105
106- state管理とstateを更新するためのロジックはhooksを利用する
107- Next.jsに依存しない様々なプロジェクトで使えるような共通ロジックは「utils」フォルダに実装する
108- API疎通は「Repository Factory」パターンで実装する
109- APIから受け取ったデータは「zod」で型チェックを行う
110 - zodの定義はmodelsフォルダに実装する
111
112### 設計書
113
114- 設計書はdocumentフォルダに保存されています
115- 実装時には設計書を参照してコードを実装してください
116- 不明点がある場合は設計書の内容を確認してください
作成しているドキュメントファイルを配置
「/document」配下に各種設計書を保存します。 実装、テスト、仕様変更などで利用する想定です。
ファイルを作ってテキストをコピペするだけなのでこれは手動で行います。

thumbnail_prompt_v0で作ったNext.jsアプリをコピーし動くように調整
ローカル開発&デプロイを行うためにv0で作成したアプリを実装用のリポジトリでも動くようにします。 まずは「thumbnail_prompt_v0」にあるコードをすべて「/app」フォルダにコピーします。
Next.js内でもappフォルダがあるのにこの時気づいて失敗した。。。となってます。 最初はfrontendフォルダにしようとしたのですが、apiもNext.jsで実装するかもと考えてappにしたのですが、名前被りしてましたね

コピーが終わったら次はpackage.jsonの調整を行います。 記事作成時点ではv0から取得したコードのままだといくつかライブラリの不整合があるようなので不要なものは削除します。
- react-day-picker
- vaul
ライブラリの調整が終わったら以下のコマンドを実行してサーバーが立ち上がるか確認します。
1npm install
2npm run dev
以下の画面が表示できれば正常にローカルで実行できている状態です。

終わり
実装についてはやることが無かったのでここで終わりにします。 テスト工程でバグを拾って直すみたいなフローを取りたいと思います。
ただ私の本職が忙しく時間が取れないので一旦ここで検証はストップします。