rails-ai-context 4.3.2 → 4.4.0

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +127 -53
  3. data/CLAUDE.md +3 -1
  4. data/README.md +268 -197
  5. data/demo-trace.gif +0 -0
  6. data/demo-trace.tape +21 -0
  7. data/demo.gif +0 -0
  8. data/demo.tape +33 -0
  9. data/docs/GUIDE.md +9 -9
  10. data/lib/generators/rails_ai_context/install/install_generator.rb +2 -1
  11. data/lib/rails_ai_context/cli/tool_runner.rb +1 -1
  12. data/lib/rails_ai_context/configuration.rb +25 -1
  13. data/lib/rails_ai_context/doctor.rb +4 -2
  14. data/lib/rails_ai_context/fingerprinter.rb +6 -1
  15. data/lib/rails_ai_context/introspectors/accessibility_introspector.rb +52 -1
  16. data/lib/rails_ai_context/introspectors/action_mailbox_introspector.rb +10 -2
  17. data/lib/rails_ai_context/introspectors/action_text_introspector.rb +22 -2
  18. data/lib/rails_ai_context/introspectors/active_storage_introspector.rb +50 -4
  19. data/lib/rails_ai_context/introspectors/api_introspector.rb +41 -5
  20. data/lib/rails_ai_context/introspectors/asset_pipeline_introspector.rb +10 -4
  21. data/lib/rails_ai_context/introspectors/auth_introspector.rb +62 -7
  22. data/lib/rails_ai_context/introspectors/component_introspector.rb +6 -0
  23. data/lib/rails_ai_context/introspectors/config_introspector.rb +59 -9
  24. data/lib/rails_ai_context/introspectors/controller_introspector.rb +45 -13
  25. data/lib/rails_ai_context/introspectors/convention_detector.rb +25 -2
  26. data/lib/rails_ai_context/introspectors/database_stats_introspector.rb +58 -4
  27. data/lib/rails_ai_context/introspectors/design_token_introspector.rb +27 -5
  28. data/lib/rails_ai_context/introspectors/devops_introspector.rb +15 -8
  29. data/lib/rails_ai_context/introspectors/engine_introspector.rb +12 -3
  30. data/lib/rails_ai_context/introspectors/frontend_framework_introspector.rb +36 -1
  31. data/lib/rails_ai_context/introspectors/gem_introspector.rb +47 -1
  32. data/lib/rails_ai_context/introspectors/i18n_introspector.rb +49 -3
  33. data/lib/rails_ai_context/introspectors/job_introspector.rb +48 -5
  34. data/lib/rails_ai_context/introspectors/middleware_introspector.rb +24 -3
  35. data/lib/rails_ai_context/introspectors/migration_introspector.rb +4 -1
  36. data/lib/rails_ai_context/introspectors/model_introspector.rb +108 -11
  37. data/lib/rails_ai_context/introspectors/multi_database_introspector.rb +57 -12
  38. data/lib/rails_ai_context/introspectors/performance_introspector.rb +34 -9
  39. data/lib/rails_ai_context/introspectors/rake_task_introspector.rb +12 -2
  40. data/lib/rails_ai_context/introspectors/route_introspector.rb +25 -8
  41. data/lib/rails_ai_context/introspectors/schema_introspector.rb +45 -7
  42. data/lib/rails_ai_context/introspectors/seeds_introspector.rb +5 -2
  43. data/lib/rails_ai_context/introspectors/stimulus_introspector.rb +59 -6
  44. data/lib/rails_ai_context/introspectors/test_introspector.rb +50 -5
  45. data/lib/rails_ai_context/introspectors/turbo_introspector.rb +44 -13
  46. data/lib/rails_ai_context/introspectors/view_introspector.rb +46 -7
  47. data/lib/rails_ai_context/introspectors/view_template_introspector.rb +25 -7
  48. data/lib/rails_ai_context/resources.rb +1 -1
  49. data/lib/rails_ai_context/server.rb +6 -3
  50. data/lib/rails_ai_context/tasks/rails_ai_context.rake +8 -4
  51. data/lib/rails_ai_context/tools/analyze_feature.rb +66 -19
  52. data/lib/rails_ai_context/tools/base_tool.rb +1 -1
  53. data/lib/rails_ai_context/tools/diagnose.rb +4 -2
  54. data/lib/rails_ai_context/tools/get_callbacks.rb +4 -2
  55. data/lib/rails_ai_context/tools/get_concern.rb +12 -6
  56. data/lib/rails_ai_context/tools/get_controllers.rb +10 -5
  57. data/lib/rails_ai_context/tools/get_conventions.rb +4 -2
  58. data/lib/rails_ai_context/tools/get_design_system.rb +2 -1
  59. data/lib/rails_ai_context/tools/get_env.rb +8 -4
  60. data/lib/rails_ai_context/tools/get_helper_methods.rb +6 -3
  61. data/lib/rails_ai_context/tools/get_job_pattern.rb +2 -1
  62. data/lib/rails_ai_context/tools/get_model_details.rb +10 -5
  63. data/lib/rails_ai_context/tools/get_partial_interface.rb +14 -7
  64. data/lib/rails_ai_context/tools/get_schema.rb +2 -1
  65. data/lib/rails_ai_context/tools/get_service_pattern.rb +2 -1
  66. data/lib/rails_ai_context/tools/get_stimulus.rb +2 -1
  67. data/lib/rails_ai_context/tools/get_test_info.rb +4 -2
  68. data/lib/rails_ai_context/tools/get_turbo_map.rb +22 -11
  69. data/lib/rails_ai_context/tools/get_view.rb +6 -3
  70. data/lib/rails_ai_context/tools/migration_advisor.rb +2 -1
  71. data/lib/rails_ai_context/tools/onboard.rb +2 -1
  72. data/lib/rails_ai_context/tools/performance_check.rb +2 -1
  73. data/lib/rails_ai_context/tools/query.rb +5 -1
  74. data/lib/rails_ai_context/tools/read_logs.rb +3 -0
  75. data/lib/rails_ai_context/tools/runtime_info.rb +10 -5
  76. data/lib/rails_ai_context/tools/search_code.rb +8 -4
  77. data/lib/rails_ai_context/tools/search_docs.rb +2 -1
  78. data/lib/rails_ai_context/tools/session_context.rb +2 -1
  79. data/lib/rails_ai_context/tools/validate.rb +16 -8
  80. data/lib/rails_ai_context/version.rb +1 -1
  81. metadata +5 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5081505ca1d99874de52ff33fb72ff75877b67ec79984fb9bb9004dbcbf4ea27
