要件
env-sync に新しいサブコマンド setup を追加し、認証 config ファイル(.env-sync.config.yaml / ~/.config/env-sync/config.yaml)を対話プロンプトで生成できるようにする。これは既存の init(env-sync.yaml = 変数定義ファイルの雛形生成)とは別概念で、未カバーだった「認証情報・ID の config」を担う。
対象ファイル
- 新規: internal/config/setup.go(RunSetup / フラグ解析 / 対話プロンプト / YAML 生成)
- 新規: internal/config/setup_test.go
- 変更: cmd/env-sync/main.go — run() でサブコマンド
setup を分岐(既存 init の args[0] == "init" 分岐と同じ書き方)、printUsage() のサブコマンド一覧とオプション説明に setup を追記
- 参照: internal/config/appconfig.go(AppConfig / AppVercelConfig / AppGitHubConfig のスキーマ・globalAppConfigPath()・projectAppConfigFile・warnIfInsecurePermissions に整合させる)
振る舞い
- 対話で以下を順に質問して config を組み立てる:
- Vercel を設定するか(Y/n)→ project_id、team_id(任意)、token の入力方法
- GitHub を設定するか(Y/n)→ repo(owner/repo)、token の入力方法
- token はデフォルトで生 token をファイルに書かず
${VERCEL_TOKEN} / ${GITHUB_TOKEN} の環境変数参照形式で書き出す(appconfig.go の expandEnvRefs が ${VAR} / ${VAR:-default} を展開できることに合わせる)。生 token を直接書く選択をした場合のみ平文で書き出す。
- 出力先フラグ: デフォルトは project の .env-sync.config.yaml。--global で ~/.config/env-sync/config.yaml(globalAppConfigPath() と同じ XDG_CONFIG_HOME 尊重ロジックを使う)。
- 上書き保護: 既存ファイルがある場合は init と同様に --force なしでは拒否してエラー(O_CREATE|O_EXCL でアトミックに)。
- 生 token を平文で書き出す場合、または --global 出力時は、ファイルを 0600 で作成し、書き込み後に「トークンが含まれます。パーミッションは 0600 です」と案内する(warnIfInsecurePermissions の方針に合わせる)。
- 非対話環境(TTY なし)では対話できないためエラーで停止し、フラグでの指定方法または手書きを案内する。
- projects[] / repos[](モノレポ向け複数ターゲット)は今回のスコープ外でよい(単一プロジェクト/単一リポジトリのスキーマを生成。必要なら手で追記する旨をコメントで案内)。
ドキュメント
- README にも setup サブコマンドの説明を追記(init の隣、または config ファイルの章)。
完了条件
完了条件
-
env-sync setup で対話プロンプトが起動し、Vercel / GitHub の設定有無・project_id・repo・token 入力方法を質問できる
- 生成される YAML が appconfig.go の AppConfig スキーマ(vercel.token/project_id/team_id, github.token/repo)として LoadAppConfig() で正しくパースできる
- token はデフォルトで
${VERCEL_TOKEN} / ${GITHUB_TOKEN} 形式の環境変数参照で書き出される
- デフォルトは .env-sync.config.yaml に出力し、--global で ~/.config/env-sync/config.yaml に出力される(XDG_CONFIG_HOME 尊重)
- 既存ファイルがある場合 --force なしではエラーで停止し上書きしない
- 生 token を平文で書く場合・--global 出力時はファイルが 0600 で作成される
- 非対話環境(TTY なし)ではエラーで停止し案内を出す
- printUsage() のサブコマンド一覧・オプション説明に setup が載っている
- README に setup の説明が追記されている
- 既存テストを含め
go test ./... が通り、setup_test.go で YAML 生成・出力先解決・上書き保護・token 参照形式のテストが追加されている
確認手順
go build -o env-sync ./cmd/env-sync
-
go test ./... がすべて green
-
go vet ./... でエラーが出ない
- 一時ディレクトリで
./env-sync setup を実行し、対話に答えて .env-sync.config.yaml が生成されることを確認(生成物に生 token が含まれず ${VERCEL_TOKEN} 参照になっていること、ファイル末尾に見直し案内が出ること)
- 生成した .env-sync.config.yaml がある状態で再度
./env-sync setup を実行し、--force なしでエラー終了することを確認
-
./env-sync setup --global で ~/.config/env-sync/config.yaml(または $XDG_CONFIG_HOME/env-sync/config.yaml)に出力され、パーミッションが 0600 であることを確認
-
./env-sync setup -h と ./env-sync -h の usage に setup が表示されることを確認
- 生成した config を使い
VERCEL_TOKEN=xxx ./env-sync --dry-run 等で config が読み込まれること(LoadAppConfig 経由で解決されること)を確認
要件
env-sync に新しいサブコマンド
setupを追加し、認証 config ファイル(.env-sync.config.yaml / ~/.config/env-sync/config.yaml)を対話プロンプトで生成できるようにする。これは既存のinit(env-sync.yaml = 変数定義ファイルの雛形生成)とは別概念で、未カバーだった「認証情報・ID の config」を担う。対象ファイル
setupを分岐(既存initのargs[0] == "init"分岐と同じ書き方)、printUsage() のサブコマンド一覧とオプション説明に setup を追記振る舞い
${VERCEL_TOKEN}/${GITHUB_TOKEN}の環境変数参照形式で書き出す(appconfig.go の expandEnvRefs が ${VAR} / ${VAR:-default} を展開できることに合わせる)。生 token を直接書く選択をした場合のみ平文で書き出す。ドキュメント
完了条件
完了条件
env-sync setupで対話プロンプトが起動し、Vercel / GitHub の設定有無・project_id・repo・token 入力方法を質問できる${VERCEL_TOKEN}/${GITHUB_TOKEN}形式の環境変数参照で書き出されるgo test ./...が通り、setup_test.go で YAML 生成・出力先解決・上書き保護・token 参照形式のテストが追加されている確認手順
go build -o env-sync ./cmd/env-syncgo test ./...がすべて greengo vet ./...でエラーが出ない./env-sync setupを実行し、対話に答えて .env-sync.config.yaml が生成されることを確認(生成物に生 token が含まれず ${VERCEL_TOKEN} 参照になっていること、ファイル末尾に見直し案内が出ること)./env-sync setupを実行し、--force なしでエラー終了することを確認./env-sync setup --globalで ~/.config/env-sync/config.yaml(または $XDG_CONFIG_HOME/env-sync/config.yaml)に出力され、パーミッションが 0600 であることを確認./env-sync setup -hと./env-sync -hの usage に setup が表示されることを確認VERCEL_TOKEN=xxx ./env-sync --dry-run等で config が読み込まれること(LoadAppConfig 経由で解決されること)を確認