MiniFlowは、チーム内の申請・承認を扱う業務システムのプロトタイプです。 申請者が下書きを作成・提出し、承認者が承認または差し戻します。管理者はユーザーと所属・役割を管理します。 TypeScriptのモノレポで、業務ルール、ユースケース、DB・HTTPの責務を分けて実装しています。
このREADMEはmainに取り込まれた機能を説明します。開発中の変更や将来案は、実装済み機能に含めません。
| 機能 | できること |
|---|---|
| 申請のライフサイクル | 下書き作成・編集・提出、承認・差し戻し、下書きへ戻して再申請、条件を満たす申請の論理削除 |
| 一覧と集計 | チームの申請、自分の申請、承認できる申請の一覧、状態フィルター、ページ送り、ダッシュボードの全件集計と一覧への移動 |
| 申請詳細 | 状態・本文・次の操作・承認履歴の表示、現在の差し戻し理由の強調、取得失敗時の再試行 |
| 編集中の保護 | 保存済み下書きの未保存変更を検知し、画面移動・ログアウト前に確認 |
| アカウント | ログイン・ログアウト、表示名・日本語/英語の設定、現在のパスワードを使ったパスワード変更 |
| ユーザー管理 | 管理者によるアカウント作成・編集・無効化、所属・役割の管理 |
| アクセス制御 | 認証情報に基づくチーム境界、申請の状態・作成者・役割による操作制限 |
申請の状態はDraft(下書き)、Pending(承認待ち)、Approved(承認済み)、Rejected(差し戻し)、Deleted(削除済み)です。
画面上の操作制限に加え、APIでも認可を行います。所属は管理者が管理し、一般ユーザーが自由に切り替える機能はありません。
- メールアドレスとパスワードでログインし、JWTをHttpOnly cookieに保存します。パスワードはbcryptでハッシュ化します。
- 認証の有効期限は8時間です。パスワード変更では認証世代を更新し、すべての既存セッションを失効させます。ログアウトは、そのブラウザのcookieを削除する操作です。
- 更新APIはログインセッションに結び付いたCSRFトークンを検証します。HTTPのHost・Originと入力形式も検証します。
- 申請は保存時にversionを照合し、競合をHTTP 409で返します。承認・差し戻しの状態更新と履歴の追加は同じトランザクションで行います。
保存versionはサーバーが取得してから保存するまでの競合を検出します。古い画面を開き続けたこと自体を検出する仕組みではありません。 認可・状態遷移・エラー契約の詳細はAPI仕様、設定と運用上の注意はローカル運用手順に記載しています。
公開ユーザー登録とメール招待はありません。初期管理者は運用者がCLIで作成し、以降のアカウントは管理者が発行します。
パスワードを忘れた利用者向けのメール再設定機能は未実装です。 /account/passwordは、ログイン済みの本人が現在のパスワードを入力して変更するAPIです。
通知センター、LINE連携、多段承認も対象外です。公開デモURLやGitHub ActionsによるCI実行結果は、このREADMEでは提供していません。
| 領域 | 技術 |
|---|---|
| フロントエンド | Next.js 15、React 19、TypeScript |
| API | Fastify 5、TypeScript |
| データベース | PostgreSQL 16、Prisma 6 |
| テスト | Vitest、実HTTPとメモリ保存先を使う試験、専用PostgreSQLでの明示実行試験 |
| 開発環境 | Node.js 22.12以上、pnpm 10.6.3、Docker Compose |
apps/
web/ Next.jsの画面とAPIクライアント
api/
src/domain/ 申請・承認・ユーザーの業務ルール
src/application/ ユースケースと保存先などの契約
src/infrastructure/ Prisma、認証などの外部実装
src/presentation/ HTTPとレスポンス変換
prisma/ 現行スキーマとmigration
packages/shared/ 通信に使う共有型
tests/ domain・usecase・HTTP・Webの試験
docs/ 仕様、試験、運用、作業ごとの検証記録
.harness/ 共通開発ルールの参照と検証設定
HTTPの組み立てには保存先を注入でき、業務ルールを本番実装のまま、実DBなしで試験できます。Prismaの保存処理やトランザクションは別のDB試験で確認します。 AI支援開発のルールはGit submoduleの共通Harnessを参照し、検証内容はProject Profileで定義しています。
直近のmainへ取り込まれた申請詳細の検証記録では、332件の試験、型検査、本番ビルド、テキスト形式・秘密情報の検査が成功しています。 これは記録された時点のローカル検証結果です。GitHub Actionsでの成功を示すものではありません。
| 確認対象 | 実施内容と限界 |
|---|---|
| 自動試験 | domain・usecase・HTTP・Webのロジックや部品を検証。標準試験はDB接続なしで実行 |
| ブラウザ | 架空ユーザーとメモリAPIで操作・日英表示・1280px/390pxの表示を確認。全ブラウザ・実機・全画面の自動E2Eを保証するものではない |
| DB競合 | 専用の使い捨てPostgreSQLで、同時承認・編集・提出・削除との競合、履歴追加失敗時のロールバックなど7シナリオを確認 |
| 未整備 | lint、ブラウザ試験の自動Runner登録、依存の既知脆弱性監査 |
DB競合の具体的な結果と未検証範囲は競合制御の検証記録を参照してください。その時点の全体検証には未通過項目もあり、DB試験の成功とは分けて記録しています。 専用DBでの成功は、既存DBへの移行やバックアップ復元の保証ではありません。
GitHub Actionsの定義は.github/workflows/validation.ymlです。同一repositoryのPR、mainへのpush、手動実行で、以下と同じProject Profileを実行します。共通Harnessが非公開のため、専用の読み取り認証をActions secret HARNESS_READ_TOKENへ設定する必要があります。未設定では検証jobが失敗します。設定と対象範囲はCI手順を参照してください。
forkのPRは、非公開Harnessと専用secretを渡さないため対象外です。workflowの追加だけでCI成功とは扱わず、各PRの実行結果を確認します。ブラウザ機能試験や実DB試験も、このCIでは実行しません。
依存とPrisma Clientを準備した環境で実行します。
node .harness/upstream/scripts/validate-config.mjs
node .harness/upstream/scripts/validate.mjs2つ目は実行予定を表示するだけです。内容を確認してから、次のコマンドで実行します。
NEXT_TELEMETRY_DISABLED=1 node .harness/upstream/scripts/validate.mjs --execute個別にはpnpm typecheck、pnpm test、pnpm buildを使えます。型検査は各workspaceに加え、ルートのテストと生成済みAPI型も対象です。
lintは未導入のため理由付きでskipします。型検査やbuildがlintの代わりにすべての問題を検出するとは扱いません。
DB競合試験は標準のpnpm testには含まれず、試験仕様書の専用DB手順で明示実行します。
Node.js 22.12以上、Corepack、Docker Composeを利用できる環境が必要です。以下はローカル開発用で、既存・共有DBへの適用手順ではありません。
git clone --recurse-submodules https://github.com/Czmirror/MiniFlow.git
cd MiniFlow
corepack enable
corepack prepare pnpm@10.6.3 --activate
pnpm install --frozen-lockfile --ignore-scripts
pnpm db:generate既存のcloneではgit submodule update --init --recursiveでHarnessを準備します。
installではライフサイクルスクリプトを実行せず、Prisma Clientを明示生成します。db:generateはコード生成で、DBへのmigration適用ではありません。必要なPrisma engineが手元にない場合は取得が発生します。
cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env.localAPIを起動するプロセスにJWT_SECRETとDATABASE_URLを設定します。JWT_SECRETは例の値をそのまま使わず、自分の開発環境用に用意し、Git・コマンド引数・共有ログへ記載しないでください。ファイルをコピーするだけで、APIプロセスへの環境変数の設定が済んだとは扱いません。
Prisma用の接続設定とAPIプロセスのDATABASE_URLは、同じ開発用DBへ向けます。WebのNEXT_PUBLIC_API_BASE_URLには公開可能なAPIのURLだけを設定します。
| ローカル既定値 | 接続先 |
|---|---|
| Web | http://localhost:3100 |
| API | http://localhost:3001 |
| PostgreSQL | localhost:5432、開発用DB名miniflow |
Host・Originの設定を変更する場合はローカル運用手順を参照してください。
docker compose up -dこの構成はローカル開発用のPostgreSQLと永続volumeを作ります。すでに同じportやvolumeを使っている場合は、対象を確認してから進めてください。 接続先を確認した新規の開発用DBへ、既存migrationを適用します。
pnpm --filter @miniflow/api exec prisma migrate deploymigrationはDBの構造を変更します。既存・共有DBでは、バックアップなどを含む適用手順を先に確認してください。 初期管理者は管理者作成手順に従い、安全な環境変数の入力経路から設定してCLIで作成します。公開登録や固定のデモアカウントはありません。
環境変数を設定したターミナルでAPIを起動します。
pnpm dev:api別のターミナルでWebを起動します。
pnpm dev:webhttp://localhost:3001/healthでDB接続を確認し、MiniFlowを開きます。管理者が発行したアカウントでログインし、下書き作成から提出・決裁を試せます。
- API仕様:状態遷移、認証・認可、入力・エラーの契約
- ローカル運用手順:環境設定、schema適用、初期管理者の作成
- 現行Prismaスキーマ:実装しているモデルと関連
- ER図(現行Prismaへの更新待ち):旧設計資料。teamsテーブルや外部キーなどに現行実装との差があるため、現行DBの説明には上記スキーマを参照
- 要求仕様・非機能要求・実装ガイド:設計資料。現在の実装状況はコードと個別仕様・検証記録も併せて確認
- 全体レビュー記録:段階的な改善の出発点。対処済みの課題も含む
次の整備候補は、現行Prismaに対応したER図、ブラウザ試験の自動化、承認フローの操作動画、ロール別認可表です。これらを追加することと、新機能を実装することは分けて進めます。