# ロードマップ







## 全体像

<table>
    <thead>
        <tr>
            <th style="min-width: 6rem;">バージョン</th>
            <th style="min-width: 12rem;">テーマ</th>
            <th style="min-width: 36rem;">完了と言える条件</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><strong>v0.1</strong></td>
            <td>DSL + 検査 + <code>konsist &#123; &#125;</code></td>
            <td>大規模なプロジェクトを表現でき、検査が通る</td>
        </tr>
        <tr>
            <td><strong>v0.2</strong></td>
            <td>Gradle plugin + ドキュメント生成 + テンプレート + baseline（＋ IDE プラグイン、実験的）</td>
            <td><code>./gradlew katachiDocs</code> でドキュメントが出る。既存の違反を baseline で許容した状態で、新しい違反と、直したのに baseline のファイルに残っている項目でだけテストが落ちる</td>
        </tr>
        <tr>
            <td><strong>v0.3 以降</strong></td>
            <td><code>declarations &#123; &#125;</code> / レポート出力 / 語彙数の計測</td>
            <td><strong>既存プロジェクト</strong>に入れやすくなる。v0.1 で書いた <code>konsist &#123; &#125;</code> の大半を <code>declarations &#123; &#125;</code> で置き換えられる</td>
        </tr>
    </tbody>
</table>

## v0.3 以降 — 既存プロジェクトへの導入と `declarations { }`

既存プロジェクトに入れやすくするのが v0.3 以降の主題です。今ある違反をとりあえず許容し、新しい違反だけをエラーにする baseline だけは、実験的な機能として v0.2 に先に入りました。

| 機能 | 何ができるか |
|---|---|
| **`dependsOnlyOn`** | 依存してよい先を**許可リスト**で書く。禁止リスト方式は、書き漏れがあっても検査を通ってしまう。v0.2 の計画から移した |
| **レポート出力** | JSON / SARIF で出し、GitHub の PR にアノテーションとして載せる |
| **`pairedWith`** | 「すべての `Screen` に対応する `Preview` がある」のような網羅性を検査する |
| **語彙数の計測** | Role の数と、Role ごとのファイル数を数値で出す |
| **Gradle のモデルに基づくモジュールの解決** | `projectDir` を変えたモジュールや、source set の実際の場所に追従する |

この段階の仕様はまだほとんど決まっていません。バージョン番号の割り当ても「v0.3 以降」とひとまとまりです。

### `declarations { }` — `konsist { }` からの昇格

v0.1 の `konsist { }` は、言ってしまえば**逃げ道**です。「`*UseCase` interface と `Default*UseCase` class だけを置く」のように、ほとんどの Role が言いたいことでも、毎回 Konsist の式で書き下すことになります。

```kt
"interface と Default 実装だけを置くこと".konsist {
    files.must { file ->
        val decls = file.declarations(includeNested = false, includeLocal = false)
        decls.size == 2 &&
            decls.any { it is KoInterfaceDeclaration && it.name.endsWith("UseCase") } &&
            decls.any { it is KoClassDeclaration && it.name.startsWith("Default") }
    }
}
```

同じ規則を、次のように読める形で書けるようにすべきでしょう。v0.3 以降で実現する予定です。

```kt
"UseCase" {
    declarations {
        `interface`("*UseCase")
        `class`("Default*UseCase")
    }
}
```

列挙していない top-level 宣言は書けません。`layout { }` が配置の allow list であるのと同じ意味で、このブロックが中身の allow list になります。

まだ API の設計段階ですが、v0.3 以降で高い確率で実装されるでしょう。