Saltar al contenido
Inicio
Docs/Workflows

Workflows

Gratis — el motor entero

Un workflow es un disparador y una secuencia de pasos que se ejecutan sobre un contexto compartido. Todo ocurre en el dispositivo: no hay servidor que alquilar ni nada que mantener vivo en la nube. Los pasos ramifican, iteran y se llaman entre sí, se referencian la salida con expresiones, y reaccionan al fallo con reintento, topes de tiempo y una rama de error.

El árbol de pasos de un workflow con una rama si / si no
La plantilla «Tests y, si pasan, deploy». La rama va numerada —2.1, 2.2 dentro de «si coincide», 2.e1 dentro de «si no»— y cada paso dice qué hace al fallar. El paso de deploy ofrece «Ejecutar este paso de verdad» en vez de «Probar este paso»: no se puede simular, y el botón lo dice.

Cuatro formas de crear uno

El módulo abre en una pantalla de bienvenida. Tomes el camino que tomes, lo que acabas teniendo es el mismo workflow editable.

Plantillas

17 plantillas integradas en cuatro familias. Tocas Activar y obtienes una copia editable con identificador nuevo — no comparte nada con la original.

Descríbeselo a la IA

Escribes una frase. La respuesta del modelo se corrige donde se puede, pasa por el linter, se prueba en seco, y se te enseña el resultado antes de guardar nada.

El editor

Un árbol de pasos con bloques anidados, paleta de acciones con búsqueda, deshacer/rehacer, copiar y pegar pasos y un panel de problemas. En tablet la configuración del paso abre como panel lateral en vez de hoja.

Importar un fichero

Alguien comparte un .pcwf.json y lo abres. Llega apagado y con identificador nuevo, así que no se ejecuta nada hasta que lo hayas leído.

Disparadores (25)

Un workflow tiene un disparador principal y tantos extra como quieras, cada uno con su filtro. El filtro es tipado: cada disparador declara sus campos, y comparas campo contra valor con operadores —igual, contiene, empieza por, coincide, rutas glob—. No es buscar una subcadena en el texto del evento.

GitGit push · Git commit
FicherosFichero guardado · creado · borrado · renombrado
Proyecto y buildProyecto abierto · cerrado · Build terminado · Ejecución terminada · Comando de terminal terminado
Deploy y datosDeploy completado · Deploy fallido · Consulta de base de datos ejecutada
Otros módulosRespuesta de API Tester · Diseño exportado · El agente IA tocó un fichero · El agente IA terminó un turno
Desde el propio móvilAcceso directo · Tile de ajustes rápidos · Texto compartido · Fichero compartido · App en primer plano
Encadenar y manualError detectado (otro workflow falló) · Manual o programado

No todos los tipos tienen todavía quien los emita. En vez de esconderlos, el panel de problemas del editor te avisa cuando un workflow usa un disparador que hoy no se dispararía nunca — un disparador que existe y no se puede usar es peor si no se dice. También hay un botón de «capturar el siguiente evento»: haces la acción, y el editor te enseña la carga real que trae el disparador para que escribas el filtro contra algo real.

Un disparador y su filtro
Un disparador sin condición lo dice con palabras —«este disparador se dispara con cada evento de su tipo»— en vez de dejar una caja vacía que tengas que interpretar. Debajo, «capturar el siguiente evento» escucha una vez y te enseña la carga real.

Acciones (15)

Las quince están cableadas a algo que se ejecuta de verdad, y un test se pone rojo nombrando cualquier tipo que se quede sin implementación. Un tipo sin nada detrás falla en voz alta en vez de dar éxito en silencio — eso era posible y ya no lo es.

AcciónQué haceSalidas
Run terminal commandEjecuta un comando en la terminalcommand · exitCode · stdout · stderr · durationMs · timedOut
HTTP requestLlama a un endpoint; el cuerpo se parsea como JSON cuando lo esstatus · body · json · headers · durationMs
Git operationcommit, push o pullsha · branch · changedFiles · ahead · behind · text
DeployDispara un deploy en el proveedor conectadostatus · url · provider · projectName · logsTail · reason
Database queryEjecuta una consulta contra la base de datos activarows · rowCount · columns
Database backupHace copia de la base de datos activapath · sizeBytes
Read fileLee un fichero del proyectocontent · sizeBytes · path
Write fileEscribe o añade a un fichero del proyectopath · bytesWritten · created
File existsComprueba si una ruta existeexists · isDirectory · sizeBytes
Open fileAbre un fichero en el editor, con línea opcionalpath · line
AI analyzeManda código o texto al asistente y captura la respuestatext · model · tokens
AI generateGenera código nuevo desde un prompttext · model · tokens
TransformTransforma un valor con los filtros de expresión — sin efectos secundariosvalue
Set variableMete un valor en el contexto del run para pasos posterioresname · value
NotificationMuestra una notificación con título y mensajeshown

