Install any skill in seconds. Free to start, no credit card required.
Get Started Free →You are an expert in Cobra, the most popular Go library for building modern CLI applications. You help developers create command-line tools with subcommands, flags, argument validation, shell completions, and help generation — powering CLIs like kubectl, Hugo, GitHub CLI, and Docker.
.claude/skills/terminalskills-cobra/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 49% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 50% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 63% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 52% | 0% |
You are an expert in Cobra, the most popular Go library for building modern CLI applications. You help developers create command-line tools with subcommands, flags, argument validation, shell completions, and help generation — powering CLIs like kubectl, Hugo, GitHub CLI, and Docker.
go// cmd/root.go — Root command package cmd import ( "fmt" "os" "github.com/spf13/cobra" "github.com/spf13/viper" ) var cfgFile string var verbose bool var rootCmd = &cobra.Command{ Use: "myctl", Short: "My CLI tool for managing stuff", Long: `A comprehensive CLI tool for managing deployments, configs, and services.`, PersistentPreRun: func(cmd *cobra.Command, args []string) { if verbose { fmt.Println("Verbose mode enabled") } }, } func Execute() { if err := rootCmd.Execute(); err != nil { os.Exit(1) } } func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default $HOME/.myctl.yaml)") rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output") } func initConfig() { if cfgFile != "" { viper.SetConfigFile(cfgFile) } else { home, _ := os.UserHomeDir() viper.AddConfigPath(home) viper.SetConfigName(".myctl") } viper.AutomaticEnv() viper.ReadInConfig() }
go// cmd/deploy.go — Subcommand with flags package cmd import ( "fmt" "github.com/spf13/cobra" ) var deployCmd = &cobra.Command{ Use: "deploy [service]", Short: "Deploy a service to the target environment", Long: `Deploy a service to the specified environment with optional version override.`, Args: cobra.ExactArgs(1), // Require exactly 1 argument Example: ` myctl deploy api --env production --version v2.1.0 myctl deploy worker --env staging --dry-run`, RunE: func(cmd *cobra.Command, args []string) error { service := args[0] env, _ := cmd.Flags().GetString("env") version, _ := cmd.Flags().GetString("version") dryRun, _ := cmd.Flags().GetBool("dry-run") if dryRun { fmt.Printf("DRY RUN: Would deploy %s@%s to %s\n", service, version, env) return nil } fmt.Printf("Deploying %s@%s to %s...\n", service, version, env) return performDeploy(service, env, version) }, } func init() { rootCmd.AddCommand(deployCmd) deployCmd.Flags().StringP("env", "e", "staging", "target environment") deployCmd.Flags().String("version", "latest", "version to deploy") deployCmd.Flags().Bool("dry-run", false, "simulate deployment") deployCmd.MarkFlagRequired("env") }
go// cmd/status.go — Another subcommand var statusCmd = &cobra.Command{ Use: "status [service]", Short: "Show service status", Aliases: []string{"st"}, // myctl st == myctl status Args: cobra.MaximumNArgs(1), ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { // Dynamic completion: list available services services := []string{"api", "worker", "scheduler", "web"} return services, cobra.ShellCompDirectiveNoFileComp }, RunE: func(cmd *cobra.Command, args []string) error { if len(args) == 0 { return showAllStatus() } return showServiceStatus(args[0]) }, }
bash# Generate completions myctl completion bash > /etc/bash_completion.d/myctl myctl completion zsh > "${fpath[1]}/_myctl" myctl completion fish > ~/.config/fish/completions/myctl.fish # Cobra generates completions for all commands, flags, and arguments automatically
bashgo get github.com/spf13/cobra # Scaffolding tool go install github.com/spf13/cobra-cli@latest cobra-cli init cobra-cli add deploy cobra-cli add status
myctl deploy, myctl status, myctl configRunE (returns error) instead of Run; Cobra handles error display and exit codesArgs: cobra.ExactArgs(1) or custom validators; catch errors before executionValidArgsFunction for dynamic completion--help, usage text, and subcommand lists; customize with Long and Examplest for status, d for deployPersistentFlags() on root for flags that apply to all subcommands (--verbose, --config)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | pass→pass | 11,647 | 9,697 | -17% | 1 | 1 | 0% | 2,288 | 3,420 | +49% | 0 | 0 | — |
case-04 | pass→pass | 11,750 | 11,792 | +0% | 1 | 1 | 0% | 2,514 | 3,783 | +50% | 0 | 0 | — |
case-01 | fail→pass | 12,686 | 11,156 | -12% | 1 | 1 | 0% | 2,574 | 3,779 | +47% | 0 | 0 | — |
case-02 | fail→fail | 6,699 | 6,588 | -2% | 1 | 1 | 0% | 1,255 | 2,620 | +109% | 0 | 0 | — |
case-05 | pass→pass | 6,482 | 3,249 | -50% | 1 | 1 | 0% | 1,268 | 2,073 | +63% | 0 | 0 | — |
case-06 | pass→pass | 13,398 | 16,022 | +20% | 1 | 1 | 0% | 2,792 | 4,253 | +52% | 0 | 0 | — |
case-07 | pass→pass | 30,485 | 6,518 | -79% | 1 | 1 | 0% | 2,154 | 2,582 | +20% | 0 | 0 | — |
case-08 | pass→pass | 9,768 | 6,730 | -31% | 1 | 1 | 0% | 1,733 | 2,653 | +53% | 0 | 0 | — |
case-09 | pass→pass | 13,836 | 12,411 | -10% | 1 | 1 | 0% | 2,540 | 3,674 | +45% | 0 | 0 | — |
case-10 | pass→pass | 5,310 | 5,796 | +9% | 1 | 1 | 0% | 860 | 2,519 | +193% | 0 | 0 | — |
case-11 | pass→pass | 4,504 | 3,909 | -13% | 1 | 1 | 0% | 886 | 1,995 | +125% | 0 | 0 | — |
case-12 | pass→pass | 6,488 | 3,711 | -43% | 1 | 1 | 0% | 1,089 | 2,048 | +88% | 0 | 0 | — |
case-13 | pass→pass | 8,628 | 4,932 | -43% | 1 | 1 | 0% | 1,674 | 2,320 | +39% | 0 | 0 | — |
case-14 | pass→pass | 14,944 | 10,547 | -29% | 1 | 1 | 0% | 2,680 | 3,316 | +24% | 0 | 0 | — |
case-15 | pass→pass | 12,256 | 12,061 | -2% | 1 | 1 | 0% | 2,078 | 3,612 | +74% | 0 | 0 | — |
case-16 | pass→pass | 10,105 | 9,640 | -5% | 1 | 1 | 0% | 1,803 | 3,304 | +83% | 0 | 0 | — |
case-17 | pass→pass | 9,053 | 6,186 | -32% | 1 | 1 | 0% | 1,740 | 2,638 | +52% | 0 | 0 | — |
case-18 | pass→pass | 13,320 | 12,826 | -4% | 1 | 1 | 0% | 2,481 | 3,741 | +51% | 0 | 0 | — |
case-19 | pass→pass | 7,711 | 6,239 | -19% | 1 | 1 | 0% | 1,576 | 2,485 | +58% | 0 | 0 | — |
case-20 | pass→pass | 8,738 | 8,370 | -4% | 1 | 1 | 0% | 1,545 | 2,988 | +93% | 0 | 0 | — |
case-21 | pass→pass | 4,943 | 5,245 | +6% | 1 | 1 | 0% | 1,001 | 2,506 | +150% | 0 | 0 | — |
case-22 | pass→pass | 6,017 | 5,977 | -1% | 1 | 1 | 0% | 1,175 | 2,518 | +114% | 0 | 0 | — |
case-23 | pass→pass | 7,675 | 8,213 | +7% | 1 | 1 | 0% | 1,458 | 2,932 | +101% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +4 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.