DeepSeek Harness: プラグインインストールと設定読み込み順序
最終更新:2026-08-31
「プラグインを書く」から「プラグインを使う」へ——このレッスンではプラグインのインストールと設定管理の実践に焦点を当てます。4つのインストール方法がすべてのシナリオをカバーし、設定読み込み優先度が「ローカル優先」を保証し、ホットパッチが本番環境の緊急変更を安全かつコントロール可能にします。
--dump-config ——プラグインが実際に最終設定に現れることを確認することです。「プラグインが効かない」問題の多くは、設定優先度の間違いです。
📋 前提知識:12-local-plugin.md と 26-bundle-profile.md の完了
1. 学習内容
- npm プラグインインストール
- GitHub リポジトリ直接インストール
- tarball インストール
- 設定読み込み優先度
- cordis.patch.yml ホットパッチ
- プラグイン競合解決
2. npm プラグインインストール
▶ サンプル 1:
# 最新版をインストール
pnpm add @dsh-plugin/database
# 特定バージョンをインストール
pnpm add @dsh-plugin/database@1.2.0
# devDependency としてインストール
pnpm add -D @dsh-plugin/debug-tools
(2) インストール後の登録
npm でインストールしたプラグインは cordis.yml に登録が必要:
# cordis.yml
plugins:
'@dsh-plugin/database':
config:
connection:'postgresql://localhost/mydb'
(3) dsh plugin add の使用
DSH はより便利なインストールコマンドを提供:
# インストールして自動登録
dsh plugin add @dsh-plugin/database
# 設定付きでインストール
dsh plugin add @dsh-plugin/database --config.connection='postgresql://localhost/mydb'
# インストール出力
📦 Installing @dsh-plugin/database@1.2.0...
✅ Plugin installed and registered!
▶ サンプル 4:
// package.json
{
"dependencies":{
"@dsh-plugin/database":"^1.2.0",
"@dsh-plugin/redis":"~2.1.0"
}
}
| 記号 | 意味 | 更新範囲 |
|---|---|---|
^1.2.0 |
1.x 互換 | 1.2.0 ~ 1.9.9 |
~2.1.0 |
2.1.x 互換 | 2.1.0 ~ 2.1.9 |
1.2.0 |
正確なバージョン | 1.2.0 のみ |
3. GitHub リポジトリ直接インストール
(1) インストール方法
# デフォルトブランチをインストール
pnpm add github:alice/dsh-plugin-redis
# 特定ブランチをインストール
pnpm add github:alice/dsh-plugin-redis#feature/cluster
# 特定タグをインストール
pnpm add github:alice/dsh-plugin-redis#v2.1.0
# 特定コミットをインストール
pnpm add github:alice/dsh-plugin-redis#abc1234
(2) dsh plugin add の使用
dsh plugin add github:alice/dsh-plugin-redis
(3) GitHub インストールの注意点
| 注意点 | 説明 |
|---|---|
| Git が必要 | マシンに Git がインストールされていること |
| リポジトリ構造 | 有効な Node.js パッケージであること(package.json がある) |
| ビルドステップ | リポジトリが先にビルドが必要な場合がある |
| ネットワーク | GitHub へのアクセスが必要 |
| バージョンロック | ブランチ名よりコミットハッシュを推奨 |
(4) package.json での表記
{
"dependencies":{
"@dsh-plugin/redis":"github:alice/dsh-plugin-redis#v2.1.0"
}
}
4. tarball インストール
(1) URL からインストール
# リモート tarball からインストール
pnpm add https://example.com/dsh-plugin-custom-1.0.0.tgz
# ローカル tarball からインストール
pnpm add ./packages/dsh-plugin-custom-1.0.0.tgz
(2) npm pack で tarball を作成
# プラグインプロジェクト内
cd dsh-plugin-my-tool
npm pack
# 生成:dsh-plugin-my-tool-1.0.0.tgz
# DSH プロジェクト内
pnpm add ../dsh-plugin-my-tool/dsh-plugin-my-tool-1.0.0.tgz
(3) tarball のユースケース
| シナリオ | 説明 |
|---|---|
| プライベートプラグイン | npm に公開せず、tgz を直接配布 |
| オフラインインストール | npm や GitHub にアクセスできない環境 |
| CI/CD | ビルド成果物を直接インストール |
| プレリリーステスト | 候補バージョンをテスト用にインストール |
(4) 3つのインストール方法の比較
| 方法 | コマンド | ネットワーク | バージョン管理 | 最適な用途 |
|---|---|---|---|---|
| npm | pnpm add @dsh-plugin/xxx |
npm レジストリ | ✅ semver | 公開プラグイン |
| GitHub | pnpm add github:user/repo |
GitHub | ⚠️ branch/tag | 開発中プラグイン |
| tarball | pnpm add ./xxx.tgz |
なし | ❌ 手動 | プライベート/オフライン |
5. 設定読み込み優先度
(1) 5つの優先レイヤー
graph TB
L5["Layer 5:CLI パラメータ<br/>(最優先)"]
L4["Layer 4:cordis.patch.yml"]
L3["Layer 3:プロジェクト cordis.yml"]
L2["Layer 2:Profile 設定"]
L1["Layer 1:Bundle デフォルト<br/>(最低優先)"]
L5 --> L4 --> L3 --> L2 --> L1
▶ サンプル 2:
Bundle デフォルト: plugins:[core, llm, tools], port:5173
Profile (web): plugins:[+web-ui]
プロジェクト設定: plugins:[+my-tool], port:8080
Patch: plugins:[+debug-tools], debug:true
CLI: port:3000
最終結果: plugins:[core, llm, tools, web-ui, my-tool, debug-tools]
port:3000, debug:true
(3) 同名プラグインの処理
複数レイヤーで同じプラグイン名が登録された場合、優先度の高いレイヤーが低いものを上書き:
Bundle: llm → deepseek-adapter
プロジェクト設定: llm → openai-adapter(上書き)
Patch: llm → custom-adapter(さらに上書き)
最終:llm → custom-adapter
(4) 読み込み順序の確認
pnpm dsh web --patch --dump-config
出力には各設定値のソースレイヤーがマークされます。
6. cordis.patch.yml ホットパッチ
(1) ホットパッチの目的
ホットパッチはベース設定を変更せずに一時的に設定を調整:
# cordis.patch.yml
plugins:
debug-tools:
$insert:./dev-plugins/debug-tools
llm:
config:
debug:true
(2) ホットパッチの有効化
# --patch を追加してパッチファイルをロード
pnpm dsh web --patch
(3) 本番環境ホットパッチ
本番で緊急問題に遭遇した場合、パッチで迅速修正:
# cordis.patch.prod.yml — 問題のあるプラグインを緊急無効化
plugins:
problematic-plugin:
enabled:false
llm:
config:
maxRetries:5 # 一時的にリトライ回数を増やす
(4) ホットパッチのロールバック
# ホットパッチを適用
cp cordis.patch.prod.yml cordis.patch.yml
pnpm dsh web --patch
# ホットパッチをロールバック(パッチファイルを削除)
rm cordis.patch.yml
pnpm dsh web
(5) ホットパッチと Git
# .gitignore
cordis.patch.yml # 現在のパッチを除外
cordis.patch.prod.yml # 本番パッチを除外
# cordis.patch.dev.yml # 開発パッチはコミット(チーム共有)
7. プラグイン競合解決
(1) 一般的な競合タイプ
| 競合タイプ | 表れ方 | 原因 |
|---|---|---|
| 同名ツール | 後の登録が前を上書き | 2つのプラグインが同じツール名を登録 |
| 同名サービス | 後の登録が前を上書き | 2つの Provider が同じサービス名を登録 |
| 設定競合 | 設定値が反映されない | 優先レイヤーの間違い |
| バージョン非互換 | 実行時エラー | プラグインバージョンが DSH コアと非互換 |
(2) 同名ツール競合
Plugin A:register tool 'search'
Plugin B:register tool 'search'
→ 最終:Plugin B の search が有効
解決策:
# 片方を無効化
plugins:
plugin-a:
config:
tools:
disabled:['search']
または Realm 分離を使用。
(3) 設定競合のトラブルシューティング
# 1. 最終設定を確認
pnpm dsh web --patch --dump-config > dump.yml
# 2. 競合する設定項目を検索
grep "my-plugin" dump.yml
# 3. パッチで上書きされていないか確認
diff cordis.yml cordis.patch.yml
(4) バージョン互換性
# プラグインの互換性を確認
dsh plugin check @dsh-plugin/database
# 出力
✅ @dsh-plugin/database@1.2.0 is compatible with dsh@0.5.0
⚠️ Requires:dsh >= 0.4.0
(5) 競合解決の判定ツリー
graph TD
CONFLICT{競合タイプ?}
CONFLICT -->|同名ツール/サービス| SCOPE{両方必要?}
SCOPE -->|いいえ| DISABLE[片方を無効化]
SCOPE -->|はい| REALM[Realm で分離]
CONFLICT -->|設定が反映されない| DUMP[--dump-config で調査]
DUMP --> FIX[設定優先度を修正]
CONFLICT -->|バージョン非互換| UPDATE[プラグインバージョンを更新]
UPDATE --> CHECK[互換性を確認]
❓ よくある質問
.npmrc を設定:text @dsh-plugin:registry=https://my-registry.com/ cordis.patch.yml 1つのみサポート。複数パッチが必要な場合は1ファイルにマージしてください。bash dsh plugin list # または pnpm list | grep dsh-plugin pnpm-error.log で詳細なエラー情報を確認。bash # 1. cordis.yml からプラグインエントリを削除 # 2. npm パッケージをアンインストール pnpm remove @dsh-plugin/database # 3. DSH を再起動 📖 まとめ
- 4つのインストール方法:npm(標準)、GitHub(開発中)、tarball(プライベート/オフライン)、ローカルパス(開発)
- 設定5層優先度:Bundle → Profile → Project → Patch → CLI
--dump-configが設定問題のトラブルシューティングの中核ツール- cordis.patch.yml で一時オーバーライド;
--patchで有効化 - プラグイン競合は無効化、Realm 分離、優先度調整で解決
- バージョン互換性は
dsh plugin checkで確認
📝 練習問題
1. ⭐ 基礎:コミュニティプラグインを npm からインストールし(例:@dsh-plugin/database)、cordis.yml に登録・設定し、--dump-config で設定が反映されていることを確認。
2. ⭐⭐ 応用:cordis.patch.yml を作成し、patch レイヤーでプラグイン設定をオーバーライドしてください(例:LLM のデフォルトモデルを変更)。--dump-config でパッチあり/なしの設定差分を比較。
3. ⭐⭐⭐ チャレンジ:プラグイン競合シナリオをシミュレーション——同名ツールを登録する2つのプラグインをインストールし、後のものが前を上書きすることを観察。その後、Realm 分離で両プラグインが独立したツール空間を持つように設定。