After Framework

共通の運用基盤の上でプロダクトを構築する。

一度つくり、あらゆるドメインへ。

After Framework は、アーキテクチャ、アイデンティティ、AI、デザインシステム、ツール、再利用可能なドメインモジュールという共通基盤をプロダクトに提供します。

supercore/packages7 パッケージ · 2 プロダクトライン · 1 コンポジション契約
SuperGarageAfterHubSuperHospitalafter_ecosystemafter_aiafter_consumerafter_enterpriseafter_firebaseafter_coreafter_design_system
凡例:pubspec の依存関係ドキュメント上の参照スタック

01 · フレームワークのアーキテクチャ

1 つのカーネル、2 つのプロダクトライン、その上に薄いプロダクト。

すべてのプロダクトは同じレイヤーを共有します。Life Domain や Industry Domain を追加しても、最上位にモジュールが 1 つ加わるだけで、下位のレイヤーは変わりません。

プロダクト固有

共有プラットフォーム

コンポジションルートのアダプター

レイヤーを選択すると、その責務と依存先を確認できます。

after_core

共有カーネル

認証、堅牢化されたネットワーク、ストレージ、Riverpod による DI、フラグ、リモート設定、BYOK AI SDK、プレミアム権限、通知、ディープリンク、そしてダッシュボード・プラグイン・検索・設定の各エンジンです。

依存先
なし — 基盤レイヤー
利用元
プロダクトドメイン層 · エコシステム層 · AI 機能 · コンシューマーモジュール · エンタープライズモジュール · デザインシステム · Firebase アダプター

共有される再利用、プロダクト固有の体験

プラットフォームの基本方針では、各プロダクトがランタイム機能の 90% 以上を継承することを目標としています。プロダクトが所有するのは、ドメイン、バーティカル機能、AI プロファイル、カタログ、ブランディングだけです。

システムを支えるルール

  1. 01SDK よりポート:バーティカルなコードは After のインターフェースに依存し、ベンダー SDK には依存しません。
  2. 02バーティカルモジュールは、プロダクトリポジトリの lib/features/ 配下にのみ置きます。
  3. 03すべてのポートにモックが付属するため、スキャフォールドはバックエンドなしで動作します。
  4. 04ゼロから作らず生成する:新しいプロダクトは新たなアーキテクチャではなく、仕様から始めます。

02 · プロダクトファクトリー

アイデアから、再利用可能な基盤の上で動くプロダクトへ。

プロダクトファクトリーは、小さな product.spec.yaml を、共有パッケージに依存する兄弟 Flutter アプリに変換します。仕様にはそのプロダクト固有の内容だけを記述します。

  1. 01

    アイデア

    プロダクト名を決め、consumer または enterprise のラインを選びます。リファレンスは SuperGarage または SuperHospital です。

  2. 02

    ドメイン

    product.spec.yaml に、ドメイン、バーティカル機能、タブ、権限、ダッシュボードウィジェット、AI スキル、ブランディング、ロケールを記述します。

  3. 03

    モジュール

    認証、メンバーシップまたは組織、RBAC、カレンダー、タスク、通知、検索など、仕様に含まれないものはすべて継承されます。

  4. 04

    プロダクトシェル

    generate_product.ps1 が、マニフェスト、コンポジションルート、機能カタログ、シェル、l10n ファイル、CI ワークフローを出力します。

  5. 05

    デプロイ

    生成された CI ワークフローは、main へのすべての push とプルリクエストで、フォーマット、静的解析、カバレッジ付きテストを実行します。

プロダクトが所有するもの

  • 名前、パッケージ、バンドル、プロダクトライン
  • バーティカル機能と i18n キー
  • ナビゲーションタブ
  • RBAC の権限文字列
  • ダッシュボードウィジェット
  • AI スキルとツールバインディング
  • アクセントカラーとモノグラム

