.cursor/skills/perfect-agent-guide/SKILL.md
LA SUPER GUÍA DEL AGENTE PERFECTO. Reglas estrictas de arquitectura C.O.R.E. para controladores, uso de Spatie Data y prohibición de modificar el paquete ai-contracts. Úsalo SIEMPRE que trabajes en controladores, DTOs o interactúes con el paquete sunnyface-ai-contracts en proyectos consumidores.
npx skillsauth add kikoseijo/ai-contracts perfect-agent-guideInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Esta guía contiene los mandamientos arquitectónicos para los agentes que consumen el paquete sunnyface-ai-contracts.
NUNCA, BAJO NINGUNA CIRCUNSTANCIA, MODIFIQUES EL CÓDIGO DEL PAQUETE sunnyface-ai-contracts.
Solo el agente "Gemini version PRO" tiene autorización para realizar cambios en ese paquete. Si estás trabajando en un proyecto consumidor (como sunnyface o SunnyTaz), asume que el paquete es de solo lectura.
Todos los controladores deben seguir estrictamente este patrón:
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api\Spoke;
use App\Actions\Spoke\ListFailedTasksAsBlindSpotsAction;
use App\Http\Controllers\Controller;
use Sunnyface\Contracts\Data\Spoke\Responses\ApiErrorResponseDTO;
use Sunnyface\Contracts\Data\Spoke\Responses\BlindSpotsResponseDTO;
use Sunnyface\Contracts\Data\Spoke\SpokeTenantIdRequest;
class BlindSpotsController extends Controller
{
public function show(SpokeTenantIdRequest $data, ListFailedTasksAsBlindSpotsAction $action): BlindSpotsResponseDTO|ApiErrorResponseDTO
{
return $action->execute($data);
}
}
declare(strict_types=1); es obligatorio en todos los archivos.Illuminate\Http\Request ni FormRequests tradicionales. Inyecta directamente el DTO de Spatie Data (ej. SpokeTenantIdRequest).Action inyectada.response()->json().return $action->execute($data);.Al revisar los proyectos consumidores (sunnyface y SunnyTaz), se detectaron estos errores comunes cometidos por otros agentes que DEBES EVITAR A TODA COSTA:
❌ MAL: (Encontrado en SunnyTaz/app/Http/Controllers/Api/HubWebhookController.php)
public function handleTaskStatus(Request $request): JsonResponse
{
try {
$dto = TaskStatusWebhookDTO::from($request->all());
} catch (\Exception $e) {
return response()->json(['message' => 'Invalid payload format'], 422);
}
// ...
}
✅ BIEN: Inyecta el DTO directamente. Spatie Data valida automáticamente y lanza la excepción correcta.
public function handleTaskStatus(TaskStatusWebhookDTO $dto, ProcessTaskAction $action): ResponseDTO
{
return $action->execute($dto);
}
❌ MAL: (Encontrado en sunnyface/app/Http/Controllers/Api/HubWebhookController.php)
Usar un FormRequest solo para convertirlo a DTO manualmente.
public function taskStatus(TaskStatusWebhookRequest $request, ProcessHubWebhookAction $action): Response
{
$action->execute($request->toDTO());
return response()->noContent();
}
✅ BIEN: Inyecta el DTO de Spatie Data directamente en el controlador y elimina el FormRequest.
response()->json() manualmente❌ MAL:
return response()->json(['status' => 'acknowledged'], 202);
✅ BIEN: Retorna un DTO de respuesta. Spatie Data lo convierte automáticamente a JSON gracias a la interfaz Responsable.
return new AcknowledgedResponseDTO();
❌ MAL: Escribir lógica de negocio, consultas a base de datos o manipulación de modelos dentro del controlador.
✅ BIEN: Mueve toda esa lógica a una clase Action dedicada e inyéctala en el método del controlador.
LA REGLA: Queda ESTRICTAMENTE PROHIBIDO realizar llamadas HTTP síncronas al Hub (o a cualquier API de IA/LLM) directamente dentro de un Controlador que sirva a un usuario web.
EL MOTIVO: Si el LLM tarda 4 segundos en responder, el navegador del usuario se queda congelado 4 segundos. Eso destruye la experiencia de usuario y bloquea los workers de PHP.
LA SOLUCIÓN C.O.R.E.: El Controlador solo puede hacer dos cosas:
pending y despacha un Job en segundo plano (ej. SendTaskToHubJob::dispatch()).LA REGLA: Las clases dentro de app/Actions son ciegas a la web. ESTRICTAMENTE PROHIBIDO usar helpers como request(), response()->json(), redirect(), o leer cabeceras HTTP dentro de una Action.
EL MOTIVO: Una Action (ej. ProcessHubWebhookAction) debe poder ejecutarse desde un Controlador, desde un Comando de Artisan en la consola, o desde un Job en Redis. Si depende de la Request HTTP, rompes su reusabilidad por completo.
LA SOLUCIÓN C.O.R.E.:
TaskNotFoundException), y es el Controlador (o el manejador de excepciones de Laravel) quien decide cómo traducir eso a una respuesta HTTP.development
Create and manage Data Transfer Objects (DTOs), requests, and resources using Spatie Laravel Data v4. Use when the user mentions DTOs, Laravel Data, Spatie Data, or needs to handle request validation and resource transformation in Laravel.
development
Briefing obligatorio del paquete sunnyface/ai-contracts. Activa SIEMPRE que toques DTOs, webhooks, comunicación Hub-Spoke, o el namespace Sunnyface\Contracts. Contiene reglas irrompibles y dónde leer los contratos reales en vendor/.
testing
Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit, tidy up, or clean up an existing skill or SKILL.md file. Also use when editing or restructuring a skill directory (moving files to references/ or scripts/, removing stale content, validating against the AgentSkills spec). Triggers on phrases like "create a skill", "author a skill", "tidy up a skill", "improve this skill", "review the skill", "clean up the skill", "audit the skill".
testing
Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).