ワークフロー&基本ツール · daymade/claude-code-skills

openclaw

OpenClaw(龙虾/ロブスター)インスタンス設定を管理します。ユーザーが openclaw.json ファイルの監査(audit)、差分比較(diff)、コピー(copy)、モデル追加(add-model)、一覧表示(list)、モデル切り替え(switch)を行いたい場合、またはロブスター(lobsters)、虾、甲虾、乙虾、DeepSeekパッチ、デフォルトモデル、モデルエイリアス、OpenClaw設定バリデーションについて言及した際に使用します。

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author daymadeGitHub daymade/claude-code-skills ↗Stars 1392License MIT(仓库根 LICENSE 文件;GitHub API spdx MIT;Copyright (c) 2025 daymade)Commit d5c4678cb5
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

統合エントリポイントは純粋な argparse 転送レイヤーです。cli.py は SUBCOMMANDS 辞書を用いて audit/compare/diff/copy/add-model/list/switch を各サブモジュールの main() にマッピングしており、`diff` は単なる `compare` のエイリアスで独自のビジネスロジックは持ちません。

openclaw/scripts/cli.py
SUBCOMMANDS = { "audit": audit, "compare": compare, "diff": compare, "copy": copy_provider,
処理内容:「6つのサブコマンド」をそれぞれ独立して実行可能なスクリプトに分割し、薄い転送レイヤーを介して複数コマンドの操作体験を統合しています。SKILL.md にも記載されている通り、各サブコマンドは cli.py を介さず直接実行可能(python3 scripts/audit.py ...)であり、エージェントが読み取り専用シナリオでオンデマンドに呼び出すのに便利です。

設定ファイルの特定は「明示的パス → ニックネームレジストリ → 3つのデフォルトパス」の3段階フォールバックであり、デフォルトパスの優先順位は DEFAULT_CONFIG_PATHS にハードコードされています。

openclaw/scripts/openclaw_config.py
DEFAULT_CONFIG_PATHS = [ Path.home() / "workspace" / ".force" / "openclaw" / "openclaw.json", Path.home() / ".kimi_openclaw" / "openclaw.json", Path.home() / ".openclaw" / "openclaw.json", ]
処理内容:単一のインストール場所を前提とせず、「プライベートワークスペース → 旧Kimiパス → 公式パス」の優先順で最初に存在するファイルを取得します。すべて存在しない場合は ConfigError を発生させ、候補となる3つのパスをすべて出力してユーザーに提示します。

複数インスタンスの抽象化は lobsters.json ニックネームレジストリに基づいています。まず Path で引数が実在するファイルかを判定し、ファイルでない場合にレジストリ内で nickname→path のマッピングを検索します。

openclaw/scripts/openclaw_config.py
registry = load_lobster_registry() if str(name_or_path) in registry: return Path(registry[str(name_or_path)])
処理内容:`--config 甲虾` や `--from 乙虾` のような人間にとってわかりやすいニックネームを直接利用可能にします。その代償として、レジストリファイル内のパス値は検証なしで Path() に渡されます(security.injection_surface を参照)。

すべての書き込み操作には自動バックアップが付属し、保持上限が存在します。<設定ディレクトリ>/config-backups/<stem>-<UTCタイムスタンプ>.json に書き込み、その後 mtime 順で20件を超える古いバックアップを削除します。

openclaw/scripts/openclaw_config.py
ts = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S") backup_path = backup_dir / f"{p.stem}-{ts}{p.suffix}" shutil.copy2(p, backup_path)
処理内容:「誤った変更からのロールバック」を標準機能として提供します。UTCタイムスタンプを用いてタイムゾーンの曖昧さを排除し、shutil.copy2 でファイルのメタデータごと複製します。同ファイル内の `for old in existing[:-max_backups]: old.unlink()` がプルーニングを担い、ディレクトリの肥大化を防ぐ唯一の仕組みとなっています。

デフォルトモデルの変更時は既存の構造を保持します。agents.defaults.model がもともとオブジェクトであれば primary のみを変更し、文字列であれば文字列として書き込みます。元の記述形式を強制的に正規化することはありません。

openclaw/scripts/openclaw_config.py
if isinstance(current, dict): defaults["model"] = {**current, "primary": ref} else: defaults["model"] = ref
処理内容:OpenClaw の設定では model に2種類の形式が許容されています。直接 model["primary"] を参照すると文字列形式の場合に TypeError/KeyError が発生します。ここでは形式に適応させており、これが openclaw と openclaw-model-switch における堅牢性の決定的な違いです。

変更系サブコマンドはデフォルトで「変更前診断 + エラー発生時の中止 + 変更後再診断」を実施し、`--no-audit` が指定された場合のみスキップします。これが自動監査(auto-audit)ガードレールです。

openclaw/scripts/switch_model.py
if any(i["level"] == "error" for i in issues): print("Aborting due to audit errors. Use --no-audit to skip.", file=sys.stderr) return 2
処理内容:audit.py をソフトな事前ゲートとして機能させます。設定内に構造的エラー(baseUrl/api の欠落、存在しない provider を指すデフォルトモデルなど)がある限り書き込みを拒否し、すでに破損している設定への重ね書きを防止します。

copy は「上書き」ではなく「マージ」です。baseUrl/api および同名モデルの定義のみを同期し、コピー先固有のモデルは削除されません。

openclaw/scripts/copy_provider.py
for key in ("baseUrl", "api"):
処理内容:インスタンス間で provider を移行する際、移行先設定に存在する追加モデルやエイリアスを保持する必要があります。そうしないと copy 1回で設定が暗黙的に失われてしまいます。merge_provider の docstring にも「does not remove target-only models」と明記されています。

ゲートウェイの再起動には3段階のフォールバックを使用します。まず `openclaw gateway restart` を試行し、失敗した場合は `systemctl --user restart`、さらにシステムレベルの `systemctl restart` へとフォールバックします。3段階すべて失敗しても警告を出力するのみで例外は送出されません。

openclaw/scripts/openclaw_config.py
commands = [ ["openclaw", "gateway", "restart"], ["systemctl", "--user", "restart", "openclaw-gateway"], ["systemctl", "restart", "openclaw-gateway"], ]
処理内容:「PATH上のCLI / ユーザーレベル systemd / システムレベル systemd」の3つの導入形態に適応します。subprocess.run には argv リストが渡されるため(shell=True なし)、設定内容からコマンドが注入されることはありませんが、3つ目の候補はシステムレベルのサービス再起動をトリガーする可能性があります。

現場でのトラブルシューティング経験を実行可能なアサーションとして定着化:audit には DeepSeek アンチパターンのヒューリスティックが含まれ、provider 名が deepseek で始まる場合に警告を出し、正しいパス(gateway provider + deepseek-v4-pro)を案内します。

openclaw/scripts/audit.py
if pname.lower().startswith("deepseek"):
処理内容:SKILL.md の「Critical pitfalls」でこの経験を文章化し、audit.py でコード検証として実装し、references/deepseek_patch_sop.md で詳細な SOP を記述することで、「ドキュメント → バリデータ → 作業手順書」のクローズドループを形成しています。

2コア機能

01設定ファイルの健全性診断(audit):providers/baseUrl/api、重複モデルID、モデルエントリの型、デフォルトモデルとエイリアスの解決可否、plugins の allow/entries/installs の整合性
022つのインスタンス間のセマンティック差分(diff):providers/models/default model/aliases/plugins ごとに差異をレポート。cost フィールドはデフォルトで除外(--include-cost で比較対象)
03インスタンス間での provider コピーとマージ(--model で指定モデルのみの移行、--alias でエイリアスを含む移行に対応)
04add-model:ソース設定または JSON ファイルからモデル定義を取り込み、必要に応じて provider も同時に複製し、エイリアスを自動補完
05list:人間向けの可読リスト表示 / jq 用の --json 出力。--validate でデフォルトモデルやエイリアスの解決可能性を同時に検証
06switch:agents.defaults.model を変更する唯一のサブコマンド(変更前に provider/model の存在を検証)
07dry-run プレビュー:3つの書き込みコマンド(copy/add-model/switch)すべてで、ディスクへの書き込みを行わずに変更内容のみを出力可能
08マルチインスタンスのニックネーム解決:lobsters.json に登録された日本語・中国語などのニックネームを --config/--from/--to で指定可能

3外部依存関係

KindDependency / Endpoint
cliopenclaw CLI(gateway restart)
clisystemctl(用户级/系统级服务重启回退)
packagePython 3 标准库 only(json/os/shutil/subprocess/argparse/pathlib;无第三方依赖)
networkOpenClaw provider baseUrl(仅写在配置里被审计/搬运,skill 自身从不发请求)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: python3 scripts/cli.py <audit|diff|copy|add-model|list|switch>(または対応するサブスクリプトを直接実行)
  • 环境变量 / API Key: ベンダーサービスAPIキーの読み取り: openclaw.json 内の models.providers.*.apiKey: 設定ファイル全体とともにメモリに読み込まれ書き戻される(スクリプトがこのフィールドを明示的に抽出することはありません); copy/
  • 本地工作目录: ファイルの読み書きおよび成果物の出力: <設定ディレクトリ>/config-backups/<stem>-<UTCタイムスタンプ>.json(書き込み操作の直前に毎回バックアップ)
監査ノート: リスク評価:青(Blue)、ローカル設定ツールの制御された書き込みレベル。理由:①サブプロセスを実行する(openclaw/systemctl によるゲートウェイ再起動、第3段階はシステムレベルのサービス)、②ユーザーの openclaw.json をその場で上書きし、保持上限を超えた古いバックアップを削除する、③models.providers.*.apiKey を読み取りファイル間で移行する。ただし、プロセス全体で外部へのネットワーク送信は一切なく、環境変数やキーチェーンからの認証情報取得もなく、サードパーティ依存関係も皆無です。さらに書き込み操作はデフォルトで自動 audit ゲートと変更前バックアップによって保護されています。留意点として、`--config <任意パス>` と `--no-audit` の組み合わせ、apiKey が provider ブロックごと対象設定にコピーされる点(SOP 自体でも注意喚起あり)、バックアップディレクトリのパーミッションが明示的に制限されていない点が挙げられます。

5二重目の独立検証

  • [ok] SKILL.md 声明「Backups: every write operation copies the config to config-backups/<stem>-<utc-timestamp>.json」是否与代码一致 — 三条写路径 copy_provider.py / add_model.py / switch_model.py 都在 save_config 之前调用 backup_config(config_path),且 openclaw_config.backup_config 用 datetime.now(timezone.utc) 生成时间戳、文件名格式恰为 f"{p.stem}-{ts}{p.suffix}";SKILL.md 关于「keeps the 20 most recent backups」也对得上 max_backups: int = 20 默认值与 existing[:-max_backups] 裁剪。
  • [ok] SKILL.md 声明「switch 是唯一改 agents.defaults.model 的子命令」 — grep set_default_model 的调用点只有 switch_model.py 一处;add_model.py 只写 agents.defaults.models(别名映射),copy_provider.py 只写 models.providers 与别名,compare/list/audit 纯只读,声明成立。
  • [ok] SKILL.md「Restart: write subcommands support --restart to restart the OpenClaw gateway after saving」 — 三个写脚本都定义了 --restart 并调用 restart_gateway();且未给 --restart 时会打印「NOTE: You must restart the OpenClaw gateway...」提示,行为与文档一致。副产物确认:restart_gateway 的第三档是系统级 systemctl(无 --user),文档未提及这一越权风险,已写进 verdict.risks。
  • [ok] external_deps 里是否漏掉了网络调用(有没有隐藏的 endpoint probe 或遥测) — 反向扫描 scripts/ 全部 8 文件:无 import urllib/requests/socket/httpx,无 curl/wget 字符串,无任何 URL 常量。openclaw 与 openclaw-model-switch 的关键差异(后者文档要求 curl 探针)在此得到对照确认。network 依赖项仅保留「配置里存在 baseUrl 字段」这一事实,并显式标注 skill 自身不请求。
  • [ok] 是否读 env 里的 API key / 密钥 — scripts/ 内 os.environ、getenv 零命中;openclaw_config.py 里 import os 的唯一用途是 os.path.getmtime 做备份排序。凭证面仅为「随配置整份读写的 apiKey 字段」与「copy/add-model 把 provider 块连同 apiKey 深拷贝到目标配置」,已在 security.credential_reads 如实登记而非留空。
  • [ok] 「copy 不删目标独有模型」是否为真(找反例:有没有静默覆盖整个 provider 的分支) — 反例检查通过:当目标已有该 provider 时走 merge_provider(只按 id 增补/更新、且注释明确 does not remove target-only models),不整块替换;唯一整体替换发生在「目标根本没有该 provider」时(copy.deepcopy(source_provider)),此时不存在目标独有模型可丢。--alias 分支只做 target_aliases[ref] = deepcopy(detail) 的增补,也不删。
  • [discrepancy] 备份保留逻辑会不会误删非备份文件 — 发现第一遍未记的边界:裁剪用 backup_dir.glob(f"{p.stem}-*{p.suffix}") 匹配,若用户在 config-backups/ 目录里放了同名模式的其它文件(例如手工备份 openclaw-手工.json,而 stem 恰为 openclaw),mtime 最旧的会被 unlink。属真实但低概率的删除面,已补进 verdict.risks。
  • [ok] 功能声明 vs 实际能力夸大检查(SKILL.md / README 有没有说到做不到的事) — SKILL.md 的六子命令、昵称注册表、三级默认路径、备份与 20 份上限、dry-run、restart、自动 audit 全部可在代码中一一落到实处,未发现夸大。唯一「文档比代码多说一句」的是 references/deepseek_patch_sop.md 的示例命令 `add-model gateway-provider references/deepseek_model.json`(相对路径需从 skill 根执行),属示例语境问题而非能力夸大。

6結論

  • 書き込みパスにおけるデフォルトの安全ガードレール:変更前後の自動 audit、エラー時の即時中止、書き込み前のバックアップ(最大20世代保持)により、設定破損時の復旧コストを単一の cp コマンド相当に抑制
  • マルチインスタンス操作の明快な抽象化:1つの lobsters.json により「甲虾/乙虾」のような通称をアドレス指定可能な設定パスに変換し、6つのサブコマンドすべてで同一の解決ロジックを共有
  • ノウハウを実行可能なアサーションとしてコード化:audit で「独自 deepseek provider の作成」に直接警告を発し、SKILL.md および SOP で正しいパス(gateway provider + deepseek-v4-pro、[1m] なし)を提示
  • コンパクトで透明性の高い実装:Python 標準ライブラリのみで構成、ネットワーク通信ゼロ、サードパーティ依存ゼロ。唯一の外部プロセスコールも argv リスト渡し(shell=True なし)のため監査コストが極めて低い
  • 破壊的変更の事前プレビュー:copy/add-model/switch のすべてで --dry-run に対応しており、add-model の dry-run では次に実行すべき switch コマンドも表示
  • 最適な用途: 複数の「龙虾/ロブスター」(複数の OpenClaw インスタンスまたはラッパー)を並行して管理しているユーザーに最適です。2つの openclaw.json の差異を横断比較したい、特定の provider(例: gateway-provider の DeepSeek)を別のマシンに同期したい、新規インスタンスにモデルやエイリアスを一括追加したい、あるいは「甲虾では動くのに乙虾では動かない理由」をトラブルシューティングしたいケースに適しています。また、DeepSeek パッチの適用作業にも最適であり、SOP + モデル定義 JSON + audit アサーションの3点セットに守られ、各手順を dry-run でプレビューできます。AI エージェントにとって最も安全な運用フローは「audit → diff → copy/add-model --dry-run → 本番実行 → audit」です。
    不向きな用途: 単一インスタンスで、デフォルトモデルを1回変更して終了するようなシナリオには不向きです(その用途には1コマンドで完了し audit/diff/copy の理解も不要な openclaw-model-switch の方が適しています)。ローカルファイルシステムへの書き込み権限がない環境や、設定がリモートまたは読み取り専用マウント上に配置されている環境には適しません(すべての操作はローカルで直接インプレース書き換えされます)。また、「設定変更後、モデルが実際に呼び出し可能かを直ちに検証したい」シナリオにも適していません。openclaw は設定構造の管理とオプションのサービス再起動のみを扱い、エンドポイントの疎通テストや E2E の推論検証は含まれません(これらは openclaw-model-switch の Step 2/Step 4 の守備範囲です)。さらに、すでに破損している設定を修復する目的で --no-audit を指定してゲートをバイパスすることは推奨されません。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload openclaw.tar.gz
    sha256: c792eb95fa4dde39…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit d5c4678cb5.