Que un paso sea destructivo se calcula con sus parámetros delante, no por su tipo: git status no es git push, y crear un fichero nuevo no es sobrescribir uno. Etiquetar el tipo entero como destructivo obligaría a confirmar hasta un status, y pedir confirmación para todo enseña a aceptar sin leer.

La paleta de acciones
La paleta busca por nombre, por descripción y por nombre de salida — si sabes que quieres stdout, no hace falta que sepas cómo se llama la acción. Cada entrada enseña lo que te da y marca lo irreversible antes de añadirlo, no después.

Ramas, bucles y subflujos

Siete formas de paso, de las cuales seis son control de flujo. Las ramas se anidan dentro de ramas, así que lo que construyes es un árbol, no una línea recta.

Si / si no

Dos ramas. La condición es un árbol, no un hueco único: And, Or y Not se anidan, así que «pasaron los tests y la rama es main» es una condición, no dos workflows.

En paralelo

N ramas a la vez, juntadas de tres formas: cuando acaben todas, con la primera que termine, o con la primera que salga bien. Las dos últimas cancelan las ramas perdedoras para que dejen de provocar efectos.

Para cada

Itera una lista con un alias por elemento, un tope de seguridad de iteraciones, y un número opcional de iteraciones a la vez.

Intentar / si falla

Si algo del primer bloque falla, el segundo se ejecuta con el mensaje de error ligado a una variable que tú nombras.

Subflujo

Ejecuta otro workflow dentro de este run, con sus propias entradas. El hijo hereda la intersección de los permisos — no puede abrir lo que el padre cerró.

Espera

Pausa un tiempo — o hasta que ocurra un evento, con el tiempo como tope. «Espera a que acabe el deploy» en vez de «espera dos minutos y cruza los dedos».

Una condición en cualquier paso

Cada paso lleva una condición propia opcional: si es falsa el paso se salta, sin envolverlo en un si / si no entero.

Pasar datos entre pasos

Cualquier campo acepta un literal o una expresión entre llaves dobles. El editor ofrece un selector, así que no hace falta recordar identificadores de paso.

ExpresiónResuelve a
{{var.name}}Una entrada declarada o un valor que puso un paso
{{step.<id>.status}}SUCCESS, FAILURE, SKIPPED, TIMED_OUT
{{step.<id>.output}}El mapa de salida entero
{{step.<id>.output.json.items[0].name}}Un campo de la salida, navegando dentro del JSON
{{step.<id>.error}}El mensaje de error del paso
{{item.<alias>}}El elemento de la iteración viva
{{trigger.<field>}}La carga útil tipada del evento que lo disparó
{{secret.NAME}}Un secreto guardado. Terminal — no se puede navegar dentro

Filtros encadenables

lines · first · last · trim · upper · lower · length · json · default:"x" · split:"," · join · date:"HH:mm" · replace:a:b

Así, la primera línea de la salida de un comando es {{step.sh.output.stdout | lines | first | trim}}.

Cuando algo sale mal

La fiabilidad se ajusta por paso, y el workflow pone los valores por defecto que los pasos heredan.

Reintento

Número de intentos, con espera fija, lineal o exponencial y un tope para esa espera

Tope de tiempo

Cancela el paso y lo marca TIMED_OUT. Un timeout no se reintenta — vuelve tal cual

Si falla

Cortar el run o seguir. Seguir no tiñe el run: el paso queda en rojo y el run sale verde

Apagado

Un paso desactivado se salta sin ejecutarse. Es lo que quieres mientras depuras, en vez de borrarlo y volver a escribirlo

Y para el workflow entero

Tope del run

Un límite de tiempo para el run entero, no para un paso

Concurrencia

Qué hacer si llega un disparo con un run en vuelo: saltárselo, encolarlo, o cancelar el anterior

Política de error por defecto

El valor que heredan los pasos que no ponen el suyo

Retención

Cuánto historial guardar: 100 runs y 30 días por defecto, de 1 a 1.000 runs y de 1 a 365 días

Paso del resultado

Qué paso da la salida que es la respuesta del workflow cuando lo llama el agente IA

Expresiones estrictas

Apagado por defecto, así una referencia a una rama que no se ejecutó da cadena vacía en vez de tumbar el run. Encendido, es un error con motivo

