CtrlK
BlogDocsLog inGet started
Tessl Logo

igmarin/hanakai-yaku

Curated library of atomic AI agent skills for Hanami, dry-rb, and ROM Ruby development. Covers actions, slices, repositories, relations, changesets, providers, DI, operations, TDD, CLI, views, routing, and validation. Shared Ruby process skills have moved to ruby-core-skills. Uses Markdown + Front-matter architecture.

92

1.33x
Quality

94%

Does it follow best practices?

Impact

92%

1.33x

Average score across 35 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

PROVIDER_PATTERNS.mdskills/providers/configure-providers/

Provider Patterns Reference

ROM Connection Provider

# config/providers/rom.rb
Hanami.app.register_provider(:rom) do
  prepare do
    require "rom"
    require "rom-sql"
  end

  start do
    configuration = ROM::Configuration.new(
      :sql,
      target["settings"].database_url,
      extensions: [:pg_json]
    )

    configuration.auto_registration(
      target.root.join("slices").to_s,
      namespace: false
    )

    register("rom", ROM.container(configuration))
  end
end

Redis Provider

# config/providers/redis.rb
Hanami.app.register_provider(:redis) do
  prepare do
    require "redis"
  end

  start do
    client = Redis.new(url: target["settings"].redis_url)
    register("redis", client)
  end
end

HTTP Client Provider

# config/providers/http_client.rb
Hanami.app.register_provider(:http_client) do
  prepare do
    require "faraday"
  end

  start do
    client = Faraday.new(
      url: target["settings"].api_base_url,
      headers: { "Authorization" => "Bearer #{target["settings"].api_token}" }
    ) do |f|
      f.request :json
      f.response :json
    end
    register("http_client", client)
  end
end

Background Job Provider

# config/providers/sidekiq.rb
Hanami.app.register_provider(:sidekiq) do
  prepare do
    require "sidekiq"
  end

  start do
    Sidekiq.configure_client do |config|
      config.redis = { url: target["settings"].redis_url }
    end

    register("sidekiq.client", Sidekiq::Client)
  end
end

Settings Structure

Every provider that needs configuration reads from settings:

# config/settings.rb
module HanamiApp
  class Settings < Hanami::Settings
    setting :database_url, constructor: Types::String
    setting :redis_url, constructor: Types::String
    setting :api_base_url, constructor: Types::String
    setting :api_token, constructor: Types::String
  end
end

Settings use dry-types for type safety. The constructor coerces the ENV value to the correct type.

skills

providers

README.md

tile.json