プラットフォームが提供するもの

  • 認証とスーパー管理者
  • メンバーシップまたは組織
  • RBAC エンジンと監査ログ
  • カレンダー、タスク、ドキュメント
  • 通知と分析
  • ワークフロー・ダッシュボード・検索エンジン
  • デザインシステム、スプラッシュ、CI

仕様を更新してジェネレーターを再実行すると、人が書いた機能コードを壊すことなくスケルトンファイルが更新されます。

03 · パッケージと機能

7 つのパッケージ。明示的な依存関係。

supercore リポジトリ内のすべてのパッケージはバージョン 1.0.0 で、パス依存関係として利用されます。パッケージを選択すると、その依存先と依存元をたどれます。

共有カーネル

after_core

認証、ネットワーク、ストレージ、DI、分析、フィーチャーフラグ、リモート設定、AI、通知、ディープリンク、プレミアム権限のポートとデフォルト実装です。プロダクトは Riverpod のプロバイダーを独自のアダプターでオーバーライドします。

依存先
なし — 基盤レイヤー
利用元

主要 API

  • AppPlatformManifest
  • PlatformConfig
  • AfterStandardOverrides
  • AfterBootstrapMode
  • AfterAuthRepository
  • AfterApiClient
  • AfterHttpClientFactory
  • AfterFeatureFlags
  • AfterRemoteConfig
  • AfterAiCredentialVault

主なサードパーティ依存関係

flutter_riverpod · dio · flutter_secure_storage · shared_preferences · google_sign_in · app_links · flutter_local_notifications

after_ecosystemafter_aiafter_consumerafter_enterpriseafter_firebaseafter_coreafter_design_system

例

dart
import 'package:after_core/after_core.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final prefs = await SharedPreferences.getInstance();

  runApp(
    ProviderScope(
      overrides: [
        afterSharedPreferencesProvider.overrideWithValue(prefs),
        afterAuthRepositoryProvider.overrideWithValue(MyFirebaseAuthRepository()),
        afterAnalyticsProvider.overrideWithValue(MyFirebaseAnalytics()),
        // ... store-specific adapters
      ],
      child: const MySuperApp(),
    ),
  );
}

ソース supercore/packages/after_core/README.md (新しいタブで開きます)

04 · CLI と開発ワークフロー

魔法ではなく、スクリプトと Flutter コマンド。

ツールは supercore/scripts に PowerShell スクリプトとして置かれ、標準の Flutter ツールチェーンと併用します。独立したパッケージ版の CLI バイナリはありません。

初期化

Flutter なしで仕様を検証し、兄弟アプリを生成してブートストラップします。

validate_product_spec.ps1
powershell -File scripts\validate_product_spec.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yaml

ソース supercore/factory/README.md (新しいタブで開きます)

generate_product.ps1
# From a spec
powershell -File scripts\generate_product.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yaml

# From a name only (quick starter)
powershell -File scripts\generate_product.ps1 -Name SuperAirport -Reference SuperHospital

# Preview without writing files
powershell -File scripts\generate_product.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yaml -DryRun

ソース supercore/factory/README.md (新しいタブで開きます)

flutter
cd ..\superairport
flutter create .
flutter pub get
flutter analyze
flutter test

05 · フレームワークから実際のプロダクトへ

共有機能が、プロダクト固有の体験になる。

SuperGarage は提供中のコンシューマー向けリファレンスです。以下の画面はすべて実際のストアのスクリーンショットで、オーバーレイはどの部分がプラットフォーム由来で、どの部分をプロダクトが所有しているかを示します。

SuperGarage のスクリーンショット:ガレージダッシュボードに表示される車両の健康スコアとリマインダー。

SuperGarage の機能マップ

supergarage/lib がインポートしている識別子を、所有パッケージごとにまとめたものです。

after_core

  • AfterUserPlan
  • AfterAiCredentialVault
  • AfterLocalNotifications

after_consumer

  • FamilyShellHeader
  • AfterRegionalLocation