Hay además un tope para toda la app: ocho runs a la vez. Por encima hacen cola, y un run rechazado o saltado se anota en el historial como cancelado diciendo cuál de los dos topes fue. No es silencioso.

Programación — cron en tu móvil

Cualquier workflow puede llevar uno o varios horarios: un intervalo, o una expresión cron de cinco campos con comodines, listas, rangos y pasos. Mientras escribes, la app te enseña el siguiente disparo o te dice que la expresión está mal. Los horarios sobreviven al cierre de la app y se vuelven a encolar al arrancar.

Zonas horarias y cambio de hora

Cada horario guarda su zona, y los días raros están resueltos y probados: en marzo, a la hora que no existe, dispara en el salto; en octubre, a la hora que ocurre dos veces, dispara una sola.

Ejecuciones perdidas

Tú eliges: saltarte lo que cayó con el dispositivo apagado, o recuperarlo una vez al volver. Una, no las cuarenta y ocho de un fin de semana largo.

Condiciones del dispositivo

Cualquier conexión, solo Wi-Fi o ninguna; solo mientras carga; no con la batería baja; solo con el dispositivo inactivo. Una condición retrasa el disparo, no lo cancela — y la pantalla lo dice.

El suelo de quince minutos

Android no ejecuta trabajo en segundo plano más a menudo que cada quince minutos. Un intervalo por debajo se sube y la app te da la cifra exacta. Un cron por debajo no lo sube nadie, así que lo único cierto es que no hay garantía — y eso es lo que dice la pantalla, en vez de un número que sería inventado.

El editor

Un árbol de pasos con deshacer y rehacer, atajos de teclado, copiar y pegar pasos, y arrastrar para reordenar. Su panel de problemas pasa 34 reglas de estructura, parámetros, expresiones, disparadores, bucles, fiabilidad, seguridad, subflujos y permisos. Solo los errores bloquean el guardado; los avisos no — quien cierra la red de un workflow suele hacerlo antes de quitar el paso que la usaba, y bloquear ahí le impediría terminar.

Probar un paso suelto

En vez de correr el workflow entero —con sus despliegues y sus notificaciones— cada vez que ajustas un parámetro, puedes ejecutar un paso suelto con los datos fijados como contexto. Un paso cuya implementación dice que no se puede simular no se simula: el botón pasa a decir «ejecutar este paso de verdad» y pregunta antes. Un botón que diga «correcto» sin haber ejecutado nada es peor que no tener botón.

Historial y actividad

Cada run se anota entero, con el resultado de cada paso, lo que tardó, cuántos intentos necesitó y su error si lo hubo. Sobrevive a los cierres y a los fallos de la app.

  • •Una pestaña de Actividad con todos los workflows, filtrable por estado, por fecha, por workflow y por el texto del error
  • •Detalle de cada run: paso a paso, con la salida en monoespaciada y el motivo por el que paró
  • •El log en vivo se agrupa en ventanas de 100 ms antes de llegar a la pantalla — un git clone con su barra de progreso emite cientos de líneas por segundo
  • •La retención la pones tú: 100 runs y 30 días por defecto

Permisos y secretos

Lo que un workflow puede hacer

Por workflow: salir a la red, escribir ficheros, ejecutar comandos, y una lista de dominios a los que puede llegar. Las implementaciones comprueban antes de tocar nada, y el rechazo dice qué permiso fue, qué iba a ejecutarse y dónde se cambia.

No es un cajón de arena, y la pantalla lo dice: quien pueda editar el workflow puede abrir el cinturón. Protege del descuido — un workflow que abriste a la IA, uno que te mandó otra persona, o la curl que alguien pegó «solo para probar» y se quedó ahí.

Secretos

Un almacén cifrado, por cuenta. Referencias un secreto como {{secret.NOMBRE}} y su valor no se vuelve a enseñar, ni siquiera en su propia pantalla.

  • • Solo se resuelven en un run de verdad — una prueba en seco no los saca del almacén
  • • El tapado cubre todos los valores guardados, no solo los que leyó un paso: si pegaste tu token a mano dentro de un comando, también sale tapado
  • • Y ocurre antes de escribir en la base de datos, no al pintar — tapar al pintar llegaría tarde, el valor ya estaría en el fichero y en cualquier copia de seguridad

La lista blanca de dominios solo alcanza a los pasos HTTP: un paso de IA, de despliegue o de git va al servicio que tenga configurado, y la pantalla lo dice con esas palabras. Se compara el nombre del host, no la dirección a la que resuelve, así que no es protección contra SSRF. Aparte, toda ruta de fichero queda acotada a la raíz del proyecto.