4
- data.tar.gz: cc6781e87f54708aab290044a33aee7aff3ddb7579fd4fe4f592eb5d3721b310
3
+ metadata.gz: 6fa4865cb6081dbc1a243371d270db6f80304fd5c3d7ccd8052d2c7c0d672dc6
4
+ data.tar.gz: 055a0fc1462f6a698e004090fda64703e98478af1d8bd1ca3426d85a5e9b6f69
5
5
  SHA512:
6
- metadata.gz: '09c0346700785aa79211b6fddf7e52dfedf9989500abd53538fc451ca3b96b0f0450865a2cbad86d6c26ac2aaefd4e19a8dcc66587960674a0adefcc324d34a9'
7
- data.tar.gz: dfd9f8d968e87b736d026e9cf3fe98ef08f61527ad4be1a9c96f8abe8a9d8b47b15d0133970df3e9fd0d4f915de87c0d893686f236f9b903a1ef53ef2c406e67
6
+ metadata.gz: ac7a84cb7f54d6106c2bf33c94208f75871b9b8d25d304e0ddde0e36f73d3bd8e973dbf5f81b0665545548fd740fbdf60726a79195889cfbb9683cc733c80307
7
+ data.tar.gz: 440e13668f46d1578933bd5f053ea15cbae494938097f55380a0ab78c3a30a0f92dd74b20ad37edf7aed67f4aade37810e02b141e9d25e8963d40e3d63a650b9
data/CHANGELOG.md CHANGED
@@ -5,6 +5,75 @@ 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
+ ## [4.4.0] — 2026-04-03
9
+
10
+ ### Added
11
+ - **33 introspector enhancements** — every introspector upgraded with new detection capabilities:
12
+ - **SchemaIntrospector**: expression indexes, column comments in static parse, `change_column_default`/`change_column_null` in migration replay
13
+ - **ModelIntrospector**: STI hierarchy detection (parent/children/type column), `attribute` API, enum `_prefix:`/`_suffix:`, `after_commit on:` parsing, inline `private def` exclusion
14
+ - **RouteIntrospector**: route parameter extraction, root route detection, RESTful action flag
15
+ - **JobIntrospector**: SolidQueue recurring job config, Sidekiq config (concurrency/queues), job callbacks (`before_perform`, `around_enqueue`, etc.)
16
+ - **GemIntrospector**: path/git gems from Gemfile, gem group extraction (dev/test/prod)
17
+ - **ConventionDetector**: multi-tenant (Apartment/ActsAsTenant), feature flags (Flipper/LaunchDarkly), error monitoring (Sentry/Bugsnag/Honeybadger), event-driven (Kafka/RabbitMQ/SNS), Zeitwerk detection, STI with type column verification
18
+ - **ControllerIntrospector**: `rate_limit` parsed into structured data (to/within/only), inline `private def` exclusion
19
+ - **StimulusIntrospector**: lifecycle hooks (connect/disconnect/initialize), outlet controller type mapping, action bindings from views (`data-action` parsing)
20
+ - **ViewIntrospector**: `yield`/`content_for` extraction from layouts, conditional layout detection with only/except
21
+ - **TurboIntrospector**: stream action semantics (append/update/remove counts), frame `src` URL extraction
22
+ - **I18nIntrospector**: locale fallback chain detection, locale coverage % per locale
23
+ - **ConfigIntrospector**: cache store options, error monitoring gem detection, job processor config (Sidekiq queues/concurrency)
24
+ - **ActiveStorageIntrospector**: attachment validations (content_type/size), variant definitions
25
+ - **ActionTextIntrospector**: Trix editor customization detection (toolbar/attachment/events)
26
+ - **AuthIntrospector**: OmniAuth provider detection, Devise settings (timeout/lockout/password_length)
27
+ - **ApiIntrospector**: GraphQL resolvers/subscriptions/dataloaders, API pagination strategy detection
28
+ - **TestIntrospector**: shared examples/contexts detection, database cleaner strategy
29
+ - **RakeTaskIntrospector**: task dependencies (`=> :prerequisite`), task arguments (`[:arg1, :arg2]`)
30
+ - **AssetPipelineIntrospector**: Bun bundler, Foundation CSS, PostCSS standalone detection
31
+ - **DevOpsIntrospector**: Fly.io/Render/Railway deployment detection, `docker-compose.yaml` support
32
+ - **ActionMailboxIntrospector**: mailbox callback detection (before/after/around_processing)
33
+ - **MigrationIntrospector**: `change_column_default`, `change_column_null`, `add_check_constraint` action detection
34
+ - **SeedsIntrospector**: CSV loader detection, seed ordering detection
35
+ - **MiddlewareIntrospector**: middleware added via initializers (`config.middleware.use/insert_before`)
36
+ - **EngineIntrospector**: route count + model count inside discovered engines
37
+ - **MultiDatabaseIntrospector**: shard names/keys/count from `connects_to`, improved YAML parsing for nested multi-db configs
38
+ - **ComponentIntrospector**: `**kwargs` splat prop detection
39
+ - **AccessibilityIntrospector**: heading hierarchy (h1-h6), skip link detection, `aria-live` regions, form input analysis (required/types)
40
+ - **PerformanceIntrospector**: polymorphic association compound index detection (`[type, id]`)
41
+ - **FrontendFrameworkIntrospector**: API client detection (Axios/Apollo/SWR/etc.), component library detection (MUI/Radix/shadcn/etc.)
42
+ - **DatabaseStatsIntrospector**: MySQL + SQLite support (was PostgreSQL-only), PostgreSQL dead row counts
43
+ - **ViewTemplateIntrospector**: slot reference detection
44
+ - **DesignTokenIntrospector**: Tailwind arbitrary value extraction
45
+
46
+ ### Fixed
47
+ - **Security: SQLite SQL injection** — `database_stats_introspector` used string interpolation for table names in COUNT queries; now uses `conn.quote_table_name`
48
+ - **Security: query column redaction bypass** — `SELECT password AS pwd` bypassed redaction; now also matches columns ending in `password`, `secret`, `token`, `key`, `digest`, `hash`
49
+ - **Security: log redaction gaps** — added AWS access key (`AKIA...`), JWT token (`eyJ...`), and SSH/TLS private key header patterns
50
+ - **Security: HTTP bind wildcard** — non-loopback warning now catches `0.0.0.0` and `::` (was only checking 3 specific addresses)
51
+ - **Thread safety: `app_size()` race condition** — `SHARED_CACHE[:context]` read without mutex; now wrapped in `SHARED_CACHE[:mutex].synchronize`
52
+ - **Crash: nil callback filter** — `model_introspector` `cb.filter.to_s` crashed on nil filters; added `cb.filter.nil?` guard
53
+ - **Crash: fingerprinter TOCTOU** — `File.mtime` after `File.exist?` could raise `Errno::ENOENT` if file deleted between calls; added rescue
54
+ - **Crash: tool_runner bounds** — `args[i+1]` access without bounds check; added `i + 1 < args.size` guard
55
+ - **Bug: server logs wrong tool list** — logged all 39 `TOOLS` instead of filtered `active_tools` after `skip_tools`; now shows correct count and names
56
+ - **Bug: STI false positive** — convention detector flagged `Admin < User` as STI even without `type` column; now verifies parent's table has `type` column via schema.rb
57
+ - **Bug: resources bare raise** — `raise "Unknown resource"` changed to `raise RailsAiContext::Error`
58
+ - **Config validation** — `http_port` (1-65535), `cache_ttl` (> 0), `max_tool_response_chars` (> 0), `query_row_limit` (1-1000) now validated on assignment
59
+
60
+ ### Changed
61
+ - Test count: 1529 (unchanged — all new features tested via integration test against sample app)
62
+
63
+ ## [4.3.3] — 2026-04-02
64
+
65
+ ### Fixed
66
+ - **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
67
+ - **database_stats introspector orphaned** — `DatabaseStatsIntrospector` was unreachable (not in any preset); added to `:full` preset (32 → 33 introspectors)
68
+ - **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 against git commit timestamps)
69
+ - **CHANGELOG missing v3.0.1 entry** — added (RubyGems republish, no code changes)
70
+ - **CHANGELOG date separator inconsistency** — normalized all 61 version entries to em dash (`—`)
71
+ - **Documentation preset counts** — CLAUDE.md, README, GUIDE all corrected: `:full` 32→33, `:standard` 14→19 (turbo, auth, accessibility, performance, i18n were added in v4.3.1 but docs not updated)
72
+ - **GUIDE.md standard preset table** — added 5 missing introspectors (turbo, auth, accessibility, performance, i18n) to match `configuration.rb`
73
+
74
+ ### Changed
75
+ - Full preset: 32 → 33 introspectors (added :database_stats)
76
+
8
77
  ## [4.3.2] — 2026-04-02
