仕様書ベース × 自動型定義

モノレポ ×3 フェーズワークフローで爆速開発

自己紹介

龍ちゃん:Tanaka Ryunosuke

領域

アプリ開発・CI/CD・コンテナ

経歴

  • Figma によるデザイン構築
  • 社内業務改善 AI システム開発
  • 技術記事 200 本執筆達成
  • AI 協働開発による執筆効率化の実践

本日のゴール

AI協働開発で「ハチャメチャなコード」を防ぎ、 効率的な開発環境を構築する

今日持ち帰っていただくこと

  1. AI 開発の環境整備が成功の鍵 - 型定義・関数のパーツ化でコード品質を保つ
  2. Single Source of Truth - DTO を唯一の型定義源とする設計思想
  3. パーツ提供の思想 - すべてを自動生成せず、必要なものだけ提供(shadcn/ui 方式)
  4. 実測データの説得力 - 47 ファイル移行で 70-79%効率化、バンドル 20-30%削減

前提:仕様書ベースでの開発

このセミナーは、計画ドキュメント(仕様書)をもとに実装する開発スタイルを前提としています。

なぜ仕様書が必要なのか

  • 開発時間の短縮: 1 週間 → 2 日(実測データ)
  • 手戻りの削減: 平均 3-4 回 → 平均 1 回
  • 意思決定の明文化: AI に技術選定を委ねる危険性を回避
  • 品質保証: 計画の品質が成果物の品質を決定

参考記事:
AI 協働で仕様書アレルギー克服!開発時間を 1 週間 →2 日に短縮する実践法

2025 年のトレンド:仕様駆動開発

SDD(Specification-Driven Development)が注目される背景

  • AI 協働開発の普及
  • 「何を作るか」と「どう作るか」の分離の重要性
  • GitHub、AWS などが積極推進

主要なツール

  • Kiro(AWS): エージェント型 AI IDE(2025 年一般提供)
  • OpenSpec(GitHub): GitHub Copilot 統合の仕様駆動ツールキット
  • OpenAPI Specification: API 仕様の標準フォーマット

本セミナーのアプローチ

特定ツールに依存しない

なぜツールを限定しないのか

  • プロジェクトごとに最適なツールは異なる
  • 既存ワークフローへの適応が重要
  • ツールの選択は皆様に任せる

雑多な検証ベース

実践的なアプローチ

  • Claude Code で試行錯誤
  • 実測データに基づく知見
  • 特定ツールなしでも実現可能な手法
今回は特定のツールを使わず、雑多に検証した内容ベースで話します

セミナー構成

セクション 時間 内容
前提 5 分 仕様書ベース開発・AI 開発の 3 つの課題
Part 1 10 分 モノレポ:AI にコンテキストを提供する基盤
Part 2 10 分 3 フェーズ開発:モノレポ上でのワークフロー
Part 3 15 分 自動型定義:Single Source of Truth の実装
まとめ 5 分 実践への提案

Part 1: モノレポ

AI にコンテキストを提供する基盤

AI がハチャメチャなコードを出す 3 つの原因

原因 1: 型定義を再定義してしまう

フロント・バックで独立に型定義を生成し、齟齬が発生

原因 2: 生成物のクオリティ担保ができていない

型定義が曖昧、エラーハンドリングが不十分

原因 3: コンテキストを忘れる

過去の実装を忘れ、一貫性のないコードが生成される

具体例: 型定義の再定義による不整合

型定義の不整合

AI 開発の本質的な課題

AI が情報を忘れてしまうリスク

参照している情報があっても、更新を無視して生成してしまう

具体的なリスク

  • フロントとバックで型定義が異なる
  • 既存の実装パターンを無視した新規実装
  • 変更時に関連ファイルの更新を忘れる
  • コンパイルエラーにならないため、発見が遅れる

解決策: モノレポでコンテキスト一元管理

AI に全体像を一度に提供できる環境

  • すべてのコードが 1 つのリポジトリに存在
  • AI が全体像を把握しやすい
  • 型定義の同期が自動化可能
  • 変更の影響範囲が明確

ポイント: AI に「正しいコンテキスト」を提供する基盤を作る

プロジェクト全体構成(4 つのアプリケーション)

アプリケーション 技術スタック デプロイ先
Frontend Next.js 15, React 19 Azure Static Web Apps
Backend NestJS 11, Node.js 22 Azure Web Apps
X Scheduler Azure Functions v4 Azure Functions
MCP Functions Azure Functions v4 Azure Functions

モノレポで一元管理 → AI に全体像を一度に提供

