Skip to content

DSL 構文リファレンス

ccchain はインデントベースのテキスト DSL を使用します。

文法

# コメント(# で始まる行)

# トップレベルルール
<action> <command>[, command2, ...] ["メッセージ"]
  # コンテキスト修飾子(インデントで子要素)
  |,>>
    <action> <command>[, command2, ...] ["メッセージ"]
  exec:
    <action> <command>[, command2, ...] ["メッセージ"]
  args:
    <パターン>: <action>
  # プロパティ
  mode: block | warn | hint  # 非推奨: パースされるが評価に影響しない。warn/hint アクションを直接使用
  message: "..."
  next: <テンプレート名>

# テンプレート定義
template <名前>
  extends: <親テンプレート>
  # ルールと同じ構造

# Hook セクション
preToolUse
  # PreToolUse 用ルール群
postToolUse
  # PostToolUse 用ルール群

# 設定
settings:
  max_context_depth: <整数>
  max_rules_per_cmd: <整数>
  fallback: <action>

アクション

アクション意味
allowコマンドを許可
denyコマンドをブロック(exit 2 + メッセージを Claude に通知)
warn許可するが Claude に警告を送信
askClaude Code の標準パーミッションダイアログに委譲
hintPostToolUse: 次のアクションを Claude に提案

コンテキスト修飾子

|,>>

パイプ先またはリダイレクト先として現れるコマンドに適用するルール:

allow find
  |,>>
    allow grep, sort
    deny rm  "find と rm をパイプで繋がないでください"

| のみ(パイプ限定)、>> のみ(リダイレクト限定)も指定可能。

exec:

-execxargsbash -c 等でネストされたコマンドに適用するルール:

allow find
  exec:
    deny rm  "一時ファイルに展開してください"
    allow cp, mv

args:

コマンド引数に対するパターンベースのルール(正規表現):

allow curl
  args:
    -X GET: allow
    -X POST: ask

パターンは Go の正規表現で、引数を結合した文字列strings.Join(args, " "))に対してマッチします。

注意事項:

  • デフォルトは部分マッチ。完全一致には ^$ アンカーを使用
  • 引数に動的展開($VAR, `cmd`)が含まれる場合、args: 評価はスキップされ親ルールのアクションが使用される
  • 複数の args: パターンがマッチした場合は last-rule-wins
  • args: ルールがマッチすると親ルールのアクションを上書きする

テンプレート

定義

template <名前>
  |,>>
    <ルール群>
  exec:
    <ルール群>

継承

template child
  extends: parent    # parent の全ルールを継承
  |,>>
    allow extra-cmd  # 追加ルール

委譲

allow find
  next: bulkExec    # bulkExec のパイプ/exec ルールを使用

設定

settings:
  max_context_depth: 2    # audit 展開の最大深度
  max_rules_per_cmd: 5    # audit でのコマンドあたりルール数上限
  fallback: ask           # マッチしないコマンドのデフォルト動作
  workspace: ~/workspace  # ワークスペーススコープ(カンマ区切りで複数指定可)

複数コマンドの一行記法

カンマ区切りで同じルールを共有:

allow cat, echo, head, tail, wc

メッセージ

コマンドの後にクォートされた文字列で deny/warn メッセージを指定:

deny rm  "trash コマンドを使ってください"
deny eval  "eval は静的解析できません"

インデント

  • スペース(2 または 4)またはタブを使用
  • タブは 4 スペースとして扱う
  • ブロック内のインデントは統一すること
  • 深いインデント = 上の行の子要素

Released under the MIT License.