GL
GrowLoop CLI — Amazon Q Developer Spec
Autocompletado inteligente para el CLI de automatización de marketing B2B
TypeScript Amazon Q Fig API macOS
Subcomandos
5
campaign · workflow · export · deploy · config
Opciones totales
24
Flags, args dinámicos y templates
Generadores dinámicos
6
Desde API, git tags, k8s, SSH config
Tiempo ahorrado
~4h
Por dev/semana vs. consultar --help
Demo — Autocompletado en acción
growloop — bash — 80×24
# Usuario empieza a escribir — Q muestra sugerencias dinámicas
~/projects/growloop $ growloop camp
Subcomandos de growloop
📣 campaign Gestionar campañas de email y SMS
~/projects/growloop $ growloop campaign
Acciones disponibles — campaign
🚀 launch Lanzar una campaña activa
pause Pausar envíos en curso
📊 stats Ver métricas de apertura y conversión
⚠️ delete Eliminar campaña permanentemente ⚡ PELIGROSO
📋 list Listar todas las campañas
~/projects/growloop $ growloop campaign launch
Campañas activas — desde API en vivo
📣 welcome-series-q3 Email · 4,200 contactos · creada 15 jun
📣 churn-recovery-pro Email + SMS · 1,820 contactos
📣 upsell-annual-plan Email · 890 contactos · A/B test activo
📣 reactivation-may SMS · 3,100 contactos · paused
~/projects/growloop $ growloop campaign launch welcome-series-q3 --env
Entornos disponibles
🟡 staging Pruebas sin envíos reales
🔴 production Envío real a contactos
🟢 sandbox Datos de test aislados
~/projects/growloop $ growloop campaign launch welcome-series-q3 --env production
Lanzando campaña welcome-series-q3 → producción
4,200 contactos en cola · ETA: 12 min
Dashboard: https://app.growloop.io/campaigns/wq3
Árbol de comandos — growloop CLI
growloop — CLI de GrowLoop Marketing Automation v2.4.0
├─ campaign Gestión de campañas de marketing
├─ launch <campaign-id> --env --dry-run --batch-size
├─ pause <campaign-id> --reason
├─ stats <campaign-id> --format --from --to
├─ list --status --type --limit
└─ delete <campaign-id> ⚠ isDangerous
├─ workflow Automatizaciones y triggers
├─ trigger <workflow-id> --data --async
├─ status <run-id> --watch
└─ reset <workflow-id> ⚠ isDangerous
├─ export Exportación de datos y reportes
├─ contacts --segment --format --output
└─ analytics --metric --from --to --output
├─ deploy Despliegue de integraciones y templates
├─ integration <name> --env --tag --replicas
└─ rollback <name> --revision ⚠ isDangerous
└─ config Configuración local y tokens API
├─ set <key> <value>
├─ get <key>
└─ auth --token --org
--verbose / -v (isPersistent — disponible en todos los subcomandos)
--config (isPersistent — ruta al archivo de configuración, template: filepaths)
⟨⟩
Completion Spec — TypeScript (Fig API)
TypeScript src/growloop.ts — completion spec para Amazon Q Developer
// src/growloop.ts — Completion spec para Amazon Q Developer (Fig API)
// Cliente: GrowLoop SaaS | Generado por: CULTIVA IA Arsenal

const getCampaigns: Fig.Generator = {
  script: ["bash", "-c",
    `curl -s "$GROWLOOP_API/v2/campaigns?status=active" \
      -H "Authorization: Bearer $GROWLOOP_TOKEN" | \
      jq -r '.data[].slug'`],
  postProcess: (output) =>
    output.split("\n").filter(Boolean).map((slug) => ({
      name: slug,
      description: `Campaña activa: ${slug}`,
      icon: "📣",
    })),
};

const getWorkflows: Fig.Generator = {
  script: ["bash", "-c",
    `curl -s "$GROWLOOP_API/v2/workflows?enabled=true" \
      -H "Authorization: Bearer $GROWLOOP_TOKEN" | \
      jq -r '.data[].id'`],
  postProcess: (output) =>
    output.split("\n").filter(Boolean).map((id) => ({
      name: id, icon: "⚡",
    })),
};

const envSuggestions: Fig.Suggestion[] = [
  { name: "staging", description: "Pruebas sin envíos reales", icon: "🟡" },
  { name: "production", description: "Envío real a contactos", icon: "🔴" },
  { name: "sandbox", description: "Datos de test aislados", icon: "🟢" },
];

