ふくふくHukuhuku LLC
EP.101Toolbox 11分公開:

Shellfirm 0.4.1でAIの危険コマンドを事前チェック:誤検知の修正、Claude Code連携と導入時の注意

AIの強制pushや削除操作を実行前に確認するShellfirm。0.4.0のポリシー強制と0.4.1の誤検知修正を、Macでの判定テスト付きで解説。終了コードの変更、フックの再接続、防げない操作まで整理します。

#AIエージェント#Claude Code#開発ツール#オープンソース
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア

AIに「危険な操作はしないで」と伝えても、実行するコマンドの確認まで任せきりにはできません。Shellfirmは、端末やAIエージェントから出るコマンドを実行前に検査するオープンソースのツールです。たとえばGitの強制pushについて、危険度、影響、代わりの操作を示し、人間には確認を、エージェントには拒否などの判定を返します。

先に知っておくこと:サンドボックスの代わりにはならない

Shellfirmが調べるのは、主に実行前のコマンドや対応するツール入力です。起動したプログラムの内部動作をすべて監視する仕組みではありません。スクリプト内部や実行時に組み立てられる処理には検知できないものがあります。権限の制限、隔離環境、復元できるバックアップも併用してください。

確認日は2026年10月29日。GitHubの公開時刻は0.4.0が10月28日22:58:49 JST、0.4.1が10月29日16:14:50 JSTです。製品自体の新規登場ではなく、既存ツールの更新を扱います。本稿は0.4.1の配布バイナリと版固定の公式資料で確認しています。

今回の更新で何が変わったか

版主な差分現場で意味がある点
0.4.0プロジェクト・組織ポリシーの強制、エージェントフックの拡張、判定と終了コードの見直し個人設定で弱められないルールを共有しやすくなる。既存CIや連携設定の移行が必要
0.4.1キャッシュ削除や通常のGit操作などの誤検知を削減。検知パターンも追加日常作業で不要な警告を減らしつつ、危険な条件は引き続き検査する

0.4.1では、相対パスで指定するnode_modulesや一部の生成キャッシュ、git worktree addなどの通常操作を見直しています。ただし、絶対パス、変数、途中のシンボリックリンク、sudoなど、条件が違えば同じ扱いにはなりません。誤検知を減らすための限定的な修正であり、「削除コマンドをすべて安全とみなす」変更ではありません。詳細は変更履歴を参照してください。

0.4.0で変わったもう一つの点は、Claude Codeの安全と判定されたコマンドを、フック側が自動承認しなくなったことです。危険なものを止めたうえで、非該当のものはClaude Code自身の権限判定に委ねます。補助ツールが、元からある確認手順を飛ばさない設計になっています。

「人に確認する」と「AIを止める」は別の動作

使う場所何をするか注意点
人間の対話型ターミナルシェルフックで入力を検査し、計算問題・Enter・yesなどの確認を出す危険度や実行状況で確認が厳しくなる。denyルールは確認で通せない
Claude CodeなどのAIエージェントエージェント用フックでツール実行の直前に判定を返す対話シェル用フックを入れただけでは、AIの実行経路を保護したことにならない
MCP危険性や代替案を問い合わせる道具として利用するAIが必要なときに呼ぶ相談機能と、自動で毎回検査するフックは役割が違う
CI・自作スクリプトcheckのJSONや終了コードで処理を分岐する非ゼロ終了の扱いを実装しないと、レポートを出すだけで通過してしまう

フックとは、決まったタイミングで別の処理を呼ぶ仕組みです。Shellfirmは実行の直前に検査を挟みます。MCPはAIから外部の道具を呼ぶための接続方式で、この製品ではcheck_commandやexplain_riskなどを提供します。基本のルール判定に別のLLM契約は不要です。LLMによる追加分析は実験機能で、設定・有効化が必要な別の経路です。公式README

Macで確認:コマンドを実行せず判定だけ試す

ふくふくではApple SiliconのMacで公式0.4.1バイナリを使い、一時的なGitリポジトリと専用設定ディレクトリで試しました。checkに--no-contextを付け、検査に伴う外部プログラムの呼び出しも抑えています。入力した削除・push・rebase自体は実行していません。

検査した文字列decision終了コード読み方
git status --shortallow0この条件では危険なルールに該当しない
git push --force origin maindeny11強制pushを拒否と判定
git rebase -i HEAD~3ask10人間の確認が必要と判定
rm -rf node_modulesallow0相対パスの依存関係フォルダをこの条件では許可
chmod 600 .envallow0所有者だけに権限を絞る指定はこの条件では許可

