こんな感じでOpusに投げてみるか
## 要件の経緯
現在、このパッケージは**手作業**でメンテナンスしています。これを**自動化**したいです。
## タスクの目標
特定のMisskeyバージョン(A)と、現在の最新のMisskeyバージョン(B)の`api.json`から、型の互換性をAまで保ちつつ、Bの機能まで型安全に(つまり、Aの時点で存在するレスポンス型については非nullableで例外を吐くことがなく)パースできるfreezedコードを生成することです。
## 関連ファイル
- Misskeyの`api.json`のサンプルは`api.json.sample`に配置しています。
- これがこれまでできなかった理由は、このスキーマの複雑さにあります。TypeScriptのエコシステムと密接に紐づいたスキーマ型(直和型など)を、Dartに自動変換することは困難でした。
- これはあくまで今回のタスクのサンプルであり、最終目標は、サブモジュールに配置したmisskeyのapi.jsonから、互換性のあるコードを出力することです。
## 計画のまえに
- 最低互換となるAPIの時点で存在しなかったAPIについては、初めてそのAPIが正式バージョンのMisskeyに含まれた時点でのリクエスト・レスポンススキーマをパースできる必要があります。このため、最低互換バージョンから、現在のバージョンまでの、タグに紐づくapi.jsonが必要となるはずです。
- api.jsonはgit管理対象ではなく、Misskey側でサーバー起動時に得られる情報のため、コンテナ上で起動しないと差分が分からないはずです。
- Misskeyのスキーマは非常に複雑なため、実装前に、OpenAPIを「素直でない」使用の仕方をしている箇所がどこかをよく読む必要があります。
- フォークのために例外的な対応をしている箇所があります。最低互換の対象に含まれていませんが、稼働している特定のサーバーのために残している例外処理があります。自動生成するにあたって、例外的対応をyamlなり何なりで記述できる仕組みが必要です。
- 具体的には、`mkkey.net` (Misskey v13系互換)のために、`EmojisConverter`が存在しています。
- `api.json`は取得する仕組みを整えて、実際に動作するのは手動でよいと思います。取得したjsonから、build_runnerでfreezedのコードを出力し、さらにfreezedが生成されるビルドチェーンの部分は、`build_runner build --delete-conflicting-outputs`で取得できるようにします。
- 最低保証バージョンは**2025.4.1**、最新バージョンは**2026.3.1**とします。
- 開発中の最新のMisskeyのバージョン**2026.*.*-alpha.*`や`beta`などに対しても生成できるとよりよいです。ただし、一度リリースになったバージョンは、そのバージョンの過程となるベータやアルファ版を考慮する必要はありません。
- 現在存在するのテストコードがパスする必要があります。