El bloque de permisos en el editor
El resumen es una frase, no una fila de iconos: te dice lo que este workflow puede hacer, y a continuación dice sin rodeos que no es un cajón de arena y que quien pueda editarlo puede cambiar esto.

Lo que la IA puede hacer aquí

Escribir uno desde una frase, o cambiar uno que ya tienes

La respuesta se corrige donde se puede, pasa el linter y la prueba en seco, y se te enseña antes de guardar nada. Cambiar uno existente fusiona la respuesta encima conservando identificador, interruptor y fecha, y te enseña el diff. Si no tienes modelo configurado hay un respaldo local — que es lo único que funciona para quien todavía no ha puesto su clave.

Workflows como herramientas del agente

Marcas «disponible para el agente de IA» en un workflow y el chat puede llamarlo. Seis herramientas en total: tres que leen (listar, obtener, ejecuciones) y tres que escriben (crear, cambiar, ejecutar) y pasan por la puerta de confirmación del agente.

El documento que se le manda al modelo no lleva valores de parámetros secretos — se sustituyen por un marcador.

Plantillas (17)

Un test es el linter de las plantillas: comprueba que cada disparador tenga emisor, que cada acción esté cableada, que cada clave de parámetro esté declarada, que cada expresión apunte a algo real, y que la prueba en seco de cada plantilla termine sin dejar el run en fallo. Una plantilla que no funciona no sale.

Clásicas · 8

Prettier al guardar · Auto-commit al guardar Kotlin · Lint del fichero que acabas de guardar · Tests y, si pasan, deploy · Auto-deploy al push a main · Tests tras el push a main · Test en cada commit · Copia de la base de datos tras el deploy

Flujo de datos · 3

Comprobación de salud por HTTP · Tres endpoints en paralelo · Notas de la versión desde el log de commits

Control de flujo · 3

Despliega o dime por qué no · Prueba cada módulo que tocaste · Protección de rama

Desde el móvil · 3

Compartir un enlace directo al proyecto · Copia nocturna · Tests de la rama en la que estás

La galería de plantillas
Agrupadas por cuándo las querrías —al editar, al usar git, alrededor de un despliegue, cuando algo falla, desde el móvil— y cada tarjeta dice qué necesita antes de que la actives.

Compartir uno

Un workflow viaja como un fichero .pcwf.json. Lo que no viaja: el historial, las salidas fijadas, los horarios y el interruptor. Lo que llega llega apagado y con identificador nuevo.

Los valores de parámetros marcados como secretos se vacían antes de escribir el fichero — y se listan, para que quien lo abra sepa qué tiene que rellenar. Una referencia {{secret.NOMBRE}} sí viaja: es un nombre, no el secreto, y vaciarla rompería el workflow de forma irreparable. Un fichero que no es nuestro, uno dañado y uno escrito por una versión más nueva dan tres mensajes distintos, porque son tres cosas distintas y solo una tiene salida.

Lo que cuesta dinero

El motor es gratis, sin asteriscos

Los 25 disparadores, las 15 acciones, ramas, bucles, subflujos, cron, permisos, secretos, el historial entero, exportar, las plantillas, y exponer un workflow como herramienta del agente IA — todo eso está en el plan gratuito.

Pro: pedirle a la IA que escriba o cambie uno

Es lo único de pago, y el límite vive en el chat, no aquí. Dejar que el agente ejecute un workflow que ya marcaste como disponible es gratis — esa herramienta es lo único que hace que la casilla signifique algo. El historial y exportar también son gratis: cobrar por ellos sería quitárselos a quien ya los tiene, y exportar es la única forma de sacar tu trabajo de la app.

Lo que no hay

Conviene saberlo antes de planear contando con ello.

Disparador por webhookFuera de alcance: exige backend, push y un modelo de secretos que llegue al servidor
Alarmas exactasEl suelo son quince minutos y la app lo dice, en vez de pedirte otro permiso
Workflows en el MarketplaceNi instalar ni publicar. Hoy compartir un workflow es compartir el fichero
Selector de zona horariaCada horario guarda su zona y resuelve el cambio de hora, pero los nuevos toman la del dispositivo
Un lienzo de grafoLas ramas son un árbol anidado, no nodos que cableas en un lienzo: no hay switch de N salidas ni merge arbitrario
Anti-SSRF en la lista blanca de dominiosSe compara el nombre del host, no la dirección a la que resuelve

El módulo en cifras

25

Tipos de disparador

15

Acciones, todas cableadas

7

Formas de paso

17

Plantillas

34

Reglas del linter

13

Filtros de expresión

6

Herramientas del agente IA

8

Runs a la vez en toda la app