Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗整骨院・治療院向けのマルチテナント業務管理 SaaS です。Next.js 15 (App Router) と Supabase をベースに、予約、患者、日報、収益、スタッフ、管理設定、セキュリティ監視を 1 つのアプリで扱います。
テナント境界は clinic_id。患者情報を扱う医療系システムのため、認可・RLS・テナント分離を最優先しています。現行バージョンは 0.1.0-pilot です。変更完了、パイロット出荷、一般商用出荷、顧客価値検証は、それぞれ独立した現行ゲートで判断します。
App Router のルートグループでアクセス境界を分離しています。
(public) — 未認証導線
/ ランディング/login スタッフログイン / /admin/login 管理者ログイン / /admin/callback/register, /register/verify, /invite, /forgot-password, /reset-password/[source]/booking/[clinic_id] 公開予約/terms, /privacy, /unauthorized(app) — 認証必須の業務画面(AppShell レイアウト)
/dashboard/reservations, /reservations/new, /reservations/list, /reservations/register, /reservations/[id]/reservations/settings/menus, /reservations/settings/resources/patients, /patients/list, /patients/[id]/daily-reports, /daily-reports/input, /daily-reports/edit/[id]/revenue, /staff, /staff/shift-requests, /staff/shift-requests/admin/multi-store, /onboarding, /chat, /ai-insights, /blocks, /master-data(app)/manager — manager(多店舗統括)向け画面
/manager/clinic-comparison, /manager/shift-requests, /manager/staff, /manager/staff-analysis(app)/admin/(protected) — 管理者機能
/admin/users, /admin/tenants, /admin/settings, /admin/managers, /admin/master/admin/security-dashboard, /admin/security-monitor, /admin/session-management/admin/mfa-setup, /admin/chat, /admin/beta-monitoring, /admin/shift-requestsAPI は src/app/api/**/route.ts。網羅一覧ではなく主要なドメイン単位で記載します(正本はソースを参照)。
reservations, customers, patients, daily-reports(および daily-reports/items の pricing / tags / care-episode), revenue, revenue-estimates, dashboard(dashboard/bootstrap), menus, menu-templates(billing-profiles 含む), resources, blocks, clinics, care-episodes, customers/[id]/insurance-coveragesstaff, staff/shifts, staff/preferences, staff/demand-forecast, staff/shift-requests(convert 含む), staff/shift-request-periodsmanager/dashboard, manager/assigned-clinics, manager/clinic-comparison, manager/revenue/analysis, manager/patients/analysis, manager/daily-reports/overview, manager/staff, manager/staff-analysispublic/menus, public/reservations, public/resourcesonboarding/*(clinic / profile / invites / status / seed), auth/profile, mfa/*(setup / verify / status / disable / backup-codes)admin/settings, admin/users(accounts / candidates / [permission_id]), admin/tenants/[clinic_id], admin/managers/[managerUserId]/clinics, admin/master-data(export / import / rollback), admin/security/*, admin/rate-limit/*, admin/staff/invites, admin/dashboard, admin/chat, admin/ai-insights, admin/notifications, admin/monitoring/sentry-test, admin/tablesai-insights, ai-comments, chat, clinic/analysis, customers/analysisbeta/feedback, beta/backlog, beta/metricsinternal/process-email-outbox(outbox → Resend), webhooks/resend, security/csp-report, notifications, , email_outbox 経由の outbox パターン)主要依存とスクリプトは package.json を正本としてください。
@/lib/supabase から import(@/lib/supabase/server の直 import は ESLint エラー)。
createClient() / getServerClient(): リクエスト毎の SSR クライアント(RLS 適用、通常はこれ)createAdminClient(): service role で RLS バイパス(サーバー専用・最小限)createScopedAdminContext(): clinic scope 検証付き admin クライアント(管理系・多店舗操作)src/lib/schemas/)→ processApiRequest()(src/lib/api-helpers.ts、管理 API は verifyAdminAuth())→ clinic scope 強制(ensureClinicAccess() / processClinicScopedBody())→ 統一エンベロープ { success, data | error } → handleRouteError() + AppError。user_permissions の role + clinic_id(単店舗)/ clinic_scope_ids(複数店舗)。manager スコープは resolveEffectiveClinicScope()、role 正規化は normalizeRole()(clinic_manager → clinic_admin)。RLS が最後の砦。supabase/migrations/ のみ。旧 src/database/ 等の参照SQLは docs/archive/sql-reference-assets/ に隔離済みで直接適用禁止。予約は reservations が SSOT(appointments はレガシー読み取り専用)。src/types/supabase.ts は npm run supabase:types の生成物(手書き編集禁止)。src/lib/jst.ts の JST ユーティリティを使う(UTC/JST 混在で E2E が落ちた実績あり)。src/lib/env.ts で起動時に検証します(NODE_ENV=test は除外)。
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYNEXT_PUBLIC_APP_URLPROTECTED_ROUTE_PREFIXES)とログイン分岐は middleware.ts で管理しています。
/admin/** は管理者ログイン(/admin/login)へ/login、redirectTo 付き)へCSP_ROLLOUT_PHASE: report-only | partial-enforce | full-enforce、失敗時 fail-open)③保護ルート判定 ④Pilot mode リダイレクト。NEXT_PUBLIC_PILOT_MODE=true)時は /chat, /ai-insights, /admin/security-*, /admin/beta-monitoring, /admin/session-management, /admin/master, /admin/chat, /blocks, /master-data を /dashboard へリダイレクトします。supabase/config.toml で管理し、auth.hook.custom_access_token により clinic scope を JWT claim に反映します。24.x>=10.0.0npm install
npm 固定です。他パッケージマネージャのロックファイル導入は禁止しています。
最小構成は .env.local.example をベースに .env.local を作成します。
cp .env.local.example .env.local
最低限、以下は設定が必要です。
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
NEXT_PUBLIC_APP_URL=http://localhost:3000
用途別のテンプレート:
.env.local.example.env.test.example.env.production.example主要フラグ: NEXT_PUBLIC_PILOT_MODE / NEXT_PUBLIC_ENABLE_CHAT / NEXT_PUBLIC_ENABLE_AI_INSIGHTS / CSP_ROLLOUT_PHASE。
環境変数の取り扱い方針は docs/operations/ENV_MANAGEMENT_POLICY.md を参照してください。
npm run dev
http://localhost:3000dev は npx next dev --hostname 0.0.0.0 を実行します(predev で SWC バイナリを検証)。supabase start
supabase status
npm run verify:supabase
ローカル構成の主要ポートは supabase/config.toml に定義されています(デフォルトと異なる点に注意)。
54331543325433354334歴史的な安定化 DoD では以下を基準としていました。
supabase startsupabase statussupabase db push --local --dry-run(スキーマ drift = diff ゼロが基準)npm run verify:supabase詳細は歴史的証跡 docs/stabilization/DoD-v0.1.md を参照してください。現在の出荷判断には リリースガバナンス索引 を使用します。
開発用:
docker compose -f docker-compose.dev.yml up -d
docker compose ps
本番相当:
docker compose up -d
docker compose ps
ヘルスチェックは GET /api/health で確認できます。実装は src/app/api/health/route.ts です。
npm run lint # ESLint(lint:fix で自動修正)
npm run type-check # tsc --noEmit
npm run test -- --ci --testPathIgnorePatterns=e2e
npm run build # standalone 出力
*.test.tsx → client (jsdom) / *.test.ts → server (node)。拡張子で実行環境が決まります。scripts/run-jest.mjs 経由で、Windows では --runInBand が自動付与されます。src/__tests__/ は tsconfig 型チェック・ESLint の対象外(テスト内は any 許容)。.github/workflows/ci.yml)PR 前にローカルで通すこと。
npm run scan:secretssrc/types/supabase.ts の先頭が export type Jsonnpm run e2e:validate-fixtures(静的)npm run test:pr05:focused(CI 必須ゲートの 9 スイート回帰)npm run e2e:validate-fixtures
npm run e2e:seed
npm run test:e2e:pw
npm run e2e:cleanup
PLAYWRIGHT_BASE_URL > NEXT_PUBLIC_APP_URL > http://127.0.0.1:3000。webServer は npm run dev を自動起動します(seed 必須)。npm run supabase:types # → src/types/supabase.ts
npm run scan:secrets # 機密スキャン(CI 必須)
docs/stabilization/spec-*.mdsupabase/migrations/)src/
app/
(public)/ 未認証導線(login, register, booking ほか)
(app)/ 認証必須の業務画面(manager / admin 配下を含む)
api/ 業務 / 公開 / 管理 / manager / internal API
components/ 画面・UI コンポーネント(ui/ は shadcn ベース)
hooks/ React Query フック(queries/ にクエリ定義)
lib/ auth, supabase, schemas, services, security, rate-limiting,
notifications, reservations, staff, insurance-fees, ai ほか
providers/ query-provider / selected-clinic-context / user-profile-context
types/ TypeScript 型(supabase.ts は生成物)
__tests__/ Jest / Playwright テスト(api, lib, security, rls, stabilization ほか)
supabase/
config.toml ローカル Supabase 設定
migrations/ 現行マイグレーション(実行 SSOT)
rollbacks/ ロールバック SQL(migration 追加時にセットで用意)
scripts/
e2e/ E2E 用 seed / cleanup / validate-fixtures
docs/
stabilization/ 安定化仕様(spec-*)と DoD
operations/ Runbook と運用ドキュメント
archive/ 歴史的資料と直接適用禁止の参照SQL
src/app/ のソースを参照してください。db reset / db push、ボリューム削除、force-push 等)は AGENTS.md の approval ルールに従ってください。src/legacy/ は lint・型チェック対象外のレガシーです。拡張・パターン流用は禁止しています。UNLICENSED。社内利用前提です。
system/statushealth