Agent Capability Analysis
The einja-infra-maintenance skill by einja-inc is an open-source community AI agent skill for Claude Code and other IDE workflows, helping agents execute tasks with better context, repeatability, and domain-specific guidance. Optimized for infrastructure management for developers, GitHub Actions environment variables.
Ideal Agent Persona
Ideal for DevOps Agents requiring streamlined infrastructure setup and maintenance for local development environments, Vercel, Neon, and GitHub Actions.
Core Value
Empowers agents to manage environment variables, automate deployment setups, and interact with infrastructure services like Vercel and Neon, utilizing documentation from categories such as environment-variables.md and deployment.md.
↓ Capabilities Granted for einja-infra-maintenance
! Prerequisites & Limits
- Requires access to specific documentation files at runtime
- Limited to the services explicitly mentioned, such as Vercel, Neon, and GitHub Actions
Browser Sandbox Environment
⚡️ Ready to unleash?
Experience this Agent in a zero-setup browser environment powered by WebContainers. No installation required.
einja-infra-maintenance
Install einja-infra-maintenance, an AI agent skill for AI agent workflows and automation. Works with Claude Code, Cursor, and Windsurf with one-command setup.
インフラ環境メンテナンス Skill
概要
インフラ環境のセットアップ・メンテナンスを対話的に実行するSkillです。ローカル開発環境、Vercel、Neon、GitHub Actions、環境変数管理をカバーします。
参照ドキュメント
重要: ドキュメントは起動時に全て読まない。選択されたカテゴリの実行時に、該当する参照ドキュメントのみを読むこと。各カテゴリの「参照ドキュメント」セクションに記載されたファイルが対象。
設計方針
docs/einja/steering/infrastructure/environment-variables.mddocs/einja/steering/infrastructure/deployment.md
手順書
docs/einja/instructions/environment-setup.mddocs/einja/instructions/deployment-setup.mddocs/einja/instructions/vercel-cli-reference.mddocs/einja/instructions/neon-cli-reference.mddocs/einja/instructions/local-server-environment-and-worktree.md
Single Source of Truth: このSkillは対話フローの定義であり、具体的なコマンド手順は各カテゴリの参照ドキュメントが正。
実行フロー
mermaid1graph TB 2 Start[Skill起動] --> Detect[Phase 1: 環境状態の自動検出] 3 Detect --> Judge[Phase 2: 意図判定] 4 Judge -->|意図が明確| Direct[該当カテゴリへ直接遷移] 5 Judge -->|意図が不明確| Menu[AskUserQuestion: メインメニュー] 6 Menu --> Cat[カテゴリ 1-7 選択] 7 Direct --> Exec[実行] 8 Cat --> Exec 9 Exec --> Result[結果報告]
Phase 1: 環境状態の自動検出
Skill起動時に以下を自動検出し、結果をユーザーに表示する。
bash1# === ファイル存在確認 === 2for f in .env .env.local .env.keys .env.personal .env.develop .env.staging .env.production .env.preview; do 3 [ -f "$f" ] && echo "✅ $f" || echo "❌ $f" 4done 5 6# === CLI存在確認 === 7for cmd in vercel neonctl gh dotenvx docker; do 8 command -v "$cmd" >/dev/null 2>&1 && echo "✅ $cmd" || echo "❌ $cmd" 9done 10 11# === Docker/PostgreSQL状態 === 12docker compose ps 2>/dev/null | grep postgres 13 14# === 開発サーバー状態 === 15pnpm dev:status 2>/dev/null || echo "停止中" 16 17# === デフォルトトークン設定状況 === 18DEFAULTS_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/einja/defaults.json" 19if [ -f "$DEFAULTS_FILE" ]; then 20 echo "✅ デフォルトトークン設定ファイル" 21 # jqがある場合はキーの有無を表示 22 if command -v jq >/dev/null 2>&1; then 23 for key in VERCEL_TOKEN NEON_API_KEY GITHUB_TOKEN VERCEL_ORG_ID; do 24 val=$(jq -r ".tokens.${key} // empty" "$DEFAULTS_FILE") 25 [ -n "$val" ] && echo " ✅ $key" || echo " ❌ $key" 26 done 27 fi 28else 29 echo "❌ デフォルトトークン未設定" 30fi 31 32# === トークン有効性検証(.env.personal 存在時のみ) === 33if [ -f ".env.personal" ]; then 34 # 並行実行で高速化(各コマンドにタイムアウト設定) 35 timeout 5 gh auth status 2>/dev/null && echo "✅ GITHUB_TOKEN 有効" || echo "⚠️ GITHUB_TOKEN 無効/未設定" & 36 timeout 5 vercel whoami 2>/dev/null && echo "✅ VERCEL_TOKEN 有効" || echo "⚠️ VERCEL_TOKEN 無効/未設定" & 37 if [ -n "$NEON_API_KEY" ]; then 38 timeout 5 neonctl projects list --api-key "$NEON_API_KEY" >/dev/null 2>&1 && echo "✅ NEON_API_KEY 有効" || echo "⚠️ NEON_API_KEY 無効/期限切れ" & 39 else 40 echo "⚠️ NEON_API_KEY 未設定" 41 fi 42 wait 43fi
検出結果をサマリー表示した上で、AskUserQuestionでメインメニューを表示する。
Phase 2: 意図判定とメインメニュー
意図が明確な場合(質問せずに直接実行)
Skill起動時の引数やユーザーの指示から意図が読み取れる場合は、AskUserQuestionを使わずに該当カテゴリに直接進む。
直接実行の例:
/infra-maintenance Vercel初期設定→ カテゴリ3: Vercel管理へ直接遷移/infra-maintenance ヘルスチェック→ カテゴリ6: 環境状態確認へ直接遷移Neonのブランチを作成したい→ カテゴリ4: Neon管理へ直接遷移GitHub Secretsを一括設定して→ カテゴリ5: GitHub Secrets管理へ直接遷移環境変数を追加したい→ カテゴリ2: 環境変数管理へ直接遷移CIが失敗してる→ カテゴリ7: GitHub Actions CI/CD管理へ直接遷移ワークフローの実行状況を見たい→ カテゴリ7: GitHub Actions CI/CD管理へ直接遷移デフォルトトークンを設定したい→ カテゴリ8: デフォルトトークン管理へ直接遷移共通トークンをプロジェクトに適用したい→ カテゴリ8: デフォルトトークン管理へ直接遷移
意図が不明確な場合のみメニューを表示
引数がない、または意図が曖昧な場合のみ、AskUserQuestionで以下の選択肢を提示する。検出結果に基づいて推奨を表示する。
検出結果に基づく推奨ロジック
Phase 1の検出結果から、推奨カテゴリにマーク(推奨)を付与してAskUserQuestionの選択肢に表示する。
| 検出結果 | 推奨カテゴリ |
|---|---|
.env.keys不在 | ローカル環境セットアップ |
開発サーバー停止中 + .env.keys存在 | ローカル環境セットアップ |
| vercel CLI未インストール or 未リンク | Vercel管理 |
| neonctl未インストール | Neon管理 |
.env.personal不在 | 環境変数管理 |
| トークン無効/期限切れ | 環境変数管理(個人トークン再設定) |
| デフォルトトークン未設定 | デフォルトトークン管理 |
| 上記に該当しない | 環境状態確認(デフォルト) |
| 選択肢 | 説明 |
|---|---|
| ローカル環境セットアップ | 初回セットアップ、開発サーバー起動 |
| 環境変数管理 | 個人トークン設定、チーム共有設定変更、新規変数追加 |
| Vercel管理 | 初期設定、環境変数同期、デプロイ状態確認 |
| Neon管理 | 初期設定、ブランチ管理、接続文字列取得 |
| GitHub Secrets管理 | 一覧表示、個別設定、一括設定 |
| 環境状態確認 | 包括的ヘルスチェック |
| GitHub Actions CI/CD管理 | ワークフロー状態確認、失敗調査、手動トリガー |
| デフォルトトークン管理 | 組織共通トークン(dev@einja.net)の設定・確認・検証・プロジェクト適用 |
カテゴリ1: ローカル環境セットアップ
サブメニュー
- 初回セットアップ:
pnpm dev:setup実行 - 開発サーバー起動:
pnpm dev:bg実行 - サーバー停止:
pnpm dev:stop実行 - ログ確認:
pnpm dev:logs実行
実行手順
ゼロ状態判定
Phase 1の検出結果で .env* ファイルが全て不在の場合、「初回プロジェクトセットアップ」モードとして以下の順序で案内する:
- 必須CLIツールの確認・インストール案内(Docker含む)
pnpm install→pnpm dev:setupの実行- 完了後、カテゴリ2(環境変数管理)への誘導
初回セットアップ
pnpm installで依存関係インストールpnpm dev:setupで環境セットアップ- エラー時: エラー内容を分析し、対話的にトラブルシュート
エラー時の対処
| エラー | 対処 |
|---|---|
.env.keys不在 | git worktree list でメインworktreeを検出し、.env.keys が存在すれば自動コピー。不在の場合は「チームメンバーから .env.keys ファイルを受け取り、プロジェクトルートに配置してください」と案内 |
| Docker未インストール | OrbStack のインストールを案内。brew install orbstack または公式サイトからダウンロード |
| PostgreSQL接続エラー | docker compose up -d postgres → ヘルスチェック |
| Node.jsバージョン不一致 | volta install node@22 提案 |
| pnpmバージョン不一致 | volta install pnpm@10 提案 |
参照ドキュメント
docs/einja/instructions/local-server-environment-and-worktree.mddocs/einja/instructions/environment-setup.md
カテゴリ2: 環境変数管理
サブメニュー
- 個人トークン設定:
.env.personalにトークンを保存 - チーム共有設定変更:
.env.local等の復号→編集→再暗号化 - 新規環境変数追加: プロジェクト全体への変数追加フロー
- 環境変数の状態表示: 現在の設定状態を表示
クイック操作:
pnpm env:updateを実行すると、個人トークン設定・チーム共有設定変更を対話式ウィザードで実行できます。
実行手順
個人トークン設定
- 必要なトークンをAskUserQuestionで確認:
GITHUB_TOKEN: https://github.com/settings/tokens/newVERCEL_TOKEN: https://vercel.com/account/tokensNEON_API_KEY: https://console.neon.tech/app/settings/api-keys
- AskUserQuestionでトークン値を入力してもらう
.env.personalに保存chmod 600 .env.personal実行- API検証(可能な場合):
- GitHub:
gh auth status - Vercel:
vercel whoami - Neon:
neonctl projects list --api-key $NEON_API_KEY
- GitHub:
チーム共有設定変更
- AskUserQuestionで対象ファイルを選択(.env.local / .env.develop / .env.production / .env.preview)
dotenvx decrypt -f <file> --stdout > <file>.tmp- 変更内容をAskUserQuestionで確認
- 編集実行
rm <file> && mv <file>.tmp <file>dotenvx encrypt -f <file>- コミット案内
新規環境変数追加
- AskUserQuestionで変数名・用途・対象環境(local/develop/production/preview)を確認
- 対象環境に応じた
.env.*ファイルを特定 - 暗号化ファイルの場合: チーム共有設定変更と同じフロー(decrypt→編集→encrypt)
- 非暗号化ファイルの場合(.env/.env.personal): 直接編集
- AskUserQuestion: 他環境への展開が必要か確認
- コミット案内(チーム共有設定の場合)
詳細手順:
docs/einja/instructions/environment-setup.mdの「新規環境変数を追加するとき」を参照
参照ドキュメント
docs/einja/instructions/environment-setup.md
カテゴリ3: Vercel管理
サブメニュー
- 新規プロジェクト作成: Vercelプロジェクトの新規作成(初回のみ)
- 初期設定: プロジェクトリンク・Root Directory設定
- 環境変数同期: dotenvx鍵のVercel同期
- デプロイ状態確認: 最新デプロイ情報表示
実行手順
新規プロジェクト作成(初回のみ)
Vercelにプロジェクトが存在しない場合(ゼロ状態)のみ実行。VERCEL_TOKEN 取得済みが前提。
-
プロジェクト名の推定・確認: package.jsonのnameフィールドからプロジェクト名を推定(
@scope/name→name、-monorepo/-templateサフィックス除去)。 フォールバック: Gitリポジトリ名から推定。bash1BASE_NAME=$(cat package.json | jq -r '.name // empty' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//') 2if [ -z "$BASE_NAME" ]; then 3 BASE_NAME=$(basename "$(git remote get-url origin 2>/dev/null)" .git | sed 's/-template$//') 4fi 5# jq未インストール時のフォールバック 6if [ -z "$BASE_NAME" ]; then 7 BASE_NAME=$(grep '"name"' package.json | head -1 | sed 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//') 8fi推定した
${BASE_NAME}-web,${BASE_NAME}-adminをAskUserQuestionでプロジェクト名と作成対象アプリ(web / admin / 両方)を確認。 -
既存プロジェクトの確認:
bash1vercel project ls既にプロジェクトが存在する場合は「既にVercelに存在します。スキップしますか?」と確認。
-
CLIでプロジェクト作成・Git接続:
bash1# チーム切り替え(必要な場合) 2vercel switch <team-slug> 3 4# apps/ 配下のディレクトリを動的取得 5APP_DIRS=$(ls -d apps/*/ 2>/dev/null | xargs -I{} basename {}) 6for APP_NAME in $APP_DIRS; do 7 cd "apps/$APP_NAME" 8 vercel link --project="${BASE_NAME}-${APP_NAME}" --yes 9 vercel git connect "https://github.com/${GH_ORG}/${GH_REPO}" --yes 10 cd ../.. 11donevercel linkはプロジェクトが存在しない場合に自動作成する(vercel-cli-reference.mdL287) -
APIでRoot Directory設定(CLIでは不可:
vercel-cli-reference.mdL112):bash1# apps/ 配下のディレクトリを動的取得 2APP_DIRS=$(ls -d apps/*/ 2>/dev/null | xargs -I{} basename {}) 3for APP_NAME in $APP_DIRS; do 4 PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId') 5 VERCEL_ORG_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId') 6 curl -X PATCH "https://api.vercel.com/v9/projects/$PROJECT_ID?teamId=$VERCEL_ORG_ID" \ 7 -H "Authorization: Bearer $VERCEL_TOKEN" \ 8 -H "Content-Type: application/json" \ 9 -d "{\"rootDirectory\": \"apps/$APP_NAME\"}" 10done -
プロジェクトID/ORG IDを自動取得・表示:
bash1# apps/ 配下のディレクトリを動的取得 2APP_DIRS=$(ls -d apps/*/ 2>/dev/null | xargs -I{} basename {}) 3for APP_NAME in $APP_DIRS; do 4 echo "$(echo $APP_NAME | tr '[:lower:]' '[:upper:]'):" 5 echo " PROJECT_ID: $(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId')" 6 echo " ORG_ID: $(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')" 7doneGitHub Secretsへの登録を提案(→ カテゴリ5: 一括設定 Step 2)
初期設定
- VERCEL_TOKEN確認 → 未設定時はURL案内 +
.env.personal保存 - AskUserQuestionでアプリ選択(web / admin)
vercel link --project=$NAME --yesで接続- Root Directory設定:
bash
1curl -X PATCH "https://api.vercel.com/v9/projects/$PROJECT_ID?teamId=$VERCEL_ORG_ID" \ 2 -H "Authorization: Bearer $VERCEL_TOKEN" \ 3 -H "Content-Type: application/json" \ 4 -d '{"rootDirectory": "apps/$APP_NAME"}' .vercel/project.jsonからプロジェクトIDとORG IDを自動取得:bash1VERCEL_PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId') 2VERCEL_ORG_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')- 取得結果を表示し、GitHub Secretsへの登録を提案(→ カテゴリ5)
環境変数同期
注意: CI/CDではmainブランチのみ
vercel env addで自動同期。develop/staging/PRは--env実行時注入。 以下の手動同期は初回セットアップ時のみ実行。
.env.keysからDOTENV_PRIVATE_KEY_*を抽出- AskUserQuestionで同期対象を確認(値はマスク表示)
- 承認後、
vercel env rm+vercel env addでVercelに同期 - 設定結果を
vercel env lsで確認
詳細手順:
docs/einja/instructions/vercel-cli-reference.mdの「環境変数同期自動化」を参照
デプロイ状態確認
bash1vercel ls
参照ドキュメント
docs/einja/instructions/vercel-cli-reference.mddocs/einja/instructions/deployment-setup.md
カテゴリ4: Neon管理
サブメニュー
- 初期設定: プロジェクト作成・ブランチ戦略初期化
- ブランチ管理: 一覧表示・作成・削除
- 接続文字列取得: 特定ブランチの接続URLを取得
- プロジェクトID取得: 既存プロジェクトのIDを
neonctl projects listで自動取得
実行手順
初期設定
-
NEON_API_KEY確認 → 未設定時はURL案内 +
.env.personal保存- 取得URL: https://console.neon.tech/app/settings/api-keys
neonctl authは使用しない(理由:docs/einja/instructions/neon-cli-reference.md「認証方式」参照)→--api-keyフラグまたはNEON_API_KEY環境変数で認証
-
既存プロジェクトの確認:
bash1neonctl projects list --api-key $NEON_API_KEY既存プロジェクトがあれば一覧表示し、使用するプロジェクトをAskUserQuestionで確認。 既存プロジェクトを使用する場合 →
neonctl projects get $PROJECT_IDでIDを取得してステップ4へ。 -
プロジェクト名の推定・確認・作成: 共通推定ロジック(カテゴリ3と同様)で
$BASE_NAMEを取得。AskUserQuestionで確認(デフォルト値として提示)。bash1neonctl projects create --name "$NEON_PROJECT_NAME" --region-id aws-ap-northeast-1 --api-key $NEON_API_KEY作成後、
neonctl projects listでプロジェクトIDを取得:bash1NEON_PROJECT_ID=$(neonctl projects list --api-key $NEON_API_KEY --output json | jq -r ".[] | select(.name==\"$NEON_PROJECT_NAME\") | .id") -
.env.previewに自動設定 → dotenvx暗号化:bash1dotenvx decrypt -f .env.preview --stdout > .env.preview.tmp 2# 既存の同名変数を削除してから追加(重複防止) 3grep -v "^NEON_PROJECT_ID=" .env.preview.tmp | grep -v "^NEON_API_KEY=" > .env.preview.clean 4echo "NEON_PROJECT_ID=$NEON_PROJECT_ID" >> .env.preview.clean 5echo "NEON_API_KEY=$NEON_API_KEY" >> .env.preview.clean 6rm .env.preview && mv .env.preview.clean .env.preview 7dotenvx encrypt -f .env.preview -
ブランチ戦略初期設定:
- production(main)ブランチ確認
- developmentブランチ作成
ブランチ管理
bash1# 一覧 2neonctl branches list --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY 3 4# 作成 5neonctl branches create --project-id $NEON_PROJECT_ID --name $NAME --api-key $NEON_API_KEY 6 7# 削除 8neonctl branches delete $BRANCH_ID --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY
接続文字列取得
bash1# CLI(単一ブランチ) 2neonctl connection-string <branch-name> --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY 3 4# API(複数ブランチ一括取得時) 5curl -s "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/connection_uri?branch_id=$BRANCH_ID&database_name=neondb&role_name=$ROLE_NAME" \ 6 -H "Authorization: Bearer $NEON_API_KEY"
pooled/unpooled接続の使い分け:
- マイグレーション用(unpooled):
neonctl connection-string <branch> --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY(デフォルトはpooled=false)- アプリruntime用(pooled):
neonctl connection-string <branch> --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY --pooled- CI/CDワークフローではマイグレーション時にunpooled、アプリビルド時にpooled接続を使い分けている
注意: 孤立ブランチのクリーンアップは
cleanup-pr-preview-db.ymlワークフローが自動実行するため、このSkillでは手動クリーンアップを提供しない。
参照ドキュメント
docs/einja/instructions/neon-cli-reference.mddocs/einja/instructions/deployment-setup.md
カテゴリ5: GitHub Secrets管理
サブメニュー
- 一覧表示: 現在のSecrets一覧
- 個別設定: 指定したSecretを設定
- 一括設定:
.env.keysからdotenvx秘密鍵を一括設定
実行手順
一覧表示
bash1gh secret list
個別設定
- AskUserQuestionでSecret名と値を入力
gh secret set $NAME --body "<value>"- 設定確認:
gh secret list
一括設定(全Secrets)
参照:
docs/einja/instructions/deployment-setup.md(セクション6)に全Secretsの取得手順あり
Step 1: dotenvx秘密鍵を自動抽出
bash1for key_name in PREVIEW PRODUCTION DEVELOP STAGING; do 2 value=$(grep "DOTENV_PRIVATE_KEY_${key_name}" .env.keys | cut -d'=' -f2 | tr -d "\"'") 3 if [ -n "$value" ]; then 4 gh secret set "DOTENV_PRIVATE_KEY_${key_name}" --body "$value" 5 echo "✅ DOTENV_PRIVATE_KEY_${key_name} を設定しました" 6 else 7 echo "⚠️ DOTENV_PRIVATE_KEY_${key_name} が .env.keys に見つかりません" 8 fi 9done
Step 2: Vercel関連Secrets
2-a. VERCEL_TOKEN(人間入力が必須):
AskUserQuestionで値を入力してもらう。取得手順:
- Vercel Dashboard(https://vercel.com/account/tokens)> 「Create Token」
- Scope: Full Account を選択
- 入力後、
vercel whoami --token $TOKENで有効性を自動検証
2-b. VERCEL_ORG_ID(自動取得):
bash1# apps/web/.vercel/project.json から取得(vercel link 実行済みの場合) 2VERCEL_ORG_ID=$(cat apps/web/.vercel/project.json 2>/dev/null | jq -r '.orgId') 3# 未取得の場合はAPI経由 4if [ -z "$VERCEL_ORG_ID" ] || [ "$VERCEL_ORG_ID" = "null" ]; then 5 VERCEL_ORG_ID=$(curl -s "https://api.vercel.com/v2/teams" \ 6 -H "Authorization: Bearer $VERCEL_TOKEN" | jq -r '.teams[0].id') 7fi 8gh secret set VERCEL_ORG_ID --body "$VERCEL_ORG_ID" 9echo "✅ VERCEL_ORG_ID = $VERCEL_ORG_ID を設定しました"
2-c. VERCEL_PROJECT_ID_*(自動取得):
bash1# apps/ 配下のディレクトリを動的取得(.vercelが存在するもの) 2for APP_NAME in $(for d in apps/*/; do [ -d "$d/.vercel" ] && basename "$d"; done); do 3 # apps/<app>/.vercel/project.json から取得(vercel link 実行済みの場合) 4 PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" 2>/dev/null | jq -r '.projectId') 5 if [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "null" ]; then 6 # vercel link 未実行の場合: カテゴリ3(新規プロジェクト作成 or 初期設定)を先に実行するよう案内 7 echo "⚠️ apps/$APP_NAME/.vercel/project.json が見つかりません。先にカテゴリ3でVercelプロジェクトをリンクしてください" 8 continue 9 fi 10 SECRET_NAME="VERCEL_PROJECT_ID_$(echo $APP_NAME | tr '[:lower:]' '[:upper:]')" 11 gh secret set "$SECRET_NAME" --body "$PROJECT_ID" 12 echo "✅ $SECRET_NAME = $PROJECT_ID を設定しました" 13done
Step 3: Turborepo Remote Cache
3-a. TURBO_TOKEN:
VERCEL_TOKEN(Step 2-a で取得済み)と同じ値を使用(別トークンを使う場合のみAskUserQuestionで入力):
bash1gh secret set TURBO_TOKEN --body "$VERCEL_TOKEN" 2echo "✅ TURBO_TOKEN を設定しました(VERCEL_TOKENと同一値)"
3-b. TURBO_TEAM(自動取得):
bash1TURBO_TEAM=$(cat .turbo/config.json 2>/dev/null | jq -r '.teamId // empty') 2if [ -z "$TURBO_TEAM" ]; then 3 echo "⚠️ .turbo/config.json 未生成。先に npx turbo login && npx turbo link を実行します" 4 npx turbo login && npx turbo link 5 TURBO_TEAM=$(cat .turbo/config.json | jq -r '.teamId') 6fi 7gh secret set TURBO_TEAM --body "$TURBO_TEAM" 8echo "✅ TURBO_TEAM = $TURBO_TEAM を設定しました"
参照ドキュメント
docs/einja/instructions/deployment-setup.md(セクション6: GitHub Secrets登録)
カテゴリ6: 環境状態確認(ヘルスチェック)
チェック対象
ローカル環境
bash1# ランタイム 2node --version 3pnpm --version 4 5# 環境変数ファイル 6for f in .env .env.local .env.keys .env.personal; do 7 [ -f "$f" ] && echo "✅ $f" || echo "❌ $f" 8done 9 10# Docker/PostgreSQL 11docker compose ps 12docker compose exec postgres pg_isready -U postgres 13 14# 開発サーバー 15pnpm dev:status 16 17# CLIツール 18for cmd in gh vercel neonctl dotenvx; do 19 command -v "$cmd" >/dev/null 2>&1 && echo "✅ $cmd" || echo "❌ $cmd" 20done 21 22# === デフォルトトークン === 23DEFAULTS_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/einja/defaults.json" 24if [ -f "$DEFAULTS_FILE" ]; then 25 echo "✅ デフォルトトークン設定済み" 26else 27 echo "❌ デフォルトトークン未設定" 28fi 29 30# === トークン有効性検証(.env.personal 存在時のみ) === 31if [ -f ".env.personal" ]; then 32 # 並行実行で高速化(各コマンドにタイムアウト設定) 33 timeout 5 gh auth status 2>/dev/null && echo "✅ GITHUB_TOKEN 有効" || echo "⚠️ GITHUB_TOKEN 無効/未設定" & 34 timeout 5 vercel whoami 2>/dev/null && echo "✅ VERCEL_TOKEN 有効" || echo "⚠️ VERCEL_TOKEN 無効/未設定" & 35 if [ -n "$NEON_API_KEY" ]; then 36 timeout 5 neonctl projects list --api-key "$NEON_API_KEY" >/dev/null 2>&1 && echo "✅ NEON_API_KEY 有効" || echo "⚠️ NEON_API_KEY 無効/期限切れ" & 37 else 38 echo "⚠️ NEON_API_KEY 未設定" 39 fi 40 wait 41fi
Vercel
bash1vercel ls
Neon
bash1neonctl branches list --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY
GitHub
bash1gh secret list 2gh run list --limit 5
結果表示
チェック結果を以下の形式でサマリー表示する:
=== 環境ヘルスチェック結果 ===
📦 ローカル環境
✅ Node.js 22.16.0
✅ pnpm 10.14.0
✅ PostgreSQL 起動中
✅ 開発サーバー 起動中 (port 3195)
❌ .env.personal 不在
🔧 CLI ツール
✅ gh 2.x
✅ vercel 37.x
❌ neonctl 未インストール
✅ dotenvx 1.x
🔑 デフォルトトークン
✅ VERCEL_TOKEN 設定済み
✅ NEON_API_KEY 設定済み
✅ GITHUB_TOKEN 設定済み
❌ VERCEL_ORG_ID 未設定
🔑 トークン有効性
✅ GITHUB_TOKEN 有効
✅ VERCEL_TOKEN 有効
⚠️ NEON_API_KEY 未設定
☁️ Vercel
✅ 最新デプロイ: 2h ago (Ready)
🗄️ Neon
✅ ブランチ: 3個 (main, development, preview/feature-auth)
🔐 GitHub Secrets
✅ 10個のSecrets設定済み
✅ 最新CI: 成功 (2h ago)
推奨アクション提案
ヘルスチェック結果に❌がある場合、以下のルールで推奨アクションを提示する:
| 検出結果 | 推奨アクション |
|---|---|
.env.keys不在 / CLI未インストール | → カテゴリ1(ローカル環境セットアップ) |
.env.personal不在 / トークン未設定 | → カテゴリ2(環境変数管理 > 個人トークン設定) |
| トークン無効/期限切れ | → カテゴリ2(環境変数管理 > 個人トークン再設定) |
| Vercel未リンク / デプロイエラー | → カテゴリ3(Vercel管理) |
| Neonブランチ取得失敗 | → カテゴリ4(Neon管理) |
| GitHub Secrets不足 | → カテゴリ5(GitHub Secrets管理) |
| CI失敗 | → カテゴリ7(GitHub Actions CI/CD管理 > 失敗調査) |
| デフォルトトークン未設定 | → カテゴリ8(デフォルトトークン管理) |
❌が3個以上の場合は「初期セットアップが必要です。カテゴリ1を実行してください」と表示。
参照ドキュメント
docs/einja/instructions/local-server-environment-and-worktree.md(包括的ヘルスチェック)
カテゴリ7: GitHub Actions CI/CD管理
サブメニュー
- ワークフロー状態確認: 最新の実行結果一覧
- 失敗調査: 失敗したワークフローのログ分析
- 手動トリガー: ワークフローの手動実行
- ワークフロー一覧: 利用可能なワークフロー確認
プロジェクトのワークフロー
| ワークフロー | ファイル | トリガー | 用途 | 備考 |
|---|---|---|---|---|
| デプロイ(安定ブランチ) | deploy-stable-branches.yml | push to main/develop/staging | 動的マトリクス → 変更アプリのみデプロイ | mainのみenv sync、他は--env実行時注入 |
| PRプレビューデプロイ | deploy-pr-preview.yml | PR open/sync | PR毎のプレビュー環境作成 | --env実行時注入(env sync廃止) |
| PRプレビューDB削除 | cleanup-pr-preview-db.yml | schedule/manual | 孤立Neonブランチのクリーンアップ | PR未存在のブランチを自動削除 |
| PRクローズ時クリーンアップ | cleanup-pr-preview-on-close.yml | PR close | PR関連リソース削除 | Neonブランチ + Vercel Preview削除 |
| CLIリリース | release-cli.yml | manual | @einja/cli NPM公開 | workflow_dispatch対応 |
| create-einja-appリリース | release-create-einja-app.yml | manual | create-einja-app NPM公開 | workflow_dispatch対応 |
| Claude Code | claude.yml | issue comment | Claude Codeによる自動対応 | /claudeコメントでトリガー |
実行手順
ワークフロー状態確認
bash1# 最新の実行結果一覧 2gh run list --limit 10 3 4# 特定ワークフローの実行一覧 5gh run list --workflow=deploy-stable-branches.yml --limit 5 6 7# 実行中のワークフロー 8gh run list --status=in_progress
失敗調査
- 失敗したワークフローの一覧を取得:
bash
1gh run list --status=failure --limit 5 - AskUserQuestionで調査対象のrun-idを選択
- 失敗したジョブのログを表示:
bash
1gh run view <run-id> --log-failed - ログ分析→アクション提案: エラーパターンに基づいてカテゴリ遷移を提案
| エラーパターン | 推奨アクション |
|---|---|
Secret not found: DOTENV_PRIVATE_KEY_* | → カテゴリ5(GitHub Secrets管理)で一括設定 |
vercel deploy failed | → カテゴリ3(Vercel管理)で状態確認 |
neonctl: authentication failed | → カテゴリ5でNEON_API_KEY更新 |
Permission denied | → .github/workflows/のpermissions設定確認を案内 |
| その他 | エラーログ全文を表示し、対処方法をAskUserQuestionで相談 |
手動トリガー
bash1# workflow_dispatch対応ワークフローを手動実行 2gh workflow run <workflow-file> --ref <branch> 3 4# 入力パラメータ付き 5gh workflow run <workflow-file> --ref <branch> -f param1=value1 6 7# PRプレビューDBクリーンアップの手動実行 8gh workflow run cleanup-pr-preview-db.yml --ref main
ワークフロー一覧
bash1# 利用可能なワークフロー一覧 2gh workflow list 3 4# 特定ワークフローの詳細 5gh workflow view <workflow-file>
エラー時の対処
| エラー | 対処 |
|---|---|
| デプロイ失敗 | gh run view <id> --log-failed でログ確認 → 原因特定 |
| Secrets不足 | カテゴリ5(GitHub Secrets管理)で設定 |
| 環境変数同期失敗 | dotenvx秘密鍵のSecret設定を確認 |
| Neonブランチ作成失敗 | NEON_API_KEY のSecret設定・有効期限を確認 |
| Permission denied | ワークフローのpermissions設定を確認 |
参照ドキュメント
.github/workflows/内の各ワークフローファイルdocs/einja/instructions/deployment-setup.mddocs/einja/steering/infrastructure/deployment.md
カテゴリ8: デフォルトトークン管理
概要
組織共通のトークン(dev@einja.net アカウント)をグローバルデフォルトとして ~/.config/einja/defaults.json に保存し、複数プロジェクトで再利用する機能。
クイック操作:
pnpm env→ 「デフォルトトークン管理」を選択
サブメニュー
- トークンを設定/更新: 個別にデフォルトトークンを入力
- プロジェクトに適用: デフォルトを
.env.personalにコピー - トークンを検証: API接続テスト
管理対象トークン
| キー | 用途 | 取得先 |
|---|---|---|
VERCEL_TOKEN | Vercel CLI認証 | https://vercel.com/account/tokens |
NEON_API_KEY | Neon CLI認証 | https://console.neon.tech/app/settings/api-keys |
GITHUB_TOKEN | GitHub API認証 | https://github.com/settings/tokens/new |
VERCEL_ORG_ID | Vercel組織ID | apps/web/.vercel/project.json の orgId |
実行手順
トークンを設定/更新
pnpm env→ 「デフォルトトークン管理」→「トークンを設定/更新」- 各トークンについて設定するか確認(現在値をマスク表示)
- 入力されたトークンを
~/.config/einja/defaults.jsonに保存
プロジェクトに適用
- 「プロジェクトに適用」を選択
- 各トークンについて
.env.personalへの適用を確認 - 承認されたトークンのみ
.env.personalに書き込み
トークンを検証
各トークンのAPIエンドポイントに接続テスト:
GITHUB_TOKEN:https://api.github.com/userVERCEL_TOKEN:https://api.vercel.com/v2/userNEON_API_KEY:https://console.neon.tech/api/v2/projects
トークン参照の優先順位
プロジェクト .env.personal > グローバルデフォルト (~/.config/einja/defaults.json)
セキュリティ
| 項目 | 詳細 |
|---|---|
| 保存形式 | プレーンテキスト JSON(.env.personal と同等のリスクレベル) |
| ディレクトリ権限 | ~/.config/einja/ を 0700 で作成 |
| ファイル権限 | defaults.json を 0600 で作成 |
| CI環境 | process.env.CI が truthy の場合、読み書きともにスキップ |
参照ドキュメント
docs/einja/instructions/environment-setup.mddocs/einja/steering/infrastructure/environment-variables.md
セキュリティ考慮事項
トークン・API Keyの管理
| トークン | 保存先 | セキュリティ |
|---|---|---|
| VERCEL_TOKEN | .env.personal | gitignore対象、chmod 600設定 |
| NEON_API_KEY | .env.personal | gitignore対象、chmod 600設定 |
| GITHUB_TOKEN | .env.personal | gitignore対象、chmod 600設定 |
| DOTENV_PRIVATE_KEY_* | .env.keys | gitignore対象、1Password等で共有 |
| NEON_PROJECT_ID | .env.preview(暗号化) | dotenvx暗号化、Git管理 |
必須: トークン保存後は chmod 600 .env.personal を実行すること。
CLI vs REST API 使い分け
| 操作 | 方式 | 理由 |
|---|---|---|
| Vercel プロジェクト操作 | CLI (vercel link --yes) | 認証簡単、非対話モード対応 |
| Vercel Root Directory設定 | API (PATCH /v9/projects/{id}) | CLIでは不可 |
| Vercel 標準環境変数 | CLI (vercel env add/rm) | バッチ対応 |
| Neon ブランチ操作 | CLI (neonctl --api-key) | 環境変数認証で非対話実行可 |
| Neon 接続URL取得 | CLI + API | CLI: 単一ブランチ、API: 一括取得 |
| GitHub Secrets | CLI (gh secret set) | API暗号化が複雑 |
| GitHub Actions監視 | CLI (gh run list/view) | フォーマット良好 |
エラーハンドリング
| エラー種別 | 対処 |
|---|---|
| CLI未インストール | 自動インストール実行: brew install <cli> または npm i -g <cli>。Docker のみ OrbStack インストール案内(GUI必須のため) |
| トークン未設定 | 取得URL案内 → AskUserQuestionで値入力 → .env.personalに保存 → API検証(vercel whoami / gh auth status / neonctl projects list)で有効性確認 |
| トークン無効/期限切れ | 再取得URL案内 → AskUserQuestionで新しい値入力 → .env.personalを更新 → API検証で有効性確認 |
| API呼び出し失敗 | エラー内容表示 → リトライ or 代替手段提示 |
| dotenvx復号失敗 | .env.keys確認 → 秘密鍵再設定ガイド |
| ネットワークエラー | 3回リトライ → 失敗時は手動手順提示 |
既存ワークフローとの整合性
競合回避ルール
- 環境変数同期:
vercel env addによるVercel環境変数ストアへの書き込みはmainブランチのみ。develop/staging/PRはvercel deploy --envで実行時注入(並行デプロイ間の競合防止) - 初回セットアップ: Skillでは初回セットアップ時のみ手動同期。以降はGitHub Actionsが自動管理
- Neonブランチクリーンアップ:
cleanup-pr-preview-db.ymlが定期実行。Skillでは手動クリーンアップは提供しない - GitHub Secrets更新: Skillで設定した値はワークフローでそのまま使用される(同じdotenvxコマンド体系)
初版で除外する機能
以下の機能は将来版で対応予定:
| 機能 | 除外理由 | 対応方針 |
|---|---|---|
| トークンローテーション | 手順書にドキュメント化のみで十分 | environment-setup.mdを参照 |
| Vercelカスタム環境操作 | API仕様の安定性要調査 | 安定確認後に追加 |
| Neon孤立ブランチ手動クリーンアップ | 既存ワークフローに任せる | cleanup-pr-preview-db.ymlが担当 |
FAQ & Installation Steps
These questions and steps mirror the structured data on this page for better search understanding.
? Frequently Asked Questions
What is einja-infra-maintenance?
Ideal for DevOps Agents requiring streamlined infrastructure setup and maintenance for local development environments, Vercel, Neon, and GitHub Actions. einja-infra-maintenance is a skill that facilitates interactive infrastructure environment setup and maintenance, supporting various platforms and tools.
How do I install einja-infra-maintenance?
Run the command: npx killer-skills add einja-inc/einja-management-template/einja-infra-maintenance. It works with Cursor, Windsurf, VS Code, Claude Code, and 19+ other IDEs.
What are the use cases for einja-infra-maintenance?
Key use cases include: Automating local development environment configurations, Deploying applications to Vercel and Neon platforms, Managing environment variables across different infrastructure setups.
Which IDEs are compatible with einja-infra-maintenance?
This skill is compatible with Cursor, Windsurf, VS Code, Trae, Claude Code, OpenClaw, Aider, Codex, OpenCode, Goose, Cline, Roo Code, Kiro, Augment Code, Continue, GitHub Copilot, Sourcegraph Cody, and Amazon Q Developer. Use the Killer-Skills CLI for universal one-command installation.
Are there any limitations for einja-infra-maintenance?
Requires access to specific documentation files at runtime. Limited to the services explicitly mentioned, such as Vercel, Neon, and GitHub Actions.
↓ How To Install
-
1. Open your terminal
Open the terminal or command line in your project directory.
-
2. Run the install command
Run: npx killer-skills add einja-inc/einja-management-template/einja-infra-maintenance. The CLI will automatically detect your IDE or AI agent and configure the skill.
-
3. Start using the skill
The skill is now active. Your AI agent can use einja-infra-maintenance immediately in the current project.