去年から、仕様駆動開発ツールの1つであるOpenSpecを試しています。
https://github.com/Fission-AI/OpenSpec
使い始めたときは0系でしたが、2026/1/26にメジャーバージョンアップが行われ、v1.0.0がリリースされました。
https://github.com/Fission-AI/OpenSpec/releases/tag/v1.0.0
OpenSpec 1系ではワークフローが増えました。
https://github.com/Fission-AI/OpenSpec/blob/v1.2.0/docs/workflows.md
Quick Featureワークフローは0系までと同じように感じる一方、1系で増えたExploratoryワークフローが気になりました。そこで、Exploratoryワークフローを試してみることにしました。
今回は、執筆時点の最新バージョンであるOpenSpec 1.2.0を使って、Rubyの Gemfile.lock のパーサーをRustで作ってみたことから、メモを残します。
なお、Rustには詳しくないので、Rustとしての実装が適切なのかまでは見ていません。。。テストや簡単な動作確認がパスすればOKとしています。
目次
環境
- mac
- OpenSpec 1.2.0
- Codex app 26.228.1430 (760)
- gpt-5.3-codex + Extra high
- Rust 1.93.1
当初作りたいと考えていた内容
Exploratoryワークフローの説明には
When requirements are unclear or you need to investigate first:
https://github.com/Fission-AI/OpenSpec/blob/v1.2.0/docs/workflows.md#exploratory
と書かれていました。
そこで、「こんな感じのものが作りたい」を簡単に考えておきました。
Gemfile.lockのパーサー- ライブラリとして使う
- パーサーはCLIとしても使えるようにする
- パース結果を標準出力する時のフォーマットは、次から選択可能
- JSON
- 人間に読みやすいテキスト
- パース結果を標準出力する時のフォーマットは、次から選択可能
Exploratoryワークフロー
実際に公式ドキュメントの Exploratory を試してみます。
https://github.com/Fission-AI/OpenSpec/blob/v1.2.0/docs/workflows.md#exploratory
以降は、試してみた時の流れや様子をスクリーンショット付きのメモとして残したものです。
なお、今回は、一度のExploratoryワークフローが終わるまでは、1つのセッションを使っています。
/opsx:explore
まずは、スラッシュコマンドの /opsx:explore を使います。
すると、AIエージェントが現在のディレクトリを探索しに行きました。
リポジトリの全体像を把握した後、次やることの提案がありました。そこでやりたいことを伝えると、また調査を進めていきました。
その後、提案が来たときは質問をしたり、雑談をしたりするうちに仕様が決まっていきました。ただ、仕様は決まっていくものの、まだ何もファイルが出力されません。
AIエージェントとやり取りを繰り返すうちに、細かな仕様も決まります。やがて、次のようなコメントが出てきました。
さらに進めると、一度仕様をまとめようという提案もありました。
ただ、本当にここまでの検討だけで十分か分からなかったため、他にも検討することがないかを伝えました。
その後もAIエージェントとの間で「各項目の検討→検討不足がないかの質問」を繰り返したところ、次のステップへ行きたそうな発言が出てきました。
個人的にもここまでの対話で十分検討できたと感じたため、次のステップへ進むことにしました。
/opsx:new
次に/opsx:new を使って次のステップに必要なファイルを生成します。この段階では、空の proposal.md を出力するだけでした。
/opsx:continue
次に実行できるスラッシュコマンドを調べたところ、
/opsx:continue/opsx:ff
の2つがありました。
/opsx:ff の場合、一気にファイルを作るようで、OpenSpec 0系の挙動と同じように感じました。
ただ、一気にすべてのファイルを出力されるとレビューが大変なので、今回は /opsx:continue で1つずつファイルを出力してもらうことにしました。
/opsx:continue すると、こんな感じで1つずつドキュメントが生成されます。生成が終わると次のコマンドが案内されます。
/opsx:apply
必要なドキュメントの出力が終わると、次のコマンドの案内が変わります。今回はそのまま実行して問題なかったため、 /opsx:apply を実行します。
apply 以降はOpenSpec 0系と同じでした。
出力されたソースコードについて
/opsx:verifyで実装の確認- 別セッションによる
/reviewによるレビュー planモードによる修正の計画- ソースコード及びOpenSpec系のファイル修正
- 最後に
/opsx:archiveでアーカイブ
を行い、このセッションでの作業は完了しました。
ただ、1回のセッションですべての機能を完成させるのは難しいと判断したことから、今回は
- Gemfile.lockをパースできるようにする
- トップレベル依存を解決済みバージョン付きで参照できるようにする
- パーサーをCLI化する
- CLIの結果を人間が見やすくする
の合計4セッションで完成となりました。
動作確認
cargo run を使って動作確認します。
JSONでの出力例です。長いので省略しています。
% cargo run -- examples/rails_relying_party_of_backend/Gemfile.lock
...
{"status":"ok","data":{"top_level_dependencies":[{"name":"tzinfo-data","raw_requirement":null,"resolved_version":null},{"name":"rails","raw_requirement":"~> 6.1.4","resolved_version":"6.1.4"}, ...
テキストでの出力例です。
% cargo run -- examples/rails_relying_party_of_backend/Gemfile.lock --format text ... activerecord-session_store [2.0.0] annotate [3.1.1] bootsnap [1.7.7] byebug [11.1.3] dotenv-rails [2.7.6] jbuilder [2.11.2] listen [3.6.0] omniauth [2.0.4] omniauth-oauth2 [1.7.1] omniauth-rails_csrf_protection [1.0.0] puma [5.4.0] rack-mini-profiler [2.3.2] rails [6.1.4] spring [2.1.1] sqlite3 [1.4.2] tzinfo-data [] web-console [4.1.0]
いずれも良さそうでした。
感想
最初Exploratoryワークフローを見たときはOpenSpec 0系よりも複雑になったのかなという印象でした。
しかし、今回あいまいな仕様の状態でそのワークフローを使ってみたところ、AIエージェントと雑談を通してあいまいな仕様が明確になっていくのを実感できました。
そのため、公式ドキュメントにもある通り、
- 仕様がすべて決まっている場合、Quick Featureを使う
- あいまいな仕様の場合、Exploratoryを使う
のような形でワークフローを使い分けるのが良さそうと感じました。
OpenSpec 1.2.0での設定について
OpenSpec 0系と比べて設定まわりに変化があったため、これもメモしておきます。
他にも色々ありそうでしたので、詳しくは公式の最新ドキュメントを確認してください。
https://github.com/Fission-AI/OpenSpec/tree/main/docs
0系からのマイグレーション
OpenSpecの0系と1系では、スラッシュコマンドのprefixが openspec と opsx で異なります。
公式ではマイグレーションガイドを用意してあります。必要に応じて参照すると良さそうです。
https://github.com/Fission-AI/OpenSpec/blob/v1.2.0/docs/migration-guide.md
多言語化
OpenSpec 1系では、多言語化の設定があります。
https://github.com/Fission-AI/OpenSpec/blob/v1.2.0/docs/multi-language.md
日本語の設定もドキュメントにあります。 openspec/config.yaml へ次を設定します。
context: | 言語:日本語 すべての成果物は日本語で作成してください。
テレメトリーの設定
OpenSpec 1系では匿名での統計を取るためのテレメトリー設定が含まれています。
https://github.com/Fission-AI/OpenSpec?tab=readme-ov-file#other
次のような環境変数でオプトアウトできるようです。
Opt-out:
export OPENSPEC_TELEMETRY=0orexport DO_NOT_TRACK=1
実装は src/telemetry/index.ts あたりです(ソースコード)。
ソースコード
GitHubに上げました。
https://github.com/thinkAmi-sandbox/lockfile_parser-example
今回のプルリクはこちら。
https://github.com/thinkAmi-sandbox/lockfile_parser-example/pull/1