node_modulesには確認用のファイルを置き、検査後も残っていることを確認しました。また、git:force_pushをdenyするプロジェクトポリシーを検証し、模擬のClaude Codeフック入力に対してpermissionDecision: denyが返ることも確認しています。実際のClaude Codeセッションや対話シェルを通した一連の運用は未検証です。速度、誤検知率、事故防止率を測った試験でもありません。

-cの後は検査する文字列。引用符を外して実コマンドとして実行しないでください。
Bash
shellfirm --versionshellfirm check --no-context -c 'git status --short' --format json --exit-codeshellfirm check --no-context -c 'git push --force origin main' --format json --exit-code

別の一時ディレクトリでの追試では、同じnode_modules削除文字列がask・10になることも確認しました。再現教材の合否判定はGit関連の3ケースに絞っています。同じコマンドでも、設定、現在のブランチ、対象パス、組織ポリシーで結果が変わります。--no-contextも完全な状況無視ではなく、ユーザーID、環境変数、.git/HEADなどは参照されます。結果が表と違う場合はmatched_rules、decision_reason、policy_sourcesを読み、まず違いの原因を調べてください。checkの仕様

導入条件:無料のCLIだが、シェルごとの対応差がある

ライセンスはApache-2.0です。公式リリースにはLinuxとmacOSのx86_64・aarch64、Windowsのx86_64向け配布物があります。npm、Homebrew、Cargoからの導入方法も案内されています。日本語で書いた開発指示に組み込めますが、検査対象はシェルコマンドで、メッセージは主に英語です。今回、日本語UIの提供は確認していません。配布物・ライセンス

シェル0.4.1公式資料の説明
Bash / Zsh / Fish / Elvish / Xonsh開発元が一連の動作をテスト済み。ただし関数や動的生成処理に固有の制限あり
Nushell組み込みrmやmvなどは確認をキャンセルしても止められない。警告として扱う
PowerShell / Oilsフックは配布されているが、開発元の一連の動作テストは未実施

Windows用バイナリがあることと、あらゆるPowerShell操作が確実に止まることは別です。OS名だけで選ばず、普段使うシェルとAI側の実行ツールをセットで確かめましょう。

まず検査を試し、その後にフックを接続する

  1. 1公式リリースまたは案内されたパッケージ管理方法で導入し、shellfirm --versionを確認する。この記事の再現対象は0.4.1。
  2. 2作業用の一時ディレクトリでcheckを試す。自動判定用の小さな教材は下のリンクから取得できる。
  3. 3人が打つ端末に適用するならshellfirm init --dry-runで変更予定を確認し、対象シェルのinitを実行して端末を開き直す。
  4. 4Claude Codeを使うならshellfirm connect claude-codeでエージェント用フックとMCPを接続し、セッションを再起動する。既存設定の差分とバックアップも確認する。
  5. 5shellfirm statusとshellfirm doctorで、導入ファイルがあるだけでなく実際の経路を確認する。隔離した検証用プロジェクトで拒否されるケースと通常作業が通るケースを両方試す。
initとconnectは設定を変更します。全コマンドの一括貼り付けではなく、使う経路だけ選んで順に確認します。
Bash
# Node.js / npmが利用できる場合の、版を固定した導入例npm install -g @shellfirm/cli@0.4.1
# 対話型のZshに接続する場合shellfirm init --dry-runshellfirm init zsh# 新しいターミナルを開いた後shellfirm statusshellfirm doctor
# Claude Codeの実行前チェックを接続する場合shellfirm connect claude-code

Claude Code連携は、Shellfirmの公式変更履歴で2.1.295未満の場合に別オプションが必要とされています。古いクライアントではfail-closed(検査が正常に終わらなければ通さない仕組み)の条件も変わるため、対応版へ更新できるかを先に確認してください。Cursorの連携もありますが、開発元は同じfail-closed状態とは扱っていません。各製品の連携設定を同一視しないことが大切です。

チームでは「お願い」を共有ポリシーにする

たとえば「AIや担当者がmainへ強制pushしない」という方針を、リポジトリ直下の.shellfirm.yamlに記録できます。下の例はブランチに限定せず、ルールgit:force_pushに該当する操作を拒否します。意図より広く止めないか、導入前にチームで確認してください。

.shellfirm.yamlの最小例。今回、この形式をpolicy validate --strictで確認しました。
YAML
version: 1deny:  - git:force_push
Bash
shellfirm policy validate --strictshellfirm policy show

