# frozen_string_literal: true require_relative "lib/opencode/rails_version" Gem::Specification.new do |spec| spec.name = "opencode-rails" spec.version = Opencode::RAILS_VERSION spec.authors = ["Ajay Krishnan"] spec.email = ["opencode-rails@ajay.to"] spec.summary = "Production-grade Rails integration for OpenCode." spec.description = <<~DESC Rails companion to opencode-ruby. ActiveRecord-aware session lifecycle (idempotent ensure!/recreate!/abort! with row-level locks), a Turn orchestrator that drives the Reply state machine + handles session-not-found recovery, an artifact pipeline backed by ActiveStorage, sandbox seeding, and tool-display value objects for Turbo Stream broadcasts. Drop into any Rails 7.1+ app that wants production-grade OpenCode streaming without rolling your own boilerplate. DESC spec.homepage = "https://github.com/ajaynomics/opencode-rails" spec.license = "MIT" spec.required_ruby_version = ">= 3.2.0" spec.metadata["homepage_uri"] = spec.homepage spec.metadata["source_code_uri"] = spec.homepage spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/main/CHANGELOG.md" spec.metadata["bug_tracker_uri"] = "#{spec.homepage}/issues" spec.files = Dir.glob("lib/**/*.rb") + Dir.glob("examples/**/*.rb") + %w[README.md LICENSE CHANGELOG.md opencode-rails.gemspec] spec.require_paths = ["lib"] # The opencode-ruby gem provides the wire-level Client + Reply primitives # this gem builds on. During alpha both gems evolve in lockstep — we pin # exactly (= not ~>) so that consumers always pick the version this gem # was tested against. spec.add_runtime_dependency "opencode-ruby", "= 0.0.1.alpha9" # Rails edge moved activestorage to marcel ~> 2.0, and this gem depends on # activestorage directly, so pinning ~> 1.0 makes it unresolvable alongside # edge. marcel 2 requires Ruby >= 3.3 while this gem supports >= 3.2, so the # bound is a permissive range rather than a bump: consumers on 3.3+ resolve # marcel 2, consumers on 3.2 resolve marcel 1. The single call site, # Marcel::MimeType.for(name:), behaves identically in both majors. spec.add_runtime_dependency "marcel", ">= 1.0", "< 3" # Rails sub-libraries used at runtime. Depending on these individually # (instead of the `rails` umbrella) avoids forcing host apps to load # ActionMailer, ActionCable, ActionView, etc. just to use this gem. spec.add_runtime_dependency "activerecord", ">= 7.1", "< 9.0" spec.add_runtime_dependency "activestorage", ">= 7.1", "< 9.0" spec.add_runtime_dependency "activesupport", ">= 7.1", "< 9.0" # minitest 6 removed minitest/mock; Object#stub now ships in the extracted # minitest-mock gem, which the suite uses to stub Net::HTTP, File and Tempfile. spec.add_development_dependency "minitest", "~> 6.0" spec.add_development_dependency "minitest-mock", "~> 5.27" spec.add_development_dependency "rake", "~> 13.0" end