feat: comandos superadmin para onboarding enterprise white-label
Contexto
free-admin ya tiene el tier Enterprise white-label (PR AppFreeticket/free-admin#230): plantillas 100% custom por Workspace.web_template (registry ENTERPRISE_TEMPLATES), dominios propios vía env ENTERPRISE_CUSTOM_DOMAINS, y plan enterprise asignado manualmente por un SUPER_ADMIN. Hoy TODO el onboarding es manual en el dashboard (/dashboard/master/clientes/[id]). Queremos que la mayor parte se pueda ejecutar desde el CLI si el usuario es superadmin, para que un agente (skill freeticket-enterprise, issue hermano en agent-skills) lo orqueste con un solo prompt.
Prerrequisitos en free-admin (bloqueantes, van primero)
El admin API (/api/admin, auth por AdminToken, contrato en /api/admin/openapi.json) hoy solo expone en PATCH /workspaces/{id}: name, slug, type, isPublished. Falta:
- Extender
PATCH /api/admin/workspaces/{id} con:
webTemplate (string | null) → workspace.web_template
customDomain (string | null) → workspace.custom_domain
customDomainVerifiedAt (datetime | null) → workspace.custom_domain_verified_at
- Nuevo
POST /api/admin/workspaces/{id}/plan — asignación manual de plan (reusar la lógica de assignPlanManually de /dashboard/master/clientes): si el workspace tenía suscripción Stripe activa, cancelarla antes de reasignar; si la cancelación falla, abortar sin tocar la fila. Body: { planSlug: "enterprise" | "spark" | "star" | "icon" }.
- Registrar ambos en el OpenAPI (
registerRoute) + audit log (recordAudit), como el resto de rutas admin.
Comandos CLI propuestos
Namespace ft admin (auth por AdminToken, separado de la API key de workspace):
ft admin login # guarda AdminToken
ft admin workspaces get <slug|id> # incluye webTemplate, customDomain, plan
ft admin workspaces set <slug|id> --web-template <clave>
ft admin workspaces set <slug|id> --custom-domain <dominio> [--verified]
ft admin plans assign <slug|id> enterprise # POST /plan, muestra warning de Stripe
ft admin enterprise checklist <slug|id> # imprime checklist de despliegue
Limitación conocida (documentar en el CLI, no resolver aquí)
El alta REAL de un dominio custom requiere hoy: editar la env ENTERPRISE_CUSTOM_DOMAINS en Vercel + agregar el dominio al proyecto + redeploy (serverActions.allowedOrigins se evalúa en build). ft admin workspaces set --custom-domain solo persiste la columna administrativa; el comando enterprise checklist debe imprimir los pasos manuales restantes. Cuando free-admin implemente F3b (resolución DB-backed de dominios), el checklist se reduce.
Criterios de aceptación
Relacionado: AppFreeticket/agent-skills (skill freeticket-enterprise), AppFreeticket/free-admin PR #230.
🤖 Generated with Claude Code
feat: comandos superadmin para onboarding enterprise white-label
Contexto
free-admin ya tiene el tier Enterprise white-label (PR AppFreeticket/free-admin#230): plantillas 100% custom por
Workspace.web_template(registryENTERPRISE_TEMPLATES), dominios propios vía envENTERPRISE_CUSTOM_DOMAINS, y planenterpriseasignado manualmente por un SUPER_ADMIN. Hoy TODO el onboarding es manual en el dashboard (/dashboard/master/clientes/[id]). Queremos que la mayor parte se pueda ejecutar desde el CLI si el usuario es superadmin, para que un agente (skillfreeticket-enterprise, issue hermano en agent-skills) lo orqueste con un solo prompt.Prerrequisitos en free-admin (bloqueantes, van primero)
El admin API (
/api/admin, auth porAdminToken, contrato en/api/admin/openapi.json) hoy solo expone enPATCH /workspaces/{id}:name,slug,type,isPublished. Falta:PATCH /api/admin/workspaces/{id}con:webTemplate(string | null) →workspace.web_templatecustomDomain(string | null) →workspace.custom_domaincustomDomainVerifiedAt(datetime | null) →workspace.custom_domain_verified_atPOST /api/admin/workspaces/{id}/plan— asignación manual de plan (reusar la lógica deassignPlanManuallyde/dashboard/master/clientes): si el workspace tenía suscripción Stripe activa, cancelarla antes de reasignar; si la cancelación falla, abortar sin tocar la fila. Body:{ planSlug: "enterprise" | "spark" | "star" | "icon" }.registerRoute) + audit log (recordAudit), como el resto de rutas admin.Comandos CLI propuestos
Namespace
ft admin(auth por AdminToken, separado de la API key de workspace):Limitación conocida (documentar en el CLI, no resolver aquí)
El alta REAL de un dominio custom requiere hoy: editar la env
ENTERPRISE_CUSTOM_DOMAINSen Vercel + agregar el dominio al proyecto + redeploy (serverActions.allowedOriginsse evalúa en build).ft admin workspaces set --custom-domainsolo persiste la columna administrativa; el comandoenterprise checklistdebe imprimir los pasos manuales restantes. Cuando free-admin implemente F3b (resolución DB-backed de dominios), el checklist se reduce.Criterios de aceptación
ft admin plans assignyft admin workspaces set --web-templatefuncionan end-to-end contra un workspace de pruebaft admin enterprise checklistimprime el runbook completo (env, dominio Vercel, redeploy, verificación)--jsonen todos los comandos (consumo por agentes/MCP)Relacionado: AppFreeticket/agent-skills (skill freeticket-enterprise), AppFreeticket/free-admin PR #230.
🤖 Generated with Claude Code