参考記事: AI チャットで話すだけ!X 予約投稿を完全自動化するシステム構築術

なぜモノレポなのか(AI 協業との相性)

別リポジトリvsモノレポ

モノレポが AI 協業に最適な理由

別リポジトリの課題

コンテキストの分断

  • 別々のリポジトリ
  • AI に全体像を伝えるのが困難
  • 型定義の同期が手動作業
  • 変更の影響範囲が追いにくい

モノレポの利点

コンテキストの一元管理

  • 1 つのリポジトリで全体像を把握
  • AI に一度に全体像を提供できる
  • 型定義の自動同期が可能
  • 変更の影響範囲が明確

CLAUDE.md 階層構造の概要

9 つの CLAUDE.md ファイルでコンテキスト管理

ルート CLAUDE.md → プロジェクト全体像

サブディレクトリ CLAUDE.md → 各領域の詳細ルール

  • /docs/CLAUDE.md - 計画フェーズルール
  • /application/backend/CLAUDE.md - バックエンド開発ガイド
  • /application/frontend/CLAUDE.md - フロントエンド開発ガイド
  • など...

CLAUDE.md 階層構造の効果

AI との協業が劇的に改善

  • AI が必要な粒度でコンテキストを取得
  • 手動説明の削減(「どういうプロジェクト?」と聞かれない)
  • フェーズごとの適切なルール提供
  • 作業領域に応じた開発ガイドを自動適用

詳細: モノレポ ×AI 協業環境構築術

モノレポが次のステップの基盤となる

モノレポでAIにコンテキストを提供する基盤が整った

次のステップ

この基盤の上で、3 フェーズ開発を実践する

Part 2: 3 フェーズ開発

モノレポ上でのワークフロー

3 フェーズ開発手法の全体像

3フェーズ開発手法

なぜフェーズを分けるのか

従来のペアコーディング(Vibe Coding)の限界

300 文字で意図を伝えるのは文豪でも困難

  • AI が自由に解釈しすぎて、意図したものが作られない
  • プロンプトが長くなりすぎてコンテキストを圧迫
  • 「何を作るか」と「どう作るか」が混在

フェーズ分離のメリット

フェーズを分けることで役割を明確化

3 つのフェーズ

  • 計画フェーズ: AI と共に「何を作るか」を考えさせる
  • 実装フェーズ: 仕様書を読み込ませて AI が実装
  • 検証フェーズ: 計画と実装の差分を分析 → 学びを得る

実際のプロジェクト構造(モノレポ)

workspace/
├── application/          # 実装コード(4つのアプリ)
│   ├── frontend/        # Next.js 15 + React 19
│   ├── backend/         # NestJS 11
│   ├── x-scheduler/     # Azure Functions
│   └── mcp-functions/   # Azure Functions
├── docs/                # 計画・知見
│   ├── features/        # 機能仕様書
│   ├── research/        # 実装レビュー
│   ├── data/            # 調査データ
│   └── templates/       # テンプレート
├── CLAUDE.md            # ルートレベル設定
└── package.json         # モノレポ設定

docs/ と application/ の分離

ディレクトリ構造

ディレクトリ分離の 3 つの利点

docs/ (計画)

計画フェーズ

  • 仕様書・設計書
  • 機能要件の定義
  • 行動計画
  • AI との計画作業エリア

application/ (実装)

実装フェーズ

  • フロント・バックのコード
  • ビルド成果物
  • テストコード
  • AI との実装作業エリア

フェーズ分離の実践的メリット

視覚・感覚的なわかりやすさ

ディレクトリ = フェーズ

  • ディレクトリ構造がフェーズ分離を表現
  • 今どのフェーズにいるか一目瞭然

横断的な作業が可能

1 つの計画で複数アプリを編集

  • フロントもバックも同時に計画
  • 統合的な視点で設計

知見収集も統括的に

  • アプリ全体の情報を一箇所に集約
  • 実装の振り返りを体系化

モノレポと 3 フェーズの組み合わせ

モノレポが基盤、3フェーズがワークフロー

次のステップ

この基盤とワークフローの上で、型定義を自動化する

Part 3: 自動型定義

Single Source of Truth の実装

パイプラインの全体像

パイプライン全体像

Single Source of Truth:人間も AI も迷わない設計

DTO→OpenAPI Spec変換

Backend DTOs を唯一の真実とする

型定義の一元管理 モノレポ内でBackend → Frontendの型定義が自動同期

AI への明確な指示

  • /application/backend/で DTO 定義
  • 自動生成で/application/frontend/に型提供
  • AI は「自動生成されたファイルは触らない」ルールを守る

