SpecRunnerDocs
ドキュメント権限・認証・環境変数
ACCESS & AUTH

権限・認証・環境変数

実行主体ごとに、GitHub、git transport、LLM providerへ渡すcredentialと最小権限を分離します。

このページの内容

認証を3つの境界に分ける

GITHUB APIPRを読み書きする

PR作成、状態確認、merge。Issue連携を使う場合だけIssue操作も追加します。

GIT TRANSPORTbranchをfetch・pushする

HTTPS originには解決済みtokenをcommand単位で注入。SSH originはambient SSH認証を使います。

LLM PROVIDERagent sessionを実行する

localはClaude CodeまたはCodex、managedはAnthropic API keyを使います。

確認単位。 1つのtokenが見つかっても他の境界が通るとは限りません。GitHub API、push、providerを個別に確認します。

推奨はlocalの対話実行から始める

通常の端末では、GitHub credentialを1つ、採用するproviderの認証を1つ用意します。Issue起点の無人運用は前提にしません。

  1. 01
    GitHubを認証

    specrunner loginのDevice Flow、または既存のgh auth loginを使います。

  2. 02
    providerを認証

    AnthropicはClaude Codeの対話認証、OpenAIはcodex loginを使います。

  3. 03
    run前に診断

    doctorのrequired failureを解消し、実repoへのpush・PR権限も確認します。

terminal
npx specrunner login
# Anthropic local: Claude Codeで対話認証
# OpenAI local:
codex login
npx specrunner doctor

headlessだけ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・pushContents read / write通常run、resume、cancel、archive
PR作成・更新・mergePull requests read / write通常run、archive --with-merge
Issue読取・commentIssues read / writeinbox runを採用する場合だけ
推奨対象repositoryを限定したfine-grained token、または対話端末のGitHub Device Flow
不要通常CLI運用だけならIssues write、organization admin、branch protection bypassは付与しない
別判定branch protectionとrequired checksはtokenを持っていても迂回しない

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.comGH_TOKEN → GITHUB_TOKEN → gh auth token → credentials.jsonすべてのruntime
GitHub / GHESGH_ENTERPRISE_TOKEN → GITHUB_ENTERPRISE_TOKEN → gh auth token --hostname → credentials.jsongithub.hostがgithub.com以外
Claude localCLAUDE_CODE_OAUTH_TOKEN → credentials.json → Claude Codeの対話認証Anthropic step
OpenAI localOPENAI_API_KEYをSDKへ明示渡し/未設定時はCodexの保存済み認証OpenAI step
Anthropic managedcredentials.jsonのanthropic.apiKey → SPECRUNNER_API_KEYmanaged runtime

managedだけcredentials.jsonが環境変数より先です SPECRUNNER_API_KEYは保存済みanthropic.apiKeyのfallbackです。一方、現行loginが保存できるproviderはgithubclaudeだけなので、managedの初期設定は環境変数を使うのが明確です。

runtimeごとの環境変数

variablescopebehavior
GH_TOKENcommongithub.com tokenの最優先。headlessでも利用可能
GITHUB_TOKENcommongithub.com tokenの第2優先。Actionsが注入する名前
GH_ENTERPRISE_TOKENGHESEnterprise host用tokenの最優先
GITHUB_ENTERPRISE_TOKENGHESEnterprise host用tokenの第2優先
CLAUDE_CODE_OAUTH_TOKENlocal / Anthropicheadless Claude Code用。保存済みtokenより優先
OPENAI_API_KEYlocal / OpenAICodex SDKのapiKeyへ明示的に渡す
SPECRUNNER_API_KEYmanagedAnthropic managed agent・environment操作用
SPECRUNNER_HEARTBEAT_INTERVALrun / resume秒数。0またはoffで無効。config値が優先
SPECRUNNER_LOG_LEVELdiagnosticquiet / verbose / debug。CLI flagが優先
SPECRUNNER_DEBUGdiagnosticpipelineを含めるとpipeline診断を有効化。debug levelも必要
DEBUGdiagnostic値があればdebug levelになるlegacy alias
XDG_CONFIG_HOMEpathconfig.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が必要です。

terminal
export GH_TOKEN=...
export SPECRUNNER_API_KEY=...
npx specrunner managed setup
npx specrunner managed status
npx specrunner doctor
PASSmanaged statusにenvironment IDとagentsが表示され、doctorのGitHub・managed checkが通る
STOPAnthropic keyだけでGitHub pushも通ると思っている、またはOpenAI modelをmanagedへ設定

secretは子processへ自動継承させない

secretをproject configへ書きません

.specrunner/config.jsonはrepositoryへcommitする設定です。tokenとAPI keyは環境変数、providerの保存済み認証、またはpermission 0600credentials.jsonへ分離します。

SpecRunnerは*_TOKEN*_API_KEY*_SECRETに一致する環境変数をsubprocessとSDKの継承envから除外し、必要なcredentialだけを専用の経路で渡します。

AT REST0600で保存

credentials.jsonはatomic writeで作成。loose permissionはwarningです。

IN PROCESS明示的に再注入

Claude OAuth、OpenAI apiKey、GitHub HTTPS transportを用途別に渡します。

LOG既知形式をmask

GitHub・Anthropic・OpenAI key形式をlog出力時に伏せます。secret自体は出力しません。

任意名のsecretを過信しません denylistとsuffix patternで継承を止めますが、秘密値を通常変数名へ入れれば検出できません。secretは*_TOKEN*_API_KEY*_SECRETの命名とcredential storeへ寄せます。

run前に4点を確認する

  1. 01
    解決元

    doctorでGitHub、Claude、managed credentialのsourceを確認。

  2. 02
    provider

    採用modelに対応するCLIまたはAPI keyが利用できるか確認。

  3. 03
    repository

    origin hostとtoken hostが一致し、branchをpushできるか確認。

  4. 04
    state path

    .specrunner/localとworktreeを作成できる権限があるか確認。

terminal
npx specrunner doctor
npx specrunner doctor --json
git remote get-url origin
git status --short

実行条件。 tokenの存在だけでなく、正しいhost・provider・repository権限・書込pathが揃った場合にrunへ進みます。

参照ソース 10