after_firebase

  • AfterFirebaseBootstrap

プロダクト機能

  • features/vehicle
  • features/maintenance
  • features/obd
  • features/expenses
  • features/fleet
  • features/trips
  • features/assistant
  • features/community

プロダクトファミリー

ステータスは supercore/catalog/products.yaml の記録に基づきます。提供中となっているのは SuperGarage のみです。

  • SuperGarage のアイコン

    SuperGarage

    コンシューマー · リファレンス

    モビリティ:車両、メンテナンス、保険、燃料、OBD、フリート

    after_core · after_design_system · after_firebase · after_consumer

  • AfterHub のアイコン

    AfterHub

    コンシューマー · OS シェル

    コンシューマー OS シェル:アイデンティティ、ダッシュボード、AI、カレンダー、検索、After+

    スキャフォールド

    after_ai · after_consumer · after_core · after_firebase · after_design_system · after_ecosystem

  • SuperHospital のアイコン

    SuperHospital

    エンタープライズ · リファレンス

    病院運営 — エンタープライズ向けリファレンス

    スキャフォールド
  • SuperHealth のアイコン

    SuperHealth

    コンシューマー

    パーソナルヘルス:服薬、記録、睡眠、栄養

  • SuperFinance のアイコン

    SuperFinance

    コンシューマー

    パーソナルファイナンス:サブスクリプション、予算、投資

    スキャフォールド
  • SuperHome のアイコン

    SuperHome

    コンシューマー

    住まいと家庭:メンテナンス、光熱費、保証

    スキャフォールド
  • SuperTravel のアイコン

    SuperTravel

    コンシューマー

    旅行:旅程、フライト、ホテル、行程表

    スキャフォールド
  • SuperPet のアイコン

    SuperPet

    コンシューマー

    ペット:獣医ケア、フード、健康記録

    スキャフォールド
  • SuperNews のアイコン

    SuperNews

    コンシューマー

    要約付きの AI パーソナライズニュース

  • SuperSports のアイコン

    SuperSports

    コンシューマー

    スポーツとパフォーマンス:フィットネス、スコア、試合日程

  • SuperAirport のアイコン

    SuperAirport

    エンタープライズ

    空港運営:フライト、ゲート、滑走路

    スキャフォールド
  • SuperMaritime のアイコン

    SuperMaritime

    エンタープライズ

    港湾と船舶の運用

    スキャフォールド
  • SuperFactory のアイコン

    SuperFactory

    エンタープライズ

    工場現場の MES と保全

    スキャフォールド
  • SuperFarm のアイコン

    SuperFarm

    エンタープライズ

    農場運営:作物、家畜、機材

    スキャフォールド

06 · デザインシステム

画一的にならない一貫性。

after_design_system は、すべてのプロダクトに同じ UI フレーム、密度、モーションを提供します。プロダクトが変えるのはアクセント、モノグラム、機能、文言であり、システムそのものではありません。

トークン

カラー、スペーシング、角丸、モーションは Dart の定数として定義され、コンシューマーとエンタープライズで共有されます。

カラー

  • accent#38BDF8
  • accentDeep#0284C7
  • graphite950#0B0C0F
  • graphite800#222831
  • steel#8A919D
  • lightBackground#FAFBFC
  • success#22C55E
  • warning#F59E0B
  • danger#EF4444

スペーシング · 4pt スケール

  • xs4
  • sm8
  • md12
  • lg16
  • xxl24
  • xxxl32
  • massive48
  • hero64

角丸

  • 6
  • 8
  • 12
  • 16
  • 20

モーション

  • instant100ms
  • fast · micro180ms
  • normal · page280ms
  • slow · modal420ms
  • emphasis560ms

コンポーネント

ボタン、カード、入力、ナビゲーション、ダイアログ、チャート、ダッシュボード、空状態と読み込み状態、設定セクション、シェルのトップバー。

  • buttons.dart
  • cards.dart
  • inputs.dart
  • navigation_bar.dart
  • dialogs.dart
  • charts.dart
  • dashboard.dart
  • empty_states.dart
  • loading.dart
  • settings_section.dart
  • shell_top_bar.dart

