- プロジェクトへのコントリビュートの際には、コントリビューターライセンス契約(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
mission_data/README.mdを参照ください。 -
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 upmigrationファイルの追加や編集で、テーブルの追加や更新を行った場合は、型定義を生成してください。
npx supabase gen types typescript --local > lib/types/supabase.ts
このプロジェクトでは、Jestを使用した単体テストを実装しています。テストは各資材と同じディレクトリに配置されています。
-
以下のコマンドですべてのテストを実行できます:
npm run test:unit
テスト実行後、coverage/ディレクトリにレポートが出力されます。(標準出力でも確認できます。)
カバレッジ(コード網羅性)が80%を超えることを基準に、テストを作成してください。
新しいテストを追加する場合は、機能名.test.(ts|tsx)の命名規則に従ってください。
このプロジェクトでは、Playwrightを使用したE2Eテストを実装しています。テストはtests/e2eディレクトリに配置されています。
-
テスト実行前に、ローカル開発環境が起動していることを確認してください:
supabase start
-
以下のコマンドですべてのテストを実行できます:
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 storybookstoriesディレクトリに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 を参照してください