9
78
 
10
79
  ### Fixed
@@ -113,7 +182,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
113
182
  ### Changed
114
183
  - Test count: 983 → 998
115
184
 
116
- ## [4.2.0] — 2026-03-26
185
+ ## [4.2.0] — 2026-03-30
117
186
 
118
187
  ### Added
119
188
  - New `rails_search_docs` tool: bundled topic index with weighted keyword search, on-demand GitHub fetch for Rails documentation
@@ -169,7 +238,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
169
238
  - Test count: 817 → 893
170
239
  - Install generator always writes `config.ai_tools` and `config.tool_mode` uncommented for re-install detection
171
240
 
172
- ## [4.0.0] — 2026-03-26
241
+ ## [4.0.0] — 2026-03-27
173
242
 
174
243
  ### Added
175
244
 
@@ -207,7 +276,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
207
276
  - Test count: 681 → 806 examples
208
277
  - Combustion test app expanded with Stimulus controllers, ViewComponents, accessible views, factories
209
278
 
210
- ## [3.1.0] - 2026-03-26
279
+ ## [3.1.0] 2026-03-26
211
280
 
212
281
  ### Fixed
213
282
 
@@ -223,7 +292,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
223
292
  - **File path suggestions in validate** — `files=["cook.rb"]` now suggests `app/models/cook.rb` when the file isn't found at the given path.