const completionSpec: Fig.Spec = {
  name: "growloop",
  description: "GrowLoop Marketing Automation CLI v2.4",
  subcommands: [

    // ─────────────── campaign ───────────────
    {
      name: "campaign",
      description: "Gestión de campañas de marketing",
      subcommands: [
        {
          name: "launch",
          description: "Lanzar una campaña activa",
          args: { name: "campaign-id", generators: getCampaigns },
          options: [
            {
              name: ["--env", "-e"],
              description: "Entorno destino",
              isRequired: true,
              args: { name: "environment", suggestions: envSuggestions },
            },
            {
              name: "--dry-run",
              description: "Preview sin ejecutar envíos",
            },
            {
              name: "--batch-size",
              description: "Contactos por lote",
              args: { name: "size", default: "500" },
            },
          ],
        },
        {
          name: "delete",
          description: "Eliminar campaña permanentemente",
          isDangerous: true,   // ← muestra icono ⚠️ en Q
          args: { name: "campaign-id", generators: getCampaigns },
        },
        {
          name: "stats",
          description: "Ver métricas de la campaña",
          args: { name: "campaign-id", generators: getCampaigns },
          options: [
            {
              name: "--format",
              args: { suggestions: ["table", "json", "csv"] },
            },
          ],
        },
      ],
    },

    // ─────────────── deploy ───────────────
    {
      name: "deploy",
      description: "Despliegue de integraciones",
      subcommands: [
        {
          name: "rollback",
          description: "Revertir a versión anterior",
          isDangerous: true,
          options: [
            {
              name: "--revision",
              args: {
                generators: {
                  script: ({ tokens }) => {
                    const svc = tokens[2];
                    return ["bash", "-c",
                      `growloop deploy history ${svc} --format json | jq -r '.[].revision'`];
                  },
                  postProcess: (out) =>
                    out.split("\n").filter(Boolean).map((r) => ({
                      name: r, description: `Revisión ${r}`,
                    })),
                },
              },
            },
          ],
        },
      ],
    },
  ],

  // Opciones globales (isPersistent)
  options: [
    {
      name: ["--verbose", "-v"],
      description: "Output detallado",
      isPersistent: true,
    },
    {
      name: "--config",
      description: "Ruta al archivo de configuración",
      isPersistent: true,
      args: { template: "filepaths" },
    },
  ],
};

export default completionSpec;
Dotfile Script — Setup del entorno GrowLoop
bash ~/.fig/scripts/growloop-setup.sh — sincronizado via Fig dotfiles
#!/bin/bash
# Fig script: Inicializar entorno de desarrollo GrowLoop
# Uso: fig run growloop-setup [dev|staging]
# Sincronizado automáticamente con Fig dotfile management

set -euo pipefail

ENV=${1:-dev}

# Colores
GREEN='\033[0;32m'; BLUE='\033[0;34m'; NC='\033[0m'

echo -e "${BLUE}🚀 Configurando entorno GrowLoop → $ENV${NC}"

# Verificar dependencias
for cmd in node pnpm jq curl; do
  command -v "$cmd" &>/dev/null || { echo "❌ Falta: $cmd"; exit 1; }
done

# Crear .env según entorno
cat > .env."$ENV" << EOF
GROWLOOP_API=https://api.growloop.io
GROWLOOP_TOKEN=<pegar token de 1Password>
GROWLOOP_ENV=$ENV
GROWLOOP_ORG=growloop-prod
EOF

# Instalar dependencias y el CLI
pnpm install
pnpm link --global

# Registrar el completion spec en Amazon Q
q integrations install dotfiles
mkdir -p ~/.fig/autocomplete/src
cp dist/growloop.js ~/.fig/autocomplete/src/growloop.js

# Verificar autenticación
growloop config auth --token "$(grep GROWLOOP_TOKEN .env.$ENV | cut -d= -f2)"

echo -e "${GREEN}✅ Listo. Prueba: growloop campaign list${NC}"
Capacidades del spec
Generadores dinámicos
Las sugerencias de campañas y workflows se obtienen en tiempo real desde la API de GrowLoop. Siempre datos frescos, sin configuración manual.
⚠️
Comandos peligrosos marcados
isDangerous: true en delete, rollback y reset. Amazon Q muestra un icono de advertencia visual para prevenir errores.
📌
Opciones persistentes
--verbose y --config disponibles en todos los subcomandos via isPersistent: true.
📁
Templates de archivo
El flag --config usa template: "filepaths" para navegar el filesystem con autocompletado nativo del SO.
🔄
Dotfiles sincronizados
El script de setup se guarda en ~/.fig/scripts/ y Fig lo sincroniza automáticamente en todos los Mac del equipo.
🎯
Contexto en revisiones
El generador de rollback lee el historial del servicio seleccionado para sugerir revisiones específicas, no una lista genérica.
Instalación
1
Instalar Amazon Q Developer
brew install amazon-q
2
Autenticar y activar integraciones
q login && q integrations install dotfiles
3
Compilar y copiar el completion spec
pnpm build && cp dist/growloop.js ~/.fig/autocomplete/src/
4
Ejecutar el script de setup del entorno
fig run growloop-setup staging
5
Verificar en modo desarrollador
q settings developer.enabled true
Buenas practicas aplicadas
1
Generadores para sugerencias dinamicas
Scripts bash que llaman a la API de GrowLoop para obtener campañas y workflows en tiempo real via curl | jq.
2
Comandos peligrosos senializados
isDangerous: true en delete, rollback y reset para mostrar advertencias visuales y prevenir errores de equipo.
3
Templates para argumentos de archivo
template: "filepaths" en --config para navegacion nativa del filesystem sin configuracion adicional.
4
Opciones persistentes en todos los subcomandos
isPersistent: true en --verbose y --config para que esten disponibles en cualquier nivel del arbol de comandos.
5
Iconos y descripciones en cada sugerencia
Emojis como pistas visuales (rojo=produccion, amarillo=staging, verde=sandbox) para acelerar la seleccion sin leer texto.
6
Dotfiles portables via Fig sync
El script growloop-setup.sh en ~/.fig/scripts/ se sincroniza automaticamente en todos los Mac del equipo engineering.