Saltar al contenido

FRAMEWORK DE IOC · INFRAESTRUCTURA

Circe

Framework de inversión de control para aplicaciones de Discord, construido sobre discord.js. El CLI de Circe posee el ciclo de vida de la aplicación, descubre comandos y listeners por convención de directorios, y enruta interacciones sobre Gateway WebSockets, HTTP Webhooks o un modo híbrido, sin tocar la lógica de interacción.

DUAL-TRANSPORT

Gateway, HTTP Webhooks o híbrido

  • Cambia el transporte directamente en circe.config.ts sin modificar una sola línea de lógica de interacción.
  • Gateway: conexión WebSocket 24/7 con estado. HTTP: Webhooks serverless sin estado. Híbrido: ambos a la vez.
  • Verificación de firma Ed25519 sub-milisegundo con crypto.subtle.verify nativo, sin dependencias, para el transporte HTTP.
circe.config.ts

						01
						import { defineCirceConfig, defineConfig } from '@sxnnyside/circe';
					
						02
						 
					
						03
						export default defineCirceConfig({
					
						04
						  config: defineConfig(schema),
					
						05
						  transport: 'gateway', // "gateway" | "http" | "hybrid"
					
						06
						});
					

CONVENCIONES DE SISTEMA DE ARCHIVOS

Descubrimiento automático por directorio

  • commands/, command-groups/, context-menus/, events/, components/ y modals/ se descubren solos.
  • Validación de forma en tiempo de escaneo con diagnósticos de nivel compilador — errores en desarrollo, no en producción.
  • Árbol de subcomandos jerárquico ensamblado automáticamente hasta el límite de dos niveles de Discord, con guards heredados a nivel de grupo.
src/commands/ping.ts

						01
						import { defineCommand } from '@sxnnyside/circe';
					
						02
						import { SlashCommandBuilder } from 'discord.js';
					
						03
						 
					
						04
						export default defineCommand({
					
						05
						  builder: new SlashCommandBuilder()
					
						06
						    .setName('ping')
					
						07
						    .setDescription('Replies with Pong'),
					
						08
						  async execute(ctx) {
					
						09
						    await ctx.interaction.reply('Pong!');
					
						10
						  },
					
						11
						});
					

CROSS-RUNTIME

Bun, Node.js 22+ o Deno

  • Mismo binario circe, mismo comportamiento, en los tres runtimes — sin capas de compatibilidad.
  • discord.js ^14.16.0 como dependencia peer. Zod para validación de configuración tipada.
  • CLI de ciclo de vida completo: circe init para scaffolding, circe dev con hot-reload, circe start en producción, circe build como verificación de contrato en CI.
terminal

						$
						bun add @sxnnyside/circe discord.js zod
					
						$
						npm install @sxnnyside/circe discord.js zod
					
						$
						deno add npm:@sxnnyside/circe npm:discord.js npm:zod
					
						 
						 
					
						$
						bun x circe dev
					
						✦
						hot-reload watching src/**
					

RUTAS TIPADAS Y OBSERVABILIDAD

Guards, paginación y trazabilidad

  • Rutas de componentes con patrones estilo URL — ticket:close:[ticketId]:[action] — con inferencia de tipos completa.
  • Paginación sin colectores vía createPaginator, con navegación opcional por dropdown (pageSelect).
  • Guards cooldown() componibles en memoria o SQLite, IDs de correlación vía AsyncLocalStorage, y reporte de errores global con onError.
src/components/ticket-close.ts

						01
						import { defineComponent, cooldown } from '@sxnnyside/circe';
					
						02
						 
					
						03
						export default defineComponent({
					
						04
						  pattern: 'ticket:close:[ticketId]:[action]',
					
						05
						  guards: [cooldown({ seconds: 5 })],
					
						06
						  async execute(ctx) {
					
						07
						    const { ticketId, action } = ctx.params;
					
						08
						  },
					
						09
						});
					

EMPIEZA AHORA

Instálalo y arranca.

Sin panel, sin dashboard, sin invitación de servidor — Circe vive en tu repositorio.

bun add @sxnnyside/circe discord.js zod