🛠️ ¿Cómo creo mis propias piezas?
Firefly JS es extensible por diseño. Puedes crear tus propios Plugins y Tools para adaptar la gobernanza a las necesidades específicas de tu equipo.
🔌 Crear un Plugin (Capacidades)
Los plugins proveen datos o servicios. Se dividen en dos tipos según su interacción:
🧩 Plugin de Ejecución (Proceso)
Es el más común. Implementa process() para devolver datos cuando se le solicita.
ts
import { Plugin } from '@fireflyjs/core'
export class MiPluginReader implements Plugin<TOutput, TInput> {
readonly name = "mi-reader-plugin"
async process(input?: TInput): Promise<TOutput> {
// Lógica para procesar o extraer datos
return { data: "resultado" }
}
}📡 Plugin de Mensajería (Driver)
Actúa como un sensor activo. Usa initialize() para levantar un listener y emitir eventos.
ts
import { Plugin, PluginContext } from '@fireflyjs/core'
export class MiPluginDriver implements Plugin {
readonly name = "mi-driver-plugin"
initialize({ events }: PluginContext) {
// Conectar a un socket, API o file watcher
miServicioExterno.on('update', (data) => {
events.emit('plugin:update', data)
})
}
}🛠️ Crear una Tool (Orquestación)
Las herramientas son las que realmente "hacen" algo, consumiendo los plugins registrados en el Kernel.
ts
import { FireflyTool, Kernel } from '@fireflyjs/core'
export class MiAnalizadorTool implements FireflyTool {
readonly name = "mi-analizador"
readonly mode = "run" // O "watch"
async run(kernel: Kernel) {
// 1. Obtener la capacidad del plugin
const reader = kernel.getPlugin<MiPluginReader>("mi-reader-plugin")
// 2. Usar la capacidad
const data = await reader.process()
// 3. Ejecutar lógica y dar feedback
if (data.error) {
console.log("❌ Error detectado")
}
}
}🧩 Patrón de Sincronización Reactiva
En modo watch, tus herramientas pueden suscribirse a eventos de los drivers para re-procesar la información.
ts
async run(kernel: Kernel) {
// Suscribirse a un driver de IA o cambios de archivos
kernel.on('plugin:update', (newData) => {
this.reanalizar(newData)
})
}💡 Mejores Prácticas
- Agnosticismo: Un plugin no sabe quién lo usa. Solo entrega datos.
- Inyección: Configura tus piezas a través del constructor.
- Simplicidad: El Kernel debe ser estable; la complejidad vive en tus plugins y herramientas.
