rails-ai-context 5.10.0 → 5.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -0
  3. data/README.md +1 -1
  4. data/docs/ARCHITECTURE.md +1 -1
  5. data/docs/superpowers/plans/2026-05-24-prism-ast-migration.md +1218 -0
  6. data/lib/generators/rails_ai_context/install/install_generator.rb +2 -1
  7. data/lib/rails_ai_context/introspectors/action_mailbox_introspector.rb +6 -7
  8. data/lib/rails_ai_context/introspectors/action_text_introspector.rb +4 -4
  9. data/lib/rails_ai_context/introspectors/active_storage_introspector.rb +15 -18
  10. data/lib/rails_ai_context/introspectors/active_support_introspector.rb +8 -2
  11. data/lib/rails_ai_context/introspectors/api_introspector.rb +22 -7
  12. data/lib/rails_ai_context/introspectors/asset_pipeline_introspector.rb +34 -3
  13. data/lib/rails_ai_context/introspectors/auth_introspector.rb +78 -44
  14. data/lib/rails_ai_context/introspectors/component_introspector.rb +133 -52
  15. data/lib/rails_ai_context/introspectors/config_introspector.rb +37 -2
  16. data/lib/rails_ai_context/introspectors/controller_introspector.rb +334 -158
  17. data/lib/rails_ai_context/introspectors/convention_introspector.rb +168 -34
  18. data/lib/rails_ai_context/introspectors/devops_introspector.rb +63 -18
  19. data/lib/rails_ai_context/introspectors/engine_introspector.rb +4 -21
  20. data/lib/rails_ai_context/introspectors/env_introspector.rb +5 -3
  21. data/lib/rails_ai_context/introspectors/gem_introspector.rb +13 -22
  22. data/lib/rails_ai_context/introspectors/job_introspector.rb +98 -20
  23. data/lib/rails_ai_context/introspectors/listeners/chained_call_listener.rb +26 -0
  24. data/lib/rails_ai_context/introspectors/listeners/env_access_listener.rb +62 -0
  25. data/lib/rails_ai_context/introspectors/listeners/gemfile_dsl_listener.rb +95 -0
  26. data/lib/rails_ai_context/introspectors/listeners/generic_macro_listener.rb +27 -0
  27. data/lib/rails_ai_context/introspectors/listeners/mailbox_routing_listener.rb +63 -0
  28. data/lib/rails_ai_context/introspectors/listeners/middleware_config_listener.rb +48 -0
  29. data/lib/rails_ai_context/introspectors/listeners/migration_dsl_listener.rb +161 -0
  30. data/lib/rails_ai_context/introspectors/listeners/mount_listener.rb +87 -0
  31. data/lib/rails_ai_context/introspectors/listeners/rake_task_dsl_listener.rb +145 -0
  32. data/lib/rails_ai_context/introspectors/listeners/schema_dsl_listener.rb +216 -0
  33. data/lib/rails_ai_context/introspectors/listeners/variant_call_listener.rb +13 -0
  34. data/lib/rails_ai_context/introspectors/middleware_introspector.rb +21 -6
  35. data/lib/rails_ai_context/introspectors/model_introspector.rb +30 -7
  36. data/lib/rails_ai_context/introspectors/multi_database_introspector.rb +35 -17
  37. data/lib/rails_ai_context/introspectors/performance_introspector.rb +29 -5
  38. data/lib/rails_ai_context/introspectors/rake_task_introspector.rb +46 -26
  39. data/lib/rails_ai_context/introspectors/schema_introspector.rb +314 -249
  40. data/lib/rails_ai_context/introspectors/security_introspector.rb +91 -14
  41. data/lib/rails_ai_context/introspectors/seeds_introspector.rb +29 -7
  42. data/lib/rails_ai_context/introspectors/source_introspector.rb +24 -10
  43. data/lib/rails_ai_context/introspectors/test_introspector.rb +11 -7
  44. data/lib/rails_ai_context/introspectors/turbo_introspector.rb +7 -4
  45. data/lib/rails_ai_context/introspectors/view_introspector.rb +24 -13
  46. data/lib/rails_ai_context/tools/validate.rb +72 -2
  47. data/lib/rails_ai_context/version.rb +1 -1
  48. metadata +13 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b022525ce9aa13c5b6d5f21a46f13db5ae84dac04f346adc40eeb2b315f9fcaa
