ConsoleAgent

Claude Code, embedded in your Rails console.

Ask questions in plain English. The AI explores your schema, models, and source code on its own, then writes and runs the Ruby code for you.

Install

# Gemfile
gem 'console_agent', group: :development
bundle install
rails generate console_agent:install

Set your API key in the generated initializer or as an env var (ANTHROPIC_API_KEY):

# config/initializers/console_agent.rb
ConsoleAgent.configure do |config|
  config.api_key = 'sk-ant-...'
end

To set up session logging (OPTIONAL), create the table from the console:

ConsoleAgent.setup!
# => ConsoleAgent: created console_agent_sessions table.

To reset the table (e.g. after upgrading), run ConsoleAgent.teardown! then ConsoleAgent.setup!.

Usage

irb> ai "find the 5 most recent orders over $100"
  Thinking...
  -> list_tables
     12 tables: users, orders, line_items, products...
  -> describe_table("orders")
     8 columns

  Order.where("total > ?", 100).order(created_at: :desc).limit(5)

Execute? [y/N/edit] y
=> [#<Order id: 4821, ...>, ...]

The AI calls tools behind the scenes to learn your app — schema, models, associations, source code — so it writes accurate queries without you providing any context.

Commands

Command What it does
ai "query" One-shot: ask, review code, confirm
ai! "query" Interactive: ask and keep chatting
ai? "query" Explain only, never executes
ai_init Generate/update app guide for better context

Multi-Step Plans

For complex tasks, the AI builds a plan and executes it step by step:

ai> get the most recent salesforce token and count events via the API
  Thinking...
  -> describe_table("oauth2_tokens")
     28 columns
  -> read_file("lib/salesforce_api.rb")
     202 lines

  Plan (2 steps):
  1. Find the most recent active Salesforce OAuth2 token
     token = Oauth2Token.where(provider: "salesforce", active: true)
                        .order(updated_at: :desc).first
  2. Query event count via SOQL
     api = SalesforceApi.new(step1)
     api.query("SELECT COUNT(Id) FROM Event")

  Accept plan? [y/N/a(uto)] a
  Step 1/2: Find the most recent active Salesforce OAuth2 token
  ...
=> #<Oauth2Token id: 1, provider: "salesforce", ...>

  Step 2/2: Query event count via SOQL
  ...
=> [{"expr0"=>42}]

Each step's return value is available to later steps as step1, step2, etc.

Plan prompt options:

  • y — accept, then confirm each step one at a time
  • a — accept and auto-run all steps (stays in manual mode for future queries)
  • N — decline; you're asked what to change and the AI revises

Memories

The AI remembers what it learns about your codebase across sessions:

ai> how does sharding work?
  -> read_file("config/initializers/sharding.rb")
  -> save_memory("Sharding architecture")
     Memory saved

  This app uses database-per-shard. User.count returns the current shard only.

Next time, it already knows — no re-reading files, fewer tokens.

Application Guide

Run ai_init to have the AI explore your app and generate a guide that gets loaded into every future conversation:

irb> ai_init
  No existing guide. Exploring the app...
  Thinking...
  -> list_models
     240 models
  -> describe_model("User")
     119 associations, 6 validations
  -> describe_model("Account")
     25 associations
  -> search_code("Sharding", dir: "config")
     Found 36 matches
  ...
  Guide saved to .console_agent/console_agent.md (3204 chars)

The guide is a markdown file covering your app's models, relationships, data architecture, and gotchas. Unlike memories (which require a tool call to recall), the guide is injected directly into the system prompt — so the AI starts every session already knowing your app.

Run ai_init again anytime to update it.

Interactive Mode

irb> ai!
ConsoleAgent interactive mode. Type 'exit' to leave.
  Auto-execute: OFF (Shift-Tab or /auto to toggle) | > code to run directly | /usage | /name <label>

ai> show me all tables
  ...
ai> count orders by status
  ...
ai> /auto
  Auto-execute: ON
ai> delete cancelled orders older than 90 days
  ...
ai> exit

Toggle /auto to skip confirmation prompts. /debug shows raw API traffic. /usage shows token stats.

Direct Code Execution

Prefix any input with > to run Ruby code directly — no LLM round-trip. The result is added to the conversation context, so the AI knows what happened:

ai> >User.count
=> 8
ai> how many users do I have?
  Thinking...

You have **8 users** in your database, as confirmed by the `User.count` you just ran.

Useful for quick checks, setting up variables, or giving the AI concrete data to work with.

Sessions

Sessions are saved automatically when session logging is enabled. You can name, list, and resume them.

ai> /name sf_user_123_calendar
  Session named: sf_user_123_calendar
ai> exit
Session #42 saved.
  Resume with: ai_resume "sf_user_123_calendar"
Left ConsoleAgent interactive mode.

List recent sessions:

irb> ai_sessions
[Sessions — showing 3]

  #42 sf_user_123_calendar find user 123 with calendar issues
     [interactive] 5m ago 2340 tokens

  #41 count all active users
     [one_shot] 1h ago 850 tokens

  #40 debug_payments explain payment flow
     [interactive] 2h ago 4100 tokens

Use ai_resume(id_or_name) to resume a session.

Resume a session by name or ID — previous output is replayed, then you continue where you left off:

irb> ai_resume "sf_user_123_calendar"
--- Replaying previous session output ---
ai> find user 123 with calendar issues
  ...previous output...
--- End of previous output ---

ConsoleAgent interactive mode (sf_user_123_calendar). Type 'exit' to leave.
ai> now check their calendar sync status
  ...

Name or rename a session after the fact:

irb> ai_name 41, "active_user_count"
Session #41 named: active_user_count

Filter sessions by search term:

irb> ai_sessions 20, search: "salesforce"

If you have an existing console_agent_sessions table, run ConsoleAgent.migrate! to add the name column.

Configuration

All settings live in config/initializers/console_agent.rb and can be changed at runtime:

ConsoleAgent.configure do |config|
  config.provider = :anthropic       # or :openai
  config.auto_execute = false         # true to skip confirmations
  config.max_tokens = 4096             # max tokens per LLM response
  config.max_tool_rounds = 10         # max tool calls per query
  config.session_logging = true       # log sessions to DB (run ConsoleAgent.setup!)
end

For the admin UI, mount the engine:

mount ConsoleAgent::Engine => '/console_agent'

Requirements

  • Ruby >= 2.5, Rails >= 5.0, Faraday >= 1.0

License

MIT