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: [
{
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,
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"] },
},
],
},
],
},
{
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}`,
})),
},
},
},
],
},
],
},
],
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;