./README.md

# 📚 HistoricalAccuracy

**時代考証アシストシステム** のモノリポジトリです。

---

## 🗂️ ディレクトリ構成

```
HistoricalAccuracy/
│
├── 📁 .github/workflows/
│   ├── deploy-infrastructure.yml  ← CDK / Lambda の自動デプロイ
│   └── deploy-frontend.yml        ← フロントエンドの自動デプロイ
│
├── 📁 research-ai/                ← AI アシスト機能(App Runner)
│   ├── src/
│   ├── front/
│   ├── Dockerfile
│   └── ...
│
└── 📁 knowledge-base/             ← 知識ベース・検索基盤(CDK + Lambda + フロントエンド)
    ├── cdk/                         インフラ定義(AWS CDK / TypeScript)
    ├── lambda/                      Lambda 関数(Python)
    ├── frontend/                    フロントエンド(React / Vite)
    ├── prompts/                     AI プロンプトファイル(S3 管理)
    └── docs/                        ドキュメント
```

> 💡 **モジュールは独立しています**
> `research-ai/` と `knowledge-base/` は同じリポジトリに共存していますが、
> CI/CD は **変更されたモジュールだけ** を自動デプロイします。
> 片方を触っても、もう片方は再デプロイされません。

---

## 🚀 初回セットアップ(このリポジトリを初めて使う人へ)

### 1️⃣ リポジトリをクローンする

```bash
git clone git@github.com:nhk-ds/HistoricalAccuracy.git
cd HistoricalAccuracy
```

> ⚠️ SSH キーを GitHub に登録していない場合は、
> GitHub の「Settings → SSH and GPG keys」からキーを追加してください。

### 2️⃣ 依存パッケージをインストールする

作業するモジュールに応じて、以下を実行してください。

**📦 knowledge-base の CDK(インフラ定義)を触る場合:**

```bash
cd knowledge-base/cdk
npm install
```

**📦 knowledge-base のフロントエンドを触る場合:**

```bash
cd knowledge-base/frontend
npm install
```

**📦 research-ai を触る場合:**

```bash
cd research-ai
# uv がインストールされていない場合: pip install uv
uv sync
```

### 3️⃣ フロントエンドのローカル動作確認(任意)

```bash
cd knowledge-base/frontend
npm run dev
# → ブラウザで http://localhost:3000 を開く
```

---

## 🔄 開発フロー

このプロジェクトは **コードを `main` ブランチに追加するとAWSへ自動デプロイ** される仕組みになっています。
開発スタイルは状況に応じて以下の3パターンから選べます。

---

### 📌 パターン早見表

| パターン          | ブランチ              | PR                         | 向いている場面                 |
| ----------------- | --------------------- | -------------------------- | ------------------------------ |
| **A(最速)**     | 作らない(main 直接) | しない                     | 一人作業・小さな修正・PoC      |
| **B(バランス)** | 作る                  | しない(ローカルでマージ) | 実験的な変更・試行錯誤         |
| **C(標準)**     | 作る                  | する                       | 複数人・レビュー必要・本番運用 |

---

### 🅰️ パターンA:最速(main に直接プッシュ)

小さな修正や一人作業のときに使える、最もシンプルな方法です。

```
① 最新コードを取得
② コードを修正
③ コミット
④ main に直接プッシュ
        ↓
⑤ GitHub Actions が自動デプロイ 🎉
```

```bash
# ① 最新コードを取得
git checkout main
git pull origin main

# ② コードを修正(エディタで編集)

# ③ コミット
git add .
git commit -m "fix: 検索のバグを修正"

# ④ main に直接プッシュ → 自動デプロイ開始
git push origin main
```

---

### 🅱️ パターンB:ブランチを作ってローカルでマージ

「実験的なコードを書いてみたい」「失敗しても main を汚したくない」ときに使います。
GitHub を経由せず、自分の PC 上でブランチを作り→作業→main にマージします。

```
① 最新コードを取得
② ブランチを作成
③ コードを修正・コミット(何度でも)
④ main に戻ってローカルでマージ
⑤ main にプッシュ
        ↓
⑥ GitHub Actions が自動デプロイ 🎉
```

```bash
# ① 最新コードを取得
git checkout main
git pull origin main

# ② 作業ブランチを作成
git checkout -b feature/add-era-filter

# ③ コードを修正 → コミット(何度繰り返してもOK)
git add .
git commit -m "feat: 時代フィルターを追加"

# ④ main に戻ってローカルでマージ
git checkout main
git merge feature/add-era-filter

# ⑤ プッシュ → 自動デプロイ開始
git push origin main

# 作業ブランチを削除(任意)
git branch -d feature/add-era-filter
```

---

### 🅲️ パターンC:PR(プルリクエスト)経由でマージ

複数人で開発したり、レビューを経てからデプロイしたいときの標準的なフローです。

```
① 最新コードを取得
② ブランチを作成
③ コードを修正・コミット
④ GitHub にプッシュ
⑤ GitHub 上でプルリクエスト(PR)を作成
⑥ レビュー → 承認
⑦ Merge pull request をクリック
        ↓
⑧ GitHub Actions が自動デプロイ 🎉
```

```bash
# ① 最新コードを取得
git checkout main
git pull origin main

# ② 作業ブランチを作成
git checkout -b fix/search-lambda-timeout

# ③ コードを修正 → コミット
git add knowledge-base/lambda/search-api/handler.py
git commit -m "fix: サーチAPIのタイムアウトを30秒に延長"

# ④ GitHub にプッシュ
git push origin fix/search-lambda-timeout
```

