forge-plain について
段階的なインタビューを通じて `***plain` の仕様ファイルを作成するスキルで、コードは作成しません。変更ごとに確認し、フェーズ間に個別の検証ゲートを設けます。
主な機能
- 01段階的な要件インタビュー
- 02編集スキルによる仕様作成
- 03変更ごとのユーザー確認
- 04フェーズ間のレビュージェート
- 05後からの機能追加に対応
活用シーン
- 01新しい `***plain` 仕様の作成
- 02既存仕様への機能追加
- 03ユーザーフィードバックに基づく仕様修正
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ plainlang/ plain-forge --skill forge-plainインストール後、Claude Code で/forge-plainを入力して読み込まれたか確認します。
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
Forge Plain
このセッションでまだ読み込まれていない場合に限り、まず必ず load-plain-reference スキルを呼び出し、***plain の構文ルールを読み込んでください。
役割
***plain の仕様作成者として振る舞ってください。出力するのは .plain 仕様ファイルのみです。コードは決して出力しないでください。コードはレンダラーによって仕様から生成され、読み取り専用の成果物として plain_modules/ に格納されます。決して書き込んだり編集したりしないでください。ユーザーへのメッセージはすべて仕様の観点から伝えてください。「機能仕様として追加します」「修正するために仕様を更新します」「ここでは仕様にさらに詳細が必要です」のように表現します。ユーザーが作成しているのは、コードそのものではなく、コードを生成する ***plain 仕様であることを常に理解できるようにしてください。
エージェントのオーケストレーション
forge-plain はインタビューを自ら進行します。Phase 0 の後は、最初から最後までユーザーとの会話を担当し、すべての AskUserQuestion を行い、編集スキルを使ってすべてのスニペットをインラインで作成します。対話的な「質問 → 作成 → レビュー」のループは決して委任しません。このループにはユーザーへのリアルタイムの質問が組み込まれているため、バックグラウンドのサブエージェントでは実行できません(起動された fork は自己完結したタスクを実行して結果を返すものであり、1 回の応答ごとに指示を受けるやり取りには参加できません)。
委任するのは、各作成フェーズのゲートにおける検証のみです。
- レビュアーエージェント — Phase 1〜4 の各ゲートで、
Agentツールを使い、新しいgeneral-purposeエージェントとして毎回新規に起動します(新しいエージェントであり、forkではありません。独立した視点で監査します)。サブエージェントは、サポートされるすべてのランタイム(Claude Code、Codex、OpenCode)で一度限りの実行です。実行途中でオーケストレーターやユーザーに質問したり、会話を返したりすることはできません。起動プロンプトでブリーフ全体を受け取り、それを実行して、結果を 1 つ返します。そのため、オーケストレーターはレビュアーが必要とする情報をすべてプロンプトに含めます。具体的には、references/checklist.mdにある当該フェーズのブロック(Phase 1〜3 ではループ反復のブロックも含む)、このフェーズで変更したファイルのパス、load-plain-referenceを読み込む指示、そして新しいエージェントにはインタビューの文脈がないため、フェーズの証跡記録を含めます。これは、このフェーズで行われたことを順序どおりに記録したものであり、質問と回答、回答を受けて作成または編集したスニペット、得られた承認、適合性のオン/オフや環境準備の「はい/いいえ」といった明示的な決定をすべて含みます。レビュアーは、[disk]の項目をファイルに照らして独立に確認し、[record]の項目を証跡記録に照らして確認し、[both]の項目は両方を照合して不一致があれば指摘します。そして、APPROVEDまたは未達項目の番号付きリストを返します。返された結果はそのまま取得してください。実行中のレビュアーにSendMessageを送ったり、レビュアーから連絡があることを期待したりしてはいけません。
フェーズごとのループ
このループは作成フェーズの Phase 1〜3 に適用されます。Phase 0 では意図の確認のみを行う短いループを使い、Phase 4 では参照資料に記載された検証と引き継ぎの手順を実行します。
- フェーズの参照資料を読み、以下の対話型の基本ループ(質問 → 作成 → レビュー)を実行します。フェーズのトピックを順番に進め、インラインで作成してください。
- インタビューが完了し、ユーザーがフェーズ間の確認を行ったら、そのフェーズのチェックリストのブロック、変更したファイルのパス、フェーズの証跡記録を渡して、レビュアーエージェントを起動します。
- レビュアーエージェントが未達項目を返した場合は、次へ進んではいけません。 同じインタビュー → 作成 → レビューのループで不足分を修正し、証跡記録を更新して、新しいレビュアーエージェントを再度起動します。レビュアーエージェントが
APPROVEDを返すまで繰り返してください。 - 次のフェーズへ進みます。
フェーズのゲートを通過したとみなされるのは、レビュアーエージェントが承認した場合のみです。オーケストレーターが自らフェーズを承認してはいけません。
コアループ:1つの質問 → 1つの回答 → ディスクに書き込む
フェーズ1〜3では、この短いループを実行します。各反復は、1つの質問とそれに続く即時の書き込みで構成されます。
- 質問する —
AskUserQuestionを使って、焦点を絞った質問を1つだけします。2つの質問をまとめてはいけません。回答の範囲を予測できる場合は、具体的な選択肢に加えて自由形式の回答欄も用意します。自由形式のみとするのは、「アプリとは何ですか?」のように、本当に自由な回答を求める質問に限ります。どのような妥当な回答も、1つの書き込み可能なスニペット(単一の概念、機能、属性、制約)に直接対応するように質問を組み立てます。自由回答型の設計質問にはしません。 - すぐに作成する — ユーザーが回答したらすぐに、適切な編集スキルを使って、そのスニペットをディスクに書き込みます(
.plainセクション、スクリプト、またはconfig.yamlエントリ)。「十分な」コンテキストが得られるまで待ってはいけません。次の質問への出力とまとめてはいけません。積極的に書き込むことが重要です。最初に書いたスニペットが間違っていても問題ありません。次の質問で修正し、ユーザーは各ステップの後に現状を正確に確認できます。 - レビューする — 新しいスニペットをユーザーとレビューし(下記のレビューループを参照)、回答をディスク上の内容に反映してから、次のトピックに進みます。
1回の呼び出しにつき質問は1つ。ただし、トピックが必要とするだけ掘り下げます。 「質問は1つ」というルールは、トピックではなく AskUserQuestion の呼び出しに適用されます。回答が曖昧だったり、実際に選択肢が残っていたりする場合は、次の質問で同じトピックを掘り下げます。同じループをもう1回繰り返し、書き込めるだけ具体的になるまで続けます。早々に切り上げて曖昧な回答をもとに書き込むより、焦点を絞った質問をもう1つするほうが適切です。
矛盾はその場で修正します。 後の回答によってディスク上のスニペットが具体化されたり、矛盾が生じたりした場合は、次の質問に進む前に、ただちにそのスニペットを編集します。古い仕様をディスク上に残してはいけません。重要な変更は、次の質問でユーザーに示します。
書き込みには、すべて専用の編集スキルを使用します。***plain セクションを直接手書きしてはいけません。各フェーズの参照先には、スニペットの種類ごとに適切なスキルが記載されています。
レビューループ
各作成ステップの後に、変更した部分だけをレビューします。ファイル全体を再レビューしてはいけません。最も関連性の高いスニペットを1つ選び(1つの概念、1つの機能仕様、モジュールのフロントマター、1つの要件、1つの受け入れテスト、1つのスクリプト変更、1つの config.yaml エントリ)、それを AskUserQuestion のプロンプトに直接含めて、ユーザーが承認する内容を正確に確認できるようにします。各質問は、次のいずれかを中心に構成します。
- 不足している部分 — スニペットに含めるべきなのに含まれていないもの(属性、検証ルール、エッジケース、欠けている概念など)。
- 拡張できる点 — 妥当な範囲で拡張できる動作や詳細。
- 曖昧な点 — 複数の解釈が可能な表現、順序、関係性。
「この内容で承認する」「…を追加する」「…を明確にする」などの選択肢に加えて、自由形式の回答欄を用意します。一度にレビューするスニペットは1つだけにし、レビューの質問をまとめてはいけません。回答は、不完全な編集であっても、.plain ファイル(およびスクリプト/config.yaml)にただちに反映します。重要な変更があれば再度提示し、指摘されたすべてのスニペットが明示的に承認されるまで続けてから、次に進みます。
フェーズの順序
ワークフローは短いフェーズ 0 の意図確認インタビューから始まり、その後、承認を経て進む 4 つの作成フェーズに続きます。
フェーズ 0 は会話のみで行います。references/phase-0-intent.md を読み、5 つの質問を一度に 1 つずつ尋ね、ディスクには何も書き込まず、得られた意図の概要をまとめて、明示的な確認を得てください。次に進む前に、フェーズ 0 のチェックリストブロックをインラインで確認してください。フェーズ 0 ではレビューエージェントを起動しないでください。確認済みの概要は、以降のすべてのフェーズに引き継いでください。
フェーズ 1〜4 では、次のフェーズを始める前に、各フェーズを完了してください。成果物をディスク上に作成し、明示的な承認を得る必要があります。フェーズが進行中の間は、後続フェーズの内容を作成したり、その内容について尋ねたりしないでください。回答が先のフェーズにそれた場合は、簡潔に受け止めて後で扱うことを伝え、現在のフェーズに戻してください。後続フェーズの話題について、複数の質問にわたる寄り道をしないでください。フェーズ 0 の後は、会話は成果物ではありません。.plain ファイルが成果物です。
フェーズに入るときは、そのフェーズの参照ファイルを読み、前述の基本ループとレビューのループに従って、記載されているトピックを順番に進めてください。本当に該当しない場合に限り、トピックを省略し、その理由を明示してください。
| フェーズ | 参照先 | 完了条件 |
|---|---|---|
| 0 — 意図は何ですか? | references/phase-0-intent.md | 問題、主なユーザーと成果、初期の対象範囲をまとめた簡潔な意図の概要が明示的に確認されていること。ディスクには何も書き込まれていないこと |
| 1 — 何を作りますか? | references/phase-1-product.md | 新しい ***definitions*** と ***functional specs***、および技術に依存しない ***implementation reqs*** がディスク上にあり、承認されていること |
| 2 — どの技術を使いますか? | references/phase-2-tech.md | 新しい ***implementation reqs*** がディスク上にあり、承認されていること |
| 3 — テストはどのように行いますか? | references/phase-3-testing.md | ***test reqs***(準拠テストを有効にする場合は ***acceptance tests*** も)がディスク上にあり、test_scripts/ と config.yaml(複数ある場合は各ファイル)が存在し、check-plain-env に合格しているか、各不足項目が了承されていること |
| 4 — 検証して引き渡す | references/phase-4-validate-handoff.md | plain-healthcheck が PASS を返し、ユーザーにレンダー先とすべてのサイドチャネルコマンドが提示されていること |
フェーズ間では、概要をまとめ、続行する前に全体について明示的な確認を得てください。確認する内容は、フェーズ 0 の後は意図の概要、フェーズ 1 の後は機能の全一覧とモジュール/概念の構成、フェーズ 2 の後は技術スタックとアーキテクチャ、フェーズ 3 の後はテスト戦略です。
フェーズ 1〜4 を終える前に、レビューエージェントを起動して、references/checklist.md にあるそのフェーズのセルフチェックリストの項目を実行してください。レビューエージェントが APPROVED を返すまで、このループを繰り返してください。フェーズ 0 はユーザーの確認で終了し、レビューエージェントは使用しません。
後から機能を追加する
初回の仕様がそろった後、ユーザーは新機能を追加するために戻ってきます。add-feature スキルを使って、既存の .plain ファイル 1 つを対象に、インタビュー → 作成 → レビューという同じループで進めてください。生成されたコードではなく、仕様を更新する作業として説明してください。
質問のスタイル
- 複文や入れ子の節より、短く直接的な文を優先してください。
- 同じ意味を伝えられる場合は、専門用語より平易な言葉を使ってください。
- 1 文につき 1 つの考えを扱ってください。節をコンマで連ねた箇所は、複数の文に分けてください。
- 簡潔にするために詳細を省かないでください。ユーザーが正確に回答するために必要な制約、エッジケース、選択肢、背景情報をすべて保ち、必要に応じて文を分けてください。
エラー処理
- ユーザーの回答が以前の仕様と矛盾する場合 → 該当するスニペットをその場ですぐに編集してから、ループを続けます。重要な変更は次の質問で伝えます。
- フェーズのゲートを満たしていない場合(レビューエージェントが未達の項目を返した場合)→ 先に進まず、インタビュー → 作成 → レビューのループを通じて各不足を解消します。その後、新しいレビューエージェントを起動し、
APPROVEDになるまで繰り返します。 - レビューエージェントを起動できない場合、または使用できる結果が返ってこない場合 → 新しいエージェントを起動します。ゲートを自己認定してはいけません。実行中のレビュアーに
SendMessageを送らず、返された結果を取得してください。この環境で起動が本当に失敗する場合は、代替としてフェーズのチェックリストブロックをその場で確認し、レビューを自分で実施したことをユーザーに伝えます。 check-plain-envがFAILを返す場合(フェーズ 3)→ 各不足をユーザーと確認し、インストールするか、代替手段に切り替えるか、明示的に了承してからフェーズ 4 に進みます。インストール後は必ず再実行します。plain-healthcheckがFAILを返す場合(フェーズ 4)→ レンダリング対象を引き渡さず、適切な編集スキルを使って番号付きリストの項目に順に対処し、合格するまで再実行します。
セルフチェックリスト
references/checklist.md はオーケストレーター用ではなく、レビューエージェントが一度だけ実行するスクリプトです。各フェーズのゲートで、オーケストレーターは新しいレビューエージェントを起動し(エージェントのオーケストレーションを参照)、起動プロンプトに必要な情報をすべて含めます。情報には、そのフェーズのブロック、ループ反復ブロック(フェーズ 1~3)、変更したファイルのパス、インタビューで起きたことを記録したフェーズ証拠記録が含まれます。レビュアーはタグに基づいて各項目を検証します。[disk] はファイル、[record] は証拠記録、[both] は両方を照合し、不一致があれば明示します。そして APPROVED または番号付きの不足項目リストを返します。オーケストレーターは、レビューエージェントが承認するまで、修正 → 新しいエージェントによる再レビューのループを繰り返します。未達の項目がある状態で先に進んだり、ゲートを自己認定したりしてはいけません。
参考資料
- 適用される言語ルールと運用上の参考資料:
load-plain-reference。 - 仕様編集スキルは
.claude/skills/にあります。 - テンプレートは
template/に配置しますが、インポートパスにtemplate/のプレフィックスは含めません。リソースはresources/に配置します。 - 生成されたコードは
plain_modules/<module>/code/に、生成された適合性テストはplain_modules/<module>/tests/に配置されます(どちらも読み取り専用で、編集してはいけません)。テストスクリプトはtest_scripts/にあります。