<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3</id>
	<title>OpenCodeの設定 - プラグイン - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;action=history"/>
	<updated>2026-07-06T09:37:57Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=15007&amp;oldid=prev</id>
		<title>2026年6月17日 (水) 04:45にWikiによる</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=15007&amp;oldid=prev"/>
		<updated>2026-06-17T04:45:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;amp;diff=15007&amp;amp;oldid=14494&quot;&gt;差分を表示&lt;/a&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
	<entry>
		<id>https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=14494&amp;oldid=prev</id>
		<title>2026年2月26日 (木) 21:33にWikiによる</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=14494&amp;oldid=prev"/>
		<updated>2026-02-26T21:33:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年2月27日 (金) 06:33時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l716&quot;&gt;716行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;716行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;!! opencode.jsonの設定&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-openai-codex-auth || ChatGPT Plus/Proのサブスクリプションを使用してOpenAI Codexバックエンドを利用する。&amp;lt;br&amp;gt;OAuth認証をサポートする。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-openai-codex-auth || ChatGPT Plus/Proのサブスクリプションを使用してOpenAI Codexバックエンドを利用する。&amp;lt;br&amp;gt;OAuth認証をサポートする。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-openai-codex-auth&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-gemini-auth || 既存のGeminiプランを使用してGoogleアカウントで認証する。&amp;lt;br&amp;gt;API課金の代わりにGeminiプランを使用できる。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-gemini-auth || 既存のGeminiプランを使用してGoogleアカウントで認証する。&amp;lt;br&amp;gt;API課金の代わりにGeminiプランを使用できる。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-gemini-auth&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-antigravity-auth || Antigravityの無料モデルを使用してAPI課金なしでモデルを利用する。&amp;lt;br&amp;gt;GeminiおよびAnthropicモデルに対応する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-antigravity-auth || Antigravityの無料モデルを使用してAPI課金なしでモデルを利用する。&amp;lt;br&amp;gt;GeminiおよびAnthropicモデルに対応する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-antigravity-auth&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-google-antigravity-auth || Google Antigravity OAuthを使用する拡張版。&amp;lt;br&amp;gt;Google検索サポートと堅牢なAPI処理を提供する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-google-antigravity-auth || Google Antigravity OAuthを使用する拡張版。&amp;lt;br&amp;gt;Google検索サポートと堅牢なAPI処理を提供する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-google-antigravity-auth&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l733&quot;&gt;733行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;733行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;!! opencode.jsonの設定&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-daytona || Daytonaサンドボックス内でOpenCodeセッションを自動実行する。&amp;lt;br&amp;gt;Git同期とライブプレビュー機能を提供する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-daytona || Daytonaサンドボックス内でOpenCodeセッションを自動実行する。&amp;lt;br&amp;gt;Git同期とライブプレビュー機能を提供する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-daytona&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-devcontainers || 複数ブランチのdevcontainer分離を実現する。&amp;lt;br&amp;gt;シャロークローンと自動割り当てポートをサポートする。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-devcontainers || 複数ブランチのdevcontainer分離を実現する。&amp;lt;br&amp;gt;シャロークローンと自動割り当てポートをサポートする。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-devcontainers&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-morph-fast-apply || Morph Fast Apply APIを使用した高速なコード編集を実現する。&amp;lt;br&amp;gt;10,500+ tokens/secの編集速度と遅延編集マーカーを提供する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-morph-fast-apply || Morph Fast Apply APIを使用した高速なコード編集を実現する。&amp;lt;br&amp;gt;10,500+ tokens/secの編集速度と遅延編集マーカーを提供する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-fast-apply&quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;パッケージ名が異なる&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-type-inject || ファイル読み込み時にTypeScript/Svelteの型を自動注入する。&amp;lt;br&amp;gt;型参照ツールを提供する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-type-inject || ファイル読み込み時にTypeScript/Svelteの型を自動注入する。&amp;lt;br&amp;gt;型参照ツールを提供する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;@nick-vi/opencode-type-inject&quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;スコープ付きパッケージ&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l750&quot;&gt;750行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;750行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;!! opencode.jsonの設定&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-background-agents || Claude Codeスタイルのバックグラウンドエージェントを提供する。&amp;lt;br&amp;gt;非同期委任とコンテキスト永続化をサポートする。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-background-agents || Claude Codeスタイルのバックグラウンドエージェントを提供する。&amp;lt;br&amp;gt;非同期委任とコンテキスト永続化をサポートする。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;@zenobius/opencode-background&quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;パッケージ名が異なる&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| oh-my-opencode || バックグラウンドエージェント、LSP/AST/MCPツール、厳選されたエージェントを提供する。&amp;lt;br&amp;gt;詳細は専用ページを参照のこと。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| oh-my-opencode || バックグラウンドエージェント、LSP/AST/MCPツール、厳選されたエージェントを提供する。&amp;lt;br&amp;gt;詳細は専用ページを参照のこと。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;oh-my-opencode&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| micode || 構造化されたブレインストーム→計画→実装のワークフローを提供する。&amp;lt;br&amp;gt;セッション継続性とサブエージェントオーケストレーションをサポートする。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| micode || 構造化されたブレインストーム→計画→実装のワークフローを提供する。&amp;lt;br&amp;gt;セッション継続性とサブエージェントオーケストレーションをサポートする。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;micode&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-workspace || バンドルされたマルチエージェントオーケストレーションハーネスを提供する。&amp;lt;br&amp;gt;16コンポーネントを1つのインストールで利用できる。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-workspace || バンドルされたマルチエージェントオーケストレーションハーネスを提供する。&amp;lt;br&amp;gt;16コンポーネントを1つのインストールで利用できる。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| npmに未公開&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l767&quot;&gt;767行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;767行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;!! opencode.jsonの設定&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-notify || タスク完了時のネイティブOS通知を提供する。&amp;lt;br&amp;gt;バックグラウンドタスクの完了を通知する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-notify || タスク完了時のネイティブOS通知を提供する。&amp;lt;br&amp;gt;バックグラウンドタスクの完了を通知する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-notify&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-notificator || デスクトップ通知とサウンドアラートを提供する。&amp;lt;br&amp;gt;OpenCodeセッションの状態変化を通知する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-notificator || デスクトップ通知とサウンドアラートを提供する。&amp;lt;br&amp;gt;OpenCodeセッションの状態変化を通知する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| npmに未公開&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-notifier || 権限、完了、エラーイベントのデスクトップ通知とサウンドアラートを提供する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-notifier || 権限、完了、エラーイベントのデスクトップ通知とサウンドアラートを提供する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;@mohak34/opencode-notifier&quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;スコープ付きパッケージ&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-wakatime || Wakatimeを使用してOpenCodeの使用状況を追跡する。&amp;lt;br&amp;gt;コーディング時間の自動記録を行う。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-wakatime || Wakatimeを使用してOpenCodeの使用状況を追跡する。&amp;lt;br&amp;gt;コーディング時間の自動記録を行う。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-wakatime&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-quota || プロバイダー間のクォータとトークン使用量を追跡する。&amp;lt;br&amp;gt;自動トースト通知とスラッシュコマンドを提供する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-quota || プロバイダー間のクォータとトークン使用量を追跡する。&amp;lt;br&amp;gt;自動トースト通知とスラッシュコマンドを提供する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-quota&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l786&quot;&gt;786行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;786行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! プラグイン名 !! 説明 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;!! opencode.json設定&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-helicone-session || リクエストグループ化のためのHeliconeセッションヘッダーを自動注入する。&amp;lt;br&amp;gt;API使用状況の分析に使用する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-helicone-session || リクエストグループ化のためのHeliconeセッションヘッダーを自動注入する。&amp;lt;br&amp;gt;API使用状況の分析に使用する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-helicone-session&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-dynamic-context-pruning || トークン使用量を最適化する。&amp;lt;br&amp;gt;古いツール出力をコンテキストから削除する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-dynamic-context-pruning || トークン使用量を最適化する。&amp;lt;br&amp;gt;古いツール出力をコンテキストから削除する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;@tarquinen/opencode-dcp&quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;スコープ付きパッケージ&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-supermemory || Supermemoryを使用してセッション間の永続メモリを提供する。&amp;lt;br&amp;gt;長期的なコンテキスト保持を実現する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-supermemory || Supermemoryを使用してセッション間の永続メモリを提供する。&amp;lt;br&amp;gt;長期的なコンテキスト保持を実現する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-supermemory&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-agent-memory || Lettaエージェントにインスパイアされた永続的な自己編集可能メモリブロックを提供する。&amp;lt;br&amp;gt;エージェントの記憶を保持する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-agent-memory || Lettaエージェントにインスパイアされた永続的な自己編集可能メモリブロックを提供する。&amp;lt;br&amp;gt;エージェントの記憶を保持する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-agent-memory&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-direnv || セッション開始時にdirenv環境変数を自動的に読み込む。&amp;lt;br&amp;gt;Nix flakesとの相性が良い。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-direnv || セッション開始時にdirenv環境変数を自動的に読み込む。&amp;lt;br&amp;gt;Nix flakesとの相性が良い。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| npmに未公開&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-scheduler || launchd (Mac) または systemd (Linux) を使用して定期的なジョブをスケジュールする。&amp;lt;br&amp;gt;cron構文をサポートする。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-scheduler || launchd (Mac) または systemd (Linux) を使用して定期的なジョブをスケジュールする。&amp;lt;br&amp;gt;cron構文をサポートする。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-scheduler&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-websearch-cited || 対応プロバイダーのネイティブウェブ検索サポートを追加する。&amp;lt;br&amp;gt;Google groundedスタイルの引用付き検索を提供する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-websearch-cited || 対応プロバイダーのネイティブウェブ検索サポートを追加する。&amp;lt;br&amp;gt;Google groundedスタイルの引用付き検索を提供する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;opencode-websearch-cited&quot;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-md-table-formatter || LLMが生成したMarkdownテーブルを整形する。&amp;lt;br&amp;gt;テーブルの可読性を向上させる。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-md-table-formatter || LLMが生成したMarkdownテーブルを整形する。&amp;lt;br&amp;gt;テーブルの可読性を向上させる。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| &amp;lt;code&amp;gt;&quot;@franlol/opencode-md-table-formatter&quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;スコープ付きパッケージ&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-shell-strategy || 非対話型シェルコマンドの指示を提供する。&amp;lt;br&amp;gt;TTY依存操作によるハングを防止する。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| opencode-shell-strategy || 非対話型シェルコマンドの指示を提供する。&amp;lt;br&amp;gt;TTY依存操作によるハングを防止する。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|| npmに未公開&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/center&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== プラグインのインストール方法 ====&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== プラグインのインストール方法 ====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;プラグインをインストールするには、&amp;lt;u&amp;gt;opencode.jsonファイル&amp;lt;/u&amp;gt; の &amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;plugin&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt; フィールドにパッケージ名を指定する。&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;プラグインをインストールするには、&amp;lt;u&amp;gt;opencode.jsonファイル&amp;lt;/u&amp;gt; の &amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;u&lt;/ins&gt;&amp;gt;plugin&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;u&lt;/ins&gt;&amp;gt; フィールドにパッケージ名を指定する。&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mochiu_wiki:diff:1.41:old-14493:rev-14494:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
	<entry>
		<id>https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=14493&amp;oldid=prev</id>
		<title>2026年2月26日 (木) 21:06にWikiによる</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=14493&amp;oldid=prev"/>
		<updated>2026-02-26T21:06:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;amp;diff=14493&amp;amp;oldid=14371&quot;&gt;差分を表示&lt;/a&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
	<entry>
		<id>https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=14371&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == OpenCodeのプラグインシステムは、TypeScript / JavaScriptで記述したソースコードをOpenCodeの動作に組み込み、独自の機能拡張を実現する仕組みである。&lt;br&gt; &lt;br&gt; プラグインはフック (hook) ベースのイベント駆動型アーキテクチャを採用しており、&lt;br&gt; セッションの開始・終了、ファイル操作、ツール実行、シェルコマンドの実行といった各種イベン…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=OpenCode%E3%81%AE%E8%A8%AD%E5%AE%9A_-_%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3&amp;diff=14371&amp;oldid=prev"/>
		<updated>2026-02-20T13:25:23Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == OpenCodeのプラグインシステムは、TypeScript / JavaScriptで記述したソースコードをOpenCodeの動作に組み込み、独自の機能拡張を実現する仕組みである。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; プラグインはフック (hook) ベースのイベント駆動型アーキテクチャを採用しており、&amp;lt;br&amp;gt; セッションの開始・終了、ファイル操作、ツール実行、シェルコマンドの実行といった各種イベン…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
