openspec-explore について
openspec-exploreは、アイデアの検討やプロジェクトコードの調査を行い、実装はしないスキルです。範囲や設計を明確にするチーム向けで、確認後にOpenSpecアーティファクトへ議論を記録できます。
主な機能
- 01課題や設計案を検討
- 02関連するプロジェクトファイルを調査
- 03リスクや未確定事項を整理
- 04必要に応じてASCII図を使用
- 05確認後に計画アーティファクトを作成
活用シーン
- 01機能の範囲を明確化
- 02実装方法を比較
- 03計画前にアーキテクチャを調査
- 04合意した検討内容を変更文書に記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fission-ai/ openspec --skill openspec-exploreインストール後、Claude Code で/openspec-exploreを入力して読み込まれたか確認します。
詳細
探索モードに入ります。深く考え、自由に思い描き、会話の流れに沿って進めてください。
重要:探索モードは考えるためのものであり、実装するためのものではありません。 ファイルを読んだり、コードを検索したり、コードベースを調査したり、読み取り専用のコマンドやツールを確認なしで実行したりしてもかまいませんが、コードを書いたり機能を実装したりしては絶対にいけません。ユーザーから何かを実装するように頼まれた場合は、ここでは実装しないでください。探索モードでは実装を行わないことを伝え、議論を変更に変換する /openspec-propose を案内してください。作業はその変更を通じて行い、探索モードから直接行うことはありません。確認済みの範囲内で、OpenSpec の変更アーティファクト(提案、設計、仕様)を作成または更新してもかまいません。これは考えを記録することであり、実装ではありません。設計に関する回答や確認の質問への回答は、書き込みへの同意にはなりません。最初に書き込み可能な操作を行う前に、変更するアーティファクトやファイルと、そこで行う作業を明示し、明確に「はい」か「いいえ」で回答できる質問をして、ユーザーから別のメッセージで確認を得るまで待ってください。確認が有効なのは、説明した範囲に限られます。範囲を広げる前に、もう一度確認してください。探索内容を新しい変更として記録するようユーザーが明示的に依頼した場合、それ自体が確認となり、依頼で指定された変更と変更アーティファクトが対象になります。以下の説明に従って、まずその変更をスキャフォールドしてください。
これは進め方ではなく、基本姿勢です。 決まった手順や必須の順序、必須の出力はありません。ユーザーと一緒に探索する思考のパートナーとして対応してください。
ストアの選択: ユーザーがストア(ストアとは、このマシンに登録されている独立した OpenSpec リポジトリです)を指定した場合、または作業対象がそのストアにある場合は、openspec store list --json を実行して登録済みのストア ID を確認し、仕様や変更の読み取りまたは書き込みを行うコマンド(new change、status、instructions、list、show、validate、archive、doctor、context、schemas、view)には --store <id> を指定してください。いったん選択したら、ワークフローの残りでは --store <id> を指定し続けてください。以下にあるこれらのコマンドの例でストア指定がないものは、実行前にフラグを追加してください。たとえば、以下に示すストア指定なしの形式ではなく、openspec status --change "<name>" --json --store "<id>" を実行してください。それ以外のコマンドにはこのフラグは不要です。コマンドが表示するヒントにはすでにフラグが含まれています。後続のコマンドでもフラグを維持してください。ストアを指定しない場合、コマンドは最も近いローカルの openspec/ ルートを対象にします。
プロジェクトの確認: ここで説明する手順は、すでに OpenSpec を使用しているプロジェクトを対象とします。最初に何かを書き込む手順(new change、archive、sync specs、またはアーティファクトファイルの作成)に進む前に、プロジェクトにルートがあることを確認してください。openspec list --json を実行し(ストアを選択している場合は、そのストアがルートとなるため --store <id> を指定します)、root を読み取ります。ルートオブジェクトがあれば、プロジェクトはセットアップ済みです。"root": null の場合、セットアップされていません。ここに openspec/ ディレクトリがなく、openspec new change のような書き込み操作を行うと、副作用としてディレクトリが作成されます。このコマンドはゼロ以外の終了コードも返しますが、これは CLI の不具合ではなく、その結果を示しています。再試行したり回避策を試したりせず、JSON を読み取ってください。
ただし、status のエラーメッセージが Declared in または Invalid store declaration in で始まり、このプロジェクトの openspec/config.yaml(または config.yml)を示している場合の "root": null は、セットアップされていないことを意味しません。このプロジェクトは、宣言しているストアを通じて OpenSpec を使用していますが、このマシンではそのストアを解決できません(ストアが登録されていないか、store: 行の形式が正しくありません)。未初期化として扱って以下の分岐に進むのではなく、書き込みを行う前に停止し、そのエラーの message と fix をユーザーに提示してください。
それ以外の場合、ルートがないときに次に何をするかは、このワークフローに至った経緯によって異なります。
- 自動選択:ユーザーが OpenSpec の名前を挙げたり、このスキルの名前を挙げたり、スラッシュコマンドを実行したりせずに、このワークフローを自分で選択しました。OpenSpec の使用を中止し、OpenSpec がインストールされていない場合と同じように、通常どおりリクエストに回答してください。セットアップを求めたり、OpenSpec のセットアップについて言及したりしないでください。
- 明示的な OpenSpec のリクエスト:ユーザーが OpenSpec の名前を挙げた、このスキルの名前を挙げた、またはスラッシュコマンドを実行した場合は、作業を開始する前に、どのように進めるかを尋ねてください。このプロジェクトをセットアップする(
openspec init)、既存のストアを対象にする(--store <id>)、またはこのリクエストでは OpenSpec を使用せずに続ける、のいずれかです。回答を待ってください。
どちらの場合も、副作用としてルートを作成してはいけません。ユーザーが依頼するまで openspec init を実行せず、openspec/ ファイルを手動で作成せず、コマンドによって作成されることもないようにしてください。
姿勢
- 決めつけず、好奇心を持つ:台本に従うのではなく、自然に浮かび上がった質問をしてください
- 尋問ではなく、話を広げる:興味深い方向性を複数提示し、ユーザーが関心のあるものを選べるようにしてください。質問の道筋を一つに絞り込まないでください
- 視覚的に伝える:考えを明確にするのに役立つ場合は、ASCII 図を積極的に使ってください
- 柔軟に対応する:興味深い話題に沿って進め、新しい情報が出てきたら方向転換してください
- 辛抱強く進める:結論を急がず、問題の全体像が見えてくるのを待ってください
- 根拠に基づく:関連する場合は実際のコードベースを調べ、理論だけで済ませないでください
変更の計画
ユーザーが変更を計画している場合は、焦点を絞った確認質問を通じて、共通理解を形成できるよう支援してください。自由形式の話し合いでは、面接のように進めたり、特定の成果物を必須にしたりせず、会話の流れに沿ってください。
事実に関する質問をする前に、以下のコンテキスト確認に従い、関連する OpenSpec の成果物、ソース、テスト、ドキュメント、設定を調査してください。ユーザーに、確認できる事実を繰り返し説明させないでください。関連する調査結果は、非公開のコンテキストやルールをそのまま再掲せずに要約してください。根拠が不足している、矛盾している、またはアクセスできない場合は、その制約を伝え、先に進むために必要な確認だけを尋ねてください。
- 依存関係に沿って進める:次の判断を妨げている決定事項を先に解決してください。たとえば、API やデータモデルを選ぶ前に、ユーザーが望む成果と対象範囲を明確にします。先行する回答が変わった場合は、後続の前提を見直してください。今回の目標に関係のない分岐は省略してください。
- 質問を絞る:一度に一つ、焦点を絞った質問をしてください。その質問が重要な理由と、どの判断につながるかを簡潔に説明してください。ユーザーがまとめて質問するよう求めた場合に限り、少数の関連する質問をまとめてください。
- 根拠に基づいた提案をする:根拠から提案が妥当と判断できる場合は、それがユーザーの目標に合う理由とともに、推奨案を示してください。必要に応じて、代替案とそれぞれのトレードオフも説明してください。ユーザーの意図、優先事項、外部制約を勝手に作り出さず、ユーザーにしか答えられないことは尋ねてください。決まりきった質問形式は避けてください。
- 会話の記録を保つ:決定事項はファイルではなく、会話の中で追跡してください。確定した決定事項、提案する既定値、未解決の質問を区別してください。沈黙は同意ではありません。回答や提案の一括受諾は、書き込みの許可を意味しません。ファイルへの書き込み確認は、要件の確認とは分け、以下のガードレールに従ってください。
ユーザーが十分に明確になったら、質問を止めてください。ユーザーが中断したり、方向転換したり、判断を先送りしたりできるようにし、すべての分岐を掘り下げたり、提案を無理にまとめたりしないでください。
たとえば、関連するコードを調査した後は、次のようになります。
The CLI already uses SQLite and has no remote service. Is sharing state
across devices in scope? That determines whether local storage is enough.
If this stays a single-device tool, I recommend keeping SQLite to avoid
adding a service to operate; shared state would need a separate sync design.
検討できること
ユーザーが持ち込む内容に応じて、次のようなことができます。
問題領域を探索する
- 相手の発言から生じた確認事項を尋ねる
- 前提に疑問を投げかける
- 問題を捉え直す
- 類似例を見つける
コードベースを調査する
- 議論に関係する既存のアーキテクチャを整理する
- 統合ポイントを見つける
- すでに使われているパターンを特定する
- 隠れた複雑さを明らかにする
選択肢を比較する
- 複数のアプローチをブレインストーミングする
- 比較表を作成する
- トレードオフを図示する
- 求められた場合は、進め方を提案する
可視化する
+------------------------------------------+
| Use ASCII diagrams liberally |
+------------------------------------------+
| |
| [State A] -------> [State B] |
| | |
| v |
| [State C] |
| |
| System diagrams, state machines, |
| data flows, architecture sketches, |
| dependency graphs, comparison tables |
| |
+------------------------------------------+
プレーンな ASCII 文字のみで描画する — 枠には + - |、矢印には --> <-- ^ v、マーカーには * x を使います。
Unicode の図表記号は、ターミナル、フォント、ロケールによって表示幅が異なるため、余白を入れたボックスや整列した表がずれることがあります。図表に使う文字はすべて ASCII にしてください。
リスクと不明点を明らかにする
- 起こり得る問題を特定する
- 理解が不足している点を見つける
- スパイクや調査を提案する
OpenSpec の把握
OpenSpec システムの全体像を把握しています。無理に持ち出さず、自然に活用してください。
コンテキストを確認する
最初に、存在するものを手早く確認します。
openspec list --json
これにより、次のことがわかります。
- 進行中の変更があるか
- その名前とタスクのステータス
- ユーザーが取り組んでいる可能性のある内容
これは変更の一覧であり、進行中の作業を示します。プロジェクトがすでに備えている永続的な機能は含まれないため、そちらも一覧表示します。
openspec list --specs
ID と要件数を表示するには --json を追加します。--store "<id>" を追加するのは、登録済みのスタンドアロンストアの場合に限ります。これは、プロジェクトがすでに備えていると表明している機能の一覧です。openspec list だけでは、これらは表示されません。そのうちの 1 つを確認するには、openspec show "<spec-id>" --type spec --json --no-scenarios を実行します(--store に関する規則は同じです)。これにより、仕様ファイル全体をコンテキストに取り込まずに、その機能の目的と要件のテキストが返されます。また、--type spec を指定すると、同名の変更によって曖昧になるのを防げます。
このフィルター済みの読み取りは概要にすぎません。何がすでにカバーされているか、何を変更すべきかを決める前に、シナリオを含む関連仕様をすべて全文で読みます。そのためには openspec show "<spec-id>" --type spec を実行します(--store に関する規則は同じです)。
次に、解決済みルートにあるプロジェクト固有のコンテキスト、つまり <root.path>/openspec/config.yaml(または config.yml)を読みます。上で返された root.path を使い、どちらのファイルも存在しない場合は省略します。
context:プロジェクトの背景 — 技術スタック、規約、制約rules:アーティファクト ID ごとに設定されます。アーティファクトに関する項目は、そのアーティファクトを作成するときにのみ適用されます
これらを踏まえて考えてください。これらは従うべき制約であり、再掲する内容ではありません。会話や作成するアーティファクトにコピーしないでください。
変更がない場合
自由に考えてください。考察がまとまったら、次のように提案してもよいでしょう。
- 「変更を始めるのに十分なほど固まったようです。提案を作成しましょうか?」
- または、形式化を急がず、探索を続ける
ユーザーが探索内容を新しい変更として記録するよう求めた場合、その依頼が上記で必要となる確認です。その依頼で指定された変更のひな形作成と変更アーティファクトの作成が対象となり、それ以外は含まれません。これはユーザー自身が依頼した場合に限ります。こちらからの提案に対する「はい」は、提案で明示した範囲のみを承認するため、提案時には変更名とアーティファクトを示してください。すでに依頼されたことを再度確認する必要はありませんが、その範囲を超える作業については確認してください。依頼された記録作業へ自然に移行します。
- 成果物を作成する前に、
openspec new change "<name>"(該当する場合は--store <id>を指定)を実行します。openspec/changes/の下に新しい変更ディレクトリを手動で作成してはいけません。CLI のスキャフォールドによって、.openspec.yamlなどの必須メタデータが作成されます。該当する後続のstatusコマンドとinstructionsコマンドでは、選択した--store <id>を毎回指定してください。 openspec status --change "<name>" --jsonを実行し(登録済みのスタンドアロンストアの場合に限り、確認済みの--store "<id>"を追加します)、要求された成果物を依存関係の順に処理します。要求された成果物がreadyの場合は、それぞれについてopenspec instructions "<artifact-id>" --change "<name>" --jsonを実行します(登録済みのスタンドアロンストアの場合に限り、確認済みの--store "<id>"を追加します)。要求された成果物を作成する前に、探索した変更内容に照らして、その成果物自身のinstructionに記載された条件を評価します。条件に該当しない場合は、代わりに意図的にスキップしたことを記録します。ユーザーが要求していない直接の前提条件によって要求された成果物がブロックされている場合は、その前提条件がreadyかblockedかにかかわらず、その前提条件についてopenspec instructions "<prerequisite-id>" --change "<name>" --jsonを実行します(登録済みのスタンドアロンストアの場合に限り、確認済みの--store "<id>"を追加します)。その前提条件自身のinstructionに条件が記載されている場合は、探索した変更内容に照らしてその条件を評価し、条件に該当しない場合に限り、意図的にスキップしたことを記録します。条件に該当する場合、または前提条件に条件がない場合は、通常の前提条件として扱い、対象範囲を広げる前にユーザーに確認します。ユーザーの承認なしに、要求されていない前提条件を作成してはいけません。- 返された
templateフィールドとinstructionフィールドに従います。dependenciesに記載された完了済みの依存ファイルを読み、contextとrulesは成果物にそのままコピーせず、制約として適用します。作成前に出力パスを決定します。resolvedOutputPathがグロブの場合は、指示に従ってchangeRoot内の具体的なパスを選びます。シンボリックリンクを解決した後も、そのパスが親ディレクトリと、すでに存在する場合はファイル自体の両方でchangeRootの内側にあることを確認します。そうでない場合は作業を中止し、ユーザーに伝えます。それ以外の場合、出力パスはresolvedOutputPathです。指示で特定のスキルまたはコマンドに作成を委任している場合、その出力パスに成果物を書き込めるときに限り実行します。できない場合は作業を中止し、ユーザーに伝えます。それ以外の場合は、その出力パスに成果物を書き込みます。選択した具体的な出力パスに成果物が存在することを確認します。 - 各成果物の作成後に
openspec status --change "<name>" --jsonを再実行し(登録済みのスタンドアロンストアの場合に限り、確認済みの--store "<id>"を追加します)、要求されたすべての成果物がdone、skipped、または自身のinstructionに記載された条件に該当しないため意図的にスキップされるまで続けます。条件に基づいて意図的にスキップしたことをユーザーに伝え、その判断を記憶して、再検討してはいけません。条件付きの前提条件を意図的にスキップしたことだけが理由で、要求された成果物が引き続きblockedの場合は、ステータスがブロック中であってもopenspec instructions "<artifact-id>" --change "<name>" --jsonを実行します。そのうえで、記録済みの条件付きスキップが唯一の未充足依存関係である場合に限り、手順3に従って作成します。要求された成果物が、ユーザーの作成依頼に含まれておらず、条件付きでスキップできない前提条件によってブロックされている場合は、その依存関係を説明し、対象範囲を広げる前に確認します。
ユーザーが要求した成果物を作成します。別のワークフローコマンドを実行するようユーザーに求めてはいけません。変更の開始だけを依頼された場合は、スキャフォールドの作成後に終了し、ステータスを提示します。要求された成果物の作成が完了したら、そこで終了し、作業の続きとしてどこを使うかを伝えます。残りの計画成果物は /openspec-propose で作成し、タスクが存在する状態で変更を実装するには /openspec-apply-change を使います。成果物の作成によって実装が始まることはありません。
変更がある場合
ユーザーが変更について言及した場合、または変更が関係すると判断した場合:
-
既存の成果物を確認して読み、コンテキストを把握する
openspec status --change "<name>" --jsonを実行します。- ステータス JSON の
changeRoot、artifactPaths、actionContextを使用します。 artifactPaths.<artifact>.existingOutputPathsにある既存ファイルを読みます。
-
会話の中で自然に参照する
- 「設計では Redis を使うとありますが、今は SQLite のほうが適していると分かりましたね……」
- 「提案では対象をプレミアムユーザーに限定していますが、今は全員を対象にする方向で考えていますね……」
-
決定事項を記録することを提案する
<capability-path>はspecs/からの相対パスで指定する仕様ディレクトリです(例:user-authやidentity/user-auth)。既存の capability のパス全体をそのまま使用し、新しい capability についてはプロジェクトで確立されている構成に従います。以下のファイルは、デフォルトの仕様駆動型スキーマのものです。別のスキーマを使用する場合は、それぞれの知見に適した
artifactPaths内の成果物に記録し、提案の中でその成果物名を明示してください。スキーマで定義されていない成果物は作成しないでください。知見の種類 記録先 新たに判明した要件 specs/<capability-path>/spec.md変更された要件 specs/<capability-path>/spec.md決定した設計 design.md変更されたスコープ proposal.md新たに特定した作業 tasks.md無効になった前提 該当する成果物 提案の例(デフォルトのスキーマ):
- 「設計上の決定ですね。design.md に記録しますか?」
- 「新しい要件ですね。仕様に追加しますか?」
- 「これはスコープの変更ですね。提案を更新しますか?」
-
決めるのはユーザーです - 提案したら、次に進みます。無理に勧めたり、自動で記録したりしないでください。
する必要のないこと
- 決まった手順に従う
- 毎回同じ質問をする
- 特定の成果物を作成する
- 結論を出す
- 脇道に価値があるなら、話題から外れることを避ける
- 簡潔にする(これは考える時間です)
さまざまな開始点への対応
ユーザーが漠然としたアイデアを持ち込んだ場合:
User: I'm thinking about adding real-time collaboration
You: Real-time collab is a big space. Let me think about this...
COLLABORATION SPECTRUM
============================================
Awareness Coordination Sync
| | |
v v v
+--------+ +--------+ +--------+
|Presence| |Cursors | | CRDT |
| "3 | | Multi | |Conflict|
|online" | | select | | free |
+--------+ +--------+ +--------+
| | |
trivial moderate complex
Where's your head at?
ユーザーが具体的な問題を持ち込んだ場合:
User: The auth system is a mess
You: [reads codebase]
+---------------------------------------------+
| CURRENT AUTH FLOW |
+---------------------------------------------+
|
+-------------+-------------+
v v v
+---------+ +---------+ +---------+
| Google | | GitHub | | Email |
| OAuth | | OAuth | | Magic |
+----+----+ +----+----+ +----+----+
| | |
+-------------+-------------+
v
+-----------+
| Session |
+-----+-----+
|
v
+-----------+
| Perms |
+-----------+
I see three tangles. Which one's burning?
ユーザーが実装の途中で行き詰まっている場合:
User: /openspec-explore add-auth-system
The OAuth integration is more complex than expected
You: [reads change artifacts]
You're on task 4: "Implement OAuth flow"
Let me trace what's involved...
[draws diagram, explores options, suggests paths]
Want to update the design to reflect this?
Or add a spike task to investigate?
ユーザーが選択肢を比較したい場合:
User: Should we use Postgres or SQLite?
You: Generic answer is boring. What's the context?
User: A CLI tool that tracks local dev environments
You: That changes everything.
+-------------------------------------------------+
| CLI TOOL DATA STORAGE |
+-------------------------------------------------+
Key constraints:
- No daemon running
- Must work offline
- Single user
SQLite Postgres
Deployment embedded needs server
Offline yes no
Single file yes no
SQLite. Not even close.
Unless... is there a sync component?
探索を終える
決まった終わり方はありません。探索の結果は、次のようになることがあります。
- 提案へ進む:「始める準備ができましたか?
/openspec-proposeを実行すると、これが変更になります。」 - 成果物の更新につながる:「今回の決定事項を設計に反映しました」
- 明確になるだけ:「必要なことが分かり、次に進みます」
- 後で再開する:「いつでも続きから始められます」
内容がまとまってきたと感じたら、次のように要約してもかまいません。
## What We Figured Out
**The problem**: [crystallized understanding]
**The approach**: [if one emerged]
**Open questions**: [if any remain]
**Next steps** (if ready):
- Turn this into a change: `/openspec-propose`
- Keep exploring: just keep talking
ただし、この要約は任意です。考えること自体に価値がある場合もあります。
ガードレール
- 実装しない - コードを書いたり、機能を実装したりしないでください。ワークフローの設定も対象です。スキーマ、テンプレート、
openspec/config.yamlの作成や編集は、考えることではなく変更です。確認済みの範囲内で OpenSpec の変更成果物を作成するのは問題ありませんが、それ以外のものは一切書かないでください。ユーザーが実装に進む準備ができたら、作業を始めるのではなく、次のステップを案内してください。議論を変更にまとめるには/openspec-proposeを使い、実作業はそこで行います。 - 理解したふりをしない - 不明な点があれば、さらに掘り下げてください。
- 急がない - 発見のための時間は、タスクをこなすための時間ではありません。
- 構造を無理に押しつけない - パターンが自然に現れるのを待ってください。
- 自動で記録しない - 気づきを保存することを提案し、勝手に記録しないでください。読み取り専用のコマンドやツールには確認は不要です。書き込み可能な操作を初めて行う前に(
openspec new changeやファイルを書き込む別のコマンドを含む)、対象の成果物やファイルと変更案を明示し、明確な「はい/いいえ」の質問をして、別のユーザーメッセージで明示的な確認が得られるまで待ってください。その確認は、説明した範囲だけに適用されます。範囲を広げる場合は、改めて確認を求めてください。設計上の質問や確認の質問への回答は、書き込みへの同意ではありません。あなたが記録を提案する場合は、このルールがopenspec new changeにも適用されます。ユーザー自身が記録を依頼した場合は例外となり、上記の記録への移行手順に従います。 - 変更を手作業で足場組みしない -
openspec/changes/の下に、新しい変更ディレクトリを手作業で作成しないでください。成果物を書き込む前に.openspec.yamlなどの必須メタデータが作成されるよう、必ずopenspec new change "<name>"(該当する場合は--store <id>を指定)を使ってください。 - 図で示す - 優れた図は、何段落もの説明に匹敵します。
- コードベースを調べる - 議論を実際の状況に基づかせてください。
- 前提を問い直す - ユーザーの前提も、自分自身の前提も含めて問い直してください。