共通の運用基盤の上でプロダクトを構築する。
一度つくり、あらゆるドメインへ。
After Framework は、アーキテクチャ、アイデンティティ、AI、デザインシステム、ツール、再利用可能なドメインモジュールという共通基盤をプロダクトに提供します。
01 · フレームワークのアーキテクチャ
1 つのカーネル、2 つのプロダクトライン、その上に薄いプロダクト。
すべてのプロダクトは同じレイヤーを共有します。Life Domain や Industry Domain を追加しても、最上位にモジュールが 1 つ加わるだけで、下位のレイヤーは変わりません。
プロダクト固有
共有プラットフォーム
コンポジションルートのアダプター
レイヤーを選択すると、その責務と依存先を確認できます。
after_core
共有カーネル
認証、堅牢化されたネットワーク、ストレージ、Riverpod による DI、フラグ、リモート設定、BYOK AI SDK、プレミアム権限、通知、ディープリンク、そしてダッシュボード・プラグイン・検索・設定の各エンジンです。
- 依存先
- なし — 基盤レイヤー
- 利用元
- プロダクトドメイン層 · エコシステム層 · AI 機能 · コンシューマーモジュール · エンタープライズモジュール · デザインシステム · Firebase アダプター
共有される再利用、プロダクト固有の体験
プラットフォームの基本方針では、各プロダクトがランタイム機能の 90% 以上を継承することを目標としています。プロダクトが所有するのは、ドメイン、バーティカル機能、AI プロファイル、カタログ、ブランディングだけです。
システムを支えるルール
- 01SDK よりポート:バーティカルなコードは After のインターフェースに依存し、ベンダー SDK には依存しません。
- 02バーティカルモジュールは、プロダクトリポジトリの lib/features/ 配下にのみ置きます。
- 03すべてのポートにモックが付属するため、スキャフォールドはバックエンドなしで動作します。
- 04ゼロから作らず生成する:新しいプロダクトは新たなアーキテクチャではなく、仕様から始めます。
02 · プロダクトファクトリー
アイデアから、再利用可能な基盤の上で動くプロダクトへ。
プロダクトファクトリーは、小さな product.spec.yaml を、共有パッケージに依存する兄弟 Flutter アプリに変換します。仕様にはそのプロダクト固有の内容だけを記述します。
- 01
アイデア
プロダクト名を決め、consumer または enterprise のラインを選びます。リファレンスは SuperGarage または SuperHospital です。
- 02
ドメイン
product.spec.yaml に、ドメイン、バーティカル機能、タブ、権限、ダッシュボードウィジェット、AI スキル、ブランディング、ロケールを記述します。
- 03
モジュール
認証、メンバーシップまたは組織、RBAC、カレンダー、タスク、通知、検索など、仕様に含まれないものはすべて継承されます。
- 04
プロダクトシェル
generate_product.ps1 が、マニフェスト、コンポジションルート、機能カタログ、シェル、l10n ファイル、CI ワークフローを出力します。
- 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
例
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(),
),
);
}エコシステムファブリック
after_ecosystem
After ID、After+、イベントバス、プロダクト横断 API、共有サービス、エコシステムの AI コンテキストを提供し、コンシューマーとエンタープライズのモジュールを 1 つのシステムとして動作させます。
- 依存先
- 利用元
主要 API
- AfterEventBus
- AfterProductApi
- AfterProductApiRegistry
- AfterSecureInteropBridge
- AfterEcosystemAiContext
- afterEcosystemProvider
主なサードパーティ依存関係
flutter_riverpod · uuid
例
{
"id": "evt_…",
"type": "garage.maintenance.completed",
"sourceProductId": "super_garage",
"afterId": "aid_…",
"organizationId": null,
"occurredAt": "2026-07-19T20:00:00Z",
"correlationId": "corr_…",
"payload": { }
}AI 機能プラットフォーム
after_ai
モジュール式の AI レイヤーです。プロダクトは機能を有効化する AfterAiProfile を選択します。無効な機能を呼び出すと例外がスローされます。すべての機能にモックアダプターが付属します。
- 依存先
- 利用元
- このパッケージに依存するパッケージはありません
主要 API
- AfterAiPlatform
- AfterAiProfile
- AfterAiCapability
- AfterAiCapabilityDisabledException
- afterAiProfileProvider
- afterAiPlatformProvider
- AfterToolCallingAi
- AfterAiPluginRegistry
主なサードパーティ依存関係
flutter_riverpod · uuid
例
// after_framework.dart
afterAiProfileProvider.overrideWithValue(AfterAiProfile.superGarage),
// feature code
final ai = ref.watch(afterAiPlatformProvider);
if (ai.canChat) {
final reply = await ai.chat(message: input);
}デザインシステム
after_design_system
共通のビジュアル言語です。カラー、スペーシング、角丸、モーション、タイポグラフィのトークン、Material 3 のテーマデータ、共有コンポーネントを提供し、プロダクトラインを問わず同一です。
- 依存先
- 利用元
主要 API
- AfterThemeData
- AfterTheme
- AfterColors
- AfterSpacing
- AfterRadius
- AfterMotion
- AfterFadeSlide
主なサードパーティ依存関係
shared_preferences
例
abstract final class AfterThemeData {
static ThemeData light({
AfterTypography typography = AfterTypography.garage,
Color? accentOverride,
}) { … }
static ThemeData dark({
AfterTypography typography = AfterTypography.garage,
Color? accentOverride,
}) { … }
}
// Product: same family, own accent (spec branding.accent).
MaterialApp(
theme: AfterThemeData.light(accentOverride: const Color(0xFF22D3EE)),
darkTheme: AfterThemeData.dark(accentOverride: const Color(0xFF22D3EE)),
);ソース supercore/packages/after_design_system/lib/src/foundations/theme.dart (新しいタブで開きます)
コンシューマーモジュール
after_consumer
カーネル上の意図的に薄い B2C レイヤーです。メンバーシップ、コンシューマー機能カタログ、パーソナルボールト、起動時の同意、地域ロケーション、ファミリー共通のシェル UI を提供します。
- 依存先
- 利用元
- このパッケージに依存するパッケージはありません
主要 API
- ConsumerMembership
- ConsumerCoreFeatureId
- ConsumerVerticalFeature
- PersonalVaultRepository
- consumerMembershipProvider
- personalVaultRepositoryProvider
主なサードパーティ依存関係
flutter_riverpod · geolocator · geocoding · image_picker · permission_handler
例
dependencies:
after_core:
path: ../supercore/packages/after_core
after_consumer:
path: ../supercore/packages/after_consumer
after_design_system:
path: ../supercore/packages/after_design_systemエンタープライズモジュール
after_enterprise
決定論的なインメモリモックを備えた 14 の共有 B2B ポート、EnterpriseScope によるフェイルクローズなテナント分離、プロダクトランタイムとシェルホストを提供します。
- 依存先
- 利用元
- このパッケージに依存するパッケージはありません
主要 API
- EnterpriseScope
- OrganizationRepository
- RbacRepository
- PermissionSet
- WorkflowEngine
- TaskRepository
- CalendarRepository
- DocumentRepository
- EnterpriseAiAssistant
- AuditLogRepository
主なサードパーティ依存関係
flutter_riverpod · collection · uuid
例
static Future<List<Override>> ensureConfigured({
EnterpriseRepository? enterpriseRepository,
}) async {
PlatformConfig.current = superAppEnterpriseManifest;
final prefs = await SharedPreferences.getInstance();
return [
...AfterStandardOverrides.create(
preferences: prefs,
userAgent: '${superAppEnterpriseManifest.appName}/'
'${superAppEnterpriseManifest.appId}',
),
enterpriseRepositoryProvider.overrideWithValue(
enterpriseRepository ?? MockEnterpriseRepository(),
),
];
}ソース supercore/templates/super_app_enterprise/after_framework.dart (新しいタブで開きます)
Firebase アダプター
after_firebase
コンポジションルート向けの Firebase Auth、Firestore の blob、Storage のメディアアダプターです。Firebase が未設定または起動に失敗した場合は、クラッシュせずにローカルアダプターへフォールバックします。
- 依存先
- 利用元
主要 API
- AfterFirebaseBootstrap
- FirebaseAfterAuthRepository
- FirestoreAfterUserBlobSync
- FirebaseAfterUserMediaSync
- AfterFirebaseCloudAvailability
主なサードパーティ依存関係
firebase_core · firebase_auth · cloud_firestore · firebase_storage · google_sign_in
例
// Cold start, before ProviderScope. Returns false (no crash) when
// options are null or init fails — auth falls back to prefs adapters.
await AfterFirebaseBootstrap.ensureInitialized(options: firebaseOptions);
final overrides = [
...AfterStandardOverrides.create(
preferences: prefs,
userAgent: userAgent,
includeUserBlobSync: false, // Firebase provides blob sync below
),
...AfterFirebaseBootstrap.overrides(
preferences: prefs,
appId: 'super_garage',
),
];ソース supercore/packages/after_firebase/lib/src/after_firebase_bootstrap.dart (新しいタブで開きます)
04 · CLI と開発ワークフロー
魔法ではなく、スクリプトと Flutter コマンド。
ツールは supercore/scripts に PowerShell スクリプトとして置かれ、標準の Flutter ツールチェーンと併用します。独立したパッケージ版の CLI バイナリはありません。
初期化
Flutter なしで仕様を検証し、兄弟アプリを生成してブートストラップします。
powershell -File scripts\validate_product_spec.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yaml# 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 -DryRuncd ..\superairport
flutter create .
flutter pub get
flutter analyze
flutter testパッケージの構成
カーネル、プロダクトラインのレイヤー 1 つ、デザインシステムにパス依存関係で依存します。
dependencies:
after_core:
path: ../supercore/packages/after_core
after_consumer:
path: ../supercore/packages/after_consumer
after_design_system:
path: ../supercore/packages/after_design_systemdependencies:
after_core:
path: ../supercore/packages/after_core
after_enterprise:
path: ../supercore/packages/after_enterprise
after_design_system:
path: ../supercore/packages/after_design_system設定
AppPlatformManifest でアイデンティティを宣言します。スキャフォールドモードではモックを使用でき、本番モードではアダプターが欠けていると起動時に失敗します。
const superHospitalManifest = AppPlatformManifest(
appName: 'SuperHospital',
appId: 'super_hospital',
packageName: 'com.overstein.superhospital',
androidWidgetProvider: 'com.overstein.superhospital.WidgetProvider',
iosAppGroupId: 'group.com.overstein.superhospital',
productLine: AfterProductLine.enterprise,
);/// Composition safety mode (ADR-007).
///
/// - [scaffold]: in-memory / mock adapters are allowed (templates, tests).
/// - [production]: missing real adapters must throw at startup.
enum AfterBootstrapMode {
scaffold,
production,
}ソース supercore/packages/after_core/lib/src/bootstrap/after_bootstrap_mode.dart (新しいタブで開きます)
テスト
フォーマット、静的解析、カバレッジ付きテストを実行し、プラットフォームの再利用契約に照らしてプロダクトをチェックします。
dart format --output=none --set-exit-if-changed .
flutter analyze
flutter test --coverage
# Platform doctrine check against a generated product
powershell -File scripts\check_reuse_contract.ps1 -AppRoot ..\superairportソース supercore/scripts/generate_product.ps1 · docs/PLATFORM_DOCTRINE.md (新しいタブで開きます)
デプロイ
生成されたプロダクトには、静的解析とテストを行う GitHub Actions ワークフローが付属します。Android のリリース署名は supercore のスクリプトで設定されます。
name: analyze-and-test
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
analyze-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Checkout supercore (sibling)
uses: actions/checkout@v5
with:
repository: oversteintech/supercore
path: ../supercore
- uses: subosito/flutter-action@v2
with:
channel: stable
- run: dart format --output=none --set-exit-if-changed .
- run: flutter pub get
- run: flutter analyze
- run: flutter test --coverageソース supercore/scripts/generate_product.ps1 (.github/workflows/ci.yml) (新しいタブで開きます)
# Wires Play release signing for sibling apps; -BuildAab also builds bundles.
# key.properties / *.jks stay local and gitignored.
powershell -File scripts\wire_play_release_signing.ps1 -BuildAabソース supercore/scripts/wire_play_release_signing.ps1 (新しいタブで開きます)
05 · フレームワークから実際のプロダクトへ
共有機能が、プロダクト固有の体験になる。
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
コンシューマー · リファレンス
モビリティ:車両、メンテナンス、保険、燃料、OBD、フリート
after_core · after_design_system · after_firebase · after_consumer

