$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Claude Codeのghコマンドpermission問題をreadonly用ラッパーで解決する

Claude Codeでgh apiを使って情報を取得しようとすると、毎回権限プロンプトが表示されてつらい。例えば以下のようなただコミット一覧を取得するだけのコマンドでも、毎回許可が必要になる。

gh api "repos/anthropics/claude-code/commits?per_page=100&page=1"

かといって利便性のためにgh api全体に対してallowを設定するのは怖い。ghコマンドはissueの作成やPRのマージなど書き込み操作もできるため、意図しない操作をしてしまうリスクがある。readonly操作だけに絞って許可できればいいのに、と思っていた。

何かいい方法はないかと調べていたところ、ghコマンドにはGH_CONFIG_DIR環境変数でプロファイルを切り替えられる仕組みがあることを発見した。これを利用してreadonly専用のghプロファイルを用意し、ラッパーコマンドghroを作って、それだけをallow設定するようにした。

まずGitHubでFine-grained personal access tokenを作成する。権限はリポジトリのreadonly系だけに絞り、secretアクセスなどは閉じておく。

次にreadonly用のプロファイルで認証する。GH_CONFIG_DIRを変えることで通常のghとは別の認証情報を持たせられる。

GH_CONFIG_DIR=~/.config/ghro gh auth login --with-token <<< "<your-token>"

そしてghroラッパースクリプトを作成してPATHの通った場所に置く。

#!/bin/sh
GH_CONFIG_DIR=~/.config/ghro exec gh "$@"
chmod +x ghro

最後にCLAUDE.mdでClaude Codeにghroを使うよう指示する。自分は以下のように設定している。

## GitHub上の情報やコンテンツを取得する場合
- GitHubの情報をreadonlyで取得するときは、ghroコマンドを使う
- ファイル内容を取得するとき、Fetchを使うと取れない。ghroコマンドを使うこと
- 何らかの書き込み操作を行うときはghroではなくghコマンドを利用する

これでreadonly操作は権限プロンプトなしで実行されるようになり、書き込み操作は通常のghコマンドでちゃんと許可が出る。readとwriteの使い分けによりガードレールを設けながら利便性を両立できるようになった。

Daily Do 1.6.0で完了したTODOをリスト上部に自動移動するようにし ました

Daily Doは、今日やることだけに集中するためのシンプルなiOS用TODOアプリです。

このアプリではTODOをいくつか完了していくと、完了済みと未完了が混在してリストが見づらくなり、今日あと何をやればいいかがわかりにくくなるという課題がありました。そこで1.6.0 で完了したTODOをリスト上部に自動で移動するようなリリースをしました。完了済みのものが上にまとまり、残りのやることに集中しやすくなります。

ぜひアップデートして使ってみてください。

Download on the App Store

自分のOSSリポジトリにGitHubのセキュリティ設定を入れ、自分用の手順書を作った

昨今GitHub上で提供されている有名なOSSに対して攻撃がなされることが多い(例: Nxの2025/08の事例)。自分もそこから学び、最低限GitHub上でセキュリティ周りの設定を入れた方が良いと考えた。

設定を考えるにあたって、とくに次の3つの記事が参考になった。

これらを参考にAIと協力して最低限のセットアップドキュメントを作ったので共有する。もっとこういう設定を入れるべきなどあれば、教えてもらえると嬉しい。

GitHub OSS セキュリティ最低限セット

チェックリスト

  • [ ] Dependabot Alertsを有効化
  • [ ] GitHubの「Private vulnerability reporting / Security Advisories」を有効化
  • [ ] CodeQLの有効化
  • [ ] Secret scanning & プッシュ保護を有効化
  • [ ] main/masterを保護(PR必須 + CI必須など)
  • [ ] バージョンtagの保護
  • [ ] SECURITY.mdを追加
  • [ ] Enable release immutability

Dependabot Alerts を有効化(脆弱性通知)

やること:依存関係に脆弱性が見つかったらSecurityタブにアラートが出るようにする。 参考

手順

  1. リポジトリ > Settings > Advanced Security
  2. Dependabot alertsをEnable

Private vulnerability reporting / Security Advisories を有効化

やること:外部からの脆弱性報告を非公開で受け付けられるようにして、「Report a vulnerability」導線を出す。 参考

手順

  1. リポジトリ > Settings > Advanced Security
  2. Private vulnerability reportingをEnable

CodeQL(Code scanning)を有効化

やること:静的解析で脆弱性の芽を拾う。最短はDefault setup。 参考

手順

  1. リポジトリ > Settings > Advanced Security
  2. CodeQL analysisのところでSet up > Default
  3. 提案されたトリガ(push / PR / schedule)で有効化

Secret scanning & Push protection を有効化

やること:トークン/APIキー等が混入したら検知してアラートを出す。

手順

  1. リポジトリ > Settings > Advanced Security
  2. Secret scanning(またはSecret Protection)をEnable
  3. Push protectionをEnable

main/master を保護(PR必須 + CI必須)

やること:直pushを禁止して、CIが通らないとマージできないようにする。 GitHubは従来の「Branch protection」か、より柔軟な「Rulesets」で設定できる。Rulesetsはブランチ/タグも対象にできる。 参考

手順

  1. リポジトリ > Settings > Rules > Rulesets
  2. New branch ruleset
  3. 対象を main(または master)にする(例:Default branch / パターン指定)
  4. ルールをON
    • Enforcement status: Active
    • Repository adminをbypass
      • リリースをmainブランチでやっているからで、本当はこれも無くしたい
    • Target branchesでInclude default branch
    • Restrict deletions
    • Require a pull request before merging(PR必須)
    • Require status checks to pass(ステータスチェック必須)
      • Add checksでCIのジョブ(例:ci / test)を選ぶ
    • 必須にしたいチェックは、まずCIを1回以上動かして「チェック名」がGitHubに認識されてから設定する 参考
    • Block force pushes
    • Require code scanning results

バージョンtagの保護

やること:バージョン用のtagを作れる人を制限する。

  1. リポジトリ > Settings > Rules > Rulesets
  2. New tag ruleset
  3. ルールをON
    • Enforcement status: Active
    • Repository adminをbypass
    • Target tagsで v*
    • Restrict creations
    • Restrict updates
    • Restrict deletions
    • Require signed commits
    • Block force pushes

SECURITY.md を追加

やること:報告方法を明文化して、公開Issueに書かれないように誘導する。 GitHubのUIからテンプレを作ってコミットできる。 参考

手順

  1. リポジトリ > Security > Set up a security policy
  2. SECURITY.md を編集してコミット

最小テンプレ(コピー&ペースト用)

# Security Policy

## Supported Versions

Only the latest version is supported with security updates.
Please always use the latest release.

## Reporting a Vulnerability

**Please do not report security vulnerabilities through public GitHub issues.**

Instead, report a vulnerability through GitHub's security advisory feature at https://github.com/<owner>/<repository_name>/security/advisories/new.

You can expect an initial response within a few days. If for some reason you do not, please follow up with a comment on the advisory to ensure we received your original report.

Enable release immutability

やること:GitHub TagやRelease、Release assetsを後から変更できないようにする。参考

手順

  1. リポジトリ > Settings > GeneralからEnable release immutabilityを有効化