4
- data.tar.gz: 9e9f7bd60ecdab6a5d1599e560762c8c7d95a8973f5d001c4573d00f55b2a594
3
+ metadata.gz: c3e23845bcfe323dd73111461ed349f0d35d8e8bb4bcd941a4c7ed870c749624
4
+ data.tar.gz: 93969c1619e875b051f414dbbb6e15390c228355354232508ae67e0edc3a59b1
5
5
  SHA512:
6
- metadata.gz: 7dca71cfea9fb5106b40f5eaebd119e36bcd1cbcbdd41b8dcd8ba4b11eb802dbb647d0c90db88b4d21a98d303ed2ed42f605ca7278a245a76155fc57cb0366cf
7
- data.tar.gz: baaeaa8a5eec91ba86c6aee32f5a0d459ebcc7f14c1eaec64e7110afe7368985e005b92dcdee960606525806d652cd63f5eb1092773765cbe831857cffde75a1
6
+ metadata.gz: a7c3d0052929d25b6ae73cbf5aa7d5019f0358b937f26ed74f494070ce8b15d86d77eca302f0ab67fd2095dec7cbe2b2dacb08443c33c0c0e0f6e2af096985d1
7
+ data.tar.gz: af39220ce267de5152de58df7bbcdf24ace9b570d295e40b014a8d491af0a680298761e38fa51039352407d6506776c17179680b6f5012e70ea1023cc93e7f2c
data/CHANGELOG.md CHANGED
@@ -5,6 +5,63 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [5.11.1] — 2026-05-24
9
+
10
+ ### Fixed
11
+
12
+ - 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.
13
+
14
+ ## [5.11.0] — 2026-05-24
15
+
16
+ ### Changed — Prism AST migration: all introspectors now use structural code extraction
17
+
18
+ Every introspector that scans `.rb` files has been migrated from regex-based pattern matching to Prism AST-based structural extraction. This is a zero-regression internal refactor -- all introspector outputs are verified identical via side-by-side comparison, 2257 unit tests, 119 E2E tests, and live validation against a production-scale Rails 8.1 app (39/39 introspectors, 41/41 tool invocations, 0 failures).
19
+
20
+ **What changed internally:**
21
+
22
+ - **`SourceIntrospector.walk(path, listener_map)`** -- new generic API that accepts any combination of listener classes or Proc factories, enabling ad-hoc AST extraction without modifying the core dispatcher. Supports both `Class` values (instantiated via `.new`) and `-> { Instance }` lambdas for configurable listeners.
23
+ - **11 new listener classes** for patterns beyond the original 7 model-level listeners:
24
+ - `GenericMacroListener` -- configurable no-receiver call detector (handles most Rails DSL patterns including `self.method` calls)
25
+ - `ChainedCallListener` -- method calls with receivers (`.variant()`, `.includes()`, `.create()`)
26
+ - `VariantCallListener` -- ActiveStorage variant detection
27
+ - `MailboxRoutingListener` -- ActionMailbox routing + lifecycle callbacks
28
+ - `MiddlewareConfigListener` -- `config.middleware.use/insert_before/insert_after/unshift`
29
+ - `EnvAccessListener` -- `ENV["KEY"]` / `ENV.fetch("KEY")` with block-default detection
30
+ - `MountListener` -- `mount Engine, at: "/path"` (both keyword and hash-rocket syntax)
31
+ - `RakeTaskDslListener` -- `namespace`/`desc`/`task` with deps and args (handles string + symbol deps)
32
+ - `GemfileDslListener` -- `gem`/`group`/`source` with group-scope tracking
33
+ - `SchemaDslListener` -- `create_table`/`t.type`/`t.index`/`add_foreign_key`/`create_enum`/`check_constraint`
34
+ - `MigrationDslListener` -- `create_table`/`add_column`/`add_index`/`rename_column`/`add_reference` and 6 more actions
35
+ - **28 introspectors converted**: ActiveStorage, ActionText, ActionMailbox, Middleware, ActiveSupport, Auth, Security, Controller (all 9 regex blocks including strong params, filters, rescue_from, rate_limit, respond_to, turbo_stream), Convention, Turbo, MultiDatabase, Performance, Job, Model, Component, View, Api, AssetPipeline, DevOps, Env, Gem, RakeTask, Engine, Seeds, Test, Schema, Config.
36
+ - **181 regex patterns intentionally remain** in categories where Prism cannot help: non-Ruby files (JS/TS/ERB/Haml -- 78), keyword/content matching (22), config assignments (15), runtime SQL/YAML (25), and complex partial patterns (41).
37
+
38
+ **What didn't change:**
39
+
40
+ - All introspector output formats are identical. No consumer-facing API changes.
41
+ - All 39 MCP tools work exactly as before.
42
+ - Runtime reflection paths (ActiveRecord, Rails config, I18n, etc.) are untouched.
43
+ - Non-Ruby file scanning (YAML, JSON, ERB, JS, Procfile, Dockerfile, Gemfile.lock) is untouched.
44
+
45
+ **Why this matters:**
46
+
47
+ - Regex scanning matches patterns in comments, strings, and dead code. AST extraction only matches actual code structure -- fewer false positives.
48
+ - Multi-line declarations that broke regex (e.g., `devise` with 9 modules across 3 lines, `before_action` with complex `only:`/`except:` constraints) are now parsed correctly by Prism.
49
+ - The `AstCache` provides thread-safe LRU caching of parse results, so repeated walks of the same file are free.
50
+ - New listeners are composable -- introspectors mix and match listeners via `SourceIntrospector.walk(path, { key: Listener })` without coupling.
51
+
52
+ ### Fixed
53
+
54
+ - Avoid false-positive route helper warnings when `rails_validate` sees locally defined Ruby methods ending in `_path` or `_url` (#83, thanks @curi).
55
+ - Preserve newline-separated staged file names in the generated pre-commit validation hook (#83).
56
+
57
+ ### Tests
58
+
59
+ - 2257 unit examples (up from 2154), 0 failures
60
+ - 119 E2E examples, 0 failures
61
+ - 47 edge-case tests for controller, auth, and security AST conversions
62
+ - 10 listener edge-case tests (block-syntax ENV defaults, string rake deps, insert-with-index middleware, hash-rocket mounts, complex gem lines)
63
+ - Side-by-side regression comparison: all 39 introspector outputs verified identical between old regex and new AST code
64
+
8
65
  ## [5.10.0] — 2026-04-20
9
66
 
10
67
  ### Added — 8 new introspectors closing RAILS_NERVOUS_SYSTEM.md gaps
data/README.md CHANGED
@@ -21,7 +21,7 @@
21
21
  <br>
22
22
  [![Ruby](https://img.shields.io/badge/Ruby-3.2%20%7C%203.3%20%7C%203.4-CC342D)](https://github.com/crisnahine/rails-ai-context)
23
23
  [![Rails](https://img.shields.io/badge/Rails-7.1%20%7C%207.2%20%7C%208.0-CC0000)](https://github.com/crisnahine/rails-ai-context)
24
- [![Tests](https://img.shields.io/badge/Tests-2154%20passing-brightgreen)](https://github.com/crisnahine/rails-ai-context/actions)
24
+ [![Tests](https://img.shields.io/badge/Tests-2257%20passing-brightgreen)](https://github.com/crisnahine/rails-ai-context/actions)
25
25
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
26
26
 
27
27
  </div>
data/docs/ARCHITECTURE.md CHANGED
@@ -26,7 +26,7 @@ graph TD
26
26
  subgraph engine["Introspection Engine"]
27
27
  direction LR
28
28
  I["Introspectors\n31 modules\nPresets\nCached"]
29
- AST["AST Engine\nPrism\n7 listeners\nConfidence tags"]
29
+ AST["AST Engine\nPrism\n20 listeners\nConfidence tags"]
30
30
  H["Hydration Layer\nSchema hints\ninjected into\ntool responses"]
31
31
  end
32
32