OpenCode 2.0に上げても、1.0で書いたプラグインはそのまま動くと思っていませんか? 1.0形式のプラグインを置いて2.0と1.19.3に同じ依頼を流すと、2.0では一度も実行されず、警告も出ませんでした。入れ方のつまずき、1.0に戻すときの落とし穴、公式の移行ガイドが警告している外部ディレクトリとLSP診断まで、上げる前に知っておきたいことをまとめます。
動かしたのは使い捨てのコンテナ(node:22-bookworm)で、APIキーは渡さず、キー不要の無料モデル opencode/deepseek-v4.1-flash-free を使いました。
OpenCode 2.0は、npmでは別のパッケージ名で入る
最初につまずいたのはここです。npm install -g opencode-ai で入ったのは1.19.3でした。npmの opencode-ai は10月16日公開の1.19.3が最新のままで、2.0は @opencode/cli という別パッケージになっています(最新は2.0.32)。
公式ドキュメントのnpmの手順は npm install -g @opencode/cli です。私は作業ディレクトリに入れて、7.2秒で終わりました。入るコマンドは opencode と opencode2 の2つで、opencode --version は opencode v2.0.32 を返します。Homebrewも2.0は anomalyco/tap/opencode-v2 という名前です。
1.xを使っている人は、v1.19.0のリリースノートにあるとおり opencode upgrade --major で上げられます。古い手順をコピペすると、2.0を入れたつもりで1.xを触り続けることになるので、まず --version に v2 と出るかを見てください。
1.0のプラグインは、一覧に出るのに一度も実行されなかった
試したのは、ツールが呼ばれるたびにファイルへ1行書くだけの、1.0形式のプラグインです。.opencode/plugin/hello.js に置きました。
// OpenCode 1.x 形式のプラグイン(tool.execute.before で記録する)
import { appendFileSync } from "node:fs"
export const HelloPlugin = async ({ project, directory }) => {
appendFileSync("/work/proj/plugin-loaded.txt", "loaded v1 plugin\n")
return {
"tool.execute.before": async (input) => {
appendFileSync("/work/proj/plugin-loaded.txt", "before tool: " + input.tool + "\n")
},
}
}この状態で「util.py の中身を読んで、1行で説明して」と頼むと、2.0はファイルを読んで答えを返しましたが、plugin-loaded.txt は作られませんでした。--print-logs --log-level warn を付けても警告はゼロでした(確かめたのはこの1種類のプラグインと、warnレベルのログだけです)。ところが opencode plugin list には local /work/proj/.opencode/plugin/hello.js と載っています。
1.19.3では「loaded v1 plugin」「before tool: glob」「before tool: read」の3行が残りました。同じファイルで、2.0だけ黙って素通りしたわけです。
公式の移行ガイドを読むと理由が分かります。2.0は .opencode/plugin/ と .opencode/plugins/ の両方からプラグインを見つけますが、ガイドには「V1 plugin implementations do not run in V2」とあります。見つけはするけれど、1.0の書き方では実行しない。一覧に出るのはそのためと読めます。
これ、ツール呼び出しを記録したり、危ないコマンドを止めたりするのにプラグインを使っている人ほど危ないです。止まったことに気づく手段がありません。移すには、エントリーポイント、フック、ツール、イベントをそれぞれ書き直す必要があり、設定キーも plugin から plugins に変わります。
同じHOMEで、OpenCode 1.0は起動しなくなった
2.0を動かしたのと同じHOMEで1.19.3を起動したら、こう返ってきました。
Error: Unexpected error
Database is not empty and has no session table2.0が使ったデータの置き場を、1.0が読めなかったのだと私は受け取りました。HOMEと XDG_* を別のディレクトリに向けて起動し直すと、1.0は普通に動き、プラグインも3行を書きました。
移行ガイドも、V1とV2は同じ設定の場所を使うと書いています。2.0専用の形に変換した設定をV1に読ませないこと、検証中はV1の設定の控えを残すこと、の2点が注意として並んでいます。1.0に戻せる道を残すなら、2.0は別のHOMEかコンテナで試すのが安全です。
移行ガイドが警告する、外部ディレクトリとLSP診断
プラグイン以外で見落とすと怖いのが2つあります。どちらも公式の移行ガイドの記述です。
1: 外部ディレクトリへのアクセス。V1はプロジェクトの外のパスに触る前に確認していましたが、V2は既定で許可します。V1と同じ動きにしたいなら、permissions に次のルールを足すようガイドは案内しています。
{ "action": "external_directory", "resource": "*", "effect": "ask" }2: LSP診断。V2は lsp の設定を受け取って残しますが、言語サーバーは起動せず、LSPのツールも診断も出しません。型エラーを言語サーバーの診断で拾わせていたなら、型チェックやリントのコマンドをエージェントに走らせる形へ置き換えることになります。
設定キーの名前もいくつか変わっていて、権限の bash は shell、task は subagent になりました。ただ、ガイドによると、対応している1.0形式の設定項目はそのまま読まれ、メモリ上で解釈されるだけで元のファイルは書き換わりません。エージェント、コマンド、スキルの定義も、変更なしで動き続ける扱いです。
無料モデルでも、OpenCode 2.0は修正からpytestまで通した
壊れる話ばかりでしたが、2.0そのものはちゃんと仕事をします。キーを入れていない状態で opencode models を叩くと、opencode/glm-5.3-flash-free などの無料モデルが10件ほど出てきました。
そのまま次の依頼を流しました。
opencode run --auto -m opencode/deepseek-v4.1-flash-free "util.py の slugify に記号除去を足し、pytest のテストも書いて実行して"30.8秒で、util.py の書き換え、9ケースのテストの作成、pytest の実行まで終わりました。面白かったのは、環境に pytest が無いと分かると apt-get install python3-pytest を自分で走らせてから「9 passed」まで持っていったところです。依頼文1本で、ここまで済みます。
ただし --auto は、明示的に拒否していない権限を全部自動で通すフラグです。先ほどの外部ディレクトリのルールは確認を求める ask なので、--auto を付けると確認なしで通ると考えたほうが安全です。今回は使い捨てのコンテナだから付けましたが、手元のマシンでは --auto を付けず、外部ディレクトリへの確認を残してください。
非同期シェルは、1回試したら裏の処理の完了を待たずに終わった
公式のリリースノートによると、2.0ではシェルを非同期で呼べるようになり、長い処理でメインのエージェントが止まらなくなりました。サブエージェントを裏で走らせる機能(別のモデルを指定した場合も含む)や、複数のツール呼び出しを1本のスクリプトにまとめるCode Modeも入っています。
ここは1回だけの結果ですが、opencode run で「sleep 25 && echo SLOW_DONE を裏で走らせて、待たずに docstring を足して、そのあと SLOW_DONE を確認して報告して」と頼みました。docstring の追加と動作確認までは済みましたが、12.6秒で終了しています。モデルが実際に非同期シェルの機能を呼んだのかは、ログから確かめられていません。最後の応答は「SLOW_DONE の出力を確認したら…報告します」で、25秒かかる裏の処理の完了は見届けていません。1回きりの実行で裏の処理の結果まで受け取る使い方は、当てにしないほうがいいです。
OpenCode 2.0に上げてよいのは、プラグインを自作していない人から
プラグインを使っておらず、LSP診断にも頼っていないなら、2.0に上げて困ることは少ないはずです。無料モデルで修正とテストまで回るので、入れてみるハードルも低いです。
自作プラグインがある人は、上げる前にプラグインの移植を済ませてください。2.0は動かないプラグインを一覧に載せたまま、私が見た範囲では警告ログに何も出しません。設定の変換は、移行ガイドにあるとおり「1.0形式の設定を2.0のネイティブ形式に移行して」という趣旨でOpenCode自身に頼めます。まずは別のHOMEで2.0を起動し、自分のプラグインが1行でも記録を残すかを見るところから始めてください。
コメント
ログイン か 会員登録 するとコメントできます