CtrlK
BlogDocsLog inGet started
Tessl Logo

oh-my-ai/nestjs

NestJS architecture, dependency injection, validation, security, errors, testing, persistence, APIs, microservices, and deployment patterns with prioritized rule tiers and companion rule files.

99

1.12x
Quality

100%

Does it follow best practices?

Impact

97%

1.12x

Average score across 2 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-1/

{
  "context": "Tests whether the agent correctly implements background job processing using @nestjs/bullmq, wires event-driven decoupling with @nestjs/event-emitter, handles async errors in processors, integrates queue health into readiness checks, and uses structured logging.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "BullMQ package used",
      "description": "Uses @nestjs/bullmq (not the older @nestjs/bull) for queue integration",
      "max_score": 10
    },
    {
      "name": "Queue injection pattern",
      "description": "Uses @InjectQueue() decorator to inject the queue into the service — not manually instantiating a queue",
      "max_score": 8
    },
    {
      "name": "Processor decorator",
      "description": "Worker class is decorated with @Processor() — not implementing a raw BullMQ worker manually",
      "max_score": 8
    },
    {
      "name": "Job retry options",
      "description": "Job options include both attempts (retry count > 1) and backoff configuration when adding jobs to the queue",
      "max_score": 10
    },
    {
      "name": "Event-driven decoupling",
      "description": "Publisher module uses @nestjs/event-emitter (@OnEvent() listener) to react to domain events and enqueue jobs — publisher module does NOT import the worker/processor module directly",
      "max_score": 10
    },
    {
      "name": "Async error handling in processor",
      "description": "Job handler method contains a try-catch block or equivalent to handle errors locally — errors are NOT silently swallowed (they are logged or re-thrown for BullMQ retry)",
      "max_score": 8
    },
    {
      "name": "Structured logging with context",
      "description": "Uses NestJS Logger instantiated with a class name context (e.g., new Logger(NotificationProcessor.name)) — NOT console.log",
      "max_score": 8
    },
    {
      "name": "Queue health in readiness probe",
      "description": "Health check module includes a BullMQ queue health indicator (or Redis ping) as part of the /health/ready readiness endpoint — NOT mixed into the liveness probe",
      "max_score": 10
    },
    {
      "name": "Separate liveness endpoint",
      "description": "A separate /health/live liveness endpoint exists with only lightweight checks (memory or basic process check) — database/Redis checks are NOT included in liveness",
      "max_score": 8
    },
    {
      "name": "Module exports pattern",
      "description": "The queue service is exported from its module and the consuming module imports the module (not re-declares the service as a provider)",
      "max_score": 8
    },
    {
      "name": "Redis config from ConfigModule",
      "description": "BullModule Redis connection is configured via ConfigService or registerAsync — no hardcoded host/port strings",
      "max_score": 8
    },
    {
      "name": "Constructor injection in services",
      "description": "All services and processors obtain dependencies via constructor parameters — no property-injected @Inject() decorators on class fields",
      "max_score": 4
    }
  ]
}

evals

scenario-1

criteria.json

task.md

SKILL.md

tile.json