go-cobra
Go言語でコマンドラインツールを開発する際に、cobraライブラリを活用して、コマンドやサブコマンドの追加、フラグの設定、シェル補完の実装、ドキュメント生成など、CLI開発に関するあらゆる作業を支援するSkill。
📜 元の英語説明(参考)
Write, scaffold, and debug Go CLI applications using the spf13/cobra library. Use this skill whenever the user wants to build a command-line interface in Go, add commands/subcommands, work with flags (persistent, local, required), implement shell completions, generate documentation, or asks anything about cobra-based CLI development.
🇯🇵 日本人クリエイター向け解説
Go言語でコマンドラインツールを開発する際に、cobraライブラリを活用して、コマンドやサブコマンドの追加、フラグの設定、シェル補完の実装、ドキュメント生成など、CLI開発に関するあらゆる作業を支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o go-cobra.zip https://jpskill.com/download/8676.zip && unzip -o go-cobra.zip && rm go-cobra.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/8676.zip -OutFile "$d\go-cobra.zip"; Expand-Archive "$d\go-cobra.zip" -DestinationPath $d -Force; ri "$d\go-cobra.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
go-cobra.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
go-cobraフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Cobra CLI Framework Skill
spf13/cobra ライブラリを使用して、Go CLI アプリケーションの作成、スキャフォールディング、デバッグを行います。ユーザーが Go でコマンドラインインターフェースを構築したい場合、CLI にコマンド/サブコマンドを追加したい場合、フラグ(永続的、ローカル、必須)を扱いたい場合、シェル補完を実装したい場合、ドキュメントを生成したい場合、または cobra ベースの CLI 開発について質問がある場合は、このスキルを使用してください。たとえ「CLI ツールを構築したい」または「Go アプリにコマンドを追加するにはどうすればよいか」と言うだけでも構いません。
クイックスタート
インストール
go get -u github.com/spf13/cobra@latest
CLI ジェネレーターの場合(オプションですが、スキャフォールディングには推奨されます):
go install github.com/spf13/cobra-cli@latest
プロジェクト構造
myapp/
cmd/
root.go # ルートコマンドと Execute()
version.go # 追加のコマンド
serve.go
main.go # cmd.Execute() を呼び出すだけ
最小限の main.go
package main
import "myapp/cmd"
func main() {
cmd.Execute()
}
最小限の root.go
package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "myapp",
Short: "アプリケーションの簡単な説明",
Long: `複数行にわたるより詳細な説明。`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hello from myapp!")
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
コアコンセプト
Commands はアクションを表します。Args は物を表します。Flags は動作を修正します。
パターン: APPNAME COMMAND ARG --FLAG
例:
hugo server --port=1313— "server" は command, "port" は flaggit clone URL --bare— "clone" は command, "URL" は arg, "bare" は flag
コマンド構造
コマンドの作成
var serveCmd = &cobra.Command{
Use: "serve", // 呼び出し方
Short: "サーバーを起動", // 1 行のヘルプ
Long: `詳細な説明はこちら...`, // 完全なヘルプテキスト
Example: ` myapp serve --port 8080`, // 使用例
Run: func(cmd *cobra.Command, args []string) {
// コマンドロジックをここに記述
},
}
func init() {
rootCmd.AddCommand(serveCmd)
}
主要なコマンドフィールド
| Field | Purpose |
|---|---|
Use |
使用パターン: "command [args]" |
Aliases |
代替名: []string{"s", "srv"} |
Short |
ヘルプ一覧の簡単な説明 |
Long |
--help の完全な説明 |
Example |
使用例 (2 つのスペースでインデント) |
Run |
実際のコマンドロジック |
RunE |
Run と同じですが、エラーを返します |
Args |
位置引数の検証 |
ValidArgs |
シェル補完用の静的リスト |
ValidArgsFunction |
動的な補完関数 |
Hidden |
ヘルプ出力から非表示 |
Deprecated |
メッセージ付きで非推奨としてマーク |
Version |
バージョン文字列 (--version を有効にする) |
Run vs RunE
呼び出し元にエラーを返す必要がある場合は、RunE を使用します。
var tryCmd = &cobra.Command{
Use: "try",
Short: "何かを試す",
RunE: func(cmd *cobra.Command, args []string) error {
if err := doSomething(); err != nil {
return err // エラーは Cobra によって処理されます
}
return nil
},
}
フラグ
フラグの種類
Persistent Flags — このコマンドとすべてのサブコマンドで使用可能:
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config ファイルのパス")
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "詳細な出力")
Local Flags — この特定のコマンドのみ:
serveCmd.Flags().IntVarP(&port, "port", "p", 8080, "リッスンするポート")
serveCmd.Flags().StringVar(&host, "host", "localhost", "ホストアドレス")
フラグメソッド
| Method | Example |
|---|---|
StringVar |
--name value |
StringVarP |
--name value または -n value |
BoolVar |
--verbose (true) または --verbose=false |
IntVar |
--count 5 |
StringSliceVar |
--tag a --tag b または --tag a,b |
StringArrayVar |
--tag a --tag b (カンマ区切りなし) |
CountVarP |
-v (1), -vv (2), -vvv (3) |
必須フラグ
cmd.Flags().StringVarP(®ion, "region", "r", "", "AWS リージョン")
cmd.MarkFlagRequired("region")
// 永続フラグの場合
cmd.MarkPersistentFlagRequired("config")
フラググループ
// 一緒に使用する必要があります
cmd.MarkFlagsRequiredTogether("username", "password")
// 一緒に使用できません
cmd.MarkFlagsMutuallyExclusive("json", "yaml")
// 少なくとも 1 つが必要
cmd.MarkFlagsOneRequired("json", "yaml")
// ちょうど 1 つが必要 (両方を組み合わせる)
cmd.MarkFlagsOneRequired("json", "yaml")
cmd.MarkFlagsMutuallyExclusive("json", "yaml")
カウントフラグ (詳細度パターン)
var verbose int
func init() {
rootCmd.PersistentFlags().CountVarP(&verbose, "verbose", "v", "詳細度 (-v, -vv, -vvv)")
}
// 使用法:
// myapp -v → verbose = 1
// myapp -vv → verbose = 2
// myapp -vvv → verbose = 3
位置引数
組み込みのバリデーター
cmd.Args = cobra.NoArgs // 引数は許可されません
cmd.Args = cobra.ArbitraryArgs // 任意の引数 (デフォルト)
cmd.Args = cobra.MinimumNArgs(1) // 少なくとも N 個
cmd.Args = cobra.MaximumNArgs(3) // 最大 N 個
cmd.Args = cobra.ExactArgs(2) // ちょうど N 個
cmd.Args = cobra.RangeArgs(1, 3) // 最小と最大の間
cmd.Args = cobra.OnlyValidArgs // ValidArgs リストからのみ
バリデーターの組み合わせ
cmd.Args = cobra.MatchAll(cobra.ExactArgs(2), cobra.OnlyValidArgs)
カスタムバリデーター
cmd.Args = func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return fmt.Errorf("少なくとも 1 つの引数が必要です")
}
if !isValidInput(args[0]) {
return fmt.Errorf("無効な引数: %s", args[0])
}
return nil
}
ライフサイクルフック
フックは次の順序で実行されます。
PersistentPreRun(子に継承されます)PreRunRunPostRun5
(原文はここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Cobra CLI Framework Skill
Write, scaffold, and debug Go CLI applications using the spf13/cobra library. Use this skill whenever the user wants to build a command-line interface in Go, add commands/subcommands to a CLI, work with flags (persistent, local, required), implement shell completions, generate documentation, or asks anything about cobra-based CLI development -- even if they just say "I want to build a CLI tool" or "how do I add commands to my Go app".
Quick Start
Installation
go get -u github.com/spf13/cobra@latest
For the CLI generator (optional but recommended for scaffolding):
go install github.com/spf13/cobra-cli@latest
Project Structure
myapp/
cmd/
root.go # Root command and Execute()
version.go # Additional commands
serve.go
main.go # Just calls cmd.Execute()
Minimal main.go
package main
import "myapp/cmd"
func main() {
cmd.Execute()
}
Minimal root.go
package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "myapp",
Short: "A brief description of your application",
Long: `A longer description that spans multiple lines.`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hello from myapp!")
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
Core Concepts
Commands represent actions. Args are things. Flags modify behavior.
Pattern: APPNAME COMMAND ARG --FLAG
Examples:
hugo server --port=1313— "server" is command, "port" is flaggit clone URL --bare— "clone" is command, "URL" is arg, "bare" is flag
Command Structure
Creating Commands
var serveCmd = &cobra.Command{
Use: "serve", // How to call it
Short: "Start the server", // One-line help
Long: `Detailed description here...`, // Full help text
Example: ` myapp serve --port 8080`, // Usage examples
Run: func(cmd *cobra.Command, args []string) {
// Command logic here
},
}
func init() {
rootCmd.AddCommand(serveCmd)
}
Key Command Fields
| Field | Purpose |
|---|---|
Use |
Usage pattern: "command [args]" |
Aliases |
Alternative names: []string{"s", "srv"} |
Short |
Brief description for help listings |
Long |
Full description for --help |
Example |
Usage examples (indent with 2 spaces) |
Run |
The actual command logic |
RunE |
Same as Run but returns error |
Args |
Positional argument validation |
ValidArgs |
Static list for shell completion |
ValidArgsFunction |
Dynamic completion function |
Hidden |
Hide from help output |
Deprecated |
Mark as deprecated with message |
Version |
Version string (enables --version) |
Run vs RunE
Use RunE when you need to return errors to the caller:
var tryCmd = &cobra.Command{
Use: "try",
Short: "Try something",
RunE: func(cmd *cobra.Command, args []string) error {
if err := doSomething(); err != nil {
return err // Error handled by Cobra
}
return nil
},
}
Flags
Flag Types
Persistent Flags — Available to this command AND all subcommands:
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file path")
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output")
Local Flags — Only for this specific command:
serveCmd.Flags().IntVarP(&port, "port", "p", 8080, "port to listen on")
serveCmd.Flags().StringVar(&host, "host", "localhost", "host address")
Flag Methods
| Method | Example |
|---|---|
StringVar |
--name value |
StringVarP |
--name value or -n value |
BoolVar |
--verbose (true) or --verbose=false |
IntVar |
--count 5 |
StringSliceVar |
--tag a --tag b or --tag a,b |
StringArrayVar |
--tag a --tag b (no comma splitting) |
CountVarP |
-v (1), -vv (2), -vvv (3) |
Required Flags
cmd.Flags().StringVarP(®ion, "region", "r", "", "AWS region")
cmd.MarkFlagRequired("region")
// For persistent flags
cmd.MarkPersistentFlagRequired("config")
Flag Groups
// Must be used together
cmd.MarkFlagsRequiredTogether("username", "password")
// Cannot be used together
cmd.MarkFlagsMutuallyExclusive("json", "yaml")
// At least one required
cmd.MarkFlagsOneRequired("json", "yaml")
// Exactly one required (combine both)
cmd.MarkFlagsOneRequired("json", "yaml")
cmd.MarkFlagsMutuallyExclusive("json", "yaml")
Count Flags (Verbosity Pattern)
var verbose int
func init() {
rootCmd.PersistentFlags().CountVarP(&verbose, "verbose", "v", "verbosity (-v, -vv, -vvv)")
}
// Usage:
// myapp -v → verbose = 1
// myapp -vv → verbose = 2
// myapp -vvv → verbose = 3
Positional Arguments
Built-in Validators
cmd.Args = cobra.NoArgs // No args allowed
cmd.Args = cobra.ArbitraryArgs // Any args (default)
cmd.Args = cobra.MinimumNArgs(1) // At least N
cmd.Args = cobra.MaximumNArgs(3) // At most N
cmd.Args = cobra.ExactArgs(2) // Exactly N
cmd.Args = cobra.RangeArgs(1, 3) // Between min and max
cmd.Args = cobra.OnlyValidArgs // Only from ValidArgs list
Combining Validators
cmd.Args = cobra.MatchAll(cobra.ExactArgs(2), cobra.OnlyValidArgs)
Custom Validator
cmd.Args = func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return fmt.Errorf("requires at least 1 arg")
}
if !isValidInput(args[0]) {
return fmt.Errorf("invalid argument: %s", args[0])
}
return nil
}
Lifecycle Hooks
Hooks execute in this order:
PersistentPreRun(inherited by children)PreRunRunPostRunPersistentPostRun(inherited by children)
var rootCmd = &cobra.Command{
Use: "app",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
// Runs before every command (including subcommands)
initLogging()
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
// Runs after every command
cleanup()
},
}
var subCmd = &cobra.Command{
Use: "sub",
PreRun: func(cmd *cobra.Command, args []string) {
// Only for this command, before Run
},
Run: func(cmd *cobra.Command, args []string) {
// Main logic
},
}
Use *RunE variants to return errors:
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
return initConfig()
}
Viper Integration
Cobra integrates seamlessly with Viper for configuration management. See references/viper-integration.md for complete documentation.
import "github.com/spf13/viper"
func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file")
rootCmd.PersistentFlags().String("author", "Me", "author name")
// Bind flag to viper - priority: flag > env > config > default
viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
}
func initConfig() {
if cfgFile != "" {
viper.SetConfigFile(cfgFile)
} else {
home, _ := os.UserHomeDir()
viper.AddConfigPath(home)
viper.SetConfigType("yaml")
viper.SetConfigName(".myapp")
}
viper.AutomaticEnv()
viper.ReadInConfig()
}
// IMPORTANT: Use viper.GetString("author"), not the flag variable
// Flag variables are NOT updated from config file values
Help & Usage
Automatic Features
--help/-hflag added automaticallyhelpsubcommand added when you have subcommands- Typo suggestions:
myapp srever→ "Did you mean 'server'?"
Customization
// Custom help template
cmd.SetHelpTemplate(`Custom help: {{.Use}}`)
// Custom usage template
cmd.SetUsageTemplate(`Usage: {{.UseLine}}`)
// Custom help function
cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
fmt.Println("Custom help!")
})
// Disable suggestions
cmd.DisableSuggestions = true
// Adjust suggestion distance
cmd.SuggestionsMinimumDistance = 1
Version Flag
var rootCmd = &cobra.Command{
Use: "myapp",
Version: "1.0.0", // Enables --version flag
}
// Custom version template
cmd.SetVersionTemplate(`Version: {{.Version}}`)
Grouping Commands
rootCmd.AddGroup(&cobra.Group{ID: "core", Title: "Core Commands:"})
rootCmd.AddGroup(&cobra.Group{ID: "util", Title: "Utility Commands:"})
serveCmd.GroupID = "core"
versionCmd.GroupID = "util"
Shell Completions
Cobra automatically provides a completion command. For detailed shell completion implementation, see references/completions.md.
Quick usage:
# Bash
source <(myapp completion bash)
# Zsh
myapp completion zsh > "${fpath[1]}/_myapp"
# Fish
myapp completion fish > ~/.config/fish/completions/myapp.fish
# PowerShell
myapp completion powershell | Out-String | Invoke-Expression
Dynamic Completions
cmd.ValidArgsFunction = func(cmd *cobra.Command, args []string, toComplete string) ([]cobra.Completion, cobra.ShellCompDirective) {
if len(args) != 0 {
return nil, cobra.ShellCompDirectiveNoFileComp
}
return []cobra.Completion{"option1", "option2"}, cobra.ShellCompDirectiveNoFileComp
}
Documentation Generation
Cobra can generate man pages, markdown, and more. See references/docgen.md for details.
Quick example:
import "github.com/spf13/cobra/doc"
// Markdown
doc.GenMarkdownTree(rootCmd, "./docs")
// Man pages
header := &doc.GenManHeader{Title: "MYAPP", Section: "1"}
doc.GenManTree(rootCmd, header, "./man")
Creating Plugins
For tools like kubectl that use plugins (kubectl-myplugin called as kubectl myplugin):
rootCmd := &cobra.Command{
Use: "kubectl-myplugin",
Annotations: map[string]string{
cobra.CommandDisplayNameAnnotation: "kubectl myplugin",
},
}
Global Settings
// Enable case-insensitive command matching
cobra.EnableCaseInsensitive = true
// Enable prefix matching (dangerous for production)
cobra.EnablePrefixMatching = true
// Execute all parent hooks (not just first found)
cobra.EnableTraverseRunHooks = true
// Disable command sorting in help
cobra.EnableCommandSorting = false
Testing Commands
func TestServeCommand(t *testing.T) {
cmd := rootCmd
// Capture output
buf := new(bytes.Buffer)
cmd.SetOut(buf)
cmd.SetErr(buf)
// Set args
cmd.SetArgs([]string{"serve", "--port", "9000"})
// Execute
err := cmd.Execute()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Check output
if !strings.Contains(buf.String(), "expected") {
t.Errorf("unexpected output: %s", buf.String())
}
}
Context Support
var rootCmd = &cobra.Command{
Use: "myapp",
Run: func(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
// Use context for cancellation, timeouts, etc.
},
}
// Execute with context
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
rootCmd.ExecuteContext(ctx)
Common Patterns
Subcommand Organization
For large apps, organize subcommands in separate packages:
cmd/
root.go
config/
config.go # Defines configCmd
get.go # config get
set.go # config set
// cmd/config/config.go
var ConfigCmd = &cobra.Command{Use: "config", Short: "Manage configuration"}
func init() {
ConfigCmd.AddCommand(getCmd)
ConfigCmd.AddCommand(setCmd)
}
// cmd/root.go
import "myapp/cmd/config"
func init() {
rootCmd.AddCommand(config.ConfigCmd)
}
Error Handling
func Execute() {
if err := rootCmd.Execute(); err != nil {
// Error already printed by Cobra
os.Exit(1)
}
}
// To silence automatic error printing:
rootCmd.SilenceErrors = true
rootCmd.SilenceUsage = true
Silent/Quiet Mode
var quiet bool
func init() {
rootCmd.PersistentFlags().BoolVarP(&quiet, "quiet", "q", false, "suppress output")
}
func output(msg string) {
if !quiet {
fmt.Println(msg)
}
}
Reference Files
For more detailed information on specific topics:
references/completions.md— Shell completion implementation detailsreferences/docgen.md— Documentation generation (man, markdown, yaml, rst)references/advanced.md— Advanced patterns and edge cases