- プロジェクトへのコントリビュートの際には、コントリビューターライセンス契約(CLA)への同意が必須となります。ご了承ください。
- Issue はどなたでも起票いただけます。ツール利用時に感じた改善点やバグについてぜひ Issue を作成してください
- Issue への自己アサイン(担当者設定)は、Issue コメントに以下のコマンドを記載することで行えます:
/assign
- 自分自身を Issue のアサインに追加/unassign
- 自分自身を Issue のアサインから削除
- 初めての貢献に適したタスクには
good first issue
ラベルが付いています
- Node.js
- Docker
- Supabase CLI
- Node.jsのインストール
brew install node
- Dockerのインストール (公式サイト)
- Supabase CLI
brew install supabase/tap/supabase
-
PowerShell ver5.1以上
PowerShell $PSVersionTable
で確認 -
gitのインストール(公式サイト)
git --version
で確認 -
WSL2のインストール
wsl --version
で確認cmd wsl --install
またはPowerShell wsl --install
- いずれも管理者権限が必要
- 詳細: 公式ドキュメント
-
Hyper-Vの有効化
- コントロールパネル > プログラムと機能 > Windowsの機能の有効化または無効化 > Windows ハイパーバイザープラットフォーム > チェックが入っているか確認 (デフォルトでは有効化)
- 入ってない場合、チェックマークをつける。チェックマークをつけてもHyper-Vが有効になっていない場合があるので、以下で確認
- PowerShell(管理者権限)でHyper-Vが有効になっているか確認 :
bcdedit
> hypervisorlaunchtype を参照 (AutoであればOK) - Offになっている場合、Hyper-VをAuto(有効)に変更
bcdedit /set hypervisorlaunchtype auto
- Autoに変更したあとPCの再起動が必要です
-
Node.js
- 公式サイトからインストーラーをダウンロードし、実行
- ver22.16.0 (25/06/06時点)
- npmも同時にインストールされます
-
Docker
- 公式ドキュメントを参照
-
Supabase CLI
-
cmd
npm install -g supabase
-
E404エラーが出てインストールに失敗する場合
- Scoop をインストール
powershell -Command "Set-ExecutionPolicy RemoteSigned -Scope CurrentUser" powershell -Command "Invoke-WebRequest -Uri https://get.scoop.sh -OutFile install.ps1" powershell -Command ".\install.ps1"
- Scoop で supabase をインストール
scoop bucket add supabase https://github.com/supabase/scoop-bucket.git scoop install supabase
-
-
インストールされているか確認:
supabase --version
-
-
.env.local
ファイルの作成cp .env.example .env.local
.env.example
ファイルをコピーして.env.local
を作成します。 -
Supabase のローカル環境を起動
supabase start
- Studio URL: http://127.0.0.1:54323 → Supabaseのダッシュボード
- Inbucket URL: http://127.0.0.1:54324 → ローカルのメールが届きます
-
.env.local
ファイルの、以下の値を更新:NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 # `supabase start` 実行時に表示される値を指定します。 NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key SUPABASE_SERVICE_ROLE_KEY=your_service_role_key # SentryのDSNを指定します。開発時は空でもかまいません。 NEXT_PUBLIC_SENTRY_DSN= NEXT_PUBLIC_SENTRY_ENVIRONMENT=development
-
ローカルデータベースの初期化:
supabase db reset
supabase/migrations
配下にあるマイグレーションを実行し、supabase/seed.sql
にあるシードデータをローカルデータベースに流し込みます。
-
必要なパッケージをインストール:
npm install
-
.env
ファイルの作成cp .env.local .env
.env.local
ファイルをコピーして.env
を作成します。 -
ミッションデータの同期:
npm run mission:sync
詳しくは ミッションデータ README を参照ください。
-
Next.js のローカル開発サーバーを起動:
npm run dev
サービスは localhost:3000 でアクセス可能になります。
supabase/seed.sql
のシードデータに含まれるユーザー情報を使用してログインしてください。
-
Supabase のローカル環境を停止
supabase stop
停止しないまま PC を再起動すると Docker コンテナが常駐し、ポート衝突やリソース消費が発生します。
mainブランチはリリース可能な状態に保ちましょう。 そのため、以下のブランチ利用ルールで開発しましょう。
- 各機能ごとに、developブランチからfeat/xxxブランチを作り、developブランチにマージ
- developで統合テストをしてからmainブランチに反映
権限管理のコストを踏まえて、各自forkしたリポジトリからオリジナルのリポジトリにPRを作成いただく運用としています。
- 開発対象のリポジトリをご自身のアカウントにforkしてください。
- forkしたリポジトリのdevelopブランチからfeatureブランチを作成し、開発を行ってください。
- commitを作成後、pushをする前にオリジナル(fork元)のリポジトリのdevelopブランチに入った変更を取り込み、必要であればコンフリクトを解消してください。
- コンフリクトを解消後、リモートリポジトリにpushを行ってください。
fork先:feature -> fork元:develop
のPRを作成してください。- レビュー可能な状態のPRはOpenにし、PR内コメントでレビュー可能な状態である旨を明記しましょう。
- slackチャネル
9_devinと人間の部屋
で過去のやり取りを参考に、Devinに開発を依頼してください。 - Devinの修正内容に不足がある場合は、slackでのやりとりを継続、もしくはスレッド内(open webapp)のリンクからGUIにてやりとり、修正を継続してください。
- コンフリクトが発生している場合は解消を依頼してください。
- レビュー可能な状態のPRはOpenにし、PR内コメントでレビュー可能な状態である旨を明記しましょう。
下記コマンドで supabase/migrations/
ディレクトリに 20250612123456_{名前}.sql
という名前の空ファイルが作成されます。このファイルに SQL を記述してください。
supabase migration new {名前}
※ {名前}
はmigrationの内容を表す英語名(例: add_mission_join_slack
)
作成したmigrationファイルがまだ適用されていない場合、下記コマンドでローカルDBに反映できます。
supabase migration up
migrationファイルの追加や編集で、テーブルの追加や更新を行った場合は、型定義を生成してください。
npx supabase gen types typescript --local > lib/types/supabase.ts
このプロジェクトでは、Jestを使用した単体テストを実装しています。テストは各資材と同じディレクトリに配置されています。
-
以下のコマンドですべてのテストを実行できます:
npm run test:unit
テスト実行後、coverage/
ディレクトリにレポートが出力されます。(標準出力でも確認できます。)
カバレッジ(コード網羅性)が80%を超えることを基準に、テストを作成してください。
新しいテストを追加する場合は、機能名.test.(ts|tsx)
の命名規則に従ってください。
このプロジェクトでは、Playwrightを使用したE2Eテストを実装しています。テストはtests/e2e
ディレクトリに配置されています。
Playwright 実行に必要なソフトウェア・ツールをインストールする必要があります ※ 環境によってはすでにインストールされている場合もあります
テスト実行時、ブラウザや依存パッケージに関するエラーが出た場合は下記コマンドでインストールを行ってください
# テスト用ブラウザのインストール
npx playwright install
# 依存パッケージのインストール
npx playwright install-deps
-
テスト実行前に、ローカル開発環境が起動していることを確認してください:
supabase start npm run dev
-
以下のコマンドですべてのテストを実行できます:
npm run test:e2e
-
特定のテストファイルのみを実行する場合:
npm run test:e2e -- tests/e2e/auth.spec.ts
-
特定のプロジェクト(ブラウザ/デバイス)でのみテストを実行する場合:
# デスクトップブラウザ npm run test:e2e -- --project=chromium npm run test:e2e -- --project=firefox npm run test:e2e -- --project=webkit # モバイルデバイス npm run test:e2e -- --project=mobile-chrome npm run test:e2e -- --project=mobile-safari
-
UIモードでテストを実行する場合(デバッグに便利):
npm run test:e2e:ui
テスト実行後、HTMLレポートが生成されます。以下のコマンドで確認できます:
npx playwright show-report
新しいテストを追加する場合は、以下のファイル構造に従ってください:
tests/e2e/
: すべてのE2Eテストファイルを配置tests/e2e-test-helpers.ts
: テスト用のヘルパー関数と拡張されたテストフィクスチャ
テストファイル命名規則: 機能名.spec.ts
このプロジェクトでは、Supabaseの行レベルセキュリティ(RLS)ポリシーのテストを実装しています。テストはtests/rls
ディレクトリに配置されています。
-
テスト実行前に、
.env
ファイルを設定してください(本番環境ではなくテスト環境のSupabase情報を使用):# .env.test の例 NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
-
以下のコマンドですべてのRLSテストを実行できます:
npm run test:rls
RLSテストは以下のテーブルに対して実装されています:
private-users.test.ts
- private_usersテーブルのRLSポリシーをテストpublic-user-profiles.test.ts
- public_user_profilesテーブルのRLSポリシーをテストachievements.test.ts
- achievementsテーブルのRLSポリシーをテストmissions.test.ts
- missionsテーブルのRLSポリシーをテスト
各テストファイルは以下の構造に従っています:
- テストユーザーの作成:
utils.ts
を使用して異なる権限を持つテストユーザーを作成 - データ操作テスト: 各テーブルに対する挿入・参照・更新・削除操作の権限をテスト
- ポリシー検証: 各RLSポリシーが正しく機能することを検証
tests/rls
ディレクトリに新しいテストファイルを作成しますutils.ts
の関数を使用してテストユーザーを作成・管理します- テーブルごとのRLSポリシーに応じたテストを記述します
- テストを実行して結果を確認します
- テストはテスト用のデータベースで実行してください
- テスト中にデータベースにテストデータが作成されますが、テスト後にクリーンアップされます
- テスト用のユーザーも自動的に作成・削除されます
- テスト実行前にRLSが有効になっていることを確認してください
- 各テストでは、成功ケースと失敗ケースの両方をテストすることが重要です
npm run storybook
stories
ディレクトリにstorybookのファイルを配置してください。
設定しなくとも動きますが、HubSpotまでの連携が見たい方はHubSpotでアカウントを作成してください。
アクションボードでは、ユーザーのプロフィール更新時に自動的にHubSpotのコンタクトリストに登録する機能を実装しています。
- HubSpotアカウントにログインし、Settings(歯車アイコン)をクリック
- 連携 → 非公開アプリ を選択
- 非公開アプリを作成 をクリック
- 基本情報 タブでアプリケーション名を入力
- スコープ タブで以下の権限を設定:
crm.objects.contacts.read
- コンタクト読み取り権限crm.objects.contacts.write
- コンタクト書き込み権限crm.lists.read
- リスト読み取り権限crm.lists.write
- リスト操作権限(コンタクトの追加/削除)
- アプリを作成 をクリックしてアプリを作成
- 生成された Access Token をコピー(
pat-na2-
で始まる形式)
.env.local
に以下を追加:
# HubSpot API連携用のアクセストークン
HUBSPOT_API_KEY=pat-na2-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# HubSpotコンタクトリストID(オプション)
HUBSPOT_CONTACT_LIST_ID=123456
自動的にコンタクトをリストに追加したい場合:
- HubSpotダッシュボードで マーケティング → リスト を選択
- リストを作成 をクリック
- コンタクトベースのリスト を選択
- 静的リスト を選択
- リスト名を入力(例:「アクションボードユーザー」)
- リストを作成後、URLからリストIDを取得(例:
/contacts/list/123456
の123456
部分) - 取得したIDを環境変数
HUBSPOT_CONTACT_LIST_ID
に設定
アクションボードのユーザー情報は以下のようにHubSpotのコンタクトプロパティにマッピングされます:
アプリケーション項目 | HubSpotプロパティ | HubSpot表示名 | データ型 | ステータス |
---|---|---|---|---|
メールアドレス | email |
✅ 実装済み | ||
メールアドレス | firstname |
名 | Text | ✅ 実装済み |
- 新規ユーザー登録時: プロフィール情報入力完了時にHubSpotコンタクトを作成
- プロフィール更新時: 既存のHubSpotコンタクト情報を更新
- 重複管理: メールアドレスベースで重複チェックを実行
- リスト追加: コンタクト作成/更新成功時に指定されたリストに自動追加(
HUBSPOT_CONTACT_LIST_ID
が設定されている場合)
- HubSpot API キーが正しく設定されているか確認
- Private App のアクセストークンが有効期限内か確認
- カスタムプロパティが HubSpot で作成されているか確認
- プロパティ名(Internal name)がコードと一致しているか確認
- HubSpot Private App に
crm.lists.read
とcrm.lists.write
スコープが設定されているか確認 - 指定したリストIDが正しいか確認
- HubSpotアカウントにリスト機能のアクセス権限があるか確認
-
Terraform Cloudへの招待をもらう
-
環境ごとの管理状況:
- action-board-staging →
release/infra/develop
- action-board-production →
release/infra/production
- action-board-staging →
-
トリガー時の挙動:
- 現状、Terraform Cloud側で自動で
plan
を実行し、apply
はUIから手動確認後の実行となります。
- 現状、Terraform Cloud側で自動で
-
環境変数追加手順:
-
通常の環境変数:
terraform/variables.tf
に追加nextjs-app/variables.tf
に追加nextjs-app/cloud_build.tf
のsubstitutions
に追加cloudbuild.yaml
のarg
経由でDockerビルド時に渡す
-
秘匿情報の場合:
nextjs-app/secrets.tf
にSecret定義追加nextjs-app/cloud_build.tf
でSecretへのアクセス権限設定
-
-
Terraform変数(秘匿情報は
sensitive
チェック)の登録先:
- **ISSUE(#398) の対応により、
missions
テーブルへ新規ミッションを登録する際、 同時にmission_category_link
テーブルへの登録が必須になりました。- もし
mission_category_link
への登録を忘れると、トップページにミッションが表示されません。
- もし
- 新規ミッション登録
missions
テーブルへのデータ登録- 必ず
mission_category_link
テーブルへカテゴリー紐づけデータを登録
- カテゴリーの選定
- 登録するミッションを どのカテゴリー に紐づけるかは、PM(プロダクトマネージャー)と相談して決定してください。
- カテゴリ管理は以下の Notion ページで一元管理しています。
- カテゴリ管理 Notion: https://team-mirai.notion.site/203f6f56bae181598a0cfbcd03853b69?v=203f6f56bae18185b448000ca7dcf05f
ミッションデータの詳細についてはmission_data/README.md を参照してください