Conversation
- internal/config/setup.go: RunSetup / ParseSetupFlags / BuildSetupYAML / WriteSetupFile を追加
- 対話プロンプトで Vercel/GitHub の設定を収集し .env-sync.config.yaml を生成
- token はデフォルトで \${VERCEL_TOKEN}/\${GITHUB_TOKEN} 環境変数参照形式
- 生 token または --global 出力時はファイルを 0600 で作成
- 非対話環境(TTY なし)ではエラーで停止し手書き方法を案内
- internal/config/setup_test.go: YAML 生成・出力先解決・上書き保護・token 参照形式のテストを追加
- cmd/env-sync/main.go: run() に setup 分岐を追加、printUsage() にサブコマンド一覧とオプション説明を追記
- README.md: setup サブコマンドの説明をクイックスタートと章として追記
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MUNfaHdh77j6ZEA2v8oieH
There was a problem hiding this comment.
Pull request overview
env-sync に新しい setup サブコマンドを追加し、対話プロンプトで認証 config(.env-sync.config.yaml / ~/.config/env-sync/config.yaml)を生成できるようにする PR です。既存の LoadAppConfig() スキーマに沿った YAML を生成し、README/usage 表示も更新しています。
Changes:
env-sync setupの対話フロー・YAML 生成・ファイル出力(上書き保護/出力先切替/パーミッション)を実装setupの統合テスト(YAML生成、global 解決、上書き拒否、token 参照形式、パーミッション)を追加- CLI usage と README に
setupの説明を追加
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| README.md | クイックスタートに setup を追加し、対話生成の説明を追記 |
| internal/config/setup.go | setup サブコマンド本体(プロンプト、YAML生成、出力/権限/上書き制御)を追加 |
| internal/config/setup_test.go | setup のYAML/出力先/上書き保護/パーミッション等のテストを追加 |
| cmd/env-sync/main.go | setup サブコマンド分岐と usage 表示を追加 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+69
to
+84
| if answers.UseVercel { | ||
| sb.WriteString("vercel:\n") | ||
| sb.WriteString(" token: ") | ||
| sb.WriteString(answers.VercelTokenRef) | ||
| sb.WriteString("\n") | ||
| if answers.VercelProjectID != "" { | ||
| sb.WriteString(" project_id: ") | ||
| sb.WriteString(answers.VercelProjectID) | ||
| sb.WriteString("\n") | ||
| } | ||
| if answers.VercelTeamID != "" { | ||
| sb.WriteString(" team_id: ") | ||
| sb.WriteString(answers.VercelTeamID) | ||
| sb.WriteString("\n") | ||
| } | ||
| } |
Comment on lines
+86
to
+96
| if answers.UseGitHub { | ||
| sb.WriteString("github:\n") | ||
| sb.WriteString(" token: ") | ||
| sb.WriteString(answers.GitHubTokenRef) | ||
| sb.WriteString("\n") | ||
| if answers.GitHubRepo != "" { | ||
| sb.WriteString(" repo: ") | ||
| sb.WriteString(answers.GitHubRepo) | ||
| sb.WriteString("\n") | ||
| } | ||
| } |
Comment on lines
+103
to
+123
| func WriteSetupFile(path, content string, perm os.FileMode, force bool) error { | ||
| flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC | ||
| if !force { | ||
| flags = os.O_WRONLY | os.O_CREATE | os.O_EXCL | ||
| } | ||
| f, err := os.OpenFile(path, flags, perm) | ||
| if err != nil { | ||
| if !force && os.IsExist(err) { | ||
| return fmt.Errorf("既に存在します: %s(上書きするには --force)", path) | ||
| } | ||
| return fmt.Errorf("config ファイルの書き込みに失敗: %s: %s", path, err) | ||
| } | ||
| if _, err := f.WriteString(content); err != nil { | ||
| f.Close() | ||
| return fmt.Errorf("config ファイルの書き込みに失敗: %s: %s", path, err) | ||
| } | ||
| if err := f.Close(); err != nil { | ||
| return fmt.Errorf("config ファイルの書き込みに失敗: %s: %s", path, err) | ||
| } | ||
| return nil | ||
| } |
- BuildSetupYAML: ユーザー入力値を YAML シングルクォートスカラでエスケープ (:、#、$、改行などの特殊文字でも YAML が壊れない) - WriteSetupFile: --force 上書き時も os.Chmod で perm を確実に適用 (os.OpenFile の perm は新規作成時のみ有効なため既存ファイルに反映されなかった) - TestWriteSetupFile_ForceOverwrite_Permissions を追加 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUNfaHdh77j6ZEA2v8oieH
Comment on lines
+61
to
+63
| // yamlSingleQuote は value を YAML シングルクォートスカラとしてエスケープして返す。 | ||
| // シングルクォートスカラ内では ' のみ ” に置換すればよく、 | ||
| // :、#、$、改行などの特殊文字を含む値でも安全に扱える。 |
Comment on lines
+288
to
+292
| line, err := reader.ReadString('\n') | ||
| if err != nil && err != io.EOF { | ||
| return "", fmt.Errorf("入力の読み込みに失敗: %w", err) | ||
| } | ||
| return strings.TrimRight(line, "\r\n"), nil |
| return answers, err | ||
| } | ||
| if useEnvRef { | ||
| answers.VercelTokenRef = "${VERCEL_TOKEN}" |
| return answers, err | ||
| } | ||
| if useEnvRef { | ||
| answers.GitHubTokenRef = "${GITHUB_TOKEN}" |
Comment on lines
+150
to
+163
| // AppConfig スキーマとして YAML パースできること | ||
| var cfg config.AppConfig | ||
| if err := yaml.Unmarshal([]byte(yamlText), &cfg); err != nil { | ||
| t.Fatalf("生成 YAML が AppConfig としてパースできない: %v\n%s", err, yamlText) | ||
| } | ||
| if cfg.Vercel.ProjectID != "prj_round" { | ||
| t.Errorf("Vercel.ProjectID = %q, want prj_round", cfg.Vercel.ProjectID) | ||
| } | ||
| if cfg.Vercel.TeamID != "team_round" { | ||
| t.Errorf("Vercel.TeamID = %q, want team_round", cfg.Vercel.TeamID) | ||
| } | ||
| if cfg.Vercel.Token != "${VERCEL_TOKEN}" { | ||
| t.Errorf("Vercel.Token = %q, want ${VERCEL_TOKEN}", cfg.Vercel.Token) | ||
| } |
- yamlSingleQuote: コメントの誤記(" → '' シングルクォート2つ)を修正 - setupReadLine: TrimRight から TrimSpace に変更し、 project_id/repo/token の前後空白混入を防止 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUNfaHdh77j6ZEA2v8oieH
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
タスク
env-sync に新しいサブコマンド
setupを追加し、認証 config ファイル(.env-sync.config.yaml / ~/.config/env-sync/config.yaml)を対話プロンプトで生成できるようにする。完了条件
env-sync setupで対話プロンプトが起動し、Vercel / GitHub の設定有無・project_id・repo・token 入力方法を質問できる${VERCEL_TOKEN}/${GITHUB_TOKEN}形式の環境変数参照で書き出されるgo test ./...が通り、setup_test.go でテストが追加されている動作確認
go build ./...)go test ./...がすべて greengo vet ./...でエラーなし変更ファイル
internal/config/setup.go: RunSetup / ParseSetupFlags / BuildSetupYAML / WriteSetupFile / RunSetupWithReader を実装internal/config/setup_test.go: YAML生成・出力先解決・上書き保護・token参照形式・パーミッションのテストを追加cmd/env-sync/main.go: run() に setup 分岐を追加、printUsage() を更新README.md: クイックスタートと setup 章を追加🤖 Generated with Claude Code
https://claude.ai/code/session_01MUNfaHdh77j6ZEA2v8oieH