policy は、ポリシー提案を検査して適用します。ポリシー提案とは、適用したいポリシー設定を書いた JSON ファイルです。policy check は提案を検証し、適用した場合の変更を出力します。policy apply はターミナルで確認した後に提案を書き込みます。これを実行できるのは人だけです。
policy のサブコマンドとオプション
policy が書き込むファイル
policy は、プロジェクトの .cc-safety-net/policy.json に書き込みます。--global を付けると、代わりにユーザーポリシーファイルに書き込みます。
--global を付けない場合、どちらのサブコマンドも、ユーザーの .cc-safety-net/ があるディレクトリでは実行を拒否します。ユーザー設定ディレクトリはプロジェクトではないためです。このとき次のエラーを出力して 1 で終了します。
policy の差分レポート
どちらのサブコマンドも、apply が書き込む前に同じレポートを出力します。
--global を付けると、1 行目は Scope: user (<path>) になります。変更がない場合、差分は No changes. の 1 行だけです。片側に値がない箇所は (unset) と表示されます。check は差分を出力した時点で終了し、終了コードは 0 です。
プロジェクトスコープの差分が比較するもの
プロジェクトスコープでは、変更前と変更後の実効ポリシーを比較します。実効ポリシーはユーザーポリシーとプロジェクトのファイルをマージしたものです。そのため差分には、ファイル自体の内容ではなく、セッションが実際に動作するレベルが表示されます。safety.level を含まない提案は、ユーザーポリシーから継承したレベルに戻します。ユーザースコープでは、ユーザーポリシーファイル自体を比較し、Effective policy の見出しは出力しません。
policy のエラー
不明なオプションやサブコマンド、ファイルの指定漏れ、余分な引数があると、差分を出力する前に標準エラー出力へエラーを書き出して1 で終了します。監査ログの設定はユーザースコープ専用のため、audit セクションを含むプロジェクト向けの提案も失敗します。
policy apply でポリシーを適用する
apply は、標準入力と標準出力の両方が対話型のターミナルであることを要求します。そうでない場合は、自分で実行するためのコマンドを出力して 1 で終了します。--global を付けていれば、出力されるコマンドにも付きます。
apply は Apply this policy to <path>? [y/N] と確認します。
- 確認とみなされるのは、大文字と小文字を問わず
yまたはyesだけです。確認して適用するとファイルを書き込み、Policy applied: <path>を出力して0で終了します。 - それ以外の回答や入力の終端(EOF)は拒否として扱われます。拒否した場合は
Cancelled; nothing was written.を出力して0で終了します。
エージェントは policy apply を実行できない
エージェントがpolicy apply を実行すると、CC Safety Net は固定 ID guard.policy-apply でブロックします。policy check は許可されたままなので、エージェントは提案を作成し、その差分をユーザーに示せます。エージェントによる cc-safety-net policy apply を参照してください。