Technology

端末UI部品を共通仕様から各言語向けに生成するTUIKit

この記事のポイント

  1. 実現したこと

    端末UI部品の共通仕様を、Go、TypeScript、Rust向けの実装先に対応付けられる。

  2. 実現の仕組み

    変更された仕様からプロンプトを作り、LLMエージェントが対象のフレームワーク向けコードを生成する。

  3. 得られた結果

    生成コードは実装先ごとのディレクトリに置かれ、元の部品仕様と分けて管理される。

  4. 従来との違い

    動作確認を終えた仕様は、ハッシュを記録してコンパイル済みの状態に移せる。

共通仕様から三系統の実装へ枝分かれする構造図
AI生成画像

端末UI部品の振る舞いを共通仕様に記述し、複数の言語やフレームワーク向けのコードを生成する仕組みが公開された。TUIKitは実装先ごとの定義を使ってプロンプトを作り、LLMエージェントにコード生成を担わせる。

部品の振る舞いをMarkdownの共通仕様に置く

GitHubが公開した端末UI部品の開発システム「TUIKit」では、各部品を言語に依存しないMarkdown仕様で定義する。仕様には振る舞いのテストが伴い、部品の動作を実装言語とは別に記述する。

部品仕様には、振る舞いやアクセシビリティ上の要件に加え、色などを役割で指定するデザイントークン、テスト、表示例を含める。実装先が異なっても、部品に求める条件の出発点は共通になる。

実装先の定義が共通仕様を各フレームワークへ対応付ける

共通仕様をコードに移す際は、実装先ごとの仕様が言語やフレームワークへの対応付けを定める。部品の条件と実装先固有の扱いを別々に記述する構成だ。

実装先には、GoのBubbleteaとLipgloss、TypeScriptのInkとReact、Bun上のTypeScriptによるOpenTUIとReact、RustのRatatuiとCrosstermが列挙されている。同じ部品仕様を、それぞれの実装先の定義と組み合わせる。

変更された仕様から生成用プロンプトを組み立てる

コンパイル用スクリプトは変更された仕様を検出し、指定された実装先向けに自己完結型のプロンプトを生成する。このプロンプトが、共通仕様と実装先の条件をコード生成工程へ渡す。

LLMエージェントはプロンプトを読み、対象のフレームワークに合わせたコードを生成する。TUIKitでいう「コンパイル」は、このエージェントによる生成を含む工程を指す。

生成コードと仕様の状態を分けて管理する

生成されたコードは、実装先ごとのdistディレクトリへ出力される。部品の仕様はそのまま残り、生成物とは別に管理される。

生成コードの動作を確認した後は、lockコマンドでコンパイル済み仕様のハッシュを記録できる。これにより、どの版の仕様をコンパイル済みとして扱うかが実装先ごとに残る。