| v5.37.0 | ### Security - **Install and uninstall leave a `.gitignore` or initializer that links out of the app as it is, and name it.** They wrote through such a link before, and the legacy rule-file cleanup deletes nothing a symlinked rules folder carries out of the app. - **Uninstall and the dropped-tool cleanup no longer delete or edit a file that a symlinked directory carries out of the app.** Such a file is left in place and named as left behind a symlink the cleanup does not follow. ### | High | 10/24/2026 |
| v5.36.9 | ### Security - **`rails_read_logs` and `rails_query` hide a value under a plural secret name or a list of codes** (#606). A secret word ending a name in its plural (`api_keys`, `tokens`, `secrets`, `passwords`, `accessTokens`) named no secret, and neither did `recovery_codes`, `backup_codes`, `recoveryCodes` or `backupCodes`, so their values came back from a log line, inline or bound, and `rails_query` returned such a column. A list or hash logged under a secret name is now filtere | High | 10/23/2026 |
| v5.36.8 | ### Security - **The static tier keeps the security settings the app's Ruby config writes.** No initializer runs without a boot, so on the static tier (`--no-boot`, or a boot that failed) a `sensitive_patterns`, `excluded_paths` or `skip_tools` value set in a `RailsAiContext.configure` block was dropped, and a file the block made sensitive was searched and read. The static tier now reads every Ruby file of the app that names the gem, without running it: a file under `config/`, and | High | 10/23/2026 |
| v5.36.5 | ### Added - **`rails_get_edit_context` takes a `line`.** It shows `context_lines` either side of that line, so a line from a stack trace needs no text to search for. `near` is needed only without one. ### Fixed - **`rails_diagnose` shows the code around the line it was given** (#495). It searched for the method name and opened on its first mention, a comment included, so the failing line was missing from the code shown in 18 of 30 real calls on one app. It also reads a setter's nam | High | 10/19/2026 |
| v5.36.4 | ### Added - **The standalone binary says when a newer release is out.** A copy installed with `gem install` stayed at its version until someone thought to update it. It now asks rubygems.org for the latest version at most once a day, in a detached child process, and keeps the answer under `$XDG_STATE_HOME` (`~/.local/state/rails-ai-context/latest`). A command run in a terminal prints one line on stderr naming the Ruby to update under and the two commands to run. The MCP server adds | High | 10/16/2026 |
| v5.36.3 | ### Fixed - **`rails_diagnose` names an instance variable receiver with its `@`, and takes it from the line the error names.** `@widget.name` read as `widget`, so the advice named a variable the action does not have. The receiver also came from the first call of the method in the file, not from the line. A line that does not call the method on a plain name now gets no receiver instead of another line's. 5.36.2 and earlier versions had the gap. - **`rails_generate_test` says which sig | High | 10/15/2026 |
| v5.35.1 | ### Security - **`rails_query` sends no statement to an adapter with no database family.** On SQL Server, Oracle, CockroachDB and any other adapter outside PostgreSQL, MySQL and SQLite it ran the statement with the text checks alone, with no read-only transaction and no timeout. It now answers with the adapter's name, and it opens no connection to do so. - **MySQL bounds a statement that starts with WITH or EXPLAIN ANALYZE.** The `MAX_EXECUTION_TIME` hint bound only a statement that | High | 10/13/2026 |
| v5.35.0 | ### Added - **Copy-paste prompts.** `docs/PROMPTS.md` holds a prompt for every way to set the gem up, change it, upgrade it, fix it and remove it, plus prompts for daily work. Paste one into Claude Code, Cursor, GitHub Copilot, OpenCode or Codex CLI and it runs the install in its own shell. Prompts cover the Gemfile and standalone installs, the three setups, a team, a folder of apps, a private setup, a try-out, HTTP, Ruby in Docker and MCP clients the gem writes no config for. - ** | High | 10/12/2026 |
| v5.32.2 | ### Security - **`rails_query` runs the text its checks read.** The read-only validator strips comments before it looks for blocked keywords, sensitive columns and a second statement, but the query that ran was the raw input. The stripper did not know string literals, so a `--` or `/*` inside a quoted string hid the rest of the line from every check while the database still ran it: a column such as `api_key` could be read through an alias, unredacted. Comments are now taken out by | High | 10/7/2026 |
| v5.32.1 | ### Fixed - **A structure.sql app names its PostgreSQL extensions the way the booted app does.** The static tier named an extension bare only when it lived in `public`. Rails names it bare when it lives in the connection's current schema, the first entry of `schema_search_path`, so an app with `schema_search_path: "app,public"` saw `app.pg_trgm` without a boot and `pg_trgm` with one. The static tier now reads the search path from config/database.yml, and on Rails before 8.0 names e | High | 10/6/2026 |
| v5.32.0 | ### Added - **`model_details` lists more of what a model declares.** Under Macros: `attribute` (with its type and default), `alias_attribute`, `has_rich_text`, `strict_loading_by_default`, `implicit_order_column`, `locking_column`, `store_full_sti_class`, `attr_readonly` and `query_constraints`, in both tiers; a setting assigned inside a method or a nested class is not listed as the model's. An STI model names its parent (or a base its subclasses) and its type column, honoring `inh | High | 10/6/2026 |
| v5.31.0 | ### Changed - **A committed placeholder is not a secret.** A file whose name ends in `.example`, `.sample`, `.template` or `.dist` (`.env.example`) is readable by `rails_get_edit_context` and the other file tools, although the default `.env.*` pattern matches it, and `doctor` no longer lists it as unread or says to gitignore it. A `sensitive_patterns` entry that names the file exactly, with no glob characters, still blocks it, and so does a path pattern with a `/` (`.ssh/*` keeps ` | High | 10/5/2026 |
| v5.30.2 | ### Changed - **`generate_root_files: false` leaves out `.cursorrules` too, and always writes `.ai-context.json`.** `.cursorrules` is the same compact file as `CLAUDE.md` at the repo root, so it is a root file and now reports "Not applicable (root files disabled)". `.ai-context.json` is data for tools, not an instruction file, and is written whatever the key says. - **`serve --port` has no default of its own.** An explicit `--port` wins, then `http_port` from the config, then 6029. T | High | 10/1/2026 |
| v5.30.1 | ### Fixed - **A PostgreSQL partitioned table is one table wherever its partitions can be told apart.** The booted schema listed each partition as a table of its own, repeating the parent's columns, indexes and keys, and one app went from 98 tables to 211. The schema.rb and structure.sql readers did the same with the partitions Rails and pg_dump write out, and schema.rb's copies of the parent's foreign keys and check constraints came with them. A foreign key to a partitioned table, | High | 9/28/2026 |
| v5.30.0 | A pass over the whole tree for code that did not need to exist, with one base class for the introspectors and one for the serializers, and one reader where several files each kept a copy. Then four real-app QA passes in every tier (Mastodon, Discourse, OpenProject, Canvas, Forem, Whitehall, Consul, OpenFoodNetwork, Huginn, Errbit, Diaspora, Plots2 and a private API app) and five review rounds found the wrong answers below. Their fixes grew `lib/` by about 8,500 lines, most of it reading what th | High | 9/28/2026 |
| v5.29.0 | Twenty-three QA reports against v5.27.0, each one a wrong answer a reader could act on, plus what eight review rounds found in the fixes themselves. ### Added - **Model payloads carry method counts and the model's own methods uncapped.** `instance_method_count`, `class_method_count` and `source_instance_methods` sit beside the capped `instance_methods` and `class_methods` lists, on both tiers, so a reader can tell a cut list from a whole one. - **The schema payload carries `declared_t | High | 9/23/2026 |
| v5.28.0 | Thirty-six changes an architecture survey of v5.27.0 asked for, nine of them defects where a user got a wrong answer, plus what three review rounds found in the fixes themselves. ### Added - **Services, helpers, jobs and concerns are found wherever the app keeps them.** The four tools globbed `app/<kind>` off the app root, so a packwerk app whose services live under `packs/billing/app/services` was told it had no services directory and may not use the pattern. Directory discovery reads | High | 9/22/2026 |
| v5.26.0 | ### Added - **`docs/RELEASING.md`.** Every release rediscovered the same list by reading the release workflow: the changelog heading the notes are extracted from, the two files carrying the version, and the end-to-end run the gate wants against the exact commit before a tag will publish. Its first step picks the version from the Changed section, which nothing downstream checks. `CONTRIBUTING.md` points at it. ### Fixed Defects found by a ninth QA round of v5.25.0 against Mastodon ( | High | 9/11/2026 |
| v5.25.0 | ### Added - **`sprockets-rails`, `sprockets`, `sorcery` and `clearance` join the notable gem table**, so `rails_get_gems` lists them and the `rails_get_config` assets and auth lines name them from the lockfile rather than from a loaded constant. ### Fixed Defects found by a second survey round over the whole surface, and the duplicated mechanisms behind them. - **`max_view_total_size` and `max_view_file_size` said they capped view reads.** Only `doctor` reads either one, as the thre | High | 9/3/2026 |
| v5.24.0 | ### Fixed Defects found by a QA round against GitLab, OpenProject, Canvas LMS, Discourse and Mastodon. Every one of them exits 0. - **The commands that read the app degrade the way `tool` does.** `context`, `inspect`, `facts`, `preset`, `watch` and `init` called a bare boot guard, so on a repo you have just cloned - the case an agent most needs a `CLAUDE.md` for, and the case least likely to boot - every tool answered and the command that writes the files exited 1 having written nothi | Medium | 8/16/2026 |
| v5.17.0 | ### Added - **`config.query_allowed_columns`** exempts a column name from the built-in sensitive list used by `rails_query`. The rejection message told you to subtract from `query_redacted_columns`, which could never work: that list is unioned with a frozen suffix list, so an app with its own `oauth_applications.secret` had no way to query it. ### Fixed - **Documented security behaviour now matches the code.** The ReDoS timeout on user-supplied regexes needs `Regexp.timeout`, which | High | 8/9/2026 |
| v5.16.2 | ### Fixed - **Standalone static tier works when installed via `gem install`.** `tool <name> --no-boot`, `tool <name> --help`, and `tool --list` outside an app all died with `cannot load such file -- active_support/...`. The RubyGems binstub eagerly activates the whole dependency tree, so the exe's framework-path strip left every rails-family spec still flagged as activated and `Gem.try_activate` refused to re-add the stripped paths. The exe now stashes the stripped specs and splice | Medium | 7/17/2026 |
| v5.16.1 | ### Fixed - **Engine-mounted MCP works on Rails 7.0-7.2** (caught by the release e2e matrix minutes after 5.16.0 shipped; 8.x was unaffected). The MCP transport answers SSE-mode requests with a Rack 3 streaming body (a Proc); Rails 7.x's response buffer fed that Proc through Rack::ETag, which 500'd every `tools/call` through `mount RailsAiContext::Engine, at: "/mcp"`. `McpController` now includes `ActionController::Live` and pumps callable bodies through the live stream (enumerab | High | 7/11/2026 |
| v5.12.0 | ### Fixed Live-usage audit of the full MCP surface (all 38 tools over stdio + HTTP, the CLI tool runner, and the 9 resources / 5 resource templates) against a real Rails 8 app surfaced 15 correctness and edge-case defects, now fixed: - **`rails_get_schema` (and every schema-backed tool) now reads the live database.** The schema introspector treated `ActiveRecord::Base.connected?` as "is a DB reachable", but that is `false` on a freshly booted server before any query runs, so it silently fell | High | 6/29/2026 |
| v5.11.2 | ### Fixed - CLI tool runner now reads tool input schemas via `MCP::Tool::InputSchema#to_h` instead of the `#schema` accessor that `mcp` 0.20.0 removed. `rails-ai-context tool ...` and `rails 'ai:tool[NAME]'` no longer raise `undefined method 'schema'` when the bundle resolves `mcp` to 0.20.0+. `to_h` exposes the same `properties` and `required` the runner reads across the supported `mcp` range (`>= 0.8, < 2.0`), so no version pin is needed. (#85) | High | 6/16/2026 |
| v5.11.1 | ### Fixed - E2E MCP HTTP protocol spec sends `initialize` once per session instead of per-test, fixing compatibility with newer `mcp` gem versions that reject duplicate initialization. | High | 5/24/2026 |
| v5.10.0 | ### Added โ 8 new introspectors closing RAILS_NERVOUS_SYSTEM.md gaps An audit against [`RAILS_NERVOUS_SYSTEM.md`](RAILS_NERVOUS_SYSTEM.md) identified 9 framework sections where introspection was missing or partial. This release ships the 8 introspectors needed to close them (the 9th โ ยง11 Query interface โ was already covered by `:conventions` via `load_async` / `.async_*` scanning). All are wired into `PRESETS[:full]`. The gem now exposes **39 introspectors** (up from 31). - **`InitializerIn | High | 4/20/2026 |
| v5.9.1 | ### Fixed โ `GetConcern` missed plural concern names (#78) Thanks to [@johan--](https://github.com/johan--) for the report and fix. `rails_get_concern`'s includer search built its include-pattern regex via `String#classify`, which singularizes its input. Concerns with intentionally plural module names โ `WorksheetImports`, `PaperTrailEvents`, `SoftDeletables`, etc. โ got demodulized to `WorksheetImport` and the `include WorksheetImports` line in the model never matched. The tool reported no i | High | 4/20/2026 |
| v5.9.0 | ### Fixed โ Cursor chat agent didn't detect rules Real user report during release QA: the Cursor IDE's chat agent didn't pick up rules written only as `.cursor/rules/*.mdc`, even when the rule declared `alwaysApply: true`. Cursor has **two** rule systems and the chat-agent composition path still consults the legacy `.cursorrules` file in many current builds. `CursorRulesSerializer` now writes **both**: `.cursor/rules/*.mdc` (newer format with frontmatter / glob scoping / agent-requested trigg | High | 4/16/2026 |
| v5.8.1 | ### Fixed โ Security Hardening Four exploitable vulnerabilities across `rails_query`, the VFS URI dispatcher, and the instrumentation bridge, plus six defense-in-depth hardening issues. All discovered by security and deep code-review passes conducted during v5.8.1 pre-release verification. None were known at the v5.8.0 release โ **users should upgrade immediately**. - **SQL column-aliasing redaction bypass (exploitable).** Post-execution redaction in `rails_query` operated on `result.columns` | High | 4/15/2026 |
| v5.8.0 | ### Added โ Modern Rails Coverage Pass Five targeted gaps in modern Rails introspection, identified by an audit of the introspectors against current Rails 7/8 patterns. Net result: the gem now surfaces what AI agents need to know about Rails 8 built-in auth, Solid Errors, async query usage, strong_migrations safety, and Action Cable channel detail. - **Rails 8 built-in auth depth.** `auth_introspector#detect_authentication` previously detected `bin/rails generate authentication` only as a boo | High | 4/14/2026 |
| v5.7.1 | ### Changed โ SLOP Cleanup Internal code quality improvements โ no API changes, no new features. - **Extract `safe_read`, `max_file_size`, `sensitive_file?` to BaseTool** โ removed 16 duplicate one-liner methods across 8 tool files (get_env, get_job_pattern, get_service_pattern, get_turbo_map, get_partial_interface, get_view, get_edit_context, get_model_details, search_code) - **Extract `FullSerializerBehavior` module** โ deduplicated identical `footer` and `architecture_summary` methods from | High | 4/9/2026 |
| v5.7.0 | ### Quickstart โ Two commands. Problem gone. ```bash gem "rails-ai-context", group: :development rails generate rails_ai_context:install ``` ### Fixed โ Bug Fixes from Codebase Audit 6 bug fixes discovered via automated codebase audit (bug-finder, code-reviewer, doc-consistency-checker agents). - **AnalyzeFeature service/mailer method extraction** (HIGH) โ `\A` (start-of-string) anchor in `scan` regex replaced with `^` (start-of-line). Services and mailers now correctly list all methods ins | Medium | 4/9/2026 |
| v5.6.0 | ### Added โ Auto-Registration, TestHelper & Bug Fixes Developer experience improvements inspired by action_mcp patterns, plus 5 security/correctness bug fixes. - **Auto-registration via `inherited` hook** โ Tools are now auto-discovered from `BaseTool` subclasses. No manual list to maintain โ drop a file in `tools/` and it's registered. `Server.builtin_tools` is the new public API. Thread-safe via `@registry_mutex` with deadlock-free design (const_get runs outside mutex to avoid recursive loc | High | 4/9/2026 |
| v5.4.0 | ### Added โ Phase 3: Dynamic VFS & Live Resource Architecture (Ground Truth Engine Blueprint #39) Live Virtual File System replaces static resource handling. Every MCP resource is introspected fresh on every request โ zero stale data. - **VFS URI Dispatcher** (`lib/rails_ai_context/vfs.rb`) โ Pattern-matched routing for `rails-ai-context://` URIs. Resolves models, controllers, controller actions, views, and routes. Each call introspects fresh. Path traversal protection for view reads. - **4 | Medium | 4/7/2026 |
| v5.3.0 | ### Added โ Phase 2: Cross-Tool Semantic Hydration (Ground Truth Engine Blueprint #38) Controller and view tools now automatically inject schema hints for referenced models, eliminating the need for follow-up tool calls. - **SchemaHint** (`lib/rails_ai_context/schema_hint.rb`) โ Immutable `Data.define` value object carrying model ground truth: table, columns, associations, validations, primary key, and `[VERIFIED]`/`[INFERRED]` confidence tag. - **HydrationResult** โ Wraps hints + warnings f | Medium | 4/7/2026 |
| v5.2.0 | ### Added โ Phase 1: Prism AST Foundation (Ground Truth Engine Blueprint #36) System-wide AST migration replacing all regex-based Ruby source parsing with Prism AST visitors. This is the foundation layer for the Ground Truth Engine transformation (#37). - **AstCache** (`lib/rails_ai_context/ast_cache.rb`) โ Thread-safe Prism parse cache backed by `Concurrent::Map`. Keyed by path + SHA256 content hash + mtime. Invalidates automatically on file change. Shared by all AST-based introspectors. - | Medium | 4/7/2026 |
| v5.1.0 | ### Fixed Accuracy fixes across 8 introspectors, eliminating false positives and capturing previously-missed signals. No public API changes; all 38 MCP tools retain their contracts. - **ApiIntrospector** โ pagination detection (`detect_pagination`) was substring-matching Gemfile.lock content, producing false positives on gems that merely contain the strategy name: `happypagy`, `kaminari-i18n`, transitive `pagy` dependencies. Now uses anchored lockfile regex (`^ pagy \(`) that only matches | Medium | 4/5/2026 |
| v5.0.0 | ### Removed (BREAKING) This release removes the Design & Styling surface and the Accessibility rule surface. When AI assistants consumed pre-digested design/styling context (color palettes, Tailwind class strings, canonical HTML/ERB snippets), they produced poor UI/UX output by blindly copying class strings instead of understanding visual hierarchy. The accessibility surface was asymmetric (Claude-only static rule file, no live MCP tool) and provided generic best-practice rules that didn't ear | Medium | 4/5/2026 |
| v4.7.0 | ### Added - **Anti-Hallucination Protocol** โ 6-rule verification section embedded in every generated context file (CLAUDE.md, AGENTS.md, .claude/rules/, .cursor/rules/, .github/instructions/, copilot-instructions.md). Targets specific AI failure modes: statistical priors overriding observed facts, pattern completion beating verification, inheritance blindness, empty-output-as-permission, stale-context-lies. Rules force AI to verify column/association/route/method/gem names before writing, mark | Medium | 4/5/2026 |
| v4.6.0 | ### Added - **Integration test suite** โ 3 purpose-built Rails 8 apps exercising every gem feature end-to-end: - `full_app` โ comprehensive app (38 gems, 14 models, 15 controllers, 26 views, 5 jobs, 3 mailers, multi-database, ViewComponent, Stimulus, STI, polymorphic, AASM, PaperTrail, FriendlyId, encrypted attributes, CurrentAttributes, Flipper feature flags, Sentry monitoring, Pundit auth, Ransack search, Dry-rb, acts_as_tenant, Docker, Kamal, GitHub Actions CI, RSpec + FactoryBot) - `api | Medium | 4/4/2026 |
| v4.5.2 | ### Added - **Strong params permit list extraction** โ Controller introspector now parses `params.require(:x).permit(...)` calls, returning structured hashes with `requires`, `permits`, `nested`, `arrays`, and `unrestricted` fields. Handles multi-line chains, hash rocket syntax, and `params.permit!` detection - **N+1 risk levels** โ PerformanceCheck now classifies N+1 risks as `[HIGH]` (no preloading), `[MEDIUM]` (partial preloading), or `[low]` (already preloaded). Detects loop patterns in con | Medium | 4/4/2026 |
| v4.5.1 | Release v4.5.1. See [CHANGELOG.md](CHANGELOG.md) for details. | Medium | 4/3/2026 |
| v4.5.0 | Release v4.5.0. See [CHANGELOG.md](CHANGELOG.md) for details. | Medium | 4/3/2026 |
| v4.4.0 | ### Added - **33 introspector enhancements** โ every introspector upgraded with new detection capabilities: - **SchemaIntrospector**: expression indexes, column comments in static parse, `change_column_default`/`change_column_null` in migration replay - **ModelIntrospector**: STI hierarchy detection (parent/children/type column), `attribute` API, enum `_prefix:`/`_suffix:`, `after_commit on:` parsing, inline `private def` exclusion - **RouteIntrospector**: route parameter extraction, root | Medium | 4/3/2026 |
| v4.3.3 | ### Fixed - **100 bare rescue statements across 46 files** โ all replaced with `rescue => e` + conditional debug logging (`$stderr.puts ... if ENV["DEBUG"]`); errors are now visible instead of silently swallowed - **database_stats introspector orphaned** โ `DatabaseStatsIntrospector` was unreachable (not in any preset); added to `:full` preset (32 โ 33 introspectors) - **CHANGELOG date errors** โ v4.0.0 corrected from 2026-03-26 to 2026-03-27, v4.2.0 from 2026-03-26 to 2026-03-30 (verified agai | Medium | 4/2/2026 |
| v4.3.2 | ### Fixed - **review_changes undefined variable** โ `changed_tests` (NameError at runtime) replaced with correct `test_files` variable in `detect_warnings` - **N+1 introspector O(n*m*k) view scan** โ `detect_n_plus_one` now pre-loads all view file contents once via `preload_view_contents` instead of re-globbing per model+association pair - **atomic write collision** โ temp filenames now include `SecureRandom.hex(4)` suffix to prevent concurrent process collisions on the same file - **bare rescu | Medium | 4/2/2026 |
| v4.3.1 | ### Fixed - **performance_check false positives** โ now parses `t.index` inside `create_table` blocks (was only parsing `add_index` outside blocks, missing inline indexes) - **review_changes overflow** โ capped at 20 files with 30 diff lines each; remaining files listed without diff to prevent 200K+ char responses - **get_context ivar cross-check** โ now follows `render :other_template` references (create rendering :new on failure no longer shows false positives) - **generate_test setup block** | Medium | 4/2/2026 |
| v4.3.0 | ### Added - **`rails_onboard`** โ narrative app walkthrough (quick/standard/full) for new developers and AI agents: stack, data model, authentication, key flows, jobs, frontend, testing, getting started - **`rails_generate_test`** โ generates test scaffolding matching project patterns: detects framework (RSpec/Minitest), factories vs fixtures, assertion style, Devise helpers; covers validations, associations, scopes, enums, request specs with routes - **`rails_diagnose`** โ one-call error diagn | Medium | 4/1/2026 |
| v4.2.3 | ### Fixed - **Unicode output** โ `rails_get_context` ivar cross-check now renders actual Unicode symbols (โโโ ) instead of literal `\u2713` escape sequences - **Scope name rendering** โ all 6 serializers (claude, cursor, copilot, opencode, claude_rules, copilot_instructions) now extract scope names from hash-style scope data instead of dumping raw `{:name=>"active", :body=>"..."}` into output - **Scope exclusion** โ `ModelIntrospector#extract_public_class_methods` now correctly extracts scope na | Medium | 4/1/2026 |
| v4.2.2 | ### Fixed - **Vite config detection** โ framework plugin detection now checks `.mts`, `.mjs`, `.cts`, `.cjs` extensions in addition to `.ts` and `.js` - **Component catalog ERB** โ no-props no-slots components now generate inline `<%= render Foo.new %>` instead of misleading `do...end` block - **Custom tools validation** โ invalid entries in `config.custom_tools` are now filtered with a clear warning instead of crashing the MCP server with a cryptic `NoMethodError` ### Changed - Test count: 99 | Medium | 4/1/2026 |
| v4.2.1 | ### Fixed - **Security: SQL comment stripping** โ `rails_query` now strips MySQL-style `#` comments in addition to `--` and `/* */` - **Security: Regex injection** โ PerformanceIntrospector now uses `Regexp.escape` on all interpolated model/association names to prevent regex injection - **Security: SearchDocs error memoization** โ transient index load failures (JSON parse errors, missing file) are no longer cached permanently; subsequent calls retry instead of returning stale errors - **Securit | Medium | 3/31/2026 |
| v4.2.0 | ### Added - New `rails_search_docs` tool: bundled topic index with weighted keyword search, on-demand GitHub fetch for Rails documentation - New `rails_query` tool: safe read-only SQL queries with defense-in-depth (regex pre-filter + SET TRANSACTION READ ONLY + configurable timeout + row limit + column redaction) - New `rails_read_logs` tool: reverse file tail with level filtering (debug/info/warn/error/fatal) and sensitive data redaction - New config options: `query_timeout` (default timeout f | Medium | 3/30/2026 |
| v4.1.0 | ### Added - New `rails_get_frontend_stack` tool: detects React/Vue/Svelte/Angular, Inertia/react-rails mounting, state management, TypeScript config, monorepo layout, package manager - New `FrontendFrameworkIntrospector`: parses package.json (JSON.parse with BOM-safe reading), config/vite.json, config/shakapacker.yml, tsconfig.json - Frontend framework detection covers patterns 3 (hybrid SPA), 4 (API+SPA), and 7 (Turbo Native) - API introspector: OpenAPI/Swagger spec detection, CORS config pars | Medium | 3/28/2026 |
| v4.0.0 | ### Added - 4 new MCP tools: `rails_get_component_catalog`, `rails_performance_check`, `rails_dependency_graph`, `rails_migration_advisor` - 3 new introspectors: ComponentIntrospector (ViewComponent/Phlex), AccessibilityIntrospector (ARIA/a11y), PerformanceIntrospector (N+1/indexes) - ViewComponent/Phlex component catalog: props, slots, previews, sidecar assets, usage examples - Accessibility scanning: ARIA attributes, semantic HTML, screen reader text, alt text, landmark roles, accessibility | Medium | 3/27/2026 |
| v3.1.0 | ### Fixed - **Consistent input normalization across all tools** โ AI agents and humans can now use any casing or format and tools resolve correctly: - `model=brand_profile` (snake_case) now resolves to `BrandProfile` via `.underscore` comparison in `get_model_details`. - `table=Cook` (model name) now resolves to `cooks` table via `.underscore.pluralize` normalization in `get_schema`. - `controller=CooksController` now works in `get_view` and `get_routes` โ both strip `Controller`/`_contr | Medium | 3/26/2026 |
| v3.0.1 | Release v3.0.1. See [CHANGELOG.md](CHANGELOG.md) for details. | Medium | 3/26/2026 |
| v3.0.0 | ## v3.0.0 โ CLI Tools + Windsurf Removal ### Breaking Changes **Windsurf support removed.** v2.0.5 is the last version with Windsurf support. If you need Windsurf context files, pin your Gemfile: ```ruby gem "rails-ai-context", "~> 2.0" ``` ### New: CLI Tool Support โ The Game Changer All 25 introspection tools now work directly from the terminal. No MCP server needed. ```bash rails 'ai:tool[schema]' table=users detail=full rails 'ai:tool[search_code]' pattern="can_cook?" match_type=trace | Medium | 3/26/2026 |
| v2.0.5 | ### Changed - **Task-based MCP tool instructions** โ all 6 serializers (Claude, Cursor, Copilot, Windsurf, OpenCode) rewritten from tool-first to task-first: "What are you trying to do?" โ exact tool call. 7 task categories: understand a feature, trace a method, add a field, fix a controller, build a view, write tests, find code. Every AI agent now understands which tool to use for any task. - **Concern detail:"full" bug fix** โ `\b` after `?`/`!` prevented 13 of 15 method bodies from being ex | Medium | 3/25/2026 |
| v2.0.4 | ### Added - **Orphaned table detection** โ `get_schema` standard mode flags tables with no ActiveRecord model: "โ Orphaned tables: content_calendars, cook_comments" - **Concern method source code** โ `get_concern(name:"X", detail:"full")` shows method bodies inline, same pattern as callbacks tool. - **analyze_feature: inherited filters** โ shows `authenticate_user! (from ApplicationController)` in controller section. - **analyze_feature: code-ready route helpers** โ `cook_path(@record)`, `cook | Medium | 3/25/2026 |
| v2.0.3 | ### Added - **Trace mode 100%** โ `match_type:"trace"` now shows 7 sections: definition with class/module context, source code, internal calls, sibling methods (same file), app callers with route chain hints, and test coverage (separated from app code). Zero follow-up calls needed. - **README rewrite** โ neuro marketing techniques: loss aversion hook, measured token savings table, trace output inline, architecture diagram. 456โ261 lines. | Medium | 3/25/2026 |
| v2.0.2 | ### Added - **`match_type:"trace"` in search_code** โ full method picture in one call: definition + source code + all callers grouped by type (Controller/Model/View/Job/Service/Test) + internal calls. The game changer for code navigation. - **`match_type:"call"`** โ find call sites only, excluding definitions. - **Smart result limiting** โ <10 shows all, 10-100 shows half, >100 caps at 100. Pagination via `offset:` param. - **`exclude_tests:true`** โ skip test/spec/features directories in sear | Medium | 3/25/2026 |
| v2.0.1 | ### Fixed - **MCP-first mandatory workflow in all serializers** โ all 6 serializer outputs (Claude, Cursor, Copilot, Windsurf, OpenCode) now use "MANDATORY, Use Before Read" language with structured workflow, anti-patterns table, and "Do NOT Bypass" rules. AI agents are explicitly instructed to never read reference files directly. - **27 type-safety bugs in serializers** โ fixed `.keys` called on Array values (same pattern as #14) across `design_system_helper.rb`, `get_design_system.rb`, `mark | Medium | 3/25/2026 |
| v2.0.0 | ### Added - **9 new MCP tools (16โ25)** โ `rails_get_concern` (concern methods + includers), `rails_get_callbacks` (execution order + source), `rails_get_helper_methods` (app + framework helpers + view refs), `rails_get_service_pattern` (interface, deps, side effects), `rails_get_job_pattern` (queue, retries, guards, broadcasts), `rails_get_env` (env vars, credentials keys, external services), `rails_get_partial_interface` (locals contract + usage), `rails_get_turbo_map` (stream/frame wiring + | Medium | 3/25/2026 |
| v1.2.1 | ### Fixed - **New models now discovered via filesystem fallback** โ when `ActiveRecord::Base.descendants` misses a newly created model, the introspector scans `app/models/*.rb` and constantizes them. Fixes model invisibility until MCP restart. - **Devise meta-methods no longer fill class/instance method caps** โ filtered 40+ Devise-generated methods (authentication_keys=, email_regexp=, password_required?, etc.). Source-defined methods now prioritized over reflection-discovered ones. - **Contr | Medium | 3/23/2026 |
| v1.2.0 | ### Added - **Design system extraction** โ ViewTemplateIntrospector now extracts canonical page examples (real HTML/ERB snippets from actual views), full color palette with semantic roles (primary/danger/success/warning), typography scale (sizes, weights, heading styles), layout patterns (containers, grids, spacing scale), responsive breakpoint usage, interactive state patterns (hover/focus/active/disabled), dark mode detection, and icon system identification. - **New MCP tool: `rails_get_desi | Medium | 3/23/2026 |
| v1.1.1 | ### Added - **Full-preset stack overview in all serializers** โ compact mode now surfaces summary lines for auth, Hotwire/Turbo, API, I18n, ActiveStorage, ActionText, assets, engines, and multi-database in generated context files (CLAUDE.md, AGENTS.md, .windsurfrules, and all split rules). Previously this data was only available via MCP tools. - **`rails_analyze_feature` in all tool reference sections** โ the 14th tool (added in v1.0.0) was missing from serializer output. Now listed in all gen | Medium | 3/23/2026 |
| v1.1.0 | ### Changed - **Default preset changed to `:full`** โ all 28 introspectors now run by default, giving AI assistants richer context out of the box. Introspectors that don't find relevant data return empty hashes with zero overhead. Use `config.preset = :standard` for the previous 13-core default. | Medium | 3/23/2026 |
| v1.0.0 | ### Added - **New composite tool: `rails_analyze_feature`** โ one call returns schema + models + controllers + routes for a feature area (e.g., `rails_analyze_feature(feature:"authentication")`). Total MCP tools: 14. - **Custom tool registration API** โ `config.custom_tools << MyCompany::PolicyCheckTool` lets teams extend the MCP server with their own tools. - **Structured error responses with fuzzy suggestions** โ `not_found_response` helper in BaseTool with "Did you mean?" fuzzy matching (su | Medium | 3/23/2026 |
| v0.15.10 | ### Changed - **Gemspec description rewritten** โ repositioned from feature list to value proposition: mental model, semantic validation, cross-file error detection. | Medium | 3/23/2026 |
| v0.15.9 | ### Added - **Deep diagnostic checks in `rails ai:doctor`** โ upgraded from 13 shallow file-existence checks to 20 deep checks: pending migrations, context file freshness, .mcp.json validation, introspector health (dry-runs each one), preset coverage (detects features not in preset), .env/.master.key gitignore check, auto_mount production warning, schema/view size vs limits. | Medium | 3/23/2026 |
| v0.15.8 | ### Added - **Semantic validation (`level:"rails"`)** โ `rails_validate` now supports `level:"rails"` for deep semantic checks beyond syntax: partial existence, route helper validity, column references vs schema, strong params vs schema columns, callback method existence, route-action consistency, `has_many` dependent options, missing FK indexes, and Stimulus controller file existence. | Medium | 3/23/2026 |
| v0.15.7 | ### Improved - **Hybrid filter extraction** โ controller filters now use reflection for complete names (handles inheritance + skips), with source parsing from the inheritance chain for only/except constraints. - **Callback source fallback** โ when reflection returns nothing (e.g. CI), falls back to parsing callback declarations from model source files. - **ERB validation accuracy** โ in-process compilation with `<%=` โ `<%` pre-processing and yield wrapper eliminates false positives from block | Low | 3/22/2026 |
| v0.15.6 | ### Added - **7 new configurable options** โ `excluded_controllers`, `excluded_route_prefixes`, `excluded_concerns`, `excluded_filters`, `excluded_middleware`, `search_extensions`, `concern_paths` for stack-specific customization. - **Configurable file size limits** โ `max_file_size`, `max_test_file_size`, `max_schema_file_size`, `max_view_total_size`, `max_view_file_size`, `max_search_results`, `max_validate_files` all exposed via `Configuration`. - **Class methods in model detail** โ `rails_ | Low | 3/22/2026 |
| v0.15.5 | ### Fixed - **ERB validation** โ now catches missing `<% end %>` by compiling ERB to Ruby then syntax-checking the result (was only checking ERB tag syntax). - **Controller namespace format** โ accepts both `Bonus::CrisesController` and `bonus/crises` (cross-tool consistency). - **Layouts discoverable** โ `controller:"layouts"` now works in view tool. - **Validate error detail** โ Ruby shows up to 5 error lines, JS shows 3 (was truncated to 1). - **Invalid/empty regex** โ early validation with | Low | 3/22/2026 |
| v0.15.4 | ### Fixed - **View subfolder paths** โ listings now show full relative paths (`bonus/brand_profiles/index.html.erb`) instead of just basenames. - **Controller flexible matching** โ `"cooks"`, `"CooksController"`, `"cookscontroller"` all resolve (matches other tools' forgiving lookup). - **View path traversal** โ explicit `..` and absolute path rejection before any filesystem operation. - **Schema case-insensitive** โ table lookup now case-insensitive (matches models/routes/etc.). - **limit:0 s | Low | 3/22/2026 |