OpenCodeのプラグインシステムは、TypeScript / JavaScriptで記述したソースコードをOpenCodeの動作に組み込み、独自の機能拡張を実現する仕組みである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
プラグインはフック (hook) ベースのイベント駆動型アーキテクチャを採用しており、&amp;lt;br&amp;gt;&lt;br /&gt;
セッションの開始・終了、ファイル操作、ツール実行、シェルコマンドの実行といった各種イベントに対して処理を追加できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
プラグインが提供する主な機能は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
* セッション管理の拡張&lt;br /&gt;
*: セッションの作成・削除・アイドル状態等のイベントに反応して処理を追加する。&lt;br /&gt;
* ツール実行の制御&lt;br /&gt;
*: ツール実行前後に検証・変換・ログ記録等の処理を挿入する。&lt;br /&gt;
* 環境変数の注入&lt;br /&gt;
*: シェル実行時にプロジェクト固有の環境変数を動的に追加する。&lt;br /&gt;
* カスタムツールの定義&lt;br /&gt;
*: LLMが呼び出せる独自のツールを作成し、OpenCodeの機能を拡張する。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
プラグインはプロジェクト固有 または グローバルに配置でき、OpenCode起動時に自動的に読み込まれる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== プラグインの基本構造 ==&lt;br /&gt;
プラグインは非同期関数として実装されており、コンテキストオブジェクトを引数として受け取り、フックオブジェクトを返す構造を持つ。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
基本的なプラグインの構造を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { Plugin } from &amp;quot;opencode/plugin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 export const MyPlugin: Plugin = async ({ client, project, $, directory }) =&amp;gt; {&lt;br /&gt;
    // 初期化処理をここに記述する&lt;br /&gt;
 &lt;br /&gt;
    return {&lt;br /&gt;
       &amp;quot;session.created&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          // セッション作成時の処理&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;tool.execute.before&amp;quot;: async ({ tool, args }) =&amp;gt; {&lt;br /&gt;
          // ツール実行前の処理&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
コンテキストはデストラクチャリングで受け取ることが重要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* 正しい記述方法&lt;br /&gt;
*: &amp;lt;code&amp;gt;async ({ client, project, $ }) =&amp;gt; { ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
* 誤った記述方法&lt;br /&gt;
*: &amp;lt;code&amp;gt;async (client, project, $) =&amp;gt; { ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== コンテキストオブジェクト ====&lt;br /&gt;
コンテキストオブジェクトには、プラグイン内で利用できる各種情報とAPIが含まれる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! プロパティ !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; || OpenCode SDKクライアント&amp;lt;br&amp;gt;ログ出力やAPI呼び出しに使用する。&amp;lt;br&amp;gt;例: &amp;lt;code&amp;gt;client.app.log(&amp;quot;info&amp;quot;, &amp;quot;メッセージ&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt; || プロジェクト情報&amp;lt;br&amp;gt;現在のプロジェクトのメタデータにアクセスできる。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || シェルコマンド実行用のAPI (BunのShell API)&amp;lt;br&amp;gt;プラグイン内からシェルコマンドを実行する時に使用する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;directory&amp;lt;/code&amp;gt; || 現在の作業ディレクトリのパス&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;worktree&amp;lt;/code&amp;gt; || ワークツリー情報&amp;lt;br&amp;gt;Gitのワークツリーに関する情報にアクセスできる。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt; || アプリケーション参照&amp;lt;br&amp;gt;OpenCodeアプリケーション全体への参照を提供する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== フックオブジェクト ====&lt;br /&gt;
フックオブジェクトは、プラグインが対応する各イベントとその処理関数をマッピングしたオブジェクトである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
フックオブジェクトの基本的な構造を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 return {&lt;br /&gt;
    // イベント名: 処理関数&lt;br /&gt;
    &amp;quot;session.created&amp;quot;: async ({ session }) =&amp;gt; { ... },&lt;br /&gt;
    &amp;quot;tool.execute.before&amp;quot;: async ({ tool, args }) =&amp;gt; { ... },&lt;br /&gt;
    &amp;quot;shell.env&amp;quot;: async ({ env }) =&amp;gt; { ... }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
フックの処理関数は非同期関数として定義して、イベントに応じたパラメータを受け取る。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
一部のフックでは、受け取ったパラメータを変更して返すことにより、OpenCodeの動作を変更できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構造 ==&lt;br /&gt;
プラグインは以下の2つの場所に配置できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* プロジェクト固有のプラグイン&lt;br /&gt;
*: &amp;lt;u&amp;gt;.opencode/plugins/&amp;lt;/u&amp;gt;&lt;br /&gt;
*: 特定のプロジェクトにのみ適用される。&lt;br /&gt;
* グローバルプラグイン&lt;br /&gt;
*: &amp;lt;u&amp;gt;~/.config/opencode/plugins/&amp;lt;/u&amp;gt;&lt;br /&gt;
*: 全てのプロジェクトで使用できる。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
OpenCode起動時に上記のディレクトリが自動的にスキャンされ、プラグインが読み込まれる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
npmパッケージとして配布されているプラグインは、&amp;lt;u&amp;gt;opencode.jsonファイル&amp;lt;/u&amp;gt; の &amp;lt;u&amp;gt;plugins&amp;lt;/u&amp;gt; フィールドに指定することで使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;plugins&amp;quot;: [&lt;br /&gt;
       &amp;quot;opencode-plugin-example&amp;quot;,&lt;br /&gt;
       &amp;quot;./local-plugin&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
プロジェクトにプラグインを追加する場合の推奨ディレクトリ構成を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # 例: QML/C++プロジェクト&lt;br /&gt;
&lt;br /&gt;
 .opencode/&lt;br /&gt;
 ├── plugins/&lt;br /&gt;
 │   ├── build-notify.ts       # CMakeビルド結果通知プラグイン&lt;br /&gt;
 │   ├── qml-hot-reload.ts     # QMLホットリロード検知プラグイン&lt;br /&gt;
 │   └── env-protection.ts     # 環境変数保護プラグイン&lt;br /&gt;
 └── package.json              # 依存関係の定義&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== プラグインの作成方法 ==&lt;br /&gt;
==== 基本的なプラグイン ====&lt;br /&gt;
最もシンプルなプラグインの例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すプラグインは、セッション作成時にログを出力するだけの基本的な実装である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* ファイルの配置場所の例&lt;br /&gt;
*: &amp;lt;u&amp;gt;.opencode/plugins/hello.ts&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { Plugin } from &amp;quot;opencode/plugin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 export const HelloPlugin: Plugin = async ({ client }) =&amp;gt; {&lt;br /&gt;
    client.app.log(&amp;quot;info&amp;quot;, &amp;quot;HelloPlugin: 読み込み完了&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
    return {&lt;br /&gt;
       &amp;quot;session.created&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          client.app.log(&amp;quot;info&amp;quot;, `新しいセッションが作成されました: ${session.id}`)&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;session.deleted&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          client.app.log(&amp;quot;info&amp;quot;, `セッションが削除されました: ${session.id}`)&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== TypeScript / JavaScriptモジュール ====&lt;br /&gt;
OpenCodeのプラグインは、TypeScript または JavaScriptで記述できる。&amp;lt;br&amp;gt;&lt;br /&gt;
TypeScriptを使用すると、型チェックによる安全性が向上するため推奨される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TypeScriptプラグインの例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { Plugin, tool } from &amp;quot;opencode/plugin&amp;quot;&lt;br /&gt;
 import { z } from &amp;quot;zod&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 export const FullExamplePlugin: Plugin = async ({ client, directory }) =&amp;gt; {&lt;br /&gt;
    // 初期化処理&lt;br /&gt;
    const startTime = Date.now()&lt;br /&gt;
    client.app.log(&amp;quot;info&amp;quot;, &amp;quot;プラグイン初期化中...&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
    return {&lt;br /&gt;
       &amp;quot;session.created&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          client.app.log(&amp;quot;info&amp;quot;, `セッション開始: ${session.id}`)&lt;br /&gt;
       },&lt;br /&gt;
 &lt;br /&gt;
       &amp;quot;session.idle&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          const elapsed = Date.now() - startTime&lt;br /&gt;
          client.app.log(&amp;quot;info&amp;quot;, `セッションがアイドル状態になりました (経過時間: ${elapsed}ms)`)&lt;br /&gt;
       },&lt;br /&gt;
 &lt;br /&gt;
       &amp;quot;session.deleted&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          // 状態のクリーンアップ&lt;br /&gt;
          client.app.log(&amp;quot;info&amp;quot;, `セッション終了: ${session.id}`)&lt;br /&gt;
       },&lt;br /&gt;
 &lt;br /&gt;
       &amp;quot;tool.execute.before&amp;quot;: async ({ tool, args }) =&amp;gt; {&lt;br /&gt;
          client.app.log(&amp;quot;debug&amp;quot;, `ツール実行前: ${tool.name}`)&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 利用可能なフック ==&lt;br /&gt;
==== セッションフック ====&lt;br /&gt;
セッションのライフサイクルに関連するフックである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ セッションフック一覧&lt;br /&gt;
! フック名 !! 説明 !! 用途&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session.created&amp;lt;/code&amp;gt; || セッションが新規作成された時 || 初期化処理、ログ記録&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session.updated&amp;lt;/code&amp;gt; || セッション情報が更新された時 || 状態の同期&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session.idle&amp;lt;/code&amp;gt; || セッションがアイドル状態になった時 || 通知送信、リソース解放&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session.deleted&amp;lt;/code&amp;gt; || セッションが削除された時 || クリーンアップ処理 (重要)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session.status&amp;lt;/code&amp;gt; || セッションのステータスが変化した時 || ステータス監視&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session.compacted&amp;lt;/code&amp;gt; || セッションがコンパクションされた時 || コンパクション後の処理&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;session.deleted&amp;lt;/code&amp;gt; フックでの状態クリーンアップは、メモリリーク防止のために特に重要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ファイルフック ====&lt;br /&gt;
メッセージとメッセージパーツに関連するフックである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ファイルフック一覧&lt;br /&gt;
! フック名 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;message.updated&amp;lt;/code&amp;gt; || メッセージが更新された時&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;message.removed&amp;lt;/code&amp;gt; || メッセージが削除された時&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;message.part.updated&amp;lt;/code&amp;gt; || メッセージパーツが更新された時&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;message.part.removed&amp;lt;/code&amp;gt; || メッセージパーツが削除された時&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ツールフック ====&lt;br /&gt;
ツールの実行に関連するフックである。&amp;lt;br&amp;gt;&lt;br /&gt;
ツールフックを使用すると、ツール実行前後に処理を追加したり、実行を制御したりできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ツールフック一覧&lt;br /&gt;
! フック !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tool.execute.before&amp;lt;/code&amp;gt; || ツール実行前に呼び出される。&amp;lt;br&amp;gt;入力値の検証や変更が可能である。&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; でツール実行を中断できる。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tool.execute.after&amp;lt;/code&amp;gt; || ツール実行後に呼び出される。&amp;lt;br&amp;gt;ツールの出力結果に対して後処理を行える。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ツールフックの使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;tool.execute.before&amp;quot;: async ({ tool, args }) =&amp;gt; {&lt;br /&gt;
    // 特定のツールの実行前に検証を行う&lt;br /&gt;
    if (tool.name === &amp;quot;bash&amp;quot; &amp;amp;&amp;amp; args.command.includes(&amp;quot;rm -rf&amp;quot;)) {&lt;br /&gt;
       throw new Error(&amp;quot;危険なコマンドの実行を拒否しました&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
 },&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;tool.execute.after&amp;quot;: async ({ tool, args, result }) =&amp;gt; {&lt;br /&gt;
    // ツール実行後にログを記録する&lt;br /&gt;
    client.app.log(&amp;quot;info&amp;quot;, `ツール実行完了: ${tool.name}`)&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== コマンドフック ====&lt;br /&gt;
LLMへのリクエストに関連するフックである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ LLMリクエスト関連フック&lt;br /&gt;
! フック !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chat.params&amp;lt;/code&amp;gt; || LLMに送信するパラメータを変更できる。温度設定やシステムプロンプトの動的変更に使用する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chat.message&amp;lt;/code&amp;gt; || LLMから受信したメッセージに対応する処理を行う。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== シェルフック ====&lt;br /&gt;
シェルコマンドの実行に関連するフックである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ LLMリクエスト関連フック&lt;br /&gt;
! フック !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chat.params&amp;lt;/code&amp;gt; || LLMに送信するパラメータを変更できる。&amp;lt;br&amp;gt;temperature設定やシステムプロンプトの動的変更に使用する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chat.message&amp;lt;/code&amp;gt; || LLMから受信したメッセージに対応する処理を行う。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;shell.env&amp;lt;/code&amp;gt; フックの使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;shell.env&amp;quot;: async ({ env }) =&amp;gt; {&lt;br /&gt;
    return {&lt;br /&gt;
       ...env,&lt;br /&gt;
       MY_PROJECT_API_URL: &amp;quot;https://api.example.com&amp;quot;,&lt;br /&gt;
       MY_PROJECT_ENV: &amp;quot;development&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== LSPフック ====&lt;br /&gt;
Language Server Protocol に関連するフックである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ LSP関連フック&lt;br /&gt;
! フック !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lsp.diagnostics&amp;lt;/code&amp;gt; || LSPの診断情報 (エラーや警告) が更新された時に呼び出される。&amp;lt;br&amp;gt;コード品質の監視や自動修正処理に使用する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
下表に、その他の主要なフックを示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ その他の主要なフック&lt;br /&gt;
! フック !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;permission.ask&amp;lt;/code&amp;gt; || 権限確認ダイアログが表示される前に呼び出される。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;permission.replied&amp;lt;/code&amp;gt; || 権限確認に対してユーザが返答した後に呼び出される。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;auth&amp;lt;/code&amp;gt; || カスタム認証プロバイダを実装する時に使用する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== カスタムツールの作成 ==&lt;br /&gt;
プラグインでは &amp;lt;code&amp;gt;tool()&amp;lt;/code&amp;gt; ヘルパー関数を使用してカスタムツールを定義できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
カスタムツールを定義すると、LLMがそのツールを呼び出してタスクを実行できるようになる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ツールの基本構造 ====&lt;br /&gt;
カスタムツールの基本構造を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { Plugin, tool } from &amp;quot;opencode/plugin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 export const CustomToolPlugin: Plugin = async ({ client }) =&amp;gt; {&lt;br /&gt;
    const myTool = tool({&lt;br /&gt;
       name: &amp;quot;my_custom_tool&amp;quot;,&lt;br /&gt;
       description: &amp;quot;このツールの説明。LLMがいつ使用するかを判断するために使用される。&amp;quot;,&lt;br /&gt;
       parameters: {&lt;br /&gt;
          input: tool.schema.string().describe(&amp;quot;処理する入力テキスト&amp;quot;),&lt;br /&gt;
          count: tool.schema.number().describe(&amp;quot;繰り返し回数&amp;quot;)&lt;br /&gt;
       },&lt;br /&gt;
       execute: async (args, context) =&amp;gt; {&lt;br /&gt;
          // ツールの処理を実装する&lt;br /&gt;
          const result = args.input.repeat(args.count)&lt;br /&gt;
          return { output: result }&lt;br /&gt;
       }&lt;br /&gt;
    })&lt;br /&gt;
 &lt;br /&gt;
    return {&lt;br /&gt;
       tools: [myTool]&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 引数スキーマ (Zod) ====&lt;br /&gt;
カスタムツールの引数スキーマはZodベースのヘルパーを使用して定義する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
利用可能なスキーマ型を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 引数スキーマ型一覧&lt;br /&gt;
! スキーマ型 !! 説明 !! 使用例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tool.schema.string()&amp;lt;/code&amp;gt; || 文字列型 || ファイルパス、テキスト入力&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tool.schema.number()&amp;lt;/code&amp;gt; || 数値型 || カウント、タイムアウト値&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tool.schema.boolean()&amp;lt;/code&amp;gt; || 真偽値型 || フラグ、スイッチ&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tool.schema.enum([...])&amp;lt;/code&amp;gt; || 列挙型 || 選択肢から1つを選ぶ引数&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tool.schema.optional(...)&amp;lt;/code&amp;gt; || 省略可能な型 || 必須でない引数をラップする&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
各スキーマ型に &amp;lt;code&amp;gt;.describe()&amp;lt;/code&amp;gt; を連結することで、LLMへの説明を追加できる。&amp;lt;br&amp;gt;&lt;br /&gt;
説明は詳細に記述するほど、LLMがツールを正しく使用しやすくなる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 parameters: {&lt;br /&gt;
    path: tool.schema.string().describe(&amp;quot;操作対象のファイルパス (絶対パスで指定)&amp;quot;),&lt;br /&gt;
    mode: tool.schema.enum([&amp;quot;read&amp;quot;, &amp;quot;write&amp;quot;, &amp;quot;append&amp;quot;]).describe(&amp;quot;ファイル操作のモード&amp;quot;),&lt;br /&gt;
    encoding: tool.schema.optional(tool.schema.string()).describe(&amp;quot;文字エンコーディング (省略時はUTF-8)&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 複数ツールのエクスポート ====&lt;br /&gt;
1つのプラグインから複数のカスタムツールをエクスポートするには、&amp;lt;code&amp;gt;tools&amp;lt;/code&amp;gt; フィールドに配列で指定する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 return {&lt;br /&gt;
    tools: [toolA, toolB, toolC]&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== コンテキストアクセス ====&lt;br /&gt;
&amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; 関数の第2引数 &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt; から、実行時の情報にアクセスできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ コンテキストプロパティ一覧&lt;br /&gt;
! プロパティ !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;context.sessionID&amp;lt;/code&amp;gt; || 現在のセッションID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;context.messageID&amp;lt;/code&amp;gt; || 現在のメッセージID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;context.directory&amp;lt;/code&amp;gt; || 現在の作業ディレクトリ&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;context.worktree&amp;lt;/code&amp;gt; || ワークツリー情報&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;context.agent&amp;lt;/code&amp;gt; || 実行中のエージェント情報&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;context.signal&amp;lt;/code&amp;gt; || キャンセル用のAbortSignal&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;context.signal&amp;lt;/code&amp;gt; を使用することにより、長時間処理の途中でキャンセルに対応できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== プラグインの実用例 ==&lt;br /&gt;
==== 環境変数保護 ====&lt;br /&gt;
機密ファイル (環境変数ファイル、認証情報ファイル等) へのアクセスを禁止するプラグインの実装例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* ファイルの配置場所の例&lt;br /&gt;
*: &amp;lt;u&amp;gt;.opencode/plugins/env-protection.ts&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { Plugin } from &amp;quot;opencode/plugin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 export const EnvProtection: Plugin = async ({ client }) =&amp;gt; {&lt;br /&gt;
    const sensitivePatterns = [/\.env/, /credentials/, /\.secret/]&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
       &amp;quot;tool.execute.before&amp;quot;: async ({ tool, args }) =&amp;gt; {&lt;br /&gt;
          if (tool.name === &amp;quot;read&amp;quot; &amp;amp;&amp;amp; sensitivePatterns.some(p =&amp;gt; p.test(args.path))) {&lt;br /&gt;
             throw new Error(&amp;quot;Access denied to sensitive files&amp;quot;)&lt;br /&gt;
          }&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
このプラグインは、&amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; ツールが機密ファイルにアクセスしようとした時に例外をスローして処理を中断する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== セッション通知 ====&lt;br /&gt;
セッションがアイドル状態になった時にログを出力するプラグインの実装例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
この例を応用することで、外部の通知サービスへの連携も実現できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* ファイルの配置場所の例&lt;br /&gt;
*: &amp;lt;u&amp;gt;.opencode/plugins/notification.ts&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { Plugin } from &amp;quot;opencode/plugin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 export const NotificationPlugin: Plugin = async ({ client }) =&amp;gt; {&lt;br /&gt;
    return {&lt;br /&gt;
       &amp;quot;session.idle&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          client.app.log(&amp;quot;info&amp;quot;, &amp;quot;Session completed&amp;quot;)&lt;br /&gt;
          // ここに外部通知サービスへのAPI呼び出し等を追加できる&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== カスタムツール定義 ====&lt;br /&gt;
プロジェクト固有のカスタムツールを定義するプラグインの実装例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
この例では、指定したファイルのメタデータ (行数、サイズ等) を取得するツールを定義している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* ファイルの配置場所の例&lt;br /&gt;
*: &amp;lt;u&amp;gt;.opencode/plugins/custom-tools.ts&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 import { Plugin, tool } from &amp;quot;opencode/plugin&amp;quot;&lt;br /&gt;
 import { stat, readFile } from &amp;quot;fs/promises&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 export const CustomToolsPlugin: Plugin = async ({ client }) =&amp;gt; {&lt;br /&gt;
    const fileInfoTool = tool({&lt;br /&gt;
       name: &amp;quot;get_file_info&amp;quot;,&lt;br /&gt;
       description: &amp;quot;指定したファイルのメタデータ (行数、ファイルサイズ等) を取得する&amp;quot;,&lt;br /&gt;
       parameters: {&lt;br /&gt;
          path: tool.schema.string().describe(&amp;quot;情報を取得するファイルのパス&amp;quot;)&lt;br /&gt;
       },&lt;br /&gt;
       execute: async (args, context) =&amp;gt; {&lt;br /&gt;
          const stats = await stat(args.path)&lt;br /&gt;
          const content = await readFile(args.path, &amp;quot;utf-8&amp;quot;)&lt;br /&gt;
          const lines = content.split(&amp;quot;\n&amp;quot;).length&lt;br /&gt;
&lt;br /&gt;
          return {&lt;br /&gt;
             size: stats.size,&lt;br /&gt;
             lines: lines,&lt;br /&gt;
             modified: stats.mtime.toISOString()&lt;br /&gt;
          }&lt;br /&gt;
       }&lt;br /&gt;
    })&lt;br /&gt;
 &lt;br /&gt;
    return {&lt;br /&gt;
       tools: [fileInfoTool]&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 依存関係の管理 ==&lt;br /&gt;
プラグインで外部npmパッケージを使用する場合は、&amp;lt;u&amp;gt;.opencode/package.jsonファイル&amp;lt;/u&amp;gt; に依存関係を定義する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;opencode-plugins&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;dependencies&amp;quot;: {&lt;br /&gt;
       &amp;quot;axios&amp;quot;: &amp;quot;^1.6.0&amp;quot;,&lt;br /&gt;
       &amp;quot;zod&amp;quot;: &amp;quot;^3.22.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;devDependencies&amp;quot;: {&lt;br /&gt;
       &amp;quot;typescript&amp;quot;: &amp;quot;^5.3.0&amp;quot;,&lt;br /&gt;
       &amp;quot;@types/node&amp;quot;: &amp;quot;^20.0.0&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
OpenCodeの起動時に &amp;lt;code&amp;gt;bun install&amp;lt;/code&amp;gt; コマンドが自動的に実行されるため、手動でインストールコマンドを実行する必要はない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
依存関係の管理に関する注意事項を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;package.jsonファイル&amp;lt;/u&amp;gt; は、必ず &amp;lt;u&amp;gt;.opencode/ディレクトリ&amp;lt;/u&amp;gt; に配置する。&lt;br /&gt;
*: プロジェクトルートの &amp;lt;u&amp;gt;package.jsonファイル&amp;lt;/u&amp;gt; とは別ファイルである。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* Bunが使用されるため、npm、yarn、pnpmとは異なる場合がある。&lt;br /&gt;
*: Bunに対応したパッケージを使用することを確認する。&lt;br /&gt;
* TypeScriptを使用する場合は、型定義パッケージ (&amp;lt;u&amp;gt;@types/*&amp;lt;/u&amp;gt;) も依存関係に含める。&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 推奨される事柄 ==&lt;br /&gt;
==== エラーハンドリング ====&lt;br /&gt;
プラグインのフック内では、適切なエラーハンドリングを実装する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;エラーが発生した場合でも、OpenCodeの動作が停止しないように注意する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;session.created&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
       await initializeSession(session.id)&lt;br /&gt;
    }&lt;br /&gt;
    catch (error) {&lt;br /&gt;
       client.app.log(&amp;quot;error&amp;quot;, `セッション初期化エラー: ${error}`)&lt;br /&gt;
       // エラーを再スローしないことで、OpenCodeの動作を継続させる&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== セッション削除時のクリーンアップ ====&lt;br /&gt;
セッションごとに状態を保持する場合は、&amp;lt;code&amp;gt;session.deleted&amp;lt;/code&amp;gt; フックで必ずクリーンアップを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
クリーンアップを怠るとメモリリークの原因となる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 export const StatefulPlugin: Plugin = async ({ client }) =&amp;gt; {&lt;br /&gt;
    const sessionState = new Map&amp;lt;string, any&amp;gt;()&lt;br /&gt;
 &lt;br /&gt;
    return {&lt;br /&gt;
       &amp;quot;session.created&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          sessionState.set(session.id, { startTime: Date.now() })&lt;br /&gt;
       },&lt;br /&gt;
       &amp;quot;session.deleted&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
          // 必ずクリーンアップする&lt;br /&gt;
          sessionState.delete(session.id)&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ログ出力 ====&lt;br /&gt;
プラグイン内のログ出力は &amp;lt;code&amp;gt;console.log()&amp;lt;/code&amp;gt; ではなく、&amp;lt;code&amp;gt;client.app.log()&amp;lt;/code&amp;gt; を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;client.app.log()&amp;lt;/code&amp;gt; を使用することにより、OpenCodeのログシステムと統合されて適切に管理される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 // 正しい方法&lt;br /&gt;
 client.app.log(&amp;quot;info&amp;quot;, &amp;quot;処理完了&amp;quot;)&lt;br /&gt;
 client.app.log(&amp;quot;error&amp;quot;, &amp;quot;エラーが発生しました&amp;quot;)&lt;br /&gt;
 client.app.log(&amp;quot;debug&amp;quot;, &amp;quot;デバッグ情報&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 // 避けるべき方法&lt;br /&gt;
 console.log(&amp;quot;処理完了&amp;quot;)&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== その他のベストプラクティス ====&lt;br /&gt;
* TypeScriptを使用して型安全性を確保する。&lt;br /&gt;
*: TypeScriptの型チェックにより、ランタイムエラーを事前に防止できる。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 公式フックのみを使用する。&lt;br /&gt;
*: 非公式・内部フックは将来のバージョンで変更される可能性がある。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 大規模なプラグインはモジュールに分割する。&lt;br /&gt;
*: 機能ごとにファイルを分割して保守性を高める。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* プラグインの初期化処理は軽量に保つ。&lt;br /&gt;
*: 起動時の重い処理はOpenCodeのレスポンス性に影響する可能性がある。&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
==== プラグインが読み込まれない場合 ====&lt;br /&gt;
プラグインが認識されない場合は、以下の項目を確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== 配置ディレクトリの確認 =====&lt;br /&gt;
プラグインファイルが正しいディレクトリに配置されているか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* プロジェクト固有&lt;br /&gt;
*: &amp;lt;u&amp;gt;.opencode/plugins/&amp;lt;/u&amp;gt;&lt;br /&gt;
* グローバル&lt;br /&gt;
*: &amp;lt;u&amp;gt;~/.config/opencode/plugins/&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== ファイル拡張子の確認 =====&lt;br /&gt;
プラグインファイルの拡張子が &amp;lt;u&amp;gt;.ts&amp;lt;/u&amp;gt; または &amp;lt;u&amp;gt;.js&amp;lt;/u&amp;gt; であることを確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
他の拡張子のファイルは自動読み込みの対象外である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== ログレベルの設定 =====&lt;br /&gt;
OpenCodeのログレベルを &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt; に設定することにより、詳細な読み込み情報を確認できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
 OPENCODE_LOG_LEVEL=DEBUG opencode&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== メモリリークが発生する場合 ====&lt;br /&gt;
セッション削除時のクリーンアップが実装されているか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;session.deleted&amp;lt;/code&amp;gt; フック内で、セッションに紐付いた全ての状態を削除しているか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;session.deleted&amp;quot;: async ({ session }) =&amp;gt; {&lt;br /&gt;
    // Map、Set、その他のデータ構造からセッションのデータを削除する&lt;br /&gt;
    mySessionData.delete(session.id)&lt;br /&gt;
    myCache.delete(session.id)&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 依存関係の問題が発生する場合 ====&lt;br /&gt;
外部パッケージが見つからないエラーが発生した場合は、以下を確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;package.jsonファイル&amp;lt;/u&amp;gt; が &amp;lt;u&amp;gt;.opencode/ディレクトリ&amp;lt;/u&amp;gt; に配置されているか確認する。&lt;br /&gt;
*: プロジェクトルートではなく、&amp;lt;code&amp;gt;.opencode/&amp;lt;/code&amp;gt; 直下に配置する必要がある。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bun install&amp;lt;/code&amp;gt; が正常に実行されたか確認する。&lt;br /&gt;
*: 手動で &amp;lt;code&amp;gt;bun install&amp;lt;/code&amp;gt; を実行して、エラーメッセージを確認する。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 cd .opencode &amp;amp;&amp;amp; bun install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== プラグインの処理が期待通りに動作しない場合 ====&lt;br /&gt;
* デストラクチャリングの記述方法を確認する。&lt;br /&gt;
*: コンテキストは単一パラメータとしてデストラクチャリングする必要がある。&lt;br /&gt;
*: 正しい記述方法: &amp;lt;code&amp;gt;async ({ client, project }) =&amp;gt; { ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* フック名のスペルミスを確認する。&lt;br /&gt;
*: フック名が誤っていると処理が呼び出されない。&lt;br /&gt;
*: 公式ドキュメントでフック名を確認する。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; の使用状況を確認する。&lt;br /&gt;
*: &amp;lt;code&amp;gt;tool.execute.before&amp;lt;/code&amp;gt; で例外をスローした場合、ツールの実行が中断される。&lt;br /&gt;
*: 意図しない &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; がないか確認する。&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参考リンク ==&lt;br /&gt;
* [https://opencode.ai/docs OpenCode公式ドキュメント]&lt;br /&gt;
* [https://opencode.ai/docs/plugins OpenCode公式ドキュメント - Plugins]&lt;br /&gt;
* [https://github.com/opencode-ai/opencode OpenCode GitHubリポジトリ]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,OpenCode,Plugin,TypeScript,JavaScript,Hook,Tool,AI,Development,Programming,SUSE,Linux&lt;br /&gt;
|description={{PAGENAME}} - OpenCodeのプラグインシステムに関する設定・実装ガイド | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:設定]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>