CtrlK
BlogDocsLog inGet started
Tessl Logo

igmarin/rails-agent-skills

Curated library of 39 AI agent skills for Ruby on Rails development. Organized by category: planning, testing, code-quality, ddd, engines, infrastructure, api, patterns, context, orchestration, and workflows. Includes 5 callable workflow skills (rails-tdd-loop, rails-review-flow, rails-setup-flow, rails-quality-flow, rails-engines-flow) for complete development cycles. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and TDD automation.

95

1.20x
Quality

98%

Does it follow best practices?

Impact

95%

1.20x

Average score across 35 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-5/

{
  "context": "Tests whether the agent implements correct error wrapping, credential safety, configuration validation, and HTTP resilience patterns in the Auth and Client layers of an API integration.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Auth includes HTTParty",
      "description": "Auth class includes HTTParty (or equivalent HTTP library include) rather than using Net::HTTP directly",
      "max_score": 5
    },
    {
      "name": "Auth credential validation",
      "description": "Auth initializer raises an error (any exception) when required credentials are blank/nil — does NOT silently accept missing credentials",
      "max_score": 10
    },
    {
      "name": "No hardcoded credentials",
      "description": "Auth class reads credentials from Rails configuration or environment variables — no literal credential strings appear in the source files",
      "max_score": 10
    },
    {
      "name": "Auth token caching",
      "description": "Auth#token (or equivalent method) caches the fetched token in an instance variable and returns the cached value on subsequent calls",
      "max_score": 8
    },
    {
      "name": "Client::Error class",
      "description": "Client defines a nested Error class inheriting from StandardError (not from RuntimeError or a generic base)",
      "max_score": 10
    },
    {
      "name": "HTTP error wrapping",
      "description": "Client's request method rescues HTTParty::Error (or equivalent HTTP library error) and re-raises as Client::Error",
      "max_score": 10
    },
    {
      "name": "JSON error wrapping",
      "description": "Client's request method rescues JSON::ParserError and re-raises as Client::Error",
      "max_score": 10
    },
    {
      "name": "Timeout configured",
      "description": "Client or Auth configures a timeout (DEFAULT_TIMEOUT constant or timeout option passed to HTTP calls) — not left at default/unlimited",
      "max_score": 8
    },
    {
      "name": "Missing config raises Client::Error",
      "description": "Client initializer raises Client::Error (using MISSING_CONFIGURATION_ERROR or similar message) when token or host is blank",
      "max_score": 10
    },
    {
      "name": "Retry constant",
      "description": "Client or Fetcher defines DEFAULT_RETRIES (or equivalent) as a numeric constant — retry count is not a magic number inline",
      "max_score": 9
    },
    {
      "name": "Spec covers error path",
      "description": "client_spec.rb contains at least one test case for error handling (network failure, JSON parse error, or missing configuration)",
      "max_score": 10
    }
  ]
}

README.md

tile.json