224
293
  - **Empty parameter validation** — `edit_context` now returns friendly messages for empty `file` or `near` parameters instead of hard errors.
225
294
 
226
- ## [3.0.0] - 2026-03-26
295
+ ## [3.0.1] 2026-03-26
296
+
297
+ ### Changed
298
+ - Patch for RubyGems publish — no code changes from v3.0.0.
299
+
300
+ ## [3.0.0] — 2026-03-26
227
301
 
228
302
  ### Removed
229
303
 
@@ -250,14 +324,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
250
324
  - All CLI examples use zsh-safe quoting: `rails 'ai:tool[X]'` (brackets are glob patterns in zsh).
251
325
  - README rewritten with real-world workflow examples, categorized tool table, MCP vs CLI showcase.
252
326
 
253
- ## [2.0.5] - 2026-03-25
327
+ ## [2.0.5] 2026-03-25
254
328
 
255
329
  ### Changed
256
330
 
257
331
  - **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.
258
332
  - **Concern detail:"full" bug fix** — `\b` after `?`/`!` prevented 13 of 15 method bodies from being extracted. All methods now show source code.
259
333
 
260
- ## [2.0.4] - 2026-03-25
334
+ ## [2.0.4] 2026-03-25
261
335
 
262
336
  ### Added
263
337
 
@@ -268,14 +342,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
268
342
  - **analyze_feature: service test gaps** — checks services for missing test files, not just models/controllers/jobs.
269
343
  - **All 6 serializers updated** — Claude, Cursor, Copilot, Windsurf, OpenCode all document trace mode, concern source, orphaned tables, inherited filters.
270
344
 
271
- ## [2.0.3] - 2026-03-25
345
+ ## [2.0.3] 2026-03-25
272
346
 
273
347
  ### Added
274
348
 
275
349
  - **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.
276
350
  - **README rewrite** — neuro marketing techniques: loss aversion hook, measured token savings table, trace output inline, architecture diagram. 456→261 lines.
277
351
 
278
- ## [2.0.2] - 2026-03-25
352
+ ## [2.0.2] 2026-03-25
279
353
 
280
354
  ### Added
281
355
 
@@ -293,7 +367,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
293
367
 
294
368
  - **Documentation audit** — fixed max_tool_response_chars reference (120K→200K), added missing search_code params to GUIDE, added config.ai_tools to config reference.
295
369
 
296
- ## [2.0.1] - 2026-03-25
370
+ ## [2.0.1] 2026-03-25
297
371
 
298
372
  ### Fixed
299
373
 
@@ -304,7 +378,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
304
378
  - **Issue #14** — `multi_db[:databases].keys` crash on Array fixed.
305
379
  - **Search code NON_CODE_GLOBS** — excludes lock files, docs, CI configs, generated context from all searches.
306
380
 
307
- ## [2.0.0] - 2026-03-24
381
+ ## [2.0.0] 2026-03-24
308
382
 
309
383
  ### Added
310
384
 
@@ -349,14 +423,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
349
423
 
350
424
  - **JS fallback validator false-positives** — escaped backslashes before string-closing quotes (`"path\\"`) no longer cause false bracket mismatch errors. Replaced `prev_char` check with proper `escaped` toggle flag.
351
425
 
352
- ## [1.3.1] - 2026-03-23
426
+ ## [1.3.1] 2026-03-23
353
427
 
354
428
  ### Fixed
355
429
 