AfterHub
コンシューマー · OS シェル
コンシューマー OS シェル:アイデンティティ、ダッシュボード、AI、カレンダー、検索、After+
スキャフォールドafter_ai · after_consumer · after_core · after_firebase · after_design_system · after_ecosystem

SuperHospital
エンタープライズ · リファレンス
病院運営 — エンタープライズ向けリファレンス
スキャフォールド
SuperHealth
コンシューマー
パーソナルヘルス:服薬、記録、睡眠、栄養
スキャフォールドSuperHealth (新しいタブで開きます)
SuperFinance
コンシューマー
パーソナルファイナンス:サブスクリプション、予算、投資
スキャフォールド
SuperHome
コンシューマー
住まいと家庭:メンテナンス、光熱費、保証
スキャフォールド
SuperTravel
コンシューマー
旅行:旅程、フライト、ホテル、行程表
スキャフォールド
SuperPet
コンシューマー
ペット:獣医ケア、フード、健康記録
スキャフォールド
SuperNews
コンシューマー
要約付きの AI パーソナライズニュース
スキャフォールドSuperNews (新しいタブで開きます)
SuperSports
コンシューマー
スポーツとパフォーマンス:フィットネス、スコア、試合日程
スキャフォールドSuperSports (新しいタブで開きます)
SuperAirport
エンタープライズ
空港運営:フライト、ゲート、滑走路
スキャフォールド
SuperMaritime
エンタープライズ
港湾と船舶の運用
スキャフォールド
SuperFactory
エンタープライズ
工場現場の MES と保全
スキャフォールド
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 によってビューポート幅に応じて調整されます。
| ビューポート幅 | コンテンツ最大幅 | ページ余白 |
|---|---|---|
| < 360 | width | 14 / 10 / 14 / 28 |
| 360 – 419 | 520 | 16 / 12 / 16 / 28 |
| 420 – 719 | 640 | 20 / 12 / 20 / 28 |
| ≥ 720 | 760 | 20 / 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 レイヤーがベンダー名を知ることはありません。
/// 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 は、認証取得や規制への準拠を主張するものではありません。
エンタープライズ境界プロダクトは小さく。基盤は強く。
アーキテクチャから始めるか、パッケージのドキュメントを読むか、ソースを探索してください。