Spekta
テストコードから仕様書を生成するツールチェイン
IR リファレンス
IR(Intermediate Representation)は Parser が生成するデータ構造で、Exporter への入力になります。全ての要素は Node として統一されたツリー構造を持ちます。
ページ
IR のトップレベル要素です。[spekta:page] のテキストが title に、SHA256 ハッシュが id になります。
同じページ名は同じ ID を生成するため、複数ファイルからのマージが可能です。
interface Page {
id: string; // SHA256 ハッシュ
type: "feature";
title: string; // ページ名(英語スラッグ)
children?: Node[];
}
ID は SHA256 ハッシュ
同じページ名は同じ ID
なぜ?
ID がページ名から決定的に生成されるため、異なるファイルでも同じページ名なら同じ ID になり、マージの対象になります。
Node
IR の全要素は Node です。各 Node は type(種類)と id(SHA256)を持ちます。
リーフ Node(children を持たない):
コンテナ Node(children を持つ):
summary— 概要テキストwhy— 理由の説明see— 関連ページへの参照(ref に対象ページの ID)step— 操作手順の1ステップimage— 画像パスgraph— Mermaid ダイアグラムtext— 散文テキストcode— コードブロック(language + text)callout— 注意書き(variant: note/warning/tip)item— リスト項目
section— セクション。children に全種類の Node を持てるsteps— 操作手順ブロック。children に step, image, graph を持てるlist— 箇条書きリスト。children に item を持てる
全 Node が ID を持つ
text Node
code Node
language フィールドで言語を指定でき、text がコード本文になります。言語名は省略可能です。
callout Node
variant は note(情報)、warning(警告)、tip(ヒント)の 3 種類です。
list Node と item Node
list はコンテナ Node で、item を children として持ちます。
マージ
複数ファイルで同じ [spekta:page] を指定すると、1つのページにマージされます。
セクションも同じパス(ページ名/セクション名/...)なら統合され、子要素が合流します。
同じページ名は 1 ページにマージされる
スキーマバリデーション
IR は Zod スキーマで定義されています。Parser の出力は irSchema.parse() で検証できます。
Tip
Exporter プラグインを開発する際は、入力される IR が必ずこのスキーマに準拠していることを前提にできます。