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