@badgie/crm-cli 0.8.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 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.8.0` expone 120 comandos sobre Supabase y endpoints de la app Next, e incluye flujo completo para investigar y mantener federaciones (nacionales + regionales). Instalación: ver `cli/README.md`.
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
 
@@ -144,6 +144,92 @@ Reglas para el agente:
144
144
  - Para investigar contactos: usa `federations contacts list --federation <numero>`
145
145
  (donde `<numero>` puede ser `"12"` o `reg-<uuid>` indistintamente).
146
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
+
147
233
  ## Finance OS para agentes
148
234
 
149
235
  Usa estos comandos nuevos antes de hacer queries manuales:
package/CHANGELOG.md CHANGED
@@ -1,5 +1,55 @@
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
+
3
53
  ## 0.8.0 — 2026-05-06
4
54
 
5
55
  ### Added — Federations workflow para agentes
package/README.md CHANGED
@@ -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`.