その後 GitHub 上で:

1. [https://github.com/nhk-ds/HistoricalAccuracy](https://github.com/nhk-ds/HistoricalAccuracy) を開く
2. 画面上部に表示される「**Compare & pull request**」ボタンをクリック
3. 変更内容を説明して PR を作成
4. レビュアーを指定し、承認されたら「**Merge pull request**」をクリック

> 💡 コミット前に `git status`(変更ファイル一覧)や `git diff`(差分)で内容を確認するのがおすすめです。
> 初回プッシュ時に `--set-upstream` を求められることがありますが、`git push origin ブランチ名` で自動的に設定されます。

---

### ⬇️ 他の人の変更を自分の PC に取り込む方法

誰かが `main` にコードを追加したあと、自分の作業を始める前に必ず実行してください。

```bash
git checkout main
git pull origin main
```

> 💡 これを忘れると「コンフリクト(同じ行を別々に変更した状態)」が発生しやすくなります。
> 作業前の `git pull` を習慣にしましょう。

---

### 🔍 デプロイの進行状況を確認する

`main` にプッシュ・マージしたあと、デプロイが正常に動いているか確認できます:

➡️ **[GitHub Actions タブを開く](https://github.com/nhk-ds/HistoricalAccuracy/actions)**

- ✅ 緑のチェック = 成功
- ❌ 赤の × = 失敗(クリックしてログを確認)

---

## ⚙️ CI/CD の仕組み

**GitHub Actions** とは「GitHub 上で自動的にコマンドを実行する仕組み」です。
`main` ブランチに変更が入ったとき、**変更されたフォルダに応じて** 対応するデプロイだけが自動実行されます。

### どのフォルダを変えると何がデプロイされるか

| 変更したフォルダ             | 動くワークフロー                              | デプロイ内容                                           |
| ---------------------------- | --------------------------------------------- | ------------------------------------------------------ |
| `knowledge-base/cdk/**`      | `deploy-infrastructure.yml`                   | CDK deploy(Lambda / API Gateway / WAF 等)            |
| `knowledge-base/lambda/**`   | `deploy-infrastructure.yml`                   | 同上(Lambda コードも CDK 経由で更新)                 |
| `knowledge-base/prompts/**`  | `deploy-infrastructure.yml`                   | 同上                                                   |
| `knowledge-base/frontend/**` | `deploy-frontend.yml`                         | フロントエンドを S3 に配置 + CloudFront キャッシュ削除 |
| `research-ai/**`             | **動かない**(research-ai 側の CI/CD は別途) | —                                                      |

> **例:** Lambda の `handler.py` だけ変えた場合
> → フロントエンドは再デプロイされない。時間もコストも無駄にならない。

---

### 🏗️ インフラデプロイ(deploy-infrastructure)の流れ

```
main にコード追加
  ↓
GitHub Actions が起動(GitHub のサーバーで実行)
  ↓
① AWS に OIDC 認証でログイン(パスワード不要・IAM ロールを一時的に使用)
  ↓
② knowledge-base/cdk/ の TypeScript をコンパイル
  ↓
③ cdk deploy --all を実行
   └─ WafStack(us-east-1)
   └─ HistoricalResearchStack(ap-northeast-1)
      ├─ 変更のある Lambda 関数だけ更新
      ├─ API Gateway 設定の差分だけ適用
      └─ 変更がなければ何もしない(スキップ)
```

---

### 🖥️ フロントエンドデプロイ(deploy-frontend)の流れ

```
main にコード追加(frontend/ 以下に変更があった場合のみ)
  ↓
GitHub Actions が起動
  ↓
① AWS に OIDC 認証でログイン
  ↓
② npm run build(React アプリを静的 HTML/CSS/JS にビルド)
  ↓
③ aws s3 sync で S3 バケット(historical-research-web)に差分のみアップロード
  ↓
④ CloudFront のキャッシュを削除(古いファイルが配信されなくなる)
```

---

### 🔐 AWS への認証方法(OIDC)

GitHub Actions が AWS にアクセスするとき、**アクセスキーなどの長期的な秘密情報は一切使いません**。
代わりに「GitHub が発行した一時的な証明書」を AWS IAM が検証する **OIDC 方式** を採用しています。

- **IAM ロール名:** `github-actions-knowledge-base`
- **許可範囲(最小権限):** CDK deploy ロールの権限借用 + S3 書き込み + CloudFront キャッシュ削除のみ

---

## 🛠️ 手動デプロイが必要な場合

通常は `main` へのプッシュ・マージで自動デプロイされますが、緊急時や手動で再実行したい場合:

1. **[Actions タブ](https://github.com/nhk-ds/HistoricalAccuracy/actions)** を開く
2. 実行したいワークフロー(`Deploy Infrastructure` または `Deploy Frontend`)をクリック
3. 右側の「**Run workflow**」ボタン → `main` を選択して実行

---

## 📖 各モジュールの詳細ドキュメント

| モジュール                    | ドキュメント                                                 |
| ----------------------------- | ------------------------------------------------------------ |
| 🗄️ knowledge-base(開発手順) | [knowledge-base/開発引継ぎ.md](knowledge-base/開発引継ぎ.md) |
| 🗄️ knowledge-base(仕様)     | [knowledge-base/仕様書.md](knowledge-base/仕様書.md)         |
| 🤖 research-ai                | [research-ai/README.md](research-ai/README.md)               |