@badgie/crm-cli 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +143 -1
- package/CHANGELOG.md +114 -0
- package/README.md +48 -3
- package/dist/bin.js +1 -32
- package/dist/bin.js.map +1 -1
- package/dist/commands/federations.js +466 -0
- package/dist/commands/federations.js.map +1 -1
- package/dist/commands/marketing.js +1336 -45
- package/dist/commands/marketing.js.map +1 -1
- package/dist/core/auth-context.js +12 -0
- package/dist/core/auth-context.js.map +1 -0
- package/dist/core/supabase.js +15 -3
- package/dist/core/supabase.js.map +1 -1
- package/dist/mcp/server.js +1 -110
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/shared.js +112 -0
- package/dist/mcp/shared.js.map +1 -0
- package/dist/modules.js +40 -0
- package/dist/modules.js.map +1 -0
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -4,7 +4,7 @@ Este archivo es la guía canónica para que un agente (openclaw, Claude, Cursor,
|
|
|
4
4
|
|
|
5
5
|
## Qué es
|
|
6
6
|
|
|
7
|
-
CLI oficial del Badgie CRM. La versión publicada `0.
|
|
7
|
+
CLI oficial del Badgie CRM. La versión publicada `0.9.0` expone ~145 comandos sobre Supabase y endpoints de la app Next, e incluye flujo completo para federaciones (nacionales + regionales) y para el **Marketing Planner** (campañas, posts, canales, assets, publicaciones, reviews, métricas). Instalación: ver `cli/README.md`.
|
|
8
8
|
|
|
9
9
|
## Fuente de verdad (machine-readable)
|
|
10
10
|
|
|
@@ -88,6 +88,148 @@ badgie-crm finance closings close --year 2026 --month 4 --notes "Revisado"
|
|
|
88
88
|
badgie-crm top-clients answer set --review-id <review-id> --question risk_level --value high
|
|
89
89
|
```
|
|
90
90
|
|
|
91
|
+
## Federations para agentes (investigación + outreach)
|
|
92
|
+
|
|
93
|
+
El módulo `federations` cubre **dos catálogos** que comparten una sola capa CRM:
|
|
94
|
+
|
|
95
|
+
- **Nacionales**: catálogo estático de 66 federaciones en
|
|
96
|
+
`data/federaciones-deportivas-esp.json` (JSON inmutable). `federacion_numero`
|
|
97
|
+
es el id del JSON, p. ej. `"1"`, `"12"`.
|
|
98
|
+
- **Regionales/territoriales**: catálogo dinámico en `regional_federations`
|
|
99
|
+
(UUID). El `federacion_numero` que comparten `federation_crm`,
|
|
100
|
+
`federation_contacts` y `federation_contact_activities` es siempre
|
|
101
|
+
`reg-<uuid>` para estas filas.
|
|
102
|
+
|
|
103
|
+
Cuando investigues con un agente:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# 1. ¿Existe ya en el catálogo nacional? (consulta el JSON estático)
|
|
107
|
+
badgie-crm federations list --pretty
|
|
108
|
+
|
|
109
|
+
# 2. ¿Es regional? Lista las que ya tenemos.
|
|
110
|
+
badgie-crm federations regional list --ccaa galicia --pretty
|
|
111
|
+
|
|
112
|
+
# 3. Si no está, creamos la regional y obtenemos el `federacion_numero`.
|
|
113
|
+
badgie-crm federations regional create \
|
|
114
|
+
--nombre "Federación Gallega de Pádel" \
|
|
115
|
+
--siglas FGP --ccaa Galicia --pretty
|
|
116
|
+
# → { id: "<uuid>", federacion_numero: "reg-<uuid>", ... }
|
|
117
|
+
|
|
118
|
+
# 4. Pipeline CRM: usa el `federacion_numero` devuelto para set/contacts/activities.
|
|
119
|
+
badgie-crm federations set reg-<uuid> --status researching --priority 4 --owner Greg
|
|
120
|
+
badgie-crm federations contacts add --federation reg-<uuid> \
|
|
121
|
+
--full-name "Marta Ruiz" --role Presidenta --email marta@fgp.es --primary --qualification warm
|
|
122
|
+
badgie-crm federations activities log --contact-id <uuid> --type email \
|
|
123
|
+
--outcome follow_up --title "Primer contacto" --description "Le envié deck Badgie"
|
|
124
|
+
|
|
125
|
+
# 5. Si verificas datos de una NACIONAL (web nueva, teléfono, dirección),
|
|
126
|
+
# persiste el override sin tocar el JSON:
|
|
127
|
+
badgie-crm federations catalog set 12 \
|
|
128
|
+
--telefono "+34 93 200 67 69" --web https://www.fedas.es
|
|
129
|
+
|
|
130
|
+
# 6. Marca un contacto como primario único de la federación:
|
|
131
|
+
badgie-crm federations contacts set-primary <uuid> --exclusive
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Reglas para el agente:
|
|
135
|
+
|
|
136
|
+
- **Antes de crear** una regional, ejecuta `federations regional list --search …`
|
|
137
|
+
o `query select regional_federations --where "nombre:ilike:%<texto>%"` para
|
|
138
|
+
evitar duplicados.
|
|
139
|
+
- **Nunca dupliques** una federación nacional como regional. Si ya está en el
|
|
140
|
+
JSON, usa `federations catalog set <numero>` para corregir datos.
|
|
141
|
+
- **`federations regional delete --cascade`** es destructivo: borra la fila del
|
|
142
|
+
catálogo y todos los CRM/contactos/timeline asociados a `reg-<uuid>`. Pide
|
|
143
|
+
confirmación humana.
|
|
144
|
+
- Para investigar contactos: usa `federations contacts list --federation <numero>`
|
|
145
|
+
(donde `<numero>` puede ser `"12"` o `reg-<uuid>` indistintamente).
|
|
146
|
+
|
|
147
|
+
## Marketing Planner para agentes (operación diaria + memoria histórica)
|
|
148
|
+
|
|
149
|
+
El módulo `marketing` cubre el flujo completo del **Marketing Planner** dentro de `crm.badgie.es/marketing-planner`: planificar la semana, generar/actualizar copy, asociar assets, mover estados, registrar publicaciones con su URL final + evidencia y guardar histórico. Tablas: `marketing_campaigns`, `marketing_channels` (LinkedIn/Instagram/TikTok/X/Blog/Email/WhatsApp/YouTube/Pinterest), `marketing_posts`, `marketing_assets`, `marketing_post_assets`, `marketing_publications`, `marketing_status_events`, `marketing_reviews`, `marketing_metrics`.
|
|
150
|
+
|
|
151
|
+
### Workflow diario recomendado para Coach/OpenClaw
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# 1. ¿Qué toca hoy? Output cronológico con canal, owner, estado.
|
|
155
|
+
badgie-crm marketing planner today --pretty
|
|
156
|
+
|
|
157
|
+
# 2. ¿Qué está bloqueado? Detecta falta de copy, canal, fecha, manual_required, failed.
|
|
158
|
+
badgie-crm marketing planner blockers --pretty
|
|
159
|
+
|
|
160
|
+
# 3. Para cada blocker, decidir:
|
|
161
|
+
|
|
162
|
+
# 3a. Falta copy → genera y actualiza
|
|
163
|
+
badgie-crm marketing posts update vid-testimonio-fmg \
|
|
164
|
+
--copy "Texto generado con CTA y datos del estudio…" \
|
|
165
|
+
--hashtags "BadgieGolf,FederacionMadridGolf,GolfJunior"
|
|
166
|
+
|
|
167
|
+
# 3b. Falta asset → enlaza URL externa o sube uuid existente
|
|
168
|
+
badgie-crm marketing posts assets add vid-testimonio-fmg \
|
|
169
|
+
--asset-id-or-url https://res.cloudinary.com/dzsrcaaas/badgie/test.mp4 \
|
|
170
|
+
--role primary
|
|
171
|
+
|
|
172
|
+
# 3c. Lista para revisión humana
|
|
173
|
+
badgie-crm marketing posts status set vid-testimonio-fmg needs_review \
|
|
174
|
+
--reason "Asset y copy listos; falta validación de Greg"
|
|
175
|
+
|
|
176
|
+
# 4. Cuando el humano publica manualmente, registra evidencia:
|
|
177
|
+
badgie-crm marketing posts publications create vid-testimonio-fmg --channel linkedin
|
|
178
|
+
# (esto crea una marketing_publication con status=pending)
|
|
179
|
+
|
|
180
|
+
badgie-crm marketing publications mark-published <publication-uuid> \
|
|
181
|
+
--external-url "https://www.linkedin.com/posts/badgie_…" \
|
|
182
|
+
--evidence-url "https://res.cloudinary.com/dzsrcaaas/screenshot.png"
|
|
183
|
+
|
|
184
|
+
# 5. Reporte semanal
|
|
185
|
+
badgie-crm marketing planner reports weekly --pretty
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Workflow semanal de planning
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
# 1. Listar campañas activas
|
|
192
|
+
badgie-crm marketing campaigns list --status active --pretty
|
|
193
|
+
|
|
194
|
+
# 2. Crear campaña nueva
|
|
195
|
+
badgie-crm marketing campaigns create \
|
|
196
|
+
--name "Profes Informes Deportivos" \
|
|
197
|
+
--slug profes-informes-q2 \
|
|
198
|
+
--objective "30 demos cualificadas en Q2" \
|
|
199
|
+
--start-date 2026-05-01 --end-date 2026-06-30 \
|
|
200
|
+
--landing-url "https://www.badgie.com/profes-informes-deportivos" \
|
|
201
|
+
--owner-email gregorio@badgie.com --pretty
|
|
202
|
+
|
|
203
|
+
# 3. Crear pieza editorial atada a la campaña
|
|
204
|
+
badgie-crm marketing posts create \
|
|
205
|
+
--title "Reel testimonio profesor tenis" \
|
|
206
|
+
--slug reel-testimonio-tenis-1 \
|
|
207
|
+
--campaign profes-informes-q2 \
|
|
208
|
+
--channel instagram \
|
|
209
|
+
--scheduled-at "2026-05-15T11:00:00+02:00" \
|
|
210
|
+
--copy "Antes lo escribía a mano. Hoy con Badgie…" \
|
|
211
|
+
--cta-label "Solicita demo" \
|
|
212
|
+
--cta-url "https://www.badgie.com/profes-informes-deportivos" \
|
|
213
|
+
--hashtags "BadgieTenis,InformesDeportivos,EscuelaTenis" \
|
|
214
|
+
--owner-email coach@badgie.com --pretty
|
|
215
|
+
# Devuelve la pieza y crea marketing_status_events automático (∅ → draft).
|
|
216
|
+
|
|
217
|
+
# 4. Una pieza, varios canales: cross-post LinkedIn + Instagram
|
|
218
|
+
badgie-crm marketing posts publications create reel-testimonio-tenis-1 --channel linkedin
|
|
219
|
+
badgie-crm marketing posts publications create reel-testimonio-tenis-1 --channel instagram
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Reglas para el agente
|
|
223
|
+
|
|
224
|
+
- **No publiques nunca automáticamente** sin `--confirm` humano. La V1 NO tiene publicación automática real — `mark-published` solo persiste evidencia de algo ya publicado fuera.
|
|
225
|
+
- **Estados válidos**: `idea | draft | needs_review | approved | scheduled | published | failed | manual_required | cancelled`. Cada cambio se registra solo en `marketing_status_events`.
|
|
226
|
+
- **Slug** se autogenera desde el título si no se pasa. Reusa el slug del post como `utm_content`; el slug de la campaña como `utm_campaign`.
|
|
227
|
+
- **`marketing posts assets add --asset-id-or-url`** acepta UUID (asset existente) o URL externa (auto-crea `marketing_assets` con `storage_provider='external'`). Para upload binario real usa la UI: el CLI no sube archivos.
|
|
228
|
+
- **`marketing publications mark-published`** es idempotente y registra `published_by` con tu user. Antes de marcar, verifica que `external_url` sea pública.
|
|
229
|
+
- **Métricas**: V1 entrada manual con `marketing metrics record --publication-id <uuid> --impressions ... --clicks ...`. No las inventes.
|
|
230
|
+
- **Borrados**: `marketing posts delete --confirm` hace cascade en assets, publications, events, reviews. **Pide confirmación humana**.
|
|
231
|
+
- **Filtros agregados**: `marketing planner reports weekly --week 2026-05-12` te da counts por estado/canal/campaña + publicaciones registradas en esa semana.
|
|
232
|
+
|
|
91
233
|
## Finance OS para agentes
|
|
92
234
|
|
|
93
235
|
Usa estos comandos nuevos antes de hacer queries manuales:
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,119 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.9.0 — 2026-05-08
|
|
4
|
+
|
|
5
|
+
### Added — Marketing Planner workflow completo
|
|
6
|
+
|
|
7
|
+
Reescritura del módulo `marketing` para soportar el nuevo Marketing Planner
|
|
8
|
+
(`crm.badgie.es/marketing-planner`). Pensado para que Coach/OpenClaw planifique
|
|
9
|
+
la semana, mantenga copy/assets, mueva estados y registre evidencia de cada
|
|
10
|
+
publicación. ~30 comandos nuevos sustituyen los 5 antiguos read-only.
|
|
11
|
+
|
|
12
|
+
- **Planner reads**:
|
|
13
|
+
- `marketing planner today` — piezas programadas para hoy con canal/owner/CTA.
|
|
14
|
+
- `marketing planner week [--week YYYY-MM-DD]` — agrupado por día.
|
|
15
|
+
- `marketing planner blockers` — detecta `falta_copy`, `falta_canal`,
|
|
16
|
+
`falta_fecha`, `manual_required`, `failed`, `needs_review`.
|
|
17
|
+
- `marketing planner reports weekly [--week YYYY-MM-DD]` — counts por estado,
|
|
18
|
+
canal, campaña + publicaciones registradas.
|
|
19
|
+
- **Campañas**: `campaigns list|get|create|update|delete`. UTM canónico
|
|
20
|
+
derivado de `slug` por defecto.
|
|
21
|
+
- **Canales**: `channels list|create|update`. Seed inicial con LinkedIn,
|
|
22
|
+
Instagram, TikTok, X, Blog, Email, WhatsApp, YouTube, Pinterest.
|
|
23
|
+
- **Posts**: `posts list|get|create|update|delete` + `posts status set` con
|
|
24
|
+
histórico append-only en `marketing_status_events`.
|
|
25
|
+
- **Post-assets**: `posts assets list|add|remove`. `add --asset-id-or-url`
|
|
26
|
+
acepta UUID o URL externa (auto-crea `marketing_assets` con
|
|
27
|
+
`storage_provider='external'`).
|
|
28
|
+
- **Publicaciones** (una pieza × N canales):
|
|
29
|
+
- `publications list`, `posts publications list|create`,
|
|
30
|
+
`publications update`, `publications mark-published` (atajo con
|
|
31
|
+
`--external-url` y `--evidence-url` que setea `published_at` y
|
|
32
|
+
`published_by` automáticamente).
|
|
33
|
+
- **Reviews**: `reviews request|resolve` con estados `requested|approved|
|
|
34
|
+
changes_requested|rejected`.
|
|
35
|
+
- **Histórico**: `posts events list <post-id>` ordenado descendente.
|
|
36
|
+
- **Métricas**: `metrics list`, `metrics record --publication-id …
|
|
37
|
+
--impressions … --clicks … --source manual|api|zapier`.
|
|
38
|
+
|
|
39
|
+
### Migration required
|
|
40
|
+
|
|
41
|
+
Aplicar `supabase-marketing-planner-migration.sql` en Supabase. **Es destructiva**:
|
|
42
|
+
hace `DROP TABLE CASCADE` de las 5 tablas legacy del módulo marketing antiguo
|
|
43
|
+
(`marketing_campaigns`, `social_media_posts`, `marketing_assets`,
|
|
44
|
+
`marketing_metrics`, `marketing_leads`) y crea 9 nuevas. La página `/marketing`
|
|
45
|
+
y sus componentes/modales han sido eliminados — usar `/marketing-planner`.
|
|
46
|
+
|
|
47
|
+
### Removed
|
|
48
|
+
|
|
49
|
+
- `marketing leads list` (la tabla `marketing_leads` ya no existe; la
|
|
50
|
+
atribución de leads se rehará en otra iteración).
|
|
51
|
+
- 4 comandos read-only originales sustituidos por la nueva familia completa.
|
|
52
|
+
|
|
53
|
+
## 0.8.0 — 2026-05-06
|
|
54
|
+
|
|
55
|
+
### Added — Federations workflow para agentes
|
|
56
|
+
|
|
57
|
+
Pensado para que un agente investigue federaciones (web pública, contactos
|
|
58
|
+
verificados, datos de contacto actualizados) y persista los hallazgos sin
|
|
59
|
+
tocar tablas ni archivos estáticos.
|
|
60
|
+
|
|
61
|
+
- **Catálogo nacional editable vía overrides JSONB**:
|
|
62
|
+
- `federations catalog set <numero>` — escribe en `federation_crm.catalog_datos`
|
|
63
|
+
los campos `--telefono`, `--email`, `--web`, `--direccion`, `--deportistas`,
|
|
64
|
+
`--notas-badgie`. Sustituyen al catálogo estático sin mutarlo. Acepta
|
|
65
|
+
`--clear-field <campo>` (repetible) para borrar overrides puntuales.
|
|
66
|
+
- `federations catalog clear <numero>` — resetea todos los overrides a `{}`.
|
|
67
|
+
- **Federaciones regionales** (tabla `regional_federations`, antes solo UI):
|
|
68
|
+
- `federations regional list [--ccaa <texto>] [--search <texto>]`.
|
|
69
|
+
- `federations regional get <id>` — fila + CRM + contactos + últimas 10
|
|
70
|
+
actividades, todo en un único response.
|
|
71
|
+
- `federations regional create --nombre … [--siglas] [--ccaa] [--notas]`
|
|
72
|
+
devuelve la fila más `federacion_numero = 'reg-<uuid>'` listo para
|
|
73
|
+
`federations set`, `federations contacts add`, etc.
|
|
74
|
+
- `federations regional update <id>` (nombre, siglas, CCAA, notas, con
|
|
75
|
+
`--clear-ccaa` / `--clear-notas`).
|
|
76
|
+
- `federations regional delete <id> [--cascade]`. Sin `--cascade` solo borra
|
|
77
|
+
la fila del catálogo regional; con `--cascade` limpia también el CRM,
|
|
78
|
+
contactos y timeline (`federacion_numero = 'reg-<uuid>'`).
|
|
79
|
+
- **Contactos**:
|
|
80
|
+
- `federations contacts update <id>` — full_name, role, email, phone,
|
|
81
|
+
linkedin, qualification, notes, `--primary` / `--no-primary`.
|
|
82
|
+
- `federations contacts remove <id>` (destructive; cascade en activities).
|
|
83
|
+
- `federations contacts set-primary <id> [--exclusive]` para garantizar un
|
|
84
|
+
único primario por federación.
|
|
85
|
+
|
|
86
|
+
### Changed
|
|
87
|
+
|
|
88
|
+
- Las tablas `federation_crm`, `federation_contacts` y
|
|
89
|
+
`federation_contact_activities` se reutilizan ahora **tanto** para
|
|
90
|
+
nacionales como regionales. La convención compartida es
|
|
91
|
+
`federacion_numero = '<numero>'` para nacionales y `'reg-<uuid>'` para
|
|
92
|
+
regionales. No hay tablas CRM duplicadas.
|
|
93
|
+
|
|
94
|
+
### Fixed
|
|
95
|
+
|
|
96
|
+
- `bin.ts`: import `ModuleSpec` faltante (provocaba `TS2304` en `tsc --noEmit`
|
|
97
|
+
desde el último refactor del registry).
|
|
98
|
+
|
|
99
|
+
### Requires
|
|
100
|
+
|
|
101
|
+
- Migraciones aplicadas en Supabase: `supabase-federation-catalog-datos.sql` y
|
|
102
|
+
`supabase-regional-federations.sql` del repo del CRM.
|
|
103
|
+
|
|
104
|
+
### Manual checks
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm run typecheck
|
|
108
|
+
npm run clean && npm run build
|
|
109
|
+
|
|
110
|
+
node dist/bin.js docs --json | jq '[.commands[] | select(.module=="federations") | .command]'
|
|
111
|
+
node dist/bin.js federations regional create --nombre "Federación Gallega de Tenis" --siglas FGT --ccaa Galicia --pretty
|
|
112
|
+
node dist/bin.js federations regional list --pretty
|
|
113
|
+
node dist/bin.js federations catalog set 12 --web https://www.fedex.es --pretty
|
|
114
|
+
node dist/bin.js federations contacts update <uuid> --qualification warm
|
|
115
|
+
```
|
|
116
|
+
|
|
3
117
|
## 0.7.0 — 2026-04-26
|
|
4
118
|
|
|
5
119
|
### Added
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @badgie/crm-cli (`badgie-crm`)
|
|
2
2
|
|
|
3
|
-
**Versión publicada:** `0.
|
|
3
|
+
**Versión publicada:** `0.8.0` — ver [`CHANGELOG.md`](./CHANGELOG.md).
|
|
4
4
|
|
|
5
5
|
CLI para operar el Badgie CRM desde la terminal. Reemplaza los scripts sueltos de `/scripts/` y expone el CRM vía MCP a agentes IA (openclaw, Claude Desktop, Cursor...).
|
|
6
6
|
|
|
@@ -87,9 +87,9 @@ badgie-crm leads list
|
|
|
87
87
|
|
|
88
88
|
## Módulos
|
|
89
89
|
|
|
90
|
-
La versión `0.
|
|
90
|
+
La versión `0.8.0` expone 120 comandos. Módulos principales:
|
|
91
91
|
|
|
92
|
-
`leads`, `clients`, `contacts`, `tasks`, `development`, `finance`, `outbound`, `directory`, `marketing`, `intelligence`, `mission-control`, `top-clients`, `federations
|
|
92
|
+
`leads`, `clients`, `contacts`, `tasks`, `development`, `finance`, `outbound`, `directory`, `marketing`, `intelligence`, `mission-control`, `top-clients`, `federations` (nacionales + regionales + overrides de catálogo), `web-design`, `team`, `sports`, `activities`, `demos`, `onboarding`, `webhooks`, `admin`, `search`, `query`, `docs`, `mcp`.
|
|
93
93
|
|
|
94
94
|
Explora todo con:
|
|
95
95
|
|
|
@@ -153,6 +153,51 @@ badgie-crm docs finance --json
|
|
|
153
153
|
badgie-crm docs finance
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
+
## Marketing Planner
|
|
157
|
+
|
|
158
|
+
`marketing` cubre el flujo completo del Marketing Planner (`crm.badgie.es/marketing-planner`): planificar la semana, generar copy, asociar assets, mover estados, registrar publicaciones y medir.
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Operación diaria
|
|
162
|
+
badgie-crm marketing planner today --pretty
|
|
163
|
+
badgie-crm marketing planner blockers --pretty
|
|
164
|
+
badgie-crm marketing planner reports weekly --pretty
|
|
165
|
+
|
|
166
|
+
# Planning semanal
|
|
167
|
+
badgie-crm marketing campaigns create \
|
|
168
|
+
--name "Profes Informes Q2" --slug profes-informes-q2 \
|
|
169
|
+
--objective "30 demos cualificadas" --start-date 2026-05-01 --end-date 2026-06-30 \
|
|
170
|
+
--landing-url "https://www.badgie.com/profes-informes-deportivos" --pretty
|
|
171
|
+
|
|
172
|
+
badgie-crm marketing posts create \
|
|
173
|
+
--title "Reel testimonio profesor tenis" \
|
|
174
|
+
--campaign profes-informes-q2 --channel instagram \
|
|
175
|
+
--scheduled-at "2026-05-15T11:00:00+02:00" \
|
|
176
|
+
--copy "Antes lo escribía a mano. Hoy con Badgie…" \
|
|
177
|
+
--cta-label "Solicita demo" --cta-url "https://www.badgie.com/profes-informes-deportivos" \
|
|
178
|
+
--hashtags "BadgieTenis,InformesDeportivos" --owner-email coach@badgie.com --pretty
|
|
179
|
+
|
|
180
|
+
# Cross-post: una pieza, dos canales
|
|
181
|
+
badgie-crm marketing posts publications create reel-testimonio-profesor-tenis --channel linkedin
|
|
182
|
+
badgie-crm marketing posts publications create reel-testimonio-profesor-tenis --channel instagram
|
|
183
|
+
|
|
184
|
+
# Estado y assets
|
|
185
|
+
badgie-crm marketing posts status set reel-testimonio-profesor-tenis needs_review --reason "Listo para Greg"
|
|
186
|
+
badgie-crm marketing posts assets add reel-testimonio-profesor-tenis \
|
|
187
|
+
--asset-id-or-url https://res.cloudinary.com/dzsrcaaas/test.mp4 --role primary
|
|
188
|
+
|
|
189
|
+
# Tras publicar manualmente: registrar evidencia
|
|
190
|
+
badgie-crm marketing publications mark-published <publication-uuid> \
|
|
191
|
+
--external-url "https://www.linkedin.com/posts/badgie_..." \
|
|
192
|
+
--evidence-url "https://res.cloudinary.com/dzsrcaaas/screenshot.png"
|
|
193
|
+
|
|
194
|
+
# Métricas (V1 manual)
|
|
195
|
+
badgie-crm marketing metrics record --publication-id <uuid> \
|
|
196
|
+
--impressions 5400 --clicks 120 --ctr 0.022 --likes 87 --source manual --pretty
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Workflow Coach completo en `cli/AGENTS.md` → sección "Marketing Planner para agentes".
|
|
200
|
+
|
|
156
201
|
## Top Clients
|
|
157
202
|
|
|
158
203
|
Top Clients usa `client_monthly_reviews` para las revisiones mensuales. La pantalla actual no tiene una tabla separada de preguntas/configuración: las preguntas del modal son columnas de esa tabla (`notes`, `needs`, `testimonials`, `risk_level`, `next_actions`, `status`, `reviewed_at`) y el contacto semanal vive en `metadata.contact_log`.
|
package/dist/bin.js
CHANGED
|
@@ -6,40 +6,9 @@ import { loginCommand } from './commands/login.js';
|
|
|
6
6
|
import { logoutCommand } from './commands/logout.js';
|
|
7
7
|
import { whoamiCommand } from './commands/whoami.js';
|
|
8
8
|
import { welcomeCommand } from './commands/welcome.js';
|
|
9
|
-
import { leadsModule } from './commands/leads.js';
|
|
10
|
-
import { clientsModule } from './commands/clients.js';
|
|
11
|
-
import { tasksModule } from './commands/tasks.js';
|
|
12
|
-
import { financeModule } from './commands/finance.js';
|
|
13
|
-
import { outboundModule } from './commands/outbound.js';
|
|
14
|
-
import { marketingModule } from './commands/marketing.js';
|
|
15
|
-
import { intelligenceModule } from './commands/intelligence.js';
|
|
16
|
-
import { operationsModule } from './commands/operations.js';
|
|
17
|
-
import { webhooksModule } from './commands/webhooks.js';
|
|
18
|
-
import { adminModule } from './commands/admin.js';
|
|
19
|
-
import { searchModule } from './commands/search.js';
|
|
20
|
-
import { queryModule } from './commands/query.js';
|
|
21
|
-
import { directoryModule } from './commands/directory.js';
|
|
22
|
-
import { topClientsModule } from './commands/top-clients.js';
|
|
23
|
-
import { federationsModule } from './commands/federations.js';
|
|
24
9
|
import { createDocsModule } from './commands/docs.js';
|
|
25
10
|
import { createMcpModule } from './commands/mcp.js';
|
|
26
|
-
|
|
27
|
-
leadsModule,
|
|
28
|
-
clientsModule,
|
|
29
|
-
tasksModule,
|
|
30
|
-
financeModule,
|
|
31
|
-
outboundModule,
|
|
32
|
-
marketingModule,
|
|
33
|
-
intelligenceModule,
|
|
34
|
-
operationsModule,
|
|
35
|
-
webhooksModule,
|
|
36
|
-
adminModule,
|
|
37
|
-
searchModule,
|
|
38
|
-
queryModule,
|
|
39
|
-
directoryModule,
|
|
40
|
-
topClientsModule,
|
|
41
|
-
federationsModule,
|
|
42
|
-
];
|
|
11
|
+
import { MODULES } from './modules.js';
|
|
43
12
|
async function main() {
|
|
44
13
|
const program = new Command();
|
|
45
14
|
const docsModule = createDocsModule(() => [...MODULES, docsModule, mcpModule]);
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|