ask-rails 0.2.5 → 0.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -24
- data/README.md +38 -13
- data/lib/ask/rails/generators/install/install_generator.rb +45 -0
- data/lib/ask/rails/generators/install/templates/application_agent.rb +26 -0
- data/lib/ask/rails/generators/install/templates/audit_log_migration.rb +19 -0
- data/lib/ask/rails/generators/install/templates/initializer.rb +27 -0
- data/lib/ask/rails/generators/install/templates/state_migration.rb +18 -0
- data/lib/ask/rails/railtie.rb +1 -18
- data/lib/ask/rails/version.rb +1 -1
- data/lib/ask/rails.rb +1 -70
- data/lib/generators/ask/install/templates/audit_log_migration.rb +16 -0
- data/lib/generators/ask/install/templates/initializer.rb +19 -0
- data/lib/generators/ask/install/templates/state_migration.rb +15 -0
- data/lib/generators/ask/install_generator.rb +39 -0
- metadata +13 -78
- data/lib/ask/rails/configuration.rb +0 -19
- data/lib/ask/rails/engine.rb +0 -11
- data/lib/ask/rails/persistence.rb +0 -35
- data/lib/ask/rails/service_discovery.rb +0 -48
- data/lib/ask/rails/tool.rb +0 -11
- data/lib/ask/rails/tools/query_database.rb +0 -72
- data/lib/ask/rails/tools/read_file.rb +0 -24
- data/lib/ask/rails/tools/read_log.rb +0 -118
- data/lib/ask/rails/tools/read_model.rb +0 -73
- data/lib/ask/rails/tools/read_routes.rb +0 -21
- data/lib/ask/rails/tools/run_command.rb +0 -20
- data/lib/ask/rails/tools/search_codebase.rb +0 -22
- data/lib/ask/skills/rails.db_debug/SKILL.md +0 -118
- data/lib/ask/skills/rails.deploy_pipeline/SKILL.md +0 -125
- data/lib/ask/skills/rails.route_trouble/SKILL.md +0 -127
- data/lib/generators/ask/rails/install/install_generator.rb +0 -29
- data/lib/generators/ask/rails/install/templates/initializer.rb +0 -5
- data/lib/generators/ask/rails/install/templates/migration.rb +0 -12
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: rails.deploy_pipeline
|
|
3
|
-
description: Pre-deployment checklist for Rails applications — migrations, assets, credentials, jobs, and logs
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Use this skill before or during a Rails deployment to ensure nothing is missed.
|
|
7
|
-
Follow the steps in order — each builds on the previous.
|
|
8
|
-
|
|
9
|
-
## Step 1: Check Pending Migrations
|
|
10
|
-
|
|
11
|
-
Before deploying, always check for unapplied migrations:
|
|
12
|
-
|
|
13
|
-
```ruby
|
|
14
|
-
RunCommand.new.call(command: "bin/rails db:migrate:status | grep 'down'")
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
If there are pending migrations:
|
|
18
|
-
1. Review them with `ReadFile.new.call(path: "db/migrate/<TIMESTAMP>_migration_name.rb")`
|
|
19
|
-
2. Verify they're reversible: check `change`, `up`/`down`, or `reversible` blocks
|
|
20
|
-
3. Check for data migrations (e.g., backfills) that should run separately
|
|
21
|
-
4. Estimate execution time — large tables may need locking strategy
|
|
22
|
-
|
|
23
|
-
## Step 2: Verify Assets Pipeline
|
|
24
|
-
|
|
25
|
-
For Rails with assets (Sprockets or Propshaft):
|
|
26
|
-
|
|
27
|
-
```ruby
|
|
28
|
-
# Precompile locally to catch errors early
|
|
29
|
-
RunCommand.new.call(command: "bin/rails assets:precompile 2>&1")
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Check for:
|
|
33
|
-
- Missing asset references (SCSS variables, image references)
|
|
34
|
-
- JavaScript compilation errors
|
|
35
|
-
- Asset fingerprint changes (manifold fingerprints if CSS changed)
|
|
36
|
-
|
|
37
|
-
For importmap or esbuild/vite setups:
|
|
38
|
-
|
|
39
|
-
```ruby
|
|
40
|
-
# Check build config
|
|
41
|
-
ReadFile.new.call(path: "package.json")
|
|
42
|
-
ReadFile.new.call(path: "vite.config.ts") if File.exist?("Rails.root.join('vite.config.ts')")
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Step 3: Review Credentials and Secrets
|
|
46
|
-
|
|
47
|
-
Verify that all required credentials exist in the target environment:
|
|
48
|
-
|
|
49
|
-
```ruby
|
|
50
|
-
# For production credentials
|
|
51
|
-
RunCommand.new.call(command: "bin/rails credentials:show --environment production 2>&1")
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Check for common secrets that may need updating:
|
|
55
|
-
- `secret_key_base`
|
|
56
|
-
- `database_password`
|
|
57
|
-
- Third-party API keys (AWS, Stripe, SendGrid, etc.)
|
|
58
|
-
- JWT signing keys
|
|
59
|
-
- Any env vars referenced in `config/` files that aren't in credentials
|
|
60
|
-
|
|
61
|
-
## Step 4: Check Background Jobs
|
|
62
|
-
|
|
63
|
-
Review sidekiq/active job configuration before deploy:
|
|
64
|
-
|
|
65
|
-
```ruby
|
|
66
|
-
# Check job files for any that need queue configuration
|
|
67
|
-
Glob.new.call(pattern: "app/jobs/**/*.rb")
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
For any new or modified jobs:
|
|
71
|
-
1. Verify the queue adapter is configured in `production.rb`
|
|
72
|
-
2. Check for job retry logic that might affect rollback
|
|
73
|
-
3. Review `ReadFile.new.call(path: "config/sidekiq.yml")` if using Sidekiq
|
|
74
|
-
4. Verify scheduled/cron jobs if using `sidekiq-cron` or `whenever`
|
|
75
|
-
|
|
76
|
-
## Step 5: Review Production Log for Pre-deploy Issues
|
|
77
|
-
|
|
78
|
-
Check that the current production environment is healthy before deploying:
|
|
79
|
-
|
|
80
|
-
```ruby
|
|
81
|
-
ReadLog.new.call(lines: 100, level: "ERROR")
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
If there are recent errors, investigate before deploying more changes.
|
|
85
|
-
|
|
86
|
-
## Step 6: Verify Dependencies and Gem Versions
|
|
87
|
-
|
|
88
|
-
Check for critical gem updates or changes:
|
|
89
|
-
|
|
90
|
-
```ruby
|
|
91
|
-
# Review Gemfile for new/modified gems
|
|
92
|
-
RunCommand.new.call(command: "git diff HEAD -- Gemfile")
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
If adding a gem that needs system dependencies or native extensions:
|
|
96
|
-
```ruby
|
|
97
|
-
RunCommand.new.call(command: "bundle platform")
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Step 7: Config File Checklist
|
|
101
|
-
|
|
102
|
-
Verify configuration files for the target environment:
|
|
103
|
-
|
|
104
|
-
```ruby
|
|
105
|
-
ReadFile.new.call(path: "config/environments/production.rb")
|
|
106
|
-
ReadFile.new.call(path: "config/database.yml")
|
|
107
|
-
ReadFile.new.call(path: "config/cable.yml") if File.exist?("config/cable.yml")
|
|
108
|
-
ReadFile.new.call(path: "config/storage.yml") if File.exist?("config/storage.yml")
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Key production checks:
|
|
112
|
-
- `config.force_ssl = true`
|
|
113
|
-
- `config.consider_all_requests_local = false`
|
|
114
|
-
- Proper cache store configured (`:mem_cache_store`, `:redis_cache_store`)
|
|
115
|
-
- Active Storage service configured for production
|
|
116
|
-
|
|
117
|
-
## Step 8: Quick Rollback Checklist
|
|
118
|
-
|
|
119
|
-
Before deploying, know how to roll back:
|
|
120
|
-
|
|
121
|
-
1. **Database**: `RunCommand.new.call(command: "bin/rails db:migrate:down VERSION=<previous>")`
|
|
122
|
-
2. **Code**: Git revert the deploy commit
|
|
123
|
-
3. **Assets**: Previous version's assets should still be cached
|
|
124
|
-
4. **Jobs**: Check if backward-incompatible changes won't replay failed jobs
|
|
125
|
-
5. **Feature flags**: If using flipper or similar, toggle off new features first
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: rails.route_trouble
|
|
3
|
-
description: Step-by-step methodology for debugging routing issues in Rails
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Use this skill when a route is returning 404, you're getting route matching errors,
|
|
7
|
-
or routes aren't behaving as expected in a Rails application.
|
|
8
|
-
|
|
9
|
-
## Step 1: Read the Routes File
|
|
10
|
-
|
|
11
|
-
Start by examining the routes configuration:
|
|
12
|
-
|
|
13
|
-
```ruby
|
|
14
|
-
ReadRoutes.new.call
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
This reads `config/routes.rb` — the source of truth for all route definitions.
|
|
18
|
-
|
|
19
|
-
Look for:
|
|
20
|
-
- The overall structure (namespaced, nested, shallow routes?)
|
|
21
|
-
- Resources that might be missing
|
|
22
|
-
- Constraints or conditions that could block matching
|
|
23
|
-
- Route ordering (more specific routes should come before less specific)
|
|
24
|
-
|
|
25
|
-
## Step 2: Check the Compiled Routes
|
|
26
|
-
|
|
27
|
-
Rails routes have a specific matching order. Use `RunCommand` to inspect the live routes:
|
|
28
|
-
|
|
29
|
-
```ruby
|
|
30
|
-
RunCommand.new.call(command: "bin/rails routes")
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
If you know the path you're trying to match, grep for it:
|
|
34
|
-
|
|
35
|
-
```ruby
|
|
36
|
-
RunCommand.new.call(command: "bin/rails routes | grep users")
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
For a specific route name:
|
|
40
|
-
|
|
41
|
-
```ruby
|
|
42
|
-
RunCommand.new.call(command: "bin/rails routes --grep user_profile")
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Step 3: Check Route Parameters and Constraints
|
|
46
|
-
|
|
47
|
-
Routes often fail because of parameter mismatches or constraints. Check for:
|
|
48
|
-
|
|
49
|
-
**Required parameters:** Does the route define `:id` but the URL doesn't include it?
|
|
50
|
-
|
|
51
|
-
**Format constraints:** Routes with `:format` (like `.json`, `.html`) constraints
|
|
52
|
-
can fail silently. Check if there's a default format:
|
|
53
|
-
|
|
54
|
-
```ruby
|
|
55
|
-
# In routes.rb:
|
|
56
|
-
resources :posts, defaults: { format: :json }
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**Constraint classes:** Custom route constraints like `subdomain` or request-based
|
|
60
|
-
constraints can prevent matching:
|
|
61
|
-
|
|
62
|
-
```ruby
|
|
63
|
-
# In routes.rb:
|
|
64
|
-
get "admin", to: "admin/dashboard#show", constraints: ->(req) { req.subdomain == "admin" }
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Check the constraints against the actual request parameters.
|
|
68
|
-
|
|
69
|
-
## Step 4: Trace the Match
|
|
70
|
-
|
|
71
|
-
For a failing request, trace how Rails would match it:
|
|
72
|
-
|
|
73
|
-
```ruby
|
|
74
|
-
RunCommand.new.call(
|
|
75
|
-
command: "bin/rails runner \"puts Rails.application.routes.recognize_path('/users/1/edit', method: :get)\""
|
|
76
|
-
)
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
This will raise `ActionController::RoutingError` if no route matches — the
|
|
80
|
-
error message tells you what routes were tried before failing.
|
|
81
|
-
|
|
82
|
-
If the route exists but the controller isn't found:
|
|
83
|
-
|
|
84
|
-
```ruby
|
|
85
|
-
ReadFile.new.call(path: "app/controllers/users_controller.rb")
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Step 5: Check Namespace and Module Nesting
|
|
89
|
-
|
|
90
|
-
Routes in namespaced controllers fail when the controller file is in the wrong
|
|
91
|
-
directory or the module is misnamed:
|
|
92
|
-
|
|
93
|
-
```ruby
|
|
94
|
-
# Route:
|
|
95
|
-
namespace :admin do
|
|
96
|
-
resources :users
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# Expects:
|
|
100
|
-
# app/controllers/admin/users_controller.rb
|
|
101
|
-
# class Admin::UsersController < ApplicationController
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Use `Glob` to verify the controller exists:
|
|
105
|
-
|
|
106
|
-
```ruby
|
|
107
|
-
# Via RunCommand:
|
|
108
|
-
RunCommand.new.call(command: "ls app/controllers/admin/")
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Step 6: Verify Helper Paths and Named Routes
|
|
112
|
-
|
|
113
|
-
If you're debugging a `No route matches` error from a view (link_to, form_with):
|
|
114
|
-
|
|
115
|
-
1. Check the route name: `RunCommand.new.call(command: "bin/rails routes | grep user_path")`
|
|
116
|
-
2. Verify the route helper: `RunCommand.new.call(command: "bin/rails routes --grep user")`
|
|
117
|
-
3. Check for route helper overrides in custom constraints or defaults
|
|
118
|
-
|
|
119
|
-
## Failure Mode Guide
|
|
120
|
-
|
|
121
|
-
| Symptom | Likely Cause | Action |
|
|
122
|
-
|---------|-------------|--------|
|
|
123
|
-
| 404 for existing route | Route constraint blocking | Check `constraints:` block in routes.rb |
|
|
124
|
-
| `No route matches` | Missing resource definition | Add `resources :model_name` |
|
|
125
|
-
| Route works in dev, not prod | Different route ordering | Check routes file isn't conditionally loaded |
|
|
126
|
-
| `Missing controller` | Wrong namespace or filename | Verify file path matches module structure |
|
|
127
|
-
| Path helper not responding | Wrong route name or params mismatch | Check `bin/rails routes --grep helper_name` |
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "rails/generators"
|
|
4
|
-
|
|
5
|
-
module Ask
|
|
6
|
-
module Rails
|
|
7
|
-
module Generators
|
|
8
|
-
class InstallGenerator < ::Rails::Generators::Base
|
|
9
|
-
source_root File.expand_path("templates", __dir__)
|
|
10
|
-
|
|
11
|
-
desc "Creates ask-rails configuration and migration"
|
|
12
|
-
|
|
13
|
-
def create_initializer
|
|
14
|
-
template "initializer.rb", "config/initializers/ask_rails.rb"
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def create_migration
|
|
18
|
-
timestamp = Time.now.utc.strftime("%Y%m%d%H%M%S")
|
|
19
|
-
template "migration.rb", "db/migrate/#{timestamp}_create_ask_sessions.rb"
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def create_tools_directory
|
|
23
|
-
empty_directory "app/tools"
|
|
24
|
-
create_file "app/tools/.keep", ""
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
class CreateAskSessions < ActiveRecord::Migration[7.1]
|
|
2
|
-
def change
|
|
3
|
-
create_table :ask_sessions do |t|
|
|
4
|
-
t.string :session_id, null: false
|
|
5
|
-
t.string :model
|
|
6
|
-
t.jsonb :data, default: {}
|
|
7
|
-
t.timestamps
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
add_index :ask_sessions, :session_id, unique: true
|
|
11
|
-
end
|
|
12
|
-
end
|