356
430
  - **Documentation audit** — updated tool count from 14 to 15 across README, GUIDE, CONTRIBUTING, server.json. Added `rails_get_design_system` documentation section to GUIDE.md. Updated SECURITY.md supported versions. Fixed spec count in CLAUDE.md. Added `rails_get_design_system` to README tool table. Updated `rails_analyze_feature` description to reflect full-stack discovery (services, jobs, views, Stimulus, tests, related models, env deps).
357
431
  - **analyze_feature crash on complex models** — added type guards (`is_a?(Hash)`, `is_a?(Array)`) to all data access points preventing `no implicit conversion of Symbol into Integer` errors on models with many associations or complex data.
358
432
 
359
- ## [1.3.0] - 2026-03-23
433
+ ## [1.3.0] 2026-03-23
360
434
 
361
435
  ### Added
362
436
 
@@ -378,7 +452,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
378
452
  - **Rules serializer methods cap raised to 20** (RS1) — uses introspector's pre-filtered methods directly instead of redundant re-filtering
379
453
  - **oklch token noise filtered** (DS21) — complex color values (oklch, calc, var) hidden from summary, only shown in `detail:"full"`
380
454
 
381
- ## [1.2.1] - 2026-03-23
455
+ ## [1.2.1] 2026-03-23
382
456
 
383
457
  ### Fixed
384
458
 
@@ -392,7 +466,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
392
466
  - **Column defaults shown in generated rules** — columns with non-nil defaults now show `(=value)` inline.
393
467
  - **`analyze_feature` matches models by table name and underscore form** — `feature:"share"` now finds `CookShare` (via `cook_shares` table and `cook_share` underscore form), not just exact model name substring.
394
468
 
395
- ## [1.2.0] - 2026-03-23
469
+ ## [1.2.0] 2026-03-23
396
470
 
397
471
  ### Added
398
472
 
@@ -406,7 +480,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
406
480
  - **"UI Patterns" section renamed to "Design System"** — richer content with color palette, typography, components, spacing conventions, interactive states, and design rules.
407
481
  - **Design tokens consumed for the first time** — `context[:design_tokens]` data was previously extracted but never rendered. Now merged into design system output in all serializers and the new MCP tool.
408
482
 
409
- ## [1.1.1] - 2026-03-23
483
+ ## [1.1.1] 2026-03-23
410
484
 
411
485
  ### Added
412
486
 
@@ -417,13 +491,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
417
491
 
418
492
  - **Tool count corrected from 13 to 14** across all serializers to reflect `rails_analyze_feature` added in v1.0.0.
419
493
 
420
- ## [1.1.0] - 2026-03-23
494
+ ## [1.1.0] 2026-03-23
421
495
 
422
496
  ### Changed
423
497
 
424
498
  - **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.
425
499
 
426
- ## [1.0.0] - 2026-03-23
500
+ ## [1.0.0] 2026-03-23
427
501
 
428
502
  ### Added
429
503
 
@@ -436,25 +510,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
436
510
 
437
511
  - **LLM-optimized tool descriptions (all 14 tools)** — every description now follows "what it does / Use when: / key params" format so AI agents pick the right tool on first try.
438
512
 
439
- ## [0.15.10] - 2026-03-23
513
+ ## [0.15.10] 2026-03-23
440
514
 
441
515
  ### Changed
442
516
 
443
517
  - **Gemspec description rewritten** — repositioned from feature list to value proposition: mental model, semantic validation, cross-file error detection.
444
518
 
445
- ## [0.15.9] - 2026-03-23
519
+ ## [0.15.9] 2026-03-23
446
520
 
447
521
  ### Added
448
522
 
449
523
  - **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.
450
524
 
451
- ## [0.15.8] - 2026-03-23
525
+ ## [0.15.8] 2026-03-23
452
526
 
453
527
  ### Added
454
528
 
455
529
  - **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.
456
530
 
457
- ## [0.15.7] - 2026-03-22
531
+ ## [0.15.7] 2026-03-22
458
532
 
459
533
  ### Improved
460
534
 
@@ -466,7 +540,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
466
540
  - **Concern test lookup** — `rails_get_test_info(model:"PlanLimitable")` searches concern test paths.
467
541
  - **Controller flexible matching** — underscore-based normalization handles CamelCase, snake_case, and slash notation consistently.
468
542
 
469
- ## [0.15.6] - 2026-03-22
543
+ ## [0.15.6] 2026-03-22
470
544
 
471
545
  ### Added
472
546
 
@@ -482,7 +556,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
482
556
  - **Concern methods inline** — shows public methods from concern source files (e.g. `PlanLimitable — can_cook?, increment_cook_count!`).
483
557
  - **MCP tool error messages** — all tools now show available values on error/not-found for AI self-correction.
484
558
 
485
- ## [0.15.5] - 2026-03-22
559
+ ## [0.15.5] 2026-03-22
486
560
 
487
561
  ### Fixed
488
562
 
@@ -495,7 +569,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
495
569
  - **Namespace test lookup** — supports `bonus/crises` format and flat test directories.
