gh apiのうち、GETなものはAIに許可したい

したいよね?

なんかアンアンちゃんと私の自我がむこうで混ざっている気がする……。

Claude Codesettings.jsongh apiをallowに入れたかったが、オプション次第で GET / POST が切り替わる。
gh api get みたいに分かれていたら、このサブコマンドを許可するだけでいいのに、そういう風にはなってないから、GETなのに毎回許可を求められてしまってめんどくさい……。

なんとかする方法無い? ラッパを書けば良かったりする? とclaudeに聞いたところ、PreToolUse hookを使うのが妥当なのでは? との返答を受けた
コマンドをparseし、write系オプションを含むときだけ exit 2 で deny すると良いらしい。
exit 2 でdenyするとstderrの理由が Claude 側に返り、permission promptに降りる とのこと。

弾く対象:
-X / --method で POST/PUT/PATCH/DELETE (-XPOST のような attached form も含む)
-f / -F / --field / --raw-field (gh が暗黙に POST する。-ftitle=foo のような attached form も)
--input (file/stdin から body を読むため POST 相当)

このスプリプトも書いてもらって、別のセッションで「こんなの用意したけど、抜けあったりする?」とか聞いて漏れがないかどうかなどを確認させた。
まだあるじゃん とか思った人はおしえてください……。
$(gh api ...) みたいにサブコマンドで実行したり、 gh をフルパスで叩いたりしたらこのhook効かんくない? とは言われたけど、それはsettings.jsonの方でallowしてるわけじゃないからそもそもパーミッション確認出るんじゃない? と思ったので一旦無視。
なんでもpythonで書かれるんやねえ(rubyで書いてもらおうかとも思ったけど、AIがそう選ぶなら……)。

この状態で permissions.allow Bash(gh api:*) を入れても多分安全……なはず……??

settings.json への hook 設定:
settings.json
Copied!
"permissions": {
"allow": [
...
"Bash(gh api:*)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "~/.claude/bin/guard-gh-api.py"
}
]
}
]
}

追記
これでしばらく試していたところ、claudeが /api/awesome_endpoint -X GET -f hoge=fuga みたいに呼ぼうとしていてはじかれた後、 /api/awesome_endpoint?hoge=fuga に書き直して実行している様子が見えて「あっ たしかにそれは許してもいいのかな……」となったけど、実害無いからこれでいいか となった。