アクセシビリティ

ライトとダークの配色が同梱されています。チャートの系列は判別しやすい順序で並び、モーショントークンによってトランジションは短く目的に沿ったものに保たれます。

レスポンシブ動作

ページの余白とコンテンツ幅は、AfterSpacing によってビューポート幅に応じて調整されます。

ビューポート幅コンテンツ最大幅ページ余白
< 360width14 / 10 / 14 / 28
360 – 41952016 / 12 / 16 / 28
420 – 71964020 / 12 / 20 / 28
≥ 72076020 / 12 / 20 / 28

ブランド拡張

各プロダクトの仕様でアクセントとモノグラムを宣言します。テーマは accentOverride でアクセントを受け取り、それ以外はファミリー共通のままです。

  • SuperGarage#22D3EE
  • SuperKids#F472B6
  • SuperHospital#F43F5E
  • SuperFactory#F59E0B

07 · ドキュメント

すばやく目を通せるドキュメント。

すべてのページは supercore リポジトリに基づいており、元のソースファイルへリンクしています。

  • キーボードショートカットによる即時検索
  • ディープリンク付きの固定目次
  • 両テーマ対応のコピーボタンとシンタックスハイライト
  • 依存関係グラフ付きのパッケージページ
  • 静的フォールバック付きのアーキテクチャ図
  • 右から左への表記に対応した 10 言語で提供
ドキュメントを開く

08 · エンタープライズ境界

フェイルクローズな境界。

エンタープライズの分離はコードで強制され、アーキテクチャ決定記録(ADR)に記録されています。

  • フェイルクローズなテナント分離

    組織スコープのエンタープライズポートには EnterpriseScope が必須です。organizationId が欠けていると例外がスローされ、全テナントのデータを返すことはありません。

  • 永続化の前に権限チェック

    バーティカル機能は、変更を伴う呼び出しの前に PermissionSet.allows(...) をチェックします。権限文字列は各プロダクトが独自に宣言します。

  • 追記専用の監査

    変更を伴うエンタープライズ操作はすべて、追記専用の AuditLogRepository に AuditLogEntry を追加する必要があります。

  • セキュアな相互運用のみ

    プロダクト間の呼び出しは AfterSecureInteropBridge を経由します。After ID のオーディエンス、スコープ、RBAC、組織メンバーシップを確認した後、監査エントリを必ず記録します。

  • フェイルファストな起動

    本番モードではアダプターが欠けていると起動時に例外がスローされるため、モックプロバイダーが気付かないうちに本番環境へ入り込むことはありません。

  • 設計段階からのモジュール性

    実際のバックエンドは、コンポジションルートで MockEnterpriseRepository を置き換えます。OS レイヤーがベンダー名を知ることはありません。

enterprise_scope.dart
/// Fail-closed tenant + actor context for enterprise ports (ADR-002).
class EnterpriseScope {
  final String organizationId;
  final String actorId;
  final PermissionSet permissions;

  /// Throws if [organizationId] is missing/blank — never allow all-tenant lists.
  static String requireOrganizationId(String? organizationId) {
    final id = organizationId?.trim() ?? '';
    if (id.isEmpty) {
      throw StateError(
        'EnterpriseScope: organizationId is required (fail-closed tenancy).',
      );
    }
    return id;
  }
}

ソース supercore/packages/after_enterprise/lib/src/scope/enterprise_scope.dart (新しいタブで開きます)

これらは supercore リポジトリに記載されたアーキテクチャ上の制御です。After Framework は、認証取得や規制への準拠を主張するものではありません。

エンタープライズ境界

プロダクトは小さく。基盤は強く。

アーキテクチャから始めるか、パッケージのドキュメントを読むか、ソースを探索してください。