gh apiのうち、GETなものはAIに許可したい
したいよね?
https://gyazo.com/b075ff84dbf8ee1af99f7fa9f941ccbf
なんかアンアンちゃんと私の自我がむこうで混ざっている気がする……。
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 設定:
code:settings.json
"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に書き直して実行している様子が見えて「あっ たしかにそれは許してもいいのかな……」となったけど、実害無いからこれでいいか となった。