ステップ 1: DTO を唯一の型定義源とする

DTO クラスがすべての型定義のマスター

役割

  • デコレーターから制約情報も自動抽出
  • OpenAPI Spec に自動変換
  • すべての型定義の起点

AI との協業

AI は DTO クラスを編集するだけで、フロントエンドの型定義が自動更新されることを理解

重要: エラー型設計の必要性

実体験から学んだ教訓

なぜエラー型が重要なのか

自動生成パイプラインを構築しても、エラー型を定義しなければ型安全性が崩壊する

問題: エラー型が自動生成されない

フロントエンド実装が破綻

エラーレスポンスがany型になる

  • OpenAPI 仕様からエラー型は自動生成されない
  • フロントエンドでエラーハンドリングがany型に
  • 実行時エラーが頻発
  • IDE の補完が効かない
  • AI もエラー型を推測できない

実際に起きた深刻な影響

リンターエラーが大量発生

  • any型の使用で ESLint エラー
  • 型チェックが通らない
  • コードレビューで指摘が増える

エラーハンドリングが作れない

  • エラーの構造が不明
  • どのフィールドにアクセスすべきか分からない
  • AI に実装を依頼しても正しいコードが生成されない

解決: RFC 7807 準拠の統一エラー型

RFC 7807(Problem Details for HTTP APIs)準拠

  • type: エラーの種類を示す URI
  • title: エラーの短い説明
  • status: HTTP ステータスコード
  • detail: 詳細なエラーメッセージ
  • timestamp: エラー発生時刻
  • traceId: トレース ID(デバッグ用)

エラー型の実装方法

実装のポイント

各エンドポイントでエラー型を明示的に定義

  1. DTO クラスとしてエラーレスポンスを定義
  2. OpenAPI 仕様に含める
  3. Orval で型定義を自動生成
  4. フロントエンドで型安全なエラーハンドリング

重要

エラー型を定義しないと、自動生成パイプラインの恩恵が半減する

エラー型定義の効果

Before: エラー型なし

型安全性の崩壊

try {
  await api.createUser(data);
} catch (error: any) {
  // errorが何を持っているか不明
  console.error(error.message);
  // ↑ 実行時エラーの可能性
}

After: エラー型あり

型安全なエラーハンドリング

try {
  await api.createUser(data);
} catch (error: ApiError) {
  // errorの型が明確
  console.error(error.detail);
  // ↑ IDEの補完が効く
  // AIも正しいコードを生成
}

結論: 仕様書と DTO の品質が全て

自動生成パイプラインの成否は、入力の品質で決まる

人間が注力すべきこと

  • 仕様書の作成(要件定義、エラーケース設計)
  • DTO の設計(型定義、エラー型定義)

レビューで品質を担保する

DTO レビューは必須

  • 型定義とエラー型の確認
  • OpenAPI 仕様の妥当性検証

AI は自動生成だけ担当

  • パイプラインは道具
  • 品質は入力次第

結論: ちゃんと仕様書も作ろう!DTO の質の担保(レビュー)をしっかりと!

ステップ 2: 型・関数のパーツ化(Orval の役割)

Orval とは: OpenAPI 仕様から TypeScript コード自動生成

型定義ファイル

  • DTO と 1 対 1 対応
  • Request/Response 型
  • エラー型も含む

API 呼び出し関数

  • 型安全な API 関数
  • Axios 関数として提供
  • パーツとして利用

ステップ 3: AI への通知と制御

自動生成ファイルをAIに触らせない仕組みが必要

2 つのアプローチ

  1. DO NOT EDIT コメント:ファイル先頭に警告
  2. CLAUDE.md での明文化:AI へのルール提示

アプローチ 1: DO NOT EDIT コメント

自動生成ファイルの先頭に警告コメントを挿入

/**
 * DO NOT EDIT THIS FILE
 *
 * This file is auto-generated from OpenAPI specification.
 * If you need to make changes, edit the DTO in backend/
 * and run `npm run generate:api` to regenerate this file.
 */

効果: AI がファイルを読んだ際に、編集してはいけないことを理解

アプローチ 2: CLAUDE.md での明文化

プロジェクトルールとして記述

## 自動生成ファイル

以下のファイルは自動生成されています。直接編集しないでください:

- `lib/api/generated.ts`
- `types/generated/`

変更が必要な場合:

1. `backend/` の DTO を修正
2. `npm run generate:api` で再生成

効果: AI が CLAUDE.md を読み込んだ時点でルールを把握

重要:AI は約 10-20%の確率で無視する