0.4.0以降は、ポリシー側の拒否や強化した条件を個人のignoreなどで弱められません。組織の基準は/etc/shellfirm/policy.yamlなどにも置けます。ただし、そのファイル自体を書き換えられる権限まで消えるわけではありません。組織用ファイルの所有権・書き込み権限も管理し、変更はレビュー対象にします。チームポリシー仕様

0.3.10からの更新は、バイナリ交換だけで終わらない

  • 開いているシェルを再起動する。Elvish・Xonsh・Nushellはinitを再実行し、旧式フックから更新する。
  • 接続済みAIごとにconnectを再実行する。旧フックのままでは、新しいファイルツール検査などが有効にならない。
  • CIの「終了コードが2なら危険」という条件を修正する。0.4系のcheck --exit-codeはaskが10、denyが11。2は使い方のエラー。
  • JSONを読む処理はschema_version: 2とdecision: allow / ask / denyに対応する。レポートの出力先は標準出力になった。
  • 保存済み設定のenabled_groupsに新グループが含まれないことがある。statusが示す未有効グループを読み、意図して無効にしたものと区別して有効化する。

CIでは「2だけ拒否」より、検査に成功しなかったら処理を止める設計が基本です。ただし--hookモードはJSONで判定を返す専用プロトコルで、正常に拒否結果を返した場合でも通常の終了コードは0です。checkの終了コードとフックの終了コードを混同しないでください。移行手順

教材:実コマンドを動かさず、許可・確認・拒否を確かめる

判定テスト用Python教材をダウンロード。Python 3、GitとShellfirm 0.4.1を使います。専用の一時ディレクトリを作り、コマンドを文字列としてcheckに渡すだけです。削除、push、rebaseは実行せず、普段のシェルやClaude Code設定も変更しません。

引数には、取得・確認済みのShellfirm実行ファイルを指定します。
Bash
python3 shellfirm-check-lab.py /path/to/shellfirm

教材はallow・ask・denyと0・10・11の対応を表示し、結果が期待と違えば異常終了します。環境に組織ポリシーがあると結果が変わる場合があります。そのときは制限を外すのではなく、出力された理由を確認してください。教材の成功は、この少数の入力に対する判定確認であり、実際のエージェント連携全体の保証ではありません。

LLMに導入を手伝わせるための日本語指示文

既存設定を保ちながら、実行経路を確認する
この開発環境へのShellfirm導入案を作ってください。
1. OS・シェル・AIエージェントの版と、既存のフック・権限設定を読み取りで確認する。秘密情報は表示しない。
2. Shellfirm 0.4.1の公式資料と照合し、対応する経路、非対応や未検証の経路、設定変更の差分を示す。
3. 最初は隔離した一時プロジェクトでcheckだけを使い、許可・確認・拒否を確認する。危険コマンドそのものを実行しない。
4. 接続設定の適用前に変更案を提示する。既存の保護設定を削除・弱体化しない。
5. 適用後はstatus・doctorと、検証用プロジェクトでフックの動作を確かめる。未検証の経路は明記する。
6. 警告を消すためだけにignoreや権限緩和を追加しない。誤検知の場合は理由と限定的な修正案を示す。

導入判断:小さく試し、止まった理由を読める運用に

Shellfirmは、AIに大きな権限を渡す前に、よくある危険操作を目に見える形で検査したいチームに向いています。まず検査だけを試し、次に少人数の開発環境でフックを接続し、正当な作業がどれだけ止まるかを記録すると判断しやすくなります。

一方、外部スクリプトの内部、一般的な秘密情報の送信、APIを通じた削除など、検知しきれない経路も公式READMEに記載されています。allowは「この検査で該当しなかった」という意味です。隔離環境や最小限の権限を残し、復旧方法まで用意したうえで、実行前の確認を増やす道具として使いましょう。関連するClaude Code連載も参考になります。

よくある質問

Shellfirmを入れればAIの誤操作をすべて防げますか?
いいえ。コマンドや対応ツールの入力を実行前に検査する仕組みで、起動したスクリプトの内部など検知できない経路があります。権限制限、隔離環境、バックアップを併用します。
LLMのAPI契約が必要ですか?
基本のルール判定に別のLLM契約は不要です。追加のLLM分析は設定と有効化が必要な実験機能で、今回の検証では使っていません。
0.3.10から更新するときの注意点は?
シェル再起動やAI連携の再接続に加え、CIの終了コード判定を修正します。check --exit-codeはaskが10、denyが11、2は使い方のエラーです。
Macで実際に試しましたか?
Apple SiliconのMacで0.4.1のcheckと模擬フック入力を確認しました。危険コマンドは実行せず、実際のClaude Codeセッションや対話シェル連携全体は未検証です。
シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp