尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
厚生労働省「職業性ストレス簡易調査票(57項目)」準拠のストレスチェックシステムです。判定は合計点数法(B≧77、またはB≧63かつA+C≧76)。Next.js (App Router) + Supabase (Auth / Postgres / RLS) + Vercel で構成された、産業医事務所による複数企業(マルチテナント)運用向けの実装です。 現在の運用では company(事業者担当者)アカウントは発行しません(実施事務従事者に統一)。RLS・スキーマ上のcompanyロールの制御は将来のために残していますが、招待画面のロール選択は 従業員 / 実施事務従事者 のみです。 氏名・社員番号・部署は従業員本人が受検時に入力します(管理者は招待時にメールアドレスと企業のみ指定)。 企業間分離はすべてのRLSポリシーが company_id で行分離しており、企業Aのアカウントから企業Bのデータは1行も取得できません(受け入れテストで自動検証)。查看完整 README ↗
厚生労働省「職業性ストレス簡易調査票(57項目)」準拠のストレスチェックシステムです。判定は合計点数法(B≧77、またはB≧63かつA+C≧76)。Next.js (App Router) + Supabase (Auth / Postgres / RLS) + Vercel で構成された、産業医事務所による複数企業(マルチテナント)運用向けの実装です。
| ロール | 想定者 | 個人結果 | 集団分析 | 面接指導申出 | アクセスログ |
|---|---|---|---|---|---|
| office | 産業医事務所 | 全企業・全結果 | 全企業 | 全企業分を閲覧・状態更新 | 閲覧可 |
| jimu | 実施事務従事者(企業ごと) | 自社の全結果 ※誓約必須 | 自社 | 自社分を閲覧・状態更新 | 不可 |
| company | 事業者側担当者 | 自社の同意ありのみ | 自社 | 不可 | 不可 |
| employee | 従業員 | 自分のみ | 不可 | 自分の申出のみ | 不可 |
現在の運用では company(事業者担当者)アカウントは発行しません(実施事務従事者に統一)。RLS・スキーマ上のcompanyロールの制御は将来のために残していますが、招待画面のロール選択は 従業員 / 実施事務従事者 のみです。
氏名・生年月日・部署は従業員本人が受検時に入力します(管理者は招待時にメールアドレスと企業のみ指定)。
企業間分離はすべてのRLSポリシーが company_id で行分離しており、企業Aのアカウントから企業Bのデータは1行も取得できません(受け入れテストで自動検証)。
Supabase SQL Editor で以下を順に実行:
supabase/migrations/0002_production.sql(適用済みの場合はスキップ)supabase/migrations/0003_app_fixes.sql — 必ず実行してください。内容:
auth.users に残したトリガーの削除(これを実行しないとユーザー招待が全件失敗します)consented_resultssupabase/migrations/0004_employee_self_entry.sql — 必ず実行してください。従業員本人が社員番号を入力できるようにする列権限の追加ですinsert into public.profiles (user_id, role, name)
values ('<officeユーザーのUID>', 'office', '植松 太郎');
以後のユーザー(従業員・jimu)は、officeダッシュボードの「ユーザー管理」から招待できます(単発またはCSV一括: メール, 企業コード の2列)。氏名・社員番号・部署は本人が受検時に入力します。
実施事務従事者(jimu)も自社の従業員を招待できます(jimuダッシュボードの「従業員招待」タブ。単発またはメールアドレス1列のCSV一括)。jimuが招待できるのは自社・従業員ロールのみで、他社への招待やjimu/officeロールの発行はAPI側で拒否されます。
個別招待の代わりに、受検用の配布URLで従業員が自己登録する方式が使えます:
/join/<トークン>)を開くと会社名・実施年度が表示され、自分のメールアドレス+パスワードで登録(登録したメールアドレスはログインに必要)環境変数(Settings > Environment Variables):
| 変数 | 用途 | 公開範囲 |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | SupabaseプロジェクトURL | クライアント公開(問題なし) |
NEXT_PUBLIC_SUPABASE_ANON_KEY | anonキー(RLS前提の操作のみ) | クライアント公開(問題なし) |
SUPABASE_SERVICE_ROLE_KEY | 招待API・通知API専用 | サーバーのみ。絶対にNEXT_PUBLIC_を付けない |
RESEND_API_KEY | 面接指導申出の通知メール送信 | サーバーのみ |
SENDER_EMAIL | 通知メールの送信元(Resend認証済みドメインのアドレス) | サーバーのみ |
GitHubへのpushで自動デプロイされます。
独自ドメイン(例: check.mestate.jp)の設定手順:
check.mestate.jp を追加cname.vercel-dns.com)をドメインのDNSに追加https://check.mestate.jp と https://check.mestate.jp/auth/callback){アプリURL}/auth/callback を追加通知はアプリ本体(/api/notify-interview)に組み込まれており、Edge FunctionやDatabase Webhookの設定は不要です。Vercelの環境変数に RESEND_API_KEY と SENDER_EMAIL を設定すれば動作します。
# ユニットテスト(スコアリング・年度判定・CSV生成/BOM・CSVパーサ)
npm test
# 受け入れテスト(実Supabaseに対する統合テスト。仕様書7章の1〜6+セキュリティ検証)
SUPABASE_URL=https://xxxx.supabase.co \
SUPABASE_ANON_KEY=eyJ... \
SUPABASE_SERVICE_ROLE_KEY=eyJ... \
npm run test:acceptance
受け入れテストはテスト用の企業・ユーザー・結果を作成して検証し、終了時に削除します(検証用プロジェクトでの実行推奨)。検証項目:
src/
app/
exam/ 従業員: 受検(年度重複時はブロック)
my/ 従業員: 結果・同意変更・面接指導申出
office/ 実施者: 企業横断ダッシュボード(結果/申出/集団分析/招待/ログ)
jimu/ 実施事務従事者: 誓約→自社ダッシュボード
company/ 事業者担当者: 集団分析+同意あり結果
api/invite/ 招待API(service_roleキーをサーバー内でのみ使用)
api/notify-interview/ 面接指導申出の通知メールAPI(Resend)
login, reset-password, account/update-password, auth/callback
components/ 共有UI(結果一覧・申出一覧・集団分析グラフ・招待・ログ)
lib/ スコアリング・年度・CSV・アクセスログ・Supabaseクライアント
supabase/
migrations/ 0002_production.sql(スキーマ+RLS) / 0003・0004(必須の補正)
tests/
unit/ ユニットテスト
acceptance/ 受け入れテスト(実Supabase統合)