現実的な課題

  • AI は警告を見落とすことがある
  • 特に長いコンテキストでは忘れやすい
  • 100%の確実性は期待できない

対策:レビューで確認

  • PR レビュー時に自動生成ファイルの変更をチェック
  • .gitattributes で自動生成ファイルをマーク
  • 無視されてもめげない!これはめげない!!

Part 3: パーツ化の最適化実践

すべてを自動生成する罠と解決策

パーツ提供の考え方(shadcn/ui との類似性)

shadcn/ui の成功と同じアプローチ

  • コンポーネントをコピペして、必要に応じてカスタマイズ
  • フルスタックの UI ライブラリではなく、パーツ提供
  • AI 開発効率化の鍵
すべてを自動生成するのではなく、 組み立てやすいパーツを提供

なぜパーツ化が必要なのか

家具づくりの比喩で理解する

Before: 一本の木から削り出す

全自動生成の限界

  • 職人技が必要
    AI に全てを任せる = 高難度
  • 失敗したらやり直し
  • 一部の修正が困難
  • 不要な部分も削り出す

After: パーツを組み立てる

パーツ提供の利点

  • 良質なパーツがあれば組み立ては簡単
  • 一部の差し替えが容易
  • 組み合わせの自由度
  • 必要なパーツだけ使う

Part 3 の本質: 人間の判断が必要な領域

AI に任せられないこと

ツール選定を間違えてはいけない

  • どのツールを使うか
  • どの設定が最適か
  • 何を自動生成すべきか
  • 何を手動で実装すべきか

人間が判断すべきこと

要件の理解と最適化

  • プロジェクトの要件理解
  • パフォーマンス要件の見極め
  • 最適なツール設定の選択
  • まだギリギリ人間の仕事いっぱい
ツール選定と設定は人間が頑張る部分

パーツの質は人間次第

人間が責任を持つべきこと

パーツ設計の品質管理

  • 型定義の正確性
  • エラー型の網羅性
  • API 設計の一貫性
  • ドキュメント整備

AI に任せられること

パーツの組み立て

  • 型定義を使った実装
  • API 関数の呼び出し
  • ボイラープレートコード
  • 単純な繰り返し作業
パーツの品質 = 成果物の品質

実例: 粗悪なパーツを作っていた失敗

初期設定: 全 API エンドポイントに SWR フック自動生成

なぜ粗悪なパーツだったのか

  • 使わないフックまで自動生成(41 個)
  • バンドルサイズ肥大化・不要なオーバーヘッドが発生
  • 「パーツ」というより「ゴミの山」

反省点
必要なものだけを高品質で提供することが重要。

最適化された設定

Orval 設定の変更

mode: "single" → 直接エクスポート
client: "axios-functions" → パーツのみ生成(型定義 + Axios 関数)

Before: 全自動生成

  • 自動生成フック数: 41 個
  • バンドルサイズ: 100%
  • コード行数: ~2030 行

After: パーツのみ生成

  • 自動生成フック数: 0 個
  • バンドルサイズ: 70-80%
  • コード行数: ~800 行

パーツ化の Before / After

Before: 全自動生成

問題点

  • 全 API SWR フック生成
  • バンドルサイズ肥大化
  • 不要なコードが大量

自動生成フック数: 41 個

After: 必要なものだけ

改善点

  • 型定義 + Axios 関数のみ生成
  • SWR は必要な箇所のみ手動実装
  • バンドルサイズ削減

自動生成フック数: 0 個

適材適所のアプローチ

Read: カスタム SWR フック

  • キャッシュ戦略
  • 自動再検証
  • データ共有

CUD: 直接 Axios

  • シンプル実装
  • フォーム統合が容易
  • 一回限りの操作

結果: 自動生成フック 41 個 → 9 個(必要な分だけ手動実装)

パーツ化最適化の効果

