#!/usr/bin/env bash # init_cli_app # ------------ # Scaffold de Go CLI app con subcomandos, opcionalmente con TUI Bubbletea. # # Genera main.go con routing de subcomandos (os.Args + switch), cmd_version.go, # cmd_status.go, Makefile, .gitignore, go.mod y app.md. # # Con --with-tui genera ademas model.go con un modelo Bubbletea base y main.go # arranca la TUI con tea.NewProgram().Run() en modo fullscreen. # # USO: # ./init_cli_app.sh [--with-tui] # # EJEMPLOS: # ./init_cli_app.sh my_cli # ./init_cli_app.sh deploy_helper --with-tui set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REGISTRY_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" source "$REGISTRY_ROOT/bash/functions/shell/assert_command_exists.sh" NOMBRE="" WITH_TUI="false" while [ $# -gt 0 ]; do case "$1" in --with-tui) WITH_TUI="true"; shift ;; -h|--help) grep "^#" "$0" | sed 's/^# \?//' ; exit 0 ;; -*) echo "Flag desconocido: $1" >&2 ; exit 1 ;; *) if [ -z "$NOMBRE" ]; then NOMBRE="$1" else echo "Argumento extra ignorado: $1" >&2 fi shift ;; esac done if [ -z "$NOMBRE" ]; then echo "Uso: $0 [--with-tui]" >&2 exit 1 fi APP_DIR="${REGISTRY_ROOT}/apps/${NOMBRE}" if [ -d "$APP_DIR" ]; then echo "ERROR: ${APP_DIR} ya existe. Abortando." >&2 exit 1 fi echo "" echo "════════════════════════════════════════════════════════════" echo " INIT CLI APP: ${NOMBRE}" echo " Directorio: ${APP_DIR}" echo " TUI: ${WITH_TUI}" echo "════════════════════════════════════════════════════════════" echo "" # ── 1. Verificar Go ────────────────────────────────────────── echo "[1/5] Verificando herramientas..." assert_command_exists go echo " Go: $(go version)" # ── 2. Crear estructura ────────────────────────────────────── echo "[2/5] Creando estructura..." mkdir -p "$APP_DIR" # go.mod if [ "$WITH_TUI" = "true" ]; then cat > "$APP_DIR/go.mod" < ${REGISTRY_ROOT} EOF else cat > "$APP_DIR/go.mod" < ${REGISTRY_ROOT} EOF fi # ── 3. Archivos Go ─────────────────────────────────────────── echo "[3/5] Escribiendo archivos Go..." # cmd_version.go — siempre existe cat > "$APP_DIR/cmd_version.go" < "$APP_DIR/cmd_status.go" < "$APP_DIR/model.go" < "$APP_DIR/main.go" < "$APP_DIR/main.go" < Comandos: version Imprime la version status Muestra info del sistema help Muestra esta ayuda\`) } EOF fi # ── 4. Makefile, .gitignore, app.md ───────────────────────── echo "[4/5] Escribiendo Makefile, .gitignore, app.md..." cat > "$APP_DIR/Makefile" < "$APP_DIR/.gitignore" < "$APP_DIR/app.md" <&1 | tail -5; then : fi if CGO_ENABLED=1 go vet -tags fts5 ./... 2>&1; then echo " go vet OK" else echo " WARN: go vet fallo" >&2 fi ) echo "" echo "════════════════════════════════════════════════════════════" echo " CLI APP '${NOMBRE}' LISTA" echo "════════════════════════════════════════════════════════════" echo "" echo " Pasos siguientes:" echo " cd apps/${NOMBRE}" echo " make build" if [ "$WITH_TUI" = "true" ]; then echo " ./${NOMBRE} # arranca la TUI fullscreen" echo " ./${NOMBRE} version # comando CLI" else echo " ./${NOMBRE} version" echo " ./${NOMBRE} status" fi echo ""