Skip to content

PulsePlatform とは ​

PulsePlatform は、AI エージェントでデスクトップアプリとモバイルアプリを作るためのフレームワークです。エージェントに適切なコードを書かせ、アイデアをアプリの形にし、アプリが大きくなってもその形を保つことを目指しています。ルールとライブラリの 2 つでできていて、ルールはプロジェクトが実行するテスト、ライブラリはそのルールが求める部品です。技術基盤は Compose Multiplatform で、デスクトップアプリは JVM で動き、Android と iOS のアプリは Kotlin のコードを共有します。

アイデアからアプリへ ​

あなたはアプリで何をしたいかを伝えます。エージェントはライブラリの部品でそれを書き、ルールをまとめた 1 本のテストを実行し、失敗が示す箇所を直して、テストが通るまで繰り返します。あなたがレビューするのは、すでに決めた形になっているコードです。次のアイデアも、誰が書いても同じ形の上に作られます。この流れの準備は AI エージェントと作る で説明しています。

なぜルールが先なのか ​

AI エージェントは、コンパイルが通り、最初から動く画面を書きます。自分では保てないのは、そのまわりのコードの形です。ある画面は Section で ViewModel を結びつけ、別の画面は State の隣に var を置き、また別の画面は domain に文言を置きます。どの選択もそれ自体は動くので、コードベースは少しずつずれていきます。

プロンプトやスタイルガイドに書いたルールは読み飛ばされます。失敗するテストになったルールはそうはいきません。PulsePlatform のルールは Konsist のアサートで、自分のテストスイートの 1 本のテストから呼びます。コードがずれるとテストが失敗し、ファイルの名前と、何をどこへ動かすかを示します。エージェントはそのメッセージを読み、コンパイルエラーと同じようにコードを直します。

もう半分がライブラリです。ルールは、ViewModel を結びつける場所が 1 つであること、Section と Component がデータとコールバックだけを受け取ること、State が 1 つの不変な値であることを求めます。ライブラリはそれをいちばん書きやすい画面の書き方にするので、ルールに従うために余計なコードを書く必要はありません。

ルールが扱うもの ​

範囲検査する内容
UI の構成feature を、ViewModel を結びつける場所と Section・Component にどう分けるか、State とメッセージ、Preview
ドメインとデータRepository がデータをどう公開するか、UseCase を書く価値があるのはどんなときか
モジュールと Koinどのモジュールがどのモジュールに依存してよいか、その中のパッケージ、Koin のモジュールをどこで定義するか
文言ユーザーが読む文字列がすべて文字列リソースから来ていて、アプリを翻訳できること

デスクトップとモバイル ​

PulsePlatform で作るデスクトップアプリとモバイルアプリは、それぞれの使われ方に合わせた別のプロダクトです。共有するのは domain と data だけで、画面は共有しません。両方を作るアプリは desktop/ と mobile/ に分けて置きます。詳しくは デスクトップとモバイル を見てください。ルールとコアはどのプラットフォームでも同じです。PulseViewModel は 1 つの不変な State を持ち、Action を処理して Event を発行し、PulseContent がそれを UI に結びつけます。違うのは、1 つの画面に ViewModel がいくつあるかです。

デスクトップのウィンドウには、サイドバー、エディタ、インスペクタが同時に並びます。それぞれが自分の ViewModel を持つ Content で、Host がそれを並べ、その上の Container が Content の間でメッセージを運びます。スマートフォンは一度に 1 つの画面しか表示しないので、Screen が ViewModel を 1 つ持って自分で結びつけ、Container はありません。

デスクトップモバイル
アーティファクトmvi-desktopmvi-mobile
ターゲットJVM(Compose Desktop)Android、iOS(Compose Multiplatform)
feature の単位Host、その Content、ContainerScreen 1 つと ViewModel 1 つ
ViewModel を結びつける場所各 ContentScreen
ViewModel 間のメッセージContainer を通る Broadcast と Unicastなし
ルールassertPulseMviConventions()assertPulseMobileConventions()
デスクトップ                             モバイル
counter/                                 counter/
├── CounterHost.kt                       ├── CounterScreen.kt
├── CounterContainer.kt                  ├── CounterViewModel.kt
├── CounterContracts.kt                  ├── CounterContracts.kt
├── content/                             ├── section/
│   └── total/                           └── component/
│       ├── TotalContent.kt
│       ├── TotalViewModel.kt
│       ├── TotalContracts.kt
│       └── section/
├── section/
└── component/

アーティファクト ​

PulsePlatform は JitPack で 5 つのアーティファクトとして公開しています。ルールはどのプラットフォームでも使い、MVI と Navigation 3 のアーティファクトはターゲットに合わせて選びます。

アーティファクト役割プラットフォーム
architectureルール。テストから呼ぶ Konsist のアサートJVM で動き、デスクトップとモバイルのコードを検査する
mvi-desktopPulseViewModel、PulseContainer、PulseHost、PulseContent、5 つのマーカーインターフェースデスクトップ
mvi-mobilePulseViewModel、PulseContent、3 つのマーカーインターフェースAndroid、iOS
navigation-desktopViewModel と Container を Navigation 3 のバックスタックエントリに結びつけるデスクトップ
navigation-mobileViewModel を Navigation 3 のバックスタックエントリに結びつけるAndroid、iOS

インストール ​

settings.gradle.kts に JitPack を追加し、build.gradle.kts にプラットフォームに合ったアーティファクトを追加します。<version> は GitHub Releases のタグに置き換えてください。

kotlin
// settings.gradle.kts
dependencyResolutionManagement {
    repositories {
        maven { url = uri("https://jitpack.io") }
    }
}
kotlin
// build.gradle.kts — デスクトップ
dependencies {
    implementation("com.github.kaleidot725.PulsePlatform:mvi-desktop:<version>")
    implementation("com.github.kaleidot725.PulsePlatform:navigation-desktop:<version>")
    testImplementation("com.github.kaleidot725.PulsePlatform:architecture:<version>")
}
kotlin
// build.gradle.kts — モバイル(Compose Multiplatform)
kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("com.github.kaleidot725.PulsePlatform:mvi-mobile:<version>")
            implementation("com.github.kaleidot725.PulsePlatform:navigation-mobile:<version>")
        }
    }
}

dependencies {
    // ルールは Android のユニットテストで実行する
    testImplementation("com.github.kaleidot725.PulsePlatform:architecture:<version>")
}

要件 ​

要件バージョン
Java17+
Kotlin2.0+
Compose Multiplatform1.6+
AndroidminSdk 26

次のステップ ​

Apache 2.0 License の下で公開されています。