実測データ

  • 47 ファイルの移行: 推定 14-20 時間 → 実績 4.2 時間(70-79%効率化
  • バンドルサイズ: 20-30%削減
  • コード行数: 約 60%削減

なぜこれほど効率化できたのか

Axios の関数がパーツとして提供されていた

  • AI に実装を任せる際もスムーズに進行
  • 型定義が自動生成されているため、型エラーで即座に問題検出

AI がハチャメチャなコードを出さなくなった実体験

再定義のリスクを排除

実感した変化

  • 型定義の齟齬がなくなった
  • フロントエンドで型定義ファイルが増殖しなくなった
  • すっきりとしたコードで実装できるようになった

まとめ・実践への提案

今日から始める自動化パイプライン

重要ポイントの整理

環境整備

  1. モノレポ構成で AI に全体像を提供
  2. CLAUDE.md 階層構造でコンテキスト管理
  3. docs/ と application/ の分離

パイプライン

  1. Single Source of Truth(DTO → OpenAPI → Frontend)
  2. パーツ提供の思想(shadcn/ui 方式)
  3. エラー型設計で型安全性確保

段階的導入ステップ

Step 1: 基本パイプラインの構築(1-2 日)

  1. Backend DTO クラス作成
  2. OpenAPI 生成設定
  3. Orval 設定(mode: "single", client: "axios-functions")
  4. エラー型定義

Step 2: 既存コードの移行(規模による)

  1. 小さな機能から移行開始
  2. 効果を実感しながら拡大
  3. チーム全体で共有

よくある質問

Q: エラー型を定義しないとどうなりますか?

A: エラーレスポンスがany型になり、実行時エラーが頻発します。IDE の補完も効かず、型安全性が失われます。

Q: バンドルサイズは本当に削減されますか?

A: 実測で 20-30%削減を確認しています。不要な SWR フックを生成しないことで、大幅な削減が実現できます。

今日から試せること

まず「DTOクラス + エラー型定義」から始めましょう

小さく始める

  1. 1 つの API エンドポイントで DTO クラス作成
  2. OpenAPI 生成を試してみる
  3. Orval で型定義生成を確認
  4. 効果を実感したら拡大

重要: 完璧を目指さず、小さく始めて効果を実感することが成功の鍵

Appendix: 拡張版 4 フェーズワークフロー

さらなる効率化への道

拡張版: 4 フェーズワークフロー

検証から記事化へ

4 フェーズ目: 記事化フェーズ

検証結果を知見として資産化

RAG もどきでの効率化

  • トークン削減: 50-60%
  • 記事執筆時間: 50%削減
  • 検証結果の体系的な整理

参考記事:
検証 → 記事化で知見を資産化!Claude Code×RAG もどきで AI 技術ブログ執筆を効率化

フェーズ 3: 研究記録(/docs/research/)

目的

  • 設計思想と意思決定の記録
  • アーキテクチャパターンの検証結果
  • 実装完了後の振り返り

記録内容

  • なぜその設計にしたのか
  • どんな課題があって、どう解決したのか
  • パフォーマンス、エッジケースの検証結果

フェーズ 4: 記事化(/docs/article/)

変換プロセス

  1. /docs/features/(計画)
  2. /docs/research/(検証)
  3. /application/(実装)
  4. ↓ 情報を抽出・整理
  5. research-doc.md(調査資料)
  6. ↓ 読者向けに再構成
  7. no1-article.md(記事本文)

RAG もどき: 既存記事をローカルに保存

RAGもどきシステム

4 フェーズワークフローの効果

Before

  • 記事執筆時間: 8 時間
  • 調査時間: 2 時間
  • 既存記事重複チェック: 手動 30 分
  • 記事品質: バラバラ

After

  • 記事執筆時間: 4 時間
  • 調査時間: 1 時間
  • 既存記事重複チェック: 5 分
  • 記事品質: 一貫性 90%

測定条件: 中規模記事(800-1000 行)での実測値

開発者の実感

Before: 現象を後から眺めて「ブログ書くか」みたいな感じ

After: 検証の過程を全部ドキュメント化

  • 何を考えてこうやってみたのか
  • 実際どうなったのか
  • 最初の予想と結論の違い

結果: 検証を明確な意識を持って行うようになった

「検証した内容がそのままブログ化できる」

ありがとうございました!

質問・ディスカッションタイム

今日から始める環境整備で、AI 協働開発を加速させましょう

Appendix: 参考ブログ・リソース

詳細情報はこちらから

AI 協業開発手法シリーズ

環境構築・ワークフロー

技術実装・パイプライン構築

自動生成パイプライン

プロジェクト事例

Spec 駆動開発関連リソース

ツール・フレームワーク

  • AWS Kiro - エージェント型 AI IDE(AWS、2025 年一般提供)
  • GitHub Spec Kit - 仕様駆動ツールキット(GitHub Copilot 統合)
  • OpenAPI Initiative - API 仕様の標準フォーマット(Linux Foundation)
  • RFC 7807 - HTTP API のエラー型標準(IETF)

使用技術

  • Orval - OpenAPI 仕様から TypeScript コード自動生成
  • NestJS - Node.js フレームワーク(DTO・OpenAPI 生成)
  • shadcn/ui - パーツ提供思想の UI ライブラリ

さらに学ぶためのリソース