PR作成、状態確認、merge。Issue連携を使う場合だけIssue操作も追加します。
権限・認証・環境変数
実行主体ごとに、GitHub、git transport、LLM providerへ渡すcredentialと最小権限を分離します。
このページの内容
認証を3つの境界に分ける
HTTPS originには解決済みtokenをcommand単位で注入。SSH originはambient SSH認証を使います。
localはClaude CodeまたはCodex、managedはAnthropic API keyを使います。
確認単位。 1つのtokenが見つかっても他の境界が通るとは限りません。GitHub API、push、providerを個別に確認します。
推奨はlocalの対話実行から始める
通常の端末では、GitHub credentialを1つ、採用するproviderの認証を1つ用意します。Issue起点の無人運用は前提にしません。
- 01GitHubを認証
specrunner loginのDevice Flow、または既存のgh auth loginを使います。 - 02providerを認証
AnthropicはClaude Codeの対話認証、OpenAIは
codex loginを使います。 - 03run前に診断
doctorのrequired failureを解消し、実repoへのpush・PR権限も確認します。
npx specrunner login
# Anthropic local: Claude Codeで対話認証
# OpenAI local:
codex login
npx specrunner doctorheadlessだけtokenを明示します。 Claude localを対話なしで動かす場合はclaude setup-token後にspecrunner login --provider claudeで保存できます。OpenAIはOPENAI_API_KEY、GitHubはGH_TOKENを実行環境へ渡します。
providerとruntimeの対応範囲、built-in model、混成時の制約は対応プロバイダーを参照してください。
GitHubは操作に必要な権限だけを渡す
| 操作 | 必要なrepository権限 | 使う場面 |
|---|---|---|
| clone・fetch・push | Contents read / write | 通常run、resume、cancel、archive |
| PR作成・更新・merge | Pull requests read / write | 通常run、archive --with-merge |
| Issue読取・comment | Issues read / write | inbox runを採用する場合だけ |
doctorは実操作の権限までは証明しません。 現行checkはtokenの存在とGitHub APIでの有効性を確認します。対象repoへのpush、PR作成、merge可否は実際のrepository policyに依存します。
HTTPS originではtokenをremote URLやglobal git configへ保存せず、transport commandのextraheaderへ限定して渡します。plain HTTPには注入せず、SSH originは変更しません。
同じcredentialは決められた順で解決する
| 対象 | 解決順 | 適用 |
|---|---|---|
| GitHub / github.com | GH_TOKEN → GITHUB_TOKEN → gh auth token → credentials.json | すべてのruntime |
| GitHub / GHES | GH_ENTERPRISE_TOKEN → GITHUB_ENTERPRISE_TOKEN → gh auth token --hostname → credentials.json | github.hostがgithub.com以外 |
| Claude local | CLAUDE_CODE_OAUTH_TOKEN → credentials.json → Claude Codeの対話認証 | Anthropic step |
| OpenAI local | OPENAI_API_KEYをSDKへ明示渡し/未設定時はCodexの保存済み認証 | OpenAI step |
| Anthropic managed | credentials.jsonのanthropic.apiKey → SPECRUNNER_API_KEY | managed runtime |
managedだけcredentials.jsonが環境変数より先です。 SPECRUNNER_API_KEYは保存済みanthropic.apiKeyのfallbackです。一方、現行loginが保存できるproviderはgithubとclaudeだけなので、managedの初期設定は環境変数を使うのが明確です。
runtimeごとの環境変数
| variable | scope | behavior |
|---|---|---|
GH_TOKEN | common | github.com tokenの最優先。headlessでも利用可能 |
GITHUB_TOKEN | common | github.com tokenの第2優先。Actionsが注入する名前 |
GH_ENTERPRISE_TOKEN | GHES | Enterprise host用tokenの最優先 |
GITHUB_ENTERPRISE_TOKEN | GHES | Enterprise host用tokenの第2優先 |
CLAUDE_CODE_OAUTH_TOKEN | local / Anthropic | headless Claude Code用。保存済みtokenより優先 |
OPENAI_API_KEY | local / OpenAI | Codex SDKのapiKeyへ明示的に渡す |
SPECRUNNER_API_KEY | managed | Anthropic managed agent・environment操作用 |
SPECRUNNER_HEARTBEAT_INTERVAL | run / resume | 秒数。0またはoffで無効。config値が優先 |
SPECRUNNER_LOG_LEVEL | diagnostic | quiet / verbose / debug。CLI flagが優先 |
SPECRUNNER_DEBUG | diagnostic | pipelineを含めるとpipeline診断を有効化。debug levelも必要 |
DEBUG | diagnostic | 値があればdebug levelになるlegacy alias |
XDG_CONFIG_HOME | path | config.jsonとcredentials.jsonの基準directory |
既定値。 heartbeatはTTYで30秒、non-TTYで60秒です。progress.heartbeatIntervalSecが環境変数より優先します。
名前が似ていても代替にならない変数があります。 現行OpenAI runnerが読むのはOPENAI_API_KEYです。doctorのhintに残るCODEX_API_KEYはrunnerへ渡されません。managedもANTHROPIC_API_KEYではなくSPECRUNNER_API_KEYを解決します。
SPECRUNNER_GITHUB_CLIENT_IDはbuilt-in GitHub App client IDのtest・advanced overrideです。通常運用では設定しません。XDG_STATE_HOMEのresolverはありますが、現行job・log stateはrepo内.specrunner/へ保存されます。
managedはGitHub tokenとAnthropic keyを分ける
SPECRUNNER_API_KEYはmanaged agentとenvironmentの作成・実行に使います。GitHub APIとpushには、別途GitHub tokenが必要です。
export GH_TOKEN=...
export SPECRUNNER_API_KEY=...
npx specrunner managed setup
npx specrunner managed status
npx specrunner doctorsecretは子processへ自動継承させない
.specrunner/config.jsonはrepositoryへcommitする設定です。tokenとAPI keyは環境変数、providerの保存済み認証、またはpermission 0600のcredentials.jsonへ分離します。
SpecRunnerは*_TOKEN、*_API_KEY、*_SECRETに一致する環境変数をsubprocessとSDKの継承envから除外し、必要なcredentialだけを専用の経路で渡します。
credentials.jsonはatomic writeで作成。loose permissionはwarningです。
Claude OAuth、OpenAI apiKey、GitHub HTTPS transportを用途別に渡します。
GitHub・Anthropic・OpenAI key形式をlog出力時に伏せます。secret自体は出力しません。
任意名のsecretを過信しません。 denylistとsuffix patternで継承を止めますが、秘密値を通常変数名へ入れれば検出できません。secretは*_TOKEN、*_API_KEY、*_SECRETの命名とcredential storeへ寄せます。
run前に4点を確認する
- 01解決元
doctorでGitHub、Claude、managed credentialのsourceを確認。 - 02provider
採用modelに対応するCLIまたはAPI keyが利用できるか確認。
- 03repository
origin hostとtoken hostが一致し、branchをpushできるか確認。
- 04state path
.specrunner/localとworktreeを作成できる権限があるか確認。
npx specrunner doctor
npx specrunner doctor --json
git remote get-url origin
git status --short実行条件。 tokenの存在だけでなく、正しいhost・provider・repository権限・書込pathが揃った場合にrunへ進みます。
参照ソース 10件
src/core/credentials/github.tsGitHub tokenの解決順src/core/credentials/claude-code.tsClaude OAuth tokensrc/core/credentials/anthropic.tsmanaged API keysrc/cli/login.ts保存できるcredentialsrc/adapter/codex/agent-runner.tsOPENAI_API_KEYの受け渡しsrc/adapter/claude-code/agent-runner.tsClaude tokenとwrite scopesrc/git/transport-auth.tsHTTPS git認証の注入src/util/env-filter.tssubprocessのsecret除外src/cli/doctor.ts認証診断docs/operations.md権限とheadless実行