# Go CLI

> CLI application patterns and best practices

- Skill: `majiayu000/go-cli` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add majiayu000/go-cli`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/go-cli/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/go-cli

---


# Go CLI Skill

Supplementary CLI patterns and utilities.

## Overview

Additional CLI patterns for argument parsing, progress indicators, and user interaction.

## Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| feature | string | yes | - | Feature: "progress", "prompt", "color" |

## Core Topics

### Argument Validation
```go
var cmd = &cobra.Command{
    Use:   "process [file]",
    Args:  cobra.ExactArgs(1),
    RunE: func(cmd *cobra.Command, args []string) error {
        file := args[0]
        if _, err := os.Stat(file); os.IsNotExist(err) {
            return fmt.Errorf("file not found: %s", file)
        }
        return process(file)
    },
}
```

### Progress Bar
```go
func DownloadWithProgress(url, dest string) error {
    resp, err := http.Get(url)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    file, err := os.Create(dest)
    if err != nil {
        return err
    }
    defer file.Close()

    bar := progressbar.DefaultBytes(resp.ContentLength, "downloading")
    _, err = io.Copy(io.MultiWriter(file, bar), resp.Body)
    return err
}
```

### Interactive Prompt
```go
func ConfirmAction(message string) bool {
    reader := bufio.NewReader(os.Stdin)
    fmt.Printf("%s [y/N]: ", message)

    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(strings.ToLower(input))

    return input == "y" || input == "yes"
}
```

### Colored Output
```go
import "github.com/fatih/color"

var (
    successColor = color.New(color.FgGreen).SprintFunc()
    errorColor   = color.New(color.FgRed).SprintFunc()
    warnColor    = color.New(color.FgYellow).SprintFunc()
)

func PrintSuccess(msg string) {
    fmt.Println(successColor("✓"), msg)
}

func PrintError(msg string) {
    fmt.Fprintln(os.Stderr, errorColor("✗"), msg)
}
```

## Troubleshooting

### Failure Modes
| Symptom | Cause | Fix |
|---------|-------|-----|
| Colors not showing | No TTY | Check isatty |
| Input hangs | Stdin closed | Handle EOF |

## Usage

```
Skill("go-cli")
```

