ルール設定ファイルの場所
CC Safety Net は 2 つのスコープからルールブックをロードし、それらをマージします。- ユーザー スコープ—
~/.cc-safety-net/rules/rule.json(rule init --global) で作成されました。これは、すべてのプロジェクトに適用される個人的なデフォルトとして使用します。 - プロジェクト スコープ— プロジェクト ルートの
.cc-safety-net/rules/rule.json。これを、ソース管理にコミットできるチームまたはプロジェクト固有のルールに使用します。
project-rules のような裸の名前で参照されます。 GitHub ルールブック ソースは owner/repo#ref/<rulebook-name> を使用し、そのリポジトリ内の .cc-safety-net/rules/<rulebook-name>/rulebook.json を指します。
スコープのマージ動作
- 両方のスコープのルールブックが、最初にユーザー スコープで結合されます。
- **重複したアクティブなルールブック名は最初の要求によって解決されます。**ユーザー スコープが最初にロードされるため、要求される名前は同じ名前のプロジェクト ルールブックをシャドウします。後のルールブックは最初のルールを部分的に影付けするのではなく、まったくルールを提供しません。衝突は警告として報告され、ランタイムが
degraded状態になります。いずれかの名前を変更してrule syncを実行します。衝突は致命的ではなく解決されたため、一方のスコープのrule syncは、もう一方のスコープがすでに使用している名前でも引き続き成功します。 - **各スコープの
overridesは、そのスコープ独自のルールに適用されます。**ユーザー スコープのルールを指定するプロジェクト オーバーライドは警告とともに無視され、ルールはユーザー構成の状態を維持します。プロジェクト構成はユーザー ルールを無効にしたり書き換えたりすることはできません。 - 既知のルールに一致しないオーバーライド キーは無視され、警告が表示されます。他のオーバーライドとルールは、構成された状態を維持します。
- 両方のスコープの
transparent_wrappersが結合されます。
ルールブックソースの管理
ルールブックのソースは、rule.json の rules 配列内のエントリによって参照されます。次の 2 種類があります。
- ローカル ソース—
project-rulesのような裸の名前。ルールブックは.cc-safety-net/rules/project-rules/rulebook.json(project) または~/.cc-safety-net/rules/project-rules/rulebook.json(user) にあります。ローカル ソースは、config ディレクトリ内に存在する必要があります。 - GitHub source—
owner/repo#ref/<rulebook-name>、そのリポジトリと ref 内の.cc-safety-net/rules/<rulebook-name>/rulebook.jsonを指します。
rule.json とロックファイルを手動で編集するのではなく、rule コマンドを使用してソースを追加、更新、削除します。
--global (-g) を追加して、プロジェクト スコープではなくユーザー スコープで動作します。すべての rule サブコマンド、そのオプション、およびその終了動作については、CLI コマンド を参照してください。
リソース制限
rules 配列は、スコープごとに最大64ソースを保持します。より多くのエントリを持つ rule.json は、単一エラー Rule config exceeds CC Safety Net's safe source limit. で検証に失敗します。サイズ超過の配列はエントリごとに項目化されず、他の無効な rule.json と同様に scope 全体の設定が active runtime snapshot から drop されます。
rule sync は固定バジェットの下で実行されます。最大で4ソースを同時に処理し、1 回の実行で最大131GitHub リクエストを作成し、すべてのソースにわたって最大64 MiBの応答バイトを読み取ります。予算を超過すると、Rule synchronization exceeds CC Safety Net's safe resource limits. で実行が停止されます。
ロックとキャッシュ
構成されたすべてのソースは、SHA-256 ダイジェストによってrule.lock ファイルに固定され、そのルールブックは .cc-safety-net/cache/rulebooks/ の下にキャッシュされます。実行時に、CC Safety Net はキャッシュされたルールブックをダイジェストと照合して検証しますが、検証中は何も書き込んだり、取得したり、キャッシュしたりすることはありません。
検証が失敗したときに何が起こるかは、どちらの側が壊れているかによって異なります。
- ロックファイルの欠落、ロックエントリの欠落、キャッシュエントリの欠落、ダイジェストの不一致、または解析不可能なキャッシュされたルールブックがある場合、その source を active runtime snapshot から drop します。
rule syncを実行するまで、ルールは提供されません。他のすべての検証済み source とすべての組み込み保護は適用され続け、通常のコマンドは実行され続けます。drop された source は、作業をブロックするのではなく、runtime をdegradedにします。 - ピン留めされたダイジェストからドリフトするlocal ソース (ディスク上で欠落しているもの、解析できないもの、またはスキーマが無効なものを含む) は、障害状態ではありません。ランタイムはダイジェスト検証されたcachedルールブックのみを読み取り、ローカル コピーを再読み取りすることはありません。保留中のローカル編集は、
rule syncを実行するまでアクティブになりません。完全なrule syncおよびrule verifyは、無効なローカル ソースまたはシンボリックリンクされたローカル ソースを拒否します。
Transparent wrapper
チームがrtk などのラッパーを介してコマンドを実行する場合、分析では、その下のコマンドではなく、デフォルトでラッパーが参照されます。 transparent_wrappers にラッパーをリストすると、CC Safety Net はそれを参照して、表示されている保護された子コマンドを参照できるようになります。そのため、組み込みの分析とカスタム ルールの両方が、裸のコマンドとまったく同じように rtk git reset --hard と rtk docker system prune に適用されます。
rule.json を手動で編集するのではなく、rule wrapper サブコマンドを使用してラッパーを構成します。
- **組み込みのデフォルトはありません。**意図的に信頼するラッパーのみを構成します。
- ラッパー名は
^[a-zA-Z][a-zA-Z0-9_-]*$と一致し、ファイル内で一意である必要があります。 - 予約されたコマンドをラッパーにすることはできません:
git、busybox、分析された組み込みコマンドrm、find、xargs、およびparallel、すべてのシェル ラッパー、すべてのインタープリター、および awk インタープリター。 - unwrap は、wrapper flag と
VAR=valueassignment の後にある最初の protectable child command、または明示的な--の直後にある token を見つけます。child 自体が protectable でない場合は unwrap しません。 - ここに記載されていない wrapper、または表示される child を exec せず、child command を書き換えるか隠す wrapper は unwrap しません。このようなコマンドを検出できる可能性があるのは、top-level の dangerous-text fallback scan だけです。
最初のカスタム ルールを作成する
スターター プロジェクト ルール構成を作成します。.cc-safety-net/rules/rule.json が作成されます — ルールブック ソースはまだ構成されていません。
--example を追加して、非アクティブなサンプル ルールブックも .cc-safety-net/rules/example-rules/rulebook.json に記述します。これは、そのファイルがまだ存在しておらず、rule init がそのファイルを参照していない場合にのみ書き込まれるため、アクティブにするためにソースとして追加する必要があります。
.cc-safety-net/rules/project-rules/rulebook.json を作成し、npx -y cc-safety-net rule add project-rules に登録します。これにより、rule.json は次のようになります。
rule sync は編集されたルールブックをアクティブにします。次に、rule verify はアクティブな構成をチェックします。
これで、git add -A、git add --all、および git add . がカスタム メッセージでブロックされます。
rule.json スキーマ
最上位の rule.json は、アクティブなルールブックを選択し、オーバーライドを適用し、透明なラッパーを宣言します。これは、安全レベル、組み込みの保護、パスの許可と拒否、監査保持を構成する policy.json とは別のものです。このファイルについては、Policy を参照してください。
integer
必須
スキーマのバージョン。
1 である必要があります。array
rulebook source string の一覧です。既定値は空の配列です。source name はファイル内で一意である必要があり、最大 64 個の source を指定できます。リソース制限を参照してください。
object
<rulebook-name>/<rule-name> をキーとするルールの上書き。値は、ルールを無効にする "off"、またはルールのブロック メッセージを置き換えるオブジェクトのいずれかです。オブジェクト フォームには reason が必要で、オプションの intent を受け入れます。 intent を省略すると、ルール自体の意図は変更されません。array
表示される protected child command を透過的に実行する command name です。analysis はこれらを通して child を確認します。既定値は空の配列です。項目は一意で、reserved command ではない必要があります。Transparent wrapperを参照してください。
rule.json エディタのサポート
CC Safety Net は、ランタイムが検証するのと同じスキーマから生成された、rule.json の JSON スキーマを公開します。完成と検証のためにエディターにそれを指示します。
rule.json フィールド (version、rules、overrides、および transparent_wrappers) を正確にカバーしています。 rule verify を実行すると、この $schema 参照が不足している有効なルール構成に追加されます。 policy.json の公開されたスキーマはありません。
ルールブックのスキーマ
各ルールブックは独自のrulebook.json ファイル内に存在します。
integer
必須
ルールブックのスキーマのバージョン。
1 である必要があります。string
必須
ルールブック名。ローカル ディレクトリ名または GitHub ソース名と一致する必要があります。
string
必須
ルールブックのバージョン文字列。
string
人間が読めるルールブックの説明。
string
ルールブックの著者。
array
必須
このルールブックでルールを定義できるコマンド。
array
必須
カスタムブロックルールです。ルール schemaを参照してください。
array
任意の rulebook fixture です。Fixture schemaを参照してください。fixture は意図する動作を文書化します。CC Safety Net は形式を検証しますが、実行しません。
ルールスキーマ
string
必須
ルールブック内でユニーク。文字で始まり、その後に文字、数字、ハイフン、またはアンダースコアが続く必要があります。最大64文字。
string
必須
一致する基本コマンド。
allowed_commands にリストされている必要があります。string
照合するサブコマンド (例:
add または install)。省略した場合は、任意のサブコマンドと一致します。array
必須
ブロックをトリガーする引数です。1 つ以上必要です。
string
必須
ブロックされたときに表示されるメッセージ。最大 256 文字。
string
ブロック メッセージ フッターに追加されるエージェントの動作の意図。
hard_stop、use_alternative、scope_down、manual_only、または stop_and_explain のいずれか。デフォルトは manual_only です。フィクスチャスキーマ
フィクスチャは、意図された動作のオプションのドキュメントです。形状検証のみが行われます。 CC Safety Net はそれらを実行しません。string
必須
シェルコマンドフィクスチャ。
string
必須
blocked または allowed のいずれか。string
ルールはコマンドをブロックすることが予期されています。ブロックされたフィクスチャに必要です。
マッチング動作
CC Safety Net は次の一致ルールを使用します。- コマンドの正規化: コマンドは照合する前にベース名に変換されます。
/usr/local/bin/npmは、ルールが"command": "npm"と一致します。 - サブコマンド検出: サブコマンドは、コマンドに続く最初の非オプション引数です。
git --no-pager add -Aのサブコマンドはaddです。 - 引数の一致:
block_argsの引数は文字通り一致します。正規表現やグロブはサポートされていません。 - Short option の展開:
-Apのようにまとめられた short flag は、照合前に分割されます。-Apは-Aと-pとして扱われます。 - Long option の照合:long option は exact string match を使います。
--all-filesは--allに一致しません。 - 任意の引数一致:
block_argsに単一の引数が存在する場合、コマンドはブロックされます。 - 追加のみ: カスタム ルールは新しい制限を追加することしかできません。組み込みの保護機能をバイパスすることはできません。
既知の制限事項:
-Cfoo は、-C foo ではなく、-C -f -o -o として扱われます。 -f をブロックすると、添付されたオプション値で誤検知が発生する可能性があります。例
npm の global install をブロックする
npm の global install をブロックする
エージェントがパッケージをグローバルにインストールできないようにします。
危険な docker コマンドをブロックする
危険な docker コマンドをブロックする
ブロック
docker system prune:1 つの rulebook に複数のルールを定義する
1 つの rulebook に複数のルールを定義する
ブロックメッセージの形式
ブロック結果の形式では、block message の完全な layout を説明します。custom rule は rulebook name と rule name を含む prefix を追加するため、どの rulebook が block を生成したかを確認できます。<rulebook-name>/<rule-name> です。これは、ルール ("off") を無効にするか、その理由を置き換えるために rule.json overrides で使用するキーでもあります。
ルールブックを検証する
ルールブックを作成または編集した後、次の方法でルールブックを検証します。rule syncは、設定されたルールブック ソースのロックとキャッシュを再構築します。rule verifyは、構成、ロックとキャッシュの状態、ローカル ルールブック、および共有可能な GitHub ソース ルールブック ディレクトリをチェックします。リモートコンテンツは取得しません。
レガシー構成を移行する
従来のインライン構成ファイル (.safety-net.json および ~/.cc-safety-net/config.json) は実行時にロードされなくなりました。
従来のルールは古い場所から強制されることはなく、作業をブロックすることもありません。ランタイムはレガシー ファイルをまったく検査しないため、ガードタイムには何も表示されません。
npx -y cc-safety-net rule verify は、残っているレガシー ファイルについて警告します。アップグレード後に実行してください。
rule migrate はルールブックベースのレイアウトを自動的に作成します。
無効なカスタムルール構成
検証できない custom rule 設定は active runtime snapshot から drop され、適用されず、それ自体が拒否に変換されることもありません。通常のコマンドは実行を続け、他のすべての検証済み source は強制を続け、すべての組み込み保護も引き続き適用されます。runtime はdegraded を報告するため、状況を確認できます。
drop された source は拒否を追加せず、以前に提供していた拒否が active runtime snapshot から外れるため、この種類の failure 自体が friction を発生させることはありません。npx cc-safety-net status は負荷が低い日常的な check です。完全な failure-to-fallback matrix、diagnostic string、reporting surface、repair sequence については、設定の復旧を参照してください。