SAP CPI Architect: iFlow Generator, Cloner & Reverse-Engineering Documentor
Operates in three specialized modes:
- Modo 1 · Generar iFlow + Script Collection (
.zip): Designs an enterprise-grade iFlow in 3 stages (Plan -> BPMN2.iflwXML -> Groovy Scripts), validates all artifacts, and builds real OSGi.zipbundles importable into SAP Integration Suite. - Modo 2 · Documentar iFlow Existente: Extracts an existing
.zipbundle, runs static heuristics, and generates the 8-section technical & architectural documentation. - Modo 3 · Clonar y Adaptar Bundles de Referencia (
.zip) según Nueva Especificación: Clones an existing working iFlow + Script Collection.ziptemplate, adapts scripts, XPath splitters, and OSGi descriptors to a new functional/API specification, and preserves private.propfiles untouched.
Modo 1: Generar iFlow + Script Collection (Pipeline en 3 Etapas)
Etapa 0: Protocolo de Clarificación Interactiva (Preguntar antes de Asumir)
Antes de generar el plan arquitectónico o el paquete .zip, analiza si el prompt del usuario define todos los parámetros críticos del flujo de integración. Si falta información clave, realiza preguntas breves y estructuradas (proponiendo valores recomendados) para obtener el contexto necesario:
- Sistemas Origen y Destino (Sender / Receiver): ¿Qué adaptadores utilizan (HTTPS, OData v2/v4, SFTP, SOAP, IDoc, JMS, ProcessDirect) y si la comunicación es síncrona (
Request-Reply) o asíncrona? - Contratos de Datos y Transformaciones: ¿Qué formato entra y sale (JSON, XML, IDoc, CSV) y qué reglas de negocio o enriquecimientos (
Content Modifier,Router,Groovy Script) deben aplicarse? - Seguridad y Parámetros Externalizados: ¿Qué método de autenticación requiere cada endpoint (OAuth2 Client Credentials, Basic Auth / User Credential alias, Client Certificate) y qué timeouts se esperan?
- Gestión de Errores y Alertas: ¿Qué debe hacer el
Exception Subprocesscuando ocurre un fallo (enviar alerta por correo, guardar en cola JMS, retornar estructura de error HTTP personalizada)?
Regla de Vía Rápida: Si el usuario ya proporcionó una especificación completa o pide explícitamente que asumas valores por defecto de mejores prácticas SAP, procede directamente a la Etapa 1 documentando los supuestos tomados.
Etapa 1: Plan Arquitectónico (plan.json)
Design the JSON plan containing:
iflowName(PascalCase with underscores, e.g.,Order_Sync_S4HANA)scriptCollectionName(SC_<iflowName>)businessDescription&technicalSummaryparameters(every external URL, credential alias, or timeout externalized asKEY: defaultValue)components[](ordered steps:StartEvent,ContentModifier,RequestReply,Router,ScriptTask,ExceptionSubprocess,EndEvent)groovyScriptsPlan[]({ fileName, purpose })
Etapa 2: BPMN 2.0 XML (<iflowName>.iflw)
Generate the complete BPMN 2.0 XML implementing every step of the plan following SAP's official Integration Flow Design Guidelines:
- Must include
<bpmn2:definitions>with namespacesbpmn2,bpmndi,ifl,dc,di. - Must include
<bpmn2:collaboration>(Sender, Receiver, Integration Process) and<bpmn2:process>. - Must include
<bpmn2:subProcess triggeredByEvent="true" ifl:type="ExceptionSubProcess">(orErrorEventSubProcessTemplate):- Resilient Error & Transaction Architecture: Differentiate between transient errors (use JMS Queues with automatic retry/backoff) and persistent/poison errors (route to a Data Store or Dead-Letter Queue in the Exception Subprocess, and optionally forward alerts via
ProcessDirectto a central Error Logging iFlow). Keep transaction boundaries short by isolating transactional steps inside Local Integration Processes.
- Resilient Error & Transaction Architecture: Differentiate between transient errors (use JMS Queues with automatic retry/backoff) and persistent/poison errors (route to a Data Store or Dead-Letter Queue in the Exception Subprocess, and optionally forward alerts via
- Splitter & Message Mapping Streaming ("Split-First" Rule):
- All
Splittersteps (General Splitter/Iterating Splitter) must enable streaming (<ifl:property key="streaming" value="true"/>) and use direct XPath expressions without heavy predicates. - Never pass mega-payloads (> 50 MB) directly into a graphical Message Mapping (DOM trap); always place a streaming
Splitterbefore the Message Mapping.
- All
- Router Optimization:
- Extract XML values into typed Exchange Properties (
java.lang.String,java.lang.Long) in aContent Modifierbefore theRouter, and evaluate${property.Field}(Camel Simple) instead of evaluating repeated XPath across multiple Router branches. - Order Router branches from most frequent to least frequent, and always define a
defaultroute on<bpmn2:exclusiveGateway>.
- Extract XML values into typed Exchange Properties (
- All external endpoints must use
https://and externalized parameters{{PARAM_NAME}}. - All synchronous
ExternalCalltasks must declare an explicittimeoutproperty (e.g.,60000). - Every Script Task must reference
<ifl:property key="scriptFunction" value="processData"/>and<ifl:property key="script" value="<fileName>"/>. - Must include
<bpmndi:BPMNDiagram>coordinates so the SAP CPI Web UI editor renders the diagram cleanly. - Patrones Opcionales para Handlers Transversales Reutilizables:
- Handler Centralizado de Errores y Observabilidad (
ProcessDirect->Parallel Multicast):- Recibe un sobre XML de error vía
ProcessDirect({{PD_address}}) desde losException Subprocessde otros iFlows, respaldado por un XSD tolerante donde todos los campos sonminOccurs="0" nillable="true"(incluyendoEnvironment,InterfaceName,InterfaceDescription,ObjectID,ExceptionMessage,OriginalMessageProcessingLogID,SAP_MessageProcessingLogID,SAP_MplCorrelationIdy banderas comoSendBody). - Usa un
Parallel Multicastpara dividir el flujo en dos ramas: (1) una rama de alerta por correo (MailSMTP constarttls_mandatory) que formatea una tabla HTML en unContent Modifier, y (2) una rama de observabilidad hacia SAP Cloud Logging / OpenSearch que evalúa${property.SendBody.toLowerCase()} = 'yes'en unRouterpara elegir entre dosMessage Mapping(WithBody.mmapvsNoBody.mmap), convierte la salida conXML to JSON Converter(xmlJsonSuppressRootElement=true) y la envía porHTTPPOST con certificado de cliente ({{CloudLoggingCertificate}}). - Incluye su propio
Exception Subprocesslocal que inspeccionaCamelExceptionCaughty guarda el detalle como adjunto MPL (addAttachmentAsString) para evitar bucles infinitos si falla el servidor de correo o de logs.
- Recibe un sobre XML de error vía
- Handler Centralizado de Refresco de Tokens (
StartTimerEvent->LocalIntegrationProcess-> GlobalData Store):- Inicia con un
StartTimerEventparametrizado ({{TokenTimer}}de tipocustom:scheduleenparameters.propdef), delega la llamadaExternalCally extracción del token a unLocalIntegrationProcess(processType="directCall"), limpia cabeceras y propiedades internas en unContent Modifiermediante accionesDelete($name=Authorization,$name=SAP_MonitoringStateProperties,$name=Content-Length, etc.) y persiste la cabecera/token en un Data Store Global Cifrado (activityType="DBstorage",operation="put",visibility="global",encrypt="true",override="true",includeMessageHeaders="true").
- Inicia con un
- Handler Centralizado de Errores y Observabilidad (
Etapa 3: Scripts Groovy (src/main/resources/script/*.groovy)
Author each Groovy script planned in groovyScriptsPlan[] following all SAP CPI Scripting Guidelines (def Message processData(Message message), Reader streaming, JsonSlurperClassic, XmlSlurper with disallow-doctype-decl, ZoneId.of("UTC"), conditional MPL attachments, CPI-ERR: exception rethrow).
Etapa 4: Validación y Construcción de los Bundles OSGi (.zip)
Save your specification JSON (containing iflowName, scriptCollectionName, businessDescription, parameters, iflwXml, and groovyScripts) and execute build-cpi-package.mjs:
node ./scripts/build-cpi-package.mjs <spec.json | --demo> --out-dir ./dist-packages
- OSGi Packager & Validator script: build-cpi-package.mjs
- OSGi Bundle Specification: osgi-bundle-spec.md
- Verification Gate & OSGi Manifest Compliance:
build-cpi-package.mjsvalidates both the.iflwBPMN2 XML and every Groovy script before producing<iflowName>.zip,<scriptCollectionName>.zip, andPaquete_<iflowName>.zip.- Places
.projectandMETA-INF/MANIFEST.MFdirectly at the root of the.zip(never nested inside a top-level wrapper folder) and wraps allMANIFEST.MFlines at 72 bytes UTF-8 with\r\ncontinuations so SAP CPI never fails withThe project must contain a valid manifest file. - Always remind the user to upload
<scriptCollectionName>.zip(in Add -> Script Collection) and<iflowName>.zip(in Add -> Integration Flow) individually, rather than uploading the outerPaquete_<iflowName>.zipwrapper.
Modo 2: Documentar iFlow Existente (Ingeniería Inversa en 8 Secciones)
Paso 0: Clarificación de Alcance Documental
Antes de redactar la documentación técnica, verifica:
- Si el usuario ha proporcionado la ruta al archivo
.zipo.iflw. Si no lo ha indicado, pídele la ruta del paquete. - Si necesita enfatizar algún aspecto específico para la audiencia del documento (ej. equipo de Operaciones/Soporte, auditoría de Seguridad BTP, o traspaso a Producción) o añadir contexto de negocio que no figure dentro del
.iflw.
Paso 1: Extraer Contexto y Heurísticas del .zip
Run extract-for-docs.mjs on the existing .zip bundle:
node ./scripts/extract-for-docs.mjs <existing-iflow.zip | --demo>
- Extractor & Doc Validator script: extract-for-docs.mjs
- 8-Section Template: doc-template-8-sections.md
Paso 2: Redactar y Validar las 8 Secciones Obligatorias
Write the Markdown documentation following the exact 8 headings in doc-template-8-sections.md and validate the generated .md file with:
node ./scripts/extract-for-docs.mjs --validate-doc <generated-doc.md>
Modo 3: Clonar y Adaptar Bundles de Referencia (.zip) según Nueva Especificación
Use this mode when the user provides an existing SAP CPI package (.zip containing one or more iFlows and/or a ScriptCollection) and asks to create new integrations or update existing ones based on an API specification document (PDF, Markdown, OpenAPI).
Paso 0: Análisis de Brechas (Gap Analysis) y Regla de Privacidad
- Inspección sin Exposición de Datos Privados (Privacy-First):
- Inspecciona la estructura de los
.zipconinspect-iflow-zip.mjs(que redacta automáticamente los valores de.propcomo[REDACTED]). - NUNCA leas ni imprimas valores sensibles de
parameters.prop(credenciales, endpoints privados, colas internas) ni subas paquetes de cliente al repositorio Git salvo instrucción explícita.
- Inspecciona la estructura de los
- Contraste Especificación vs. Implementación y Preguntas de Clarificación:
- Compara los filtros de consulta, campos solicitados, tablas de resolución de referencias y esquemas JSON/XML entre el bundle de referencia y el documento de especificación.
- Si el documento presenta puntos abiertos, campos heredados de entidades padre (dot-walking vs
null), o discrepancias de nombres de campo (ej. campo canónico vs campo alternativo), pregunta al usuario antes de escribir código proponiendo la opción recomendada primero.
Paso 1: Adaptar o Crear los Scripts en la Script Collection
- Crea los nuevos scripts
.groovy(y actualiza los existentes si el usuario lo solicitó) manteniendo el patrón arquitectónico de la Script Collection original. - Asegúrate de que:
- En scripts Groovy 2.4 (
com.sap.gateway.ip.core.customdev.util.Message), se importegroovy.util.XmlSlurper(nuncagroovy.xml.XmlSlurper, que falla al compilar conunable to resolve class groovy.xml.XmlSlurper). - Al leer desde un
Reader(BufferedReader/StringReader), nunca se invoquebodyReader.getText('UTF-8')con parámetro de charset (lanzaMissingMethodException); usabodyReader.getText()sin argumentos o pasabodyReaderdirectamente a.parse(bodyReader). - Toda constante a nivel de script con
@Fieldincluyafinal(@Field final), el parseo XML deshabilitedisallow-doctype-decl, y el parseo JSON useJsonSlurperClassic.
- En scripts Groovy 2.4 (
- Valida todos los scripts en lote con
validate-groovy.mjs:
node ../sap-cpi-groovy-generator/scripts/validate-groovy.mjs <carpeta-scripts> --strict
Paso 2: Clonar los iFlows y Empaquetar la Script Collection
Ejecuta clone-iflow-bundle.mjs para clonar cada iFlow de referencia (actualizando .project, META-INF/MANIFEST.MF, metainfo.prop, <NuevoNombre>.iflw, referencias a scripts .groovy y expresiones XPath del Splitter) y para inyectar los nuevos scripts en la Script Collection .zip:
# 1. Clonar y adaptar un iFlow .zip manteniendo intactos sus diagramas BPMN2 y .prop
node ./scripts/clone-iflow-bundle.mjs --source <Referencia_iFlow.zip> --target-name <Nuevo_iFlow> --out <Nuevo_iFlow.zip> --replace <ScriptViejo.groovy=ScriptNuevo.groovy> --xpath <//nodoViejo=//nodoNuevo> [--add-resource <Esquema.xsd>] [--add-resource <Mapeo.mmap>]
# 2. Inyectar o actualizar archivos sueltos (.xsd, .mmap, .xsl, .wsdl, .groovy) en un iFlow .zip existente (sin renombrarlo)
node ./scripts/clone-iflow-bundle.mjs --source <iFlow_Existente.zip> --add-resource <NuevoEsquema.xsd> --add-resource <NuevoMapeo.mmap> --out <iFlow_Actualizado.zip>
# 3. Actualizar la Script Collection .zip con los nuevos scripts validados
node ./scripts/clone-iflow-bundle.mjs --update-sc <SC_Origen.zip> --scripts-dir <carpeta-scripts> --out <SC_Actualizada.zip> --strict
- Cloner & SC Updater script: clone-iflow-bundle.mjs
- Normalización Automática de Estructura OSGi ZIP:
clone-iflow-bundle.mjsdetecta y elimina automáticamente cualquier carpeta raíz intermedia heredada del.zipde origen (stripRootFolderPrefix), garantizando que.projectyMETA-INF/MANIFEST.MFqueden siempre en la raíz del.zipy con plegado de 72 bytes UTF-8 (wrapManifestLine72). - Verifica finalmente todos los
.zipgenerados ejecutandoinspect-iflow-zip.mjssobre cada paquete resultante (comprobandomanifestIssues: []) e indica al usuario qué archivos.zipindividuales debe subir en SAP CPI (Script Collection vs Integration Flow).
Protocolo de Aprendizaje Continuo (Self-Improving Harness)
Siempre que el usuario reporte un error de subida o ejecución en SAP CPI, corrija un artefacto generado o comparta un paquete .zip de referencia, tras resolver su tarea inmediata debes aplicar automáticamente el ciclo de auto-mejora:
- Anonimizar (Zero Data Leakage): Extraer únicamente el patrón técnico genérico de SAP CPI, sin guardar jamás nombres de proyectos privados, clientes, endpoints ni valores de
.prop. - Codificar en el Script CLI: Actualizar el script validador/generador correspondiente en
./scripts/para detectar o prevenir determinísticamente ese caso en el futuro. - Actualizar Documentación y Lecciones: Documentar la mejora en esta
SKILL.md, endocs/VALIDATION_RULES.mdy endocs/LESSONS_LEARNED.md. - Verificar y Sincronizar: Ejecutar
node verify-all.mjsynode setup-skills.mjspara propagar el aprendizaje a.agents/y.claude/.