496
570
  - **Empty inputs** — `near:""` in edit_context and `pattern:""` in search return helpful errors.
497
571
 
498
- ## [0.15.4] - 2026-03-22
572
+ ## [0.15.4] 2026-03-22
499
573
 
500
574
  ### Fixed
501
575
 
@@ -512,7 +586,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
512
586
 
513
587
  - **Pagination on models, controllers, stimulus** — `limit`/`offset` params (default 50) with "end of results" hints. Prevents token bombs on large apps.
514
588
 
515
- ## [0.15.3] - 2026-03-22
589
+ ## [0.15.3] 2026-03-22
516
590
 
517
591
  ### Fixed
518
592
 
@@ -523,20 +597,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
523
597
 
524
598
  - **Documentation** — updated all docs (README, CLAUDE.md, GUIDE.md, SECURITY.md, CHANGELOG, server.json, install generator) to match v0.15.x codebase. Fixed spec counts, file counts, preset counts, config options, and supported versions.
525
599
 
526
- ## [0.15.2] - 2026-03-22
600
+ ## [0.15.2] 2026-03-22
527
601
 
528
602
  ### Fixed
529
603
 
530
604
  - **Test command detection** — Serializers now use detected test framework (minitest → `rails test`, rspec → `bundle exec rspec`) instead of hardcoding `bundle exec rspec`. Default is `rails test` (the Rails default). Contributed by @curi (PR #13).
531
605
 
532
- ## [0.15.1] - 2026-03-22
606
+ ## [0.15.1] 2026-03-22
533
607
 
534
608
  ### Fixed
535
609
 
536
610
  - **Copilot serializer** — Show all model associations (not capped at 3), use human-readable architecture/pattern labels.
537
611
  - **OpenCode rules serializer** — Filter framework controllers (Devise) from AGENTS.md output, show all associations, match `before_action` with `!`/`?` suffixes.
538
612
 
539
- ## [0.15.0] - 2026-03-22
613
+ ## [0.15.0] 2026-03-22
540
614
 
541
615
  ### Security
542
616
 
@@ -577,7 +651,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
577
651
  - **Strong params body** — Action detail now shows the actual `permit(...)` call.
578
652
  - **AR-generated methods** — Filter `build_*`, `*_ids=`, etc. from model instance methods.
579
653
 
580
- ## [0.14.0] - 2026-03-20
654
+ ## [0.14.0] 2026-03-20
581
655
 
582
656
  ### Fixed
583
657
 
@@ -595,7 +669,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
595
669
  - **Stimulus dash/underscore normalization** — Both `weekly-chart` and `weekly_chart` work for controller lookup. Output shows HTML `data-controller` attribute.
596
670
  - **Model public method signatures** — `rails_get_model_details(model: "Cook")` shows method names with params from source, stopping at private boundary.
597
671
 
598
- ## [0.13.1] - 2026-03-20
672
+ ## [0.13.1] 2026-03-20
599
673
 
600
674
  ### Changed
601
675
 
@@ -603,7 +677,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
603
677
  - **Model details** — shows method signatures (name + parameters) instead of just method names.
604
678
  - Removed unused demo files; fixed GUIDE.md preset tables.
605
679
 
606
- ## [0.13.0] - 2026-03-20
680
+ ## [0.13.0] 2026-03-20
607
681
 
608
682
  ### Added
609
683
 
@@ -624,7 +698,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
624
698
  - ERB validation was broken due to shell quoting bug (backticks + nested quotes). Replaced with `Open3.capture2e("ruby", "-e", script, ARGV[0])`.
625
699
  - Rubocop offenses in validate.rb (18 spacing issues auto-corrected).
626
700
 
627
- ## [0.12.0] - 2026-03-20
701
+ ## [0.12.0] 2026-03-20
628
702
 
629
703
  ### Added
630
704
 
@@ -657,7 +731,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
657
731
  - Progress bars misclassified as badges.
658
732
  - Input detection picking up alert divs instead of actual inputs.
659
733
 
660
- ## [0.11.0] - 2026-03-20
734
+ ## [0.11.0] 2026-03-20
661
735
 
662
736
  ### Added
663
737
 
@@ -665,20 +739,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
665
739
  - **View partial structure** — `rails_get_view(detail: "standard")` shows model fields and helper methods used by each partial.
666
740
  - **Schema column names** — `.claude/rules/rails-schema.md` shows key column names with types, foreign keys, indexes, and enum values. Keeps polymorphic `_type`, STI `type`, and soft-delete `deleted_at` columns.
667
741
 
668
- ## [0.10.2] - 2026-03-20
742
+ ## [0.10.2] 2026-03-20
669
743
 
670
744
  ### Security
671
745
 
672
746
  - **ReDoS protection** — added regex timeout and converted greedy quantifiers to non-greedy across all pattern matching.
673
747
  - **File size limits** — added size caps on parsed files to prevent memory exhaustion from oversized inputs.
674
748
 
675
- ## [0.10.1] - 2026-03-19
749
+ ## [0.10.1] 2026-03-19
676
750
 
677
751
  ### Changed
678
752
 
679
753
  - Patch release for RubyGems republish (no code changes).
680
754
 
681
- ## [0.10.0] - 2026-03-19
755
+ ## [0.10.0] 2026-03-19
682
756
 
683
757
  ### Added
684
758
 
@@ -689,7 +763,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
689
763
  - **ViewTemplateIntrospector** — new introspector that reads view file contents and extracts partial references and Stimulus data attributes.
690
764
  - **Stimulus and view_templates in standard preset** — both introspectors now in `:standard` preset (11 introspectors, was 10).
691
765
 
692
- ## [0.9.0] - 2026-03-19
766
+ ## [0.9.0] 2026-03-19
693
767
 
694
768
  ### Added
695
769
 
@@ -702,7 +776,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
702
776
  - **Removed `.cursorrules` root file** — Cursor officially deprecated `.cursorrules` in favor of `.cursor/rules/`. The `:cursor` format now generates only `.cursor/rules/*.mdc` split rules. The `rails-project.mdc` split rule (with `alwaysApply: true`) already provides the project overview.
703
777
  - **License changed from AGPL-3.0 to MIT** — removes the copyleft blocker for SaaS and commercial projects.
704
778
 
705
- ## [0.8.5] - 2026-03-19
779
+ ## [0.8.5] 2026-03-19
706
780
 
707
781
  ### Fixed
708
782
 
@@ -715,27 +789,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
715
789
 
716
790
  - **Standalone CLI documented** — the `rails-ai-context` executable (serve, context, inspect, watch, doctor, version) is now documented in README, GUIDE, and CLAUDE.md.
717
791
 
718
- ## [0.8.4] - 2026-03-19
792
+ ## [0.8.4] 2026-03-19
719
793
 
720
794
  ### Added
721
795
 
722
796
  - **`structure.sql` support** — the schema introspector now parses `db/structure.sql` when no `db/schema.rb` exists and no database connection is available. Extracts tables, columns (with SQL type normalization), indexes, and foreign keys from PostgreSQL dump format. Prefers `schema.rb` when both exist.
723
797
  - **Fingerprinter watches `db/structure.sql`** — file changes to `structure.sql` now trigger cache invalidation and live reload.
724
798
 
725
- ## [0.8.3] - 2026-03-19
799
+ ## [0.8.3] 2026-03-19
726
800
 
727
801
  ### Changed
728
802
 
729
803
  - **License published to RubyGems** — v0.8.2 changed the license from MIT to AGPL-3.0 but the gem was not republished. This release ensures the AGPL-3.0 license is reflected on RubyGems.
730
804
 
731
- ## [0.8.2] - 2026-03-19
805
+ ## [0.8.2] 2026-03-19
732
806
 
733
807
  ### Changed
734
808
 
735
809
  - **License** — changed from MIT to AGPL-3.0 to protect against unauthorized clones and ensure derivative works remain open source.
736
810
  - **CI: auto-publish to MCP Registry** — the release workflow now automatically publishes to the MCP Registry via `mcp-publisher` with GitHub OIDC auth. No manual `mcp-publisher login` + `publish` needed.
737
811
 
738
- ## [0.8.1] - 2026-03-19
812
+ ## [0.8.1] 2026-03-19
739
813
 
740
814
  ### Added
741
815
 
@@ -746,14 +820,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
746
820
  - **Live reload LoadError in HTTP mode** — when `live_reload = true` and the `listen` gem was missing, the `start_http` method's rescue block (for rackup fallback) swallowed the live reload error, producing a confusing rack error instead of the correct "listen gem required" message. The rescue is now scoped to the rackup require only.
747
821
  - **Dangling @live_reload reference** — `@live_reload` was assigned before `start` was called. If `start` raised LoadError, the instance variable pointed to a non-functional object. Now only assigned after successful start.
748
822
 
749
- ## [0.8.0] - 2026-03-19
823
+ ## [0.8.0] 2026-03-19
750
824
 
751
825
  ### Added
752
826
 
753
827
  - **MCP Live Reload** — when running `rails ai:serve`, file changes automatically invalidate tool caches and send MCP notifications (`notifications/resources/list_changed`) to connected AI clients. The AI's context stays fresh without manual re-querying. Requires the `listen` gem (enabled by default when available). Configurable via `config.live_reload` (`:auto`, `true`, `false`) and `config.live_reload_debounce` (default: 1.5s).
754
828
  - **Live reload doctor check** — `rails ai:doctor` now warns when the `listen` gem is not installed.
755
829
 
756
- ## [0.7.1] - 2026-03-19
830
+ ## [0.7.1] 2026-03-19
757
831
 
758
832
  ### Added
759
833
 
@@ -765,7 +839,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
765
839
  - **Schema version parsing** — versions with underscores (e.g. `2024_01_15_123456`) were truncated to the first digit group. Now captures the full version string.
766
840
  - **Documentation** — updated README (detail levels, pagination, generated file tree, config options), SECURITY.md (supported versions), CONTRIBUTING.md (project structure), gemspec (post-install message), demo_script.sh (all 17 generated files).
767
841
 
768
- ## [0.7.0] - 2026-03-19
842
+ ## [0.7.0] 2026-03-19
769
843
 
770
844
  ### Added
771
845
 
@@ -788,7 +862,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
788
862
  - All tools return pagination hints when results are truncated.
789
863
  - `.windsurfrules` now uses dedicated `WindsurfSerializer` instead of sharing `RulesSerializer` with Cursor.
790
864
 
791
- ## [0.6.0] - 2026-03-18
865
+ ## [0.6.0] 2026-03-18
792
866
 
793
867
  ### Added
794
868
 
@@ -809,7 +883,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
809
883
  - Doctor checks expanded from 11 to 12
810
884
  - Static MCP resources expanded from 7 to 9
811
885
 
812
- ## [0.5.2] - 2026-03-18
886
+ ## [0.5.2] 2026-03-18
813
887
 
814
888
  ### Fixed
815
889
 
@@ -817,14 +891,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
817
891
  - **Zeitwerk dependency** — Changed from open-ended `>= 2.6` to pessimistic `~> 2.6` per RubyGems best practices
818
892
  - **Documentation** — Updated CONTRIBUTING.md, CHANGELOG.md, and CLAUDE.md to reflect Zeitwerk autoloading, introspector presets, and `.mcp.json` auto-discovery changes
819
893
 
820
- ## [0.5.1] - 2026-03-18
894
+ ## [0.5.1] 2026-03-18
821
895
 
822
896
  ### Fixed
823
897
 
824
898
  - Documentation updates and animated demo GIF added to README.
825
899
  - Zeitwerk autoloading fixes for edge cases.
826
900
 
827
- ## [0.5.0] - 2026-03-18
901
+ ## [0.5.0] 2026-03-18
828
902
 
829
903
  ### Added
830
904
 
@@ -845,7 +919,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
845
919
  - Default introspectors reduced from 21 to 8 (`:standard` preset) for faster boot; use `config.preset = :full` for all 21
846
920
  - New files auto-loaded by Zeitwerk — no manual `require_relative` needed when adding introspectors or tools
847
921
 
848
- ## [0.4.0] - 2026-03-18
922
+ ## [0.4.0] 2026-03-18
849
923
 
850
924
  ### Added
851
925
 
@@ -882,7 +956,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
882
956
  - Doctor checks expanded from 7 to 11
883
957
  - Test suite expanded from 149 to 247 examples with exact value assertions
884
958
 
885
- ## [0.3.0] - 2026-03-18
959
+ ## [0.3.0] 2026-03-18
886
960
 
887
961
  ### Added
888
962
 
@@ -907,7 +981,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
907
981
  - `generate_context` now returns `{ written: [], skipped: [] }` instead of flat array
908
982
  - Default introspectors now include `:stimulus`
909
983
 
910
- ## [0.2.0] - 2026-03-18
984
+ ## [0.2.0] 2026-03-18
911
985
 
912
986
  ### Added
913
987
 
@@ -921,7 +995,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
921
995
  - `rails ai:context_for[claude]` failing in zsh due to bracket glob interpretation
922
996
  - Double introspection in `ai:context` and `ai:context_for` tasks (removed unused `RailsAiContext.introspect` calls)
923
997
 
924
- ## [0.1.0] - 2026-03-18
998
+ ## [0.1.0] 2026-03-18
925
999
 
926
1000
  ### Added
927
1001
 
data/CLAUDE.md CHANGED
@@ -34,7 +34,7 @@ structure to AI assistants via the Model Context Protocol (MCP).
34
34
  7. **Diff-aware** — context regeneration skips unchanged files
35
35
  8. **Per-assistant serializers** — each AI tool gets tailored output format
36
36
  9. **Zeitwerk autoloading** — files loaded on-demand, not all upfront
37
- 10. **Introspector presets** — `:full` (32) default, `:standard` (14 core) for lightweight usage
37
+ 10. **Introspector presets** — `:full` (33) default, `:standard` (19) for lightweight usage
38
38
  11. **MCP auto-discovery** — `.mcp.json` generated by install generator
39
39
  12. **Compact by default** — context files ≤150 lines, MCP tools use `detail` parameter (summary/standard/full)
40
40
  13. **Per-tool split rules** — `.claude/rules/`, `.cursor/rules/`, `.github/instructions/`
@@ -56,6 +56,8 @@ structure to AI assistants via the Model Context Protocol (MCP).
56
56
  29. **Docs search** — bundled topic index with weighted keyword search, on-demand GitHub fetch
57
57
  30. **Safe SQL queries** — defense-in-depth: regex pre-filter + SET TRANSACTION READ ONLY + timeout
58
58
  31. **Log reading** — reverse file tail with level filtering and sensitive data redaction
59
+ 32. **Config validation** — `http_port`, `cache_ttl`, `max_tool_response_chars`, `query_row_limit` validated on assignment with clear error messages
60
+ 33. **Sensitive column redaction** — query tool redacts columns by name AND by suffix pattern (password, secret, token, key, digest, hash) to prevent alias bypass
59
61
 
60
62
  ## Testing
61
63