gufi-cli 0.1.49 → 0.1.51
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/dist/commands/docs.js +1 -5
- package/dist/lib/docs-resolver.d.ts +8 -0
- package/dist/lib/docs-resolver.js +27 -0
- package/dist/lib/security.js +5 -0
- package/dist/mcp.js +56 -43
- package/docs/dev-guide/1-01-architecture.md +358 -0
- package/docs/dev-guide/1-02-multi-tenant.md +415 -0
- package/docs/dev-guide/1-03-column-types.md +594 -0
- package/docs/dev-guide/1-04-json-config.md +442 -0
- package/docs/dev-guide/1-05-authentication.md +427 -0
- package/docs/dev-guide/2-01-api-reference.md +564 -0
- package/docs/dev-guide/2-02-automations.md +508 -0
- package/docs/dev-guide/2-03-gufi-cli.md +568 -0
- package/docs/dev-guide/2-04-realtime.md +401 -0
- package/docs/dev-guide/2-05-permissions.md +497 -0
- package/docs/dev-guide/2-06-integrations-overview.md +104 -0
- package/docs/dev-guide/2-07-stripe.md +173 -0
- package/docs/dev-guide/2-08-nayax.md +297 -0
- package/docs/dev-guide/2-09-ourvend.md +226 -0
- package/docs/dev-guide/2-10-tns.md +177 -0
- package/docs/dev-guide/2-11-custom-http.md +268 -0
- package/docs/dev-guide/3-01-custom-views.md +555 -0
- package/docs/dev-guide/3-02-webhooks-api.md +446 -0
- package/docs/mcp/00-overview.md +329 -0
- package/docs/mcp/01-architecture.md +226 -0
- package/docs/mcp/02-modules.md +285 -0
- package/docs/mcp/03-fields.md +357 -0
- package/docs/mcp/04-views.md +613 -0
- package/docs/mcp/05-automations.md +461 -0
- package/docs/mcp/06-api.md +531 -0
- package/docs/mcp/07-packages.md +246 -0
- package/docs/mcp/08-common-errors.md +284 -0
- package/docs/mcp/09-examples.md +453 -0
- package/docs/mcp/README.md +71 -0
- package/docs/mcp/tool-descriptions.json +64 -0
- package/package.json +3 -2
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Packages y Marketplace
|
|
2
|
+
|
|
3
|
+
Los packages agrupan modulos y vistas para distribucion en el Marketplace.
|
|
4
|
+
|
|
5
|
+
## Estructura de un package
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Package
|
|
9
|
+
├── Modules (snapshots)
|
|
10
|
+
│ └── Module JSON congelado
|
|
11
|
+
├── Views (referencias)
|
|
12
|
+
│ └── IDs de vistas marketplace
|
|
13
|
+
└── Migrations
|
|
14
|
+
└── SQL para actualizaciones
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Flujo de desarrollo
|
|
18
|
+
|
|
19
|
+
### 1. Crear package
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
gufi_package_create({
|
|
23
|
+
name: "CRM Basico",
|
|
24
|
+
description: "Gestion de clientes y contactos"
|
|
25
|
+
})
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 2. Agregar modulos
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
gufi_package_add_module({
|
|
32
|
+
package_id: "14",
|
|
33
|
+
company_id: "116",
|
|
34
|
+
module_id: "360"
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Esto crea un **snapshot** del modulo (copia congelada).
|
|
39
|
+
|
|
40
|
+
### 3. Agregar vistas
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
gufi_package_add_view({
|
|
44
|
+
package_id: "14",
|
|
45
|
+
view_id: "13"
|
|
46
|
+
})
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 4. Publicar
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
gufi_package_publish({ package_id: "14" })
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Versionado
|
|
56
|
+
|
|
57
|
+
### Sincronizar cambios
|
|
58
|
+
|
|
59
|
+
Cuando modificas un modulo fuente, sincroniza el snapshot:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
gufi_package_sync({ package_id: "14" })
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Esto:
|
|
66
|
+
- Actualiza snapshots de modulos
|
|
67
|
+
- Incrementa version (1.0.0 -> 1.0.1)
|
|
68
|
+
|
|
69
|
+
### Verificar cambios pendientes
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
gufi_package_check({ package_id: "14" })
|
|
73
|
+
|
|
74
|
+
Response:
|
|
75
|
+
{
|
|
76
|
+
"has_changes": true,
|
|
77
|
+
"modules_changed": [360],
|
|
78
|
+
"current_version": "1.0.0"
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Migraciones
|
|
83
|
+
|
|
84
|
+
Cuando cambias la estructura de un modulo publicado, necesitas migraciones para actualizar instalaciones existentes.
|
|
85
|
+
|
|
86
|
+
### Listar migraciones
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
gufi_package_migrations({ package_id: "14" })
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Crear migracion
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
gufi_package_migration_create({
|
|
96
|
+
package_id: "14",
|
|
97
|
+
description: "Add phone column to clients",
|
|
98
|
+
target_entity: "crm.clientes",
|
|
99
|
+
up_sql: "ALTER TABLE {tableName} ADD COLUMN telefono JSONB",
|
|
100
|
+
down_sql: "ALTER TABLE {tableName} DROP COLUMN telefono",
|
|
101
|
+
is_breaking: false
|
|
102
|
+
})
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Placeholders disponibles:**
|
|
106
|
+
- `{tableName}` - Nombre fisico de la tabla (m360_t4136)
|
|
107
|
+
- `{entityId}` - ID de la entidad
|
|
108
|
+
- `{companyId}` - ID de la company instaladora
|
|
109
|
+
|
|
110
|
+
### Eliminar migracion (solo si no aplicada)
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
gufi_package_migration_delete({
|
|
114
|
+
package_id: "14",
|
|
115
|
+
migration_id: "5"
|
|
116
|
+
})
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Ver entidades para target_entity
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
gufi_package_entities({ package_id: "14" })
|
|
123
|
+
|
|
124
|
+
Response:
|
|
125
|
+
[
|
|
126
|
+
{ "path": "crm.clientes", "name": "Clientes", "entity_id": 4136 },
|
|
127
|
+
{ "path": "crm.contactos", "name": "Contactos", "entity_id": 4137 }
|
|
128
|
+
]
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Operaciones con MCP
|
|
132
|
+
|
|
133
|
+
### Listar mis packages
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
gufi_packages()
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Ver detalle de package
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
gufi_package({ package_id: "14" })
|
|
143
|
+
|
|
144
|
+
Response:
|
|
145
|
+
{
|
|
146
|
+
"id": 14,
|
|
147
|
+
"name": "CRM Basico",
|
|
148
|
+
"version": "1.0.3",
|
|
149
|
+
"published": true,
|
|
150
|
+
"modules": [...],
|
|
151
|
+
"views": [...],
|
|
152
|
+
"installations_count": 25
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Quitar modulo
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
gufi_package_remove_module({
|
|
160
|
+
package_id: "14",
|
|
161
|
+
module_id: "5" // ID del module DENTRO del package
|
|
162
|
+
})
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Quitar vista
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
gufi_package_remove_view({
|
|
169
|
+
package_id: "14",
|
|
170
|
+
package_view_id: "3" // ID de la relacion package-view
|
|
171
|
+
})
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Despublicar
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
gufi_package_unpublish({ package_id: "14" })
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Eliminar package
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
gufi_package_delete({ package_id: "14" })
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Solo funciona si NO esta publicado.
|
|
187
|
+
|
|
188
|
+
## Instalacion (para compradores)
|
|
189
|
+
|
|
190
|
+
Cuando alguien instala un package:
|
|
191
|
+
|
|
192
|
+
1. Se crea copia de modulos en su company
|
|
193
|
+
2. Se configuran vistas con sus tablas
|
|
194
|
+
3. Se ejecutan migraciones pendientes
|
|
195
|
+
|
|
196
|
+
## Actualizaciones
|
|
197
|
+
|
|
198
|
+
Cuando publicas nueva version:
|
|
199
|
+
|
|
200
|
+
1. Instalaciones existentes ven "actualizacion disponible"
|
|
201
|
+
2. Al actualizar, se ejecutan migraciones en orden
|
|
202
|
+
3. Se actualizan snapshots de modulos
|
|
203
|
+
|
|
204
|
+
## Precios y monetizacion
|
|
205
|
+
|
|
206
|
+
El Marketplace soporta:
|
|
207
|
+
- **Gratis** - Cualquiera puede instalar
|
|
208
|
+
- **Pago unico** - Se cobra una vez
|
|
209
|
+
- **Suscripcion** - Cobro mensual/anual
|
|
210
|
+
|
|
211
|
+
Configuracion via UI de Developer Center (no via MCP).
|
|
212
|
+
|
|
213
|
+
## Buenas practicas
|
|
214
|
+
|
|
215
|
+
### 1. Versionado semantico
|
|
216
|
+
|
|
217
|
+
- **MAJOR** (2.0.0): Cambios breaking (eliminaciones, renombres)
|
|
218
|
+
- **MINOR** (1.1.0): Nuevas features compatibles
|
|
219
|
+
- **PATCH** (1.0.1): Fixes y mejoras menores
|
|
220
|
+
|
|
221
|
+
### 2. Migraciones seguras
|
|
222
|
+
|
|
223
|
+
```sql
|
|
224
|
+
-- CORRECTO: Add column (safe)
|
|
225
|
+
ALTER TABLE {tableName} ADD COLUMN IF NOT EXISTS nuevo_campo TEXT;
|
|
226
|
+
|
|
227
|
+
-- CUIDADO: Drop column (perdida de datos)
|
|
228
|
+
ALTER TABLE {tableName} DROP COLUMN IF EXISTS campo_viejo;
|
|
229
|
+
|
|
230
|
+
-- INCORRECTO: Rename (no soportado bien)
|
|
231
|
+
ALTER TABLE {tableName} RENAME COLUMN viejo TO nuevo;
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 3. Test antes de publicar
|
|
235
|
+
|
|
236
|
+
1. Instalar en company de prueba
|
|
237
|
+
2. Verificar que todo funciona
|
|
238
|
+
3. Probar migraciones en BD de test
|
|
239
|
+
|
|
240
|
+
### 4. Documentacion
|
|
241
|
+
|
|
242
|
+
Incluir en descripcion del package:
|
|
243
|
+
- Que hace
|
|
244
|
+
- Como configurar
|
|
245
|
+
- Requisitos previos
|
|
246
|
+
- Changelog de versiones
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# Errores Comunes y Soluciones
|
|
2
|
+
|
|
3
|
+
## Datos y tipos
|
|
4
|
+
|
|
5
|
+
### Currency como objeto (INCORRECTO)
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
// ERROR: Formato legacy
|
|
9
|
+
precio: { currency: 'EUR', amount: 150 }
|
|
10
|
+
|
|
11
|
+
// CORRECTO: Solo el numero
|
|
12
|
+
precio: gufi.CB.currency(150)
|
|
13
|
+
// o directamente:
|
|
14
|
+
precio: 150
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Currency ahora es NUMERIC. El codigo de moneda va en el schema del campo.
|
|
18
|
+
|
|
19
|
+
### Phone con formato incorrecto
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
// ERROR: Formato legacy
|
|
23
|
+
telefono: { country: 'ES', number: '612345678' }
|
|
24
|
+
|
|
25
|
+
// CORRECTO: Usar CB.phone
|
|
26
|
+
telefono: gufi.CB.phone('612345678')
|
|
27
|
+
// Resultado: { prefix: '+34', number: '612345678' }
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Olvidar __display en updates
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
// ERROR: UI no muestra el cambio
|
|
34
|
+
await dataProvider.update({
|
|
35
|
+
resource: table,
|
|
36
|
+
id: 5,
|
|
37
|
+
variables: { estado: 'completado' }
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// CORRECTO: Actualizar ambos
|
|
41
|
+
await dataProvider.update({
|
|
42
|
+
resource: table,
|
|
43
|
+
id: 5,
|
|
44
|
+
variables: {
|
|
45
|
+
estado: 'completado',
|
|
46
|
+
estado__display: 'Completado'
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Aplica a: `select`, `relation`, `currency` (si tenia formato viejo)
|
|
52
|
+
|
|
53
|
+
### Base64 en campos file
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// ERROR: Base64 directo
|
|
57
|
+
foto: 'data:image/png;base64,iVBOR...'
|
|
58
|
+
|
|
59
|
+
// CORRECTO: Subir primero, luego guardar URL
|
|
60
|
+
const { url, name } = await uploadFile(file);
|
|
61
|
+
foto: gufi.CB.file(url, name)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Solo `signature` acepta base64 directo.
|
|
65
|
+
|
|
66
|
+
## Vistas
|
|
67
|
+
|
|
68
|
+
### Hardcodear IDs físicos de tabla
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// ERROR: IDs físicos difíciles de leer y no portables
|
|
72
|
+
const data = await dataProvider.getList({ resource: 'm360_t16192' });
|
|
73
|
+
|
|
74
|
+
// CORRECTO: Usar nombres lógicos (dataProvider los resuelve automáticamente)
|
|
75
|
+
const pedidosTable = 'ventas.pedidos';
|
|
76
|
+
const data = await dataProvider.getList({ resource: pedidosTable });
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Importar stores directamente
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
// ERROR: Rompe aislamiento
|
|
83
|
+
import { useAuthStore } from '@/stores/useAuthStore';
|
|
84
|
+
|
|
85
|
+
// CORRECTO: Usar gufi.context
|
|
86
|
+
const user = gufi.context?.user;
|
|
87
|
+
const company = gufi.context?.activeCompany;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Toast de shadcn
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// ERROR: No es el toast de Gufi
|
|
94
|
+
import { toast } from '@/components/ui/toast';
|
|
95
|
+
|
|
96
|
+
// CORRECTO: Toast del SDK
|
|
97
|
+
import { toastSuccess, toastError } from '@/sdk';
|
|
98
|
+
toastSuccess('Guardado');
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Olvidar exportar featureConfig
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// ERROR: Vista no tiene dataSources
|
|
105
|
+
export default function MiVista() { ... }
|
|
106
|
+
|
|
107
|
+
// CORRECTO: Exportar featureConfig
|
|
108
|
+
export { featureConfig } from './core/dataProvider';
|
|
109
|
+
export default function MiVista() { ... }
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Automations
|
|
113
|
+
|
|
114
|
+
### Destructuring en api.query
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
// ERROR: api.query devuelve rows directamente
|
|
118
|
+
const { rows } = await gufi.query("SELECT * FROM table");
|
|
119
|
+
|
|
120
|
+
// CORRECTO:
|
|
121
|
+
const rows = await gufi.query("SELECT * FROM table");
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### SQL injection
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
// ERROR: Interpolacion directa
|
|
128
|
+
const rows = await gufi.query(`SELECT * FROM users WHERE id = ${id}`);
|
|
129
|
+
|
|
130
|
+
// CORRECTO: Parametros
|
|
131
|
+
const rows = await gufi.query("SELECT * FROM users WHERE id = $1", [id]);
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Return sin success
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
// ERROR: Worker no sabe si funciono
|
|
138
|
+
async function mi_automation(ctx, api, logger) {
|
|
139
|
+
// ... hacer cosas
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// CORRECTO: Retornar estado
|
|
143
|
+
async function mi_automation(ctx, api, logger) {
|
|
144
|
+
// ... hacer cosas
|
|
145
|
+
return { success: true, message: 'OK' };
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## API y autenticacion
|
|
150
|
+
|
|
151
|
+
### Falta X-Company-ID
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
// ERROR: 400 Bad Request
|
|
155
|
+
GET /api/company/schema
|
|
156
|
+
Authorization: Bearer xxx
|
|
157
|
+
|
|
158
|
+
// CORRECTO:
|
|
159
|
+
GET /api/company/schema
|
|
160
|
+
Authorization: Bearer xxx
|
|
161
|
+
X-Company-ID: 116
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Token expirado
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
// Response: 401 Unauthorized
|
|
168
|
+
// Solucion: Refresh token
|
|
169
|
+
|
|
170
|
+
POST /api/auth/refresh
|
|
171
|
+
X-Refresh-Token: {refreshToken}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Sin permisos
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
// Response: 403 Forbidden
|
|
178
|
+
// Causa: Usuario no tiene permiso para esa accion
|
|
179
|
+
|
|
180
|
+
// Verificar permisos de la entidad:
|
|
181
|
+
gufi_context({ company_id: "116" })
|
|
182
|
+
// Ver permissions de cada entity
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Modulos
|
|
186
|
+
|
|
187
|
+
### Field type incorrecto
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
// ERROR: Tipo no existe
|
|
191
|
+
{ "name": "fecha", "type": "timestamp" }
|
|
192
|
+
|
|
193
|
+
// CORRECTO: Usar date (con includeTime si necesitas hora)
|
|
194
|
+
{ "name": "fecha", "type": "date" }
|
|
195
|
+
{ "name": "fecha_hora", "type": "date", "includeTime": true }
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Tipos validos: `text`, `email`, `url`, `barcode`, `number`, `number_int`, `number_float`, `percentage`, `date`, `time`, `select`, `multiselect`, `boolean`, `relation`, `users`, `currency`, `phone`, `location`, `file`, `signature`, `json`, `formula`, `mirror`
|
|
199
|
+
|
|
200
|
+
### Relacion sin displayField
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
// WARNING: Muestra ID en lugar de nombre
|
|
204
|
+
{
|
|
205
|
+
"name": "cliente",
|
|
206
|
+
"type": "relation",
|
|
207
|
+
"relation": { "module": "crm", "entity": "clientes" }
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// MEJOR: Especificar displayField
|
|
211
|
+
{
|
|
212
|
+
"name": "cliente",
|
|
213
|
+
"type": "relation",
|
|
214
|
+
"relation": {
|
|
215
|
+
"module": "crm",
|
|
216
|
+
"entity": "clientes",
|
|
217
|
+
"displayField": "nombre"
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Select sin options
|
|
223
|
+
|
|
224
|
+
```json
|
|
225
|
+
// ERROR: No hay opciones que seleccionar
|
|
226
|
+
{ "name": "estado", "type": "select" }
|
|
227
|
+
|
|
228
|
+
// CORRECTO:
|
|
229
|
+
{
|
|
230
|
+
"name": "estado",
|
|
231
|
+
"type": "select",
|
|
232
|
+
"options": [
|
|
233
|
+
{ "value": "activo", "label": "Activo", "color": "green" },
|
|
234
|
+
{ "value": "inactivo", "label": "Inactivo", "color": "gray" }
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Packages
|
|
240
|
+
|
|
241
|
+
### Publicar sin cambios guardados
|
|
242
|
+
|
|
243
|
+
```javascript
|
|
244
|
+
// ERROR: Cambios no se reflejan
|
|
245
|
+
|
|
246
|
+
// CORRECTO: Verificar con get antes de publicar
|
|
247
|
+
gufi_package({ action: "get", id: "14" })
|
|
248
|
+
// Ver has_unpublished_changes
|
|
249
|
+
|
|
250
|
+
// Publicar
|
|
251
|
+
gufi_package({ action: "publish", id: "14" })
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Debug tips
|
|
255
|
+
|
|
256
|
+
### Ver logs de automation
|
|
257
|
+
|
|
258
|
+
```javascript
|
|
259
|
+
gufi_automation_executions({
|
|
260
|
+
company_id: "116",
|
|
261
|
+
script_name: "mi_automation",
|
|
262
|
+
limit: 5
|
|
263
|
+
})
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Ver schema completo
|
|
267
|
+
|
|
268
|
+
```javascript
|
|
269
|
+
gufi_context({ company_id: "116" })
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Verificar configuracion
|
|
273
|
+
|
|
274
|
+
```javascript
|
|
275
|
+
gufi_whoami()
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Probar API directamente
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
curl -X GET "https://api.gogufi.com/api/company/schema" \
|
|
282
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
283
|
+
-H "X-Company-ID: 116"
|
|
284
|
+
```
|