maquina-generators 0.3.0 → 0.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 (114) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -20
  3. data/lib/generators/maquina/app/app_generator.rb +85 -31
  4. data/lib/generators/maquina/app/templates/.rubocop.yml +5 -0
  5. data/lib/generators/maquina/app/templates/.standard.yml +1 -0
  6. data/lib/generators/maquina/app/templates/Procfile.dev.tt +1 -0
  7. data/lib/generators/maquina/app/templates/README.md.erb +74 -8
  8. data/lib/generators/maquina/app/templates/app/views/home/index.html.erb +267 -3
  9. data/lib/generators/maquina/app/templates/config/database.yml.tt +78 -0
  10. data/lib/generators/maquina/clave/clave_generator.rb +24 -22
  11. data/lib/generators/maquina/clave/templates/app/controllers/registration/verifications_controller.rb.tt +0 -1
  12. data/lib/generators/maquina/clave/templates/app/models/user.rb.tt +0 -5
  13. data/lib/generators/maquina/clave/templates/app/views/registration/verifications/new.html.erb.tt +10 -9
  14. data/lib/generators/maquina/clave/templates/app/views/registrations/new.html.erb.tt +10 -9
  15. data/lib/generators/maquina/clave/templates/app/views/session/verifications/new.html.erb.tt +10 -9
  16. data/lib/generators/maquina/clave/templates/app/views/sessions/new.html.erb.tt +10 -9
  17. data/lib/generators/maquina/clave/templates/app/views/verification_mailer/verification_code.html.erb.tt +8 -8
  18. data/lib/generators/maquina/clave/templates/config/locales/clave.en.yml +0 -1
  19. data/lib/generators/maquina/clave/templates/config/locales/clave.es.yml +0 -1
  20. data/lib/generators/maquina/clave/templates/migration_create_users.rb.tt +0 -1
  21. data/lib/generators/maquina/mission_control_jobs/mission_control_jobs_generator.rb +51 -5
  22. data/lib/generators/maquina/mission_control_jobs/templates/app/controllers/backstage_controller.rb.tt +4 -0
  23. data/lib/generators/maquina/mission_control_jobs/templates/app/helpers/mission_control_helper.rb +24 -0
  24. data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/_admin_navigation.html.erb.tt +28 -0
  25. data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/_application_selection.html.erb +8 -0
  26. data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/_navigation.html.erb +11 -0
  27. data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/application.html.erb +33 -0
  28. data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/application_selection/_applications.html.erb +17 -0
  29. data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/application_selection/_servers.html.erb +10 -0
  30. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_error_information.html.erb +35 -0
  31. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_filters.html.erb +55 -0
  32. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_general_information.html.erb +83 -0
  33. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_job.html.erb +18 -0
  34. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_jobs_page.html.erb +13 -0
  35. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_raw_data.html.erb +9 -0
  36. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_title.html.erb +20 -0
  37. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_toolbar.html.erb +22 -0
  38. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/blocked/_actions.html.erb +5 -0
  39. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/blocked/_job.html.erb +13 -0
  40. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/failed/_actions.html.erb +9 -0
  41. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/failed/_backtrace_toggle.html.erb +11 -0
  42. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/failed/_job.html.erb +10 -0
  43. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/finished/_job.html.erb +7 -0
  44. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/in_progress/_job.html.erb +17 -0
  45. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/index.html.erb +35 -0
  46. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/scheduled/_actions.html.erb +9 -0
  47. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/scheduled/_job.html.erb +17 -0
  48. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/show.html.erb +35 -0
  49. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_actions.html.erb +15 -0
  50. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_job.html.erb +18 -0
  51. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_queue.html.erb +19 -0
  52. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_queue_title.html.erb +14 -0
  53. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/index.html.erb +24 -0
  54. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/show.html.erb +52 -0
  55. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_actions.html.erb +8 -0
  56. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_general_information.html.erb +45 -0
  57. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_recurring_task.html.erb +32 -0
  58. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_title.html.erb +6 -0
  59. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/index.html.erb +27 -0
  60. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/show.html.erb +51 -0
  61. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/shared/_job.html.erb +29 -0
  62. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/shared/_jobs.html.erb +12 -0
  63. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/shared/_pagination_toolbar.html.erb +25 -0
  64. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_configuration.html.erb +9 -0
  65. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_raw_data.html.erb +9 -0
  66. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_title.html.erb +10 -0
  67. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_worker.html.erb +26 -0
  68. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_workers_page.html.erb +13 -0
  69. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/index.html.erb +13 -0
  70. data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/show.html.erb +54 -0
  71. data/lib/generators/maquina/rack_attack/rack_attack_generator.rb +5 -0
  72. data/lib/generators/maquina/registration/registration_generator.rb +33 -4
  73. data/lib/generators/maquina/registration/templates/app/views/registrations/new.html.erb.tt +20 -15
  74. data/lib/generators/maquina/registration/templates/app/views/sessions/new.html.erb.tt +12 -10
  75. data/lib/generators/maquina/solid_errors/solid_errors_generator.rb +39 -7
  76. data/lib/generators/maquina/solid_errors/templates/app/controllers/backstage_controller.rb.tt +4 -0
  77. data/lib/generators/maquina/solid_errors/templates/app/helpers/solid_errors_helper.rb +9 -0
  78. data/lib/generators/maquina/solid_errors/templates/app/javascript/controllers/backtrace_filter_controller.js +27 -0
  79. data/lib/generators/maquina/solid_errors/templates/app/javascript/controllers/clipboard_controller.js +36 -0
  80. data/lib/generators/maquina/solid_errors/templates/app/views/layouts/_admin_navigation.html.erb.tt +28 -0
  81. data/lib/generators/maquina/solid_errors/templates/app/views/layouts/solid_errors/application.html.erb +23 -0
  82. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_actions.html.erb +16 -33
  83. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_delete_button.html.erb +4 -18
  84. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_error_card.html.erb +12 -55
  85. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_resolve_button.html.erb +5 -17
  86. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/index.html.erb +21 -58
  87. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_actions.html.erb +26 -53
  88. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_error_details.html.erb +60 -97
  89. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_header.html.erb +3 -17
  90. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_properties.html.erb +50 -62
  91. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show.html.erb +6 -6
  92. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/occurrences/_backtrace_line.html.erb +2 -2
  93. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/occurrences/_collection.html.erb +22 -66
  94. data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/occurrences/_occurrence.html.erb +24 -70
  95. data/lib/generators/maquina/solid_errors/templates/config/initializers/solid_errors.rb.tt +2 -0
  96. data/lib/generators/maquina/solid_queue/solid_queue_generator.rb +6 -1
  97. data/lib/generators/maquina/solid_queue/templates/config/solid_queue.yml +4 -0
  98. data/lib/maquina_generators/version.rb +1 -1
  99. data/test/generators/maquina/app_generator_test.rb +103 -22
  100. data/test/generators/maquina/clave_generator_test.rb +2 -9
  101. data/test/generators/maquina/mission_control_jobs_generator_test.rb +76 -2
  102. data/test/generators/maquina/registration_generator_test.rb +11 -5
  103. data/test/generators/maquina/solid_errors_generator_test.rb +64 -4
  104. data/test/generators/maquina/solid_queue_generator_test.rb +4 -0
  105. data/test/tmp/Gemfile +1 -1
  106. data/test/tmp/Procfile.dev +3 -0
  107. data/test/tmp/config/application.rb +12 -0
  108. data/test/tmp/config/solid_queue.yml +21 -0
  109. metadata +60 -6
  110. data/lib/generators/maquina/app/templates/bin/ci +0 -16
  111. data/lib/generators/maquina/app/templates/bin/setup.tt +0 -22
  112. data/test/tmp/app/controllers/backstage_controller.rb +0 -4
  113. data/test/tmp/config/initializers/solid_errors.rb +0 -10
  114. data/test/tmp/config/routes.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93ceefd73d3c9ff6cc2672408b697f8bd89557a1d1b069121b3eb4aeb237169a
4
- data.tar.gz: 8bf8072079ccbd44ccc74e6ed9278df905704d1826fb442d5fe965880b7184c5
3
+ metadata.gz: a581a9d09b983644b89ffae641f2fe08678a6a6d0f71125937f05354624a4887
4
+ data.tar.gz: 1b002af208c383174877f552055e64435099709fbfd997d228aca8ec15df39aa
5
5
  SHA512:
6
- metadata.gz: d09ece2ec179ec0ca30ce5a0b426c52f50f791afee3a8a8ef877fe05779c50f367b341667199d73ea49204420dfd1d94c2bdf3acff45df5a9b695592d8f1e103
7
- data.tar.gz: 70698a7c84c71c8a734592262f67f935ccd0cf1daa36820d7e3368878aa7d448a4352d94038db9aba3b71c1beabae38db50d895fc0f75b54b1f8dbb4ca9ed10b
6
+ metadata.gz: a7319c61cce5ffcef0376b918f4ff706170c678309f79814379a2ef89ffa15a77c71e9e369fda32168842c514cd1303403acf1a8542194fbd1394c0937f2cd3d
7
+ data.tar.gz: 17634bc69f8cb7acb1eb0b1a2ec28e79461daeb480ad869c41731c6c6334fcf4840574711e8ce4c75da459419b30a70f020a8cd053fc940f562276fc5acb44cf
data/README.md CHANGED
@@ -36,7 +36,6 @@ rails g maquina:clave
36
36
  Then:
37
37
 
38
38
  ```bash
39
- bundle install # Install bcrypt
40
39
  rails db:migrate # Run migrations
41
40
  ```
42
41
 
@@ -84,6 +83,7 @@ rails g maquina:registration
84
83
  Then:
85
84
 
86
85
  ```bash
86
+ bundle install # Install bcrypt
87
87
  rails db:migrate # Run migrations
88
88
  ```
89
89
 
@@ -115,13 +115,16 @@ All generated code lives in your app -- edit it directly:
115
115
  - **BackstageController:** Inherits from `ActionController::Base` (bypasses app's ApplicationController concerns)
116
116
  - **Initializer:** Credentials-first auth with ENV variable fallback, database connection config
117
117
  - **Route:** Mounts `SolidErrors::Engine` under a configurable prefix
118
- - **Custom views:** Optionally copies custom Tailwind-styled views to override the gem defaults
118
+ - **Admin navigation:** Shared navigation bar linking Solid Errors and Mission Control Jobs dashboards
119
+ - **Custom layout:** Tailwind-styled layout with admin navigation and toast flash messages
120
+ - **Stimulus controllers:** `clipboard_controller.js` and `backtrace_filter_controller.js`
121
+ - **Custom views:** Tailwind-styled views to override the gem defaults (included by default, use `--no-copy-views` to skip)
119
122
 
120
123
  #### Usage
121
124
 
122
125
  ```bash
123
126
  rails g maquina:solid_errors --prefix /admin
124
- rails g maquina:solid_errors --prefix /admin --copy-views # Include custom views
127
+ rails g maquina:solid_errors --prefix /admin --no-copy-views # Skip custom views
125
128
  ```
126
129
 
127
130
  The generator automatically runs `bundle install`. After running, execute `bin/rails generate solid_errors:install` (decline the initializer overwrite to keep your config), then `bin/rails db:migrate`.
@@ -129,8 +132,8 @@ The generator automatically runs `bundle install`. After running, execute `bin/r
129
132
  #### Options
130
133
 
131
134
  ```bash
132
- rails g maquina:solid_errors --prefix /admin # Default env vars
133
- rails g maquina:solid_errors --prefix /admin --copy-views # With custom views
135
+ rails g maquina:solid_errors --prefix /admin # Default (with custom views)
136
+ rails g maquina:solid_errors --prefix /admin --no-copy-views # Without custom views
134
137
  rails g maquina:solid_errors --prefix /backstage \
135
138
  --user-env-var ADMIN_USER --password-env-var ADMIN_PASSWORD # Custom env vars
136
139
  ```
@@ -150,14 +153,19 @@ Credentials are resolved in order:
150
153
 
151
154
  #### What it generates
152
155
 
153
- - **BackstageController:** Inherits from `ActionController::Base` (bypasses app's ApplicationController concerns)
156
+ - **BackstageController:** Inherits from `ActionController::Base` with maquina_components helpers (bypasses app's ApplicationController concerns)
157
+ - **Helper:** `MissionControlHelper` with `job_status_badge_variant` and `nav_icon_for_section`
154
158
  - **Initializer:** Sets base controller class, credentials-first auth with ENV variable fallback
155
159
  - **Route:** Mounts `MissionControl::Jobs::Engine` under a configurable prefix
160
+ - **Admin navigation:** Shared navigation bar linking Solid Errors and Mission Control Jobs dashboards
161
+ - **Custom layout:** Tailwind-styled layout with admin navigation, toast flash messages, application/server selection, and tab navigation
162
+ - **Custom views:** Tailwind-styled views for jobs, queues, workers, and recurring tasks (included by default, use `--no-copy-views` to skip)
156
163
 
157
164
  #### Usage
158
165
 
159
166
  ```bash
160
167
  rails g maquina:mission_control_jobs --prefix /admin
168
+ rails g maquina:mission_control_jobs --prefix /admin --no-copy-views # Skip custom views
161
169
  ```
162
170
 
163
171
  The generator automatically runs `bundle install`.
@@ -165,7 +173,8 @@ The generator automatically runs `bundle install`.
165
173
  #### Options
166
174
 
167
175
  ```bash
168
- rails g maquina:mission_control_jobs --prefix /admin # Default env vars
176
+ rails g maquina:mission_control_jobs --prefix /admin # Default (with custom views)
177
+ rails g maquina:mission_control_jobs --prefix /admin --no-copy-views # Without custom views
169
178
  rails g maquina:mission_control_jobs --prefix /backstage \
170
179
  --user-env-var ADMIN_USER --password-env-var ADMIN_PASSWORD # Custom env vars
171
180
  ```
@@ -240,19 +249,23 @@ Customize rules in `config/initializers/rack_attack.rb`.
240
249
 
241
250
  #### What it does
242
251
 
243
- 1. Adds development, runtime, and production gems (brakeman, standard, rails-i18n, maquina_components, aws-sdk-s3, etc.)
252
+ 1. Adds development, runtime, and production gems (brakeman, standard, rails-i18n, maquina-components, aws-sdk-s3, etc.)
244
253
  2. Creates `Procfile.dev`
245
254
  3. Creates `.rubocop.yml`, `.standard.yml`, appends to `.gitignore`
246
- 4. Creates `bin/setup` and `bin/ci` scripts
247
- 5. Creates `config/initializers/generators.rb`
248
- 6. Configures development (letter_opener) and production (APPLICATION_HOST) environments
249
- 7. Configures `field_error_proc` in application
250
- 8. Installs Action Text and Active Storage
251
- 9. Sets up ActiveStorage JavaScript imports
252
- 10. Adds turbo morphing and `yield :head` to layout
253
- 11. Invokes sub-generators: `maquina:rack_attack`, `maquina:solid_queue`, `maquina:mission_control_jobs`, `maquina:solid_errors`, `maquina_components:install`
254
- 12. Creates a HomeController with root route
255
- 13. Generates a README and `database.yml.example`
255
+ 4. Creates `config/initializers/generators.rb`
256
+ 5. Configures development (letter_opener) and production (APPLICATION_HOST) environments
257
+ 6. Configures `field_error_proc` and Solid Queue in `application.rb`
258
+ 7. Installs Action Text and Active Storage
259
+ 8. Sets up ActiveStorage JavaScript imports
260
+ 9. Adds turbo morphing, `yield :head`, and simplifies `<main>` tag in layout
261
+ 10. Optionally installs authentication (`maquina:clave` or `maquina:registration`)
262
+ 11. Invokes sub-generators: `maquina:rack_attack`, `maquina:mission_control_jobs`, `maquina:solid_errors`
263
+ 12. Runs external installers: `solid_queue:install`, `solid_errors:install`, `solid_cache:install`, `solid_cable:install`, `maquina_components:install`
264
+ 13. Restores custom layouts overwritten by gem installers
265
+ 14. Configures multi-database `database.yml` (primary, queue, cache, cable, errors)
266
+ 15. Creates a HomeController with root route
267
+ 16. Generates a README and `database.yml.example`
268
+ 17. Runs `db:prepare`
256
269
 
257
270
  #### Usage
258
271
 
@@ -271,8 +284,6 @@ rails g maquina:app --auth registration
271
284
  #### After running
272
285
 
273
286
  ```bash
274
- bin/rails generate solid_errors:install # decline initializer overwrite
275
- bin/rails db:migrate
276
287
  bin/rails credentials:edit # set backstage username/password
277
288
  bin/dev
278
289
  ```
@@ -19,10 +19,15 @@ module Maquina
19
19
 
20
20
  content = File.read(gemfile_path)
21
21
 
22
+ remove_gems = ["rubocop-rails-omakase"]
22
23
  dev_gems = {"brakeman" => nil, "bundle-audit" => nil, "letter_opener" => nil, "standard" => nil}
23
- runtime_gems = {"rails-i18n" => nil, "maquina_components" => nil}
24
+ runtime_gems = {"rails-i18n" => nil, "maquina-components" => nil}
24
25
  production_gems = {"aws-sdk-s3" => nil}
25
26
 
27
+ remove_gems.each do |gem_name|
28
+ gsub_file "Gemfile", /^\s*gem\s+["']#{gem_name}["'].*\n/, ""
29
+ end
30
+
26
31
  dev_gems.each do |gem_name, _|
27
32
  unless content.include?("gem \"#{gem_name}\"")
28
33
  append_to_file "Gemfile", "\ngem \"#{gem_name}\", group: :development\n"
@@ -67,15 +72,7 @@ module Maquina
67
72
  end
68
73
  end
69
74
 
70
- # 4. Scripts
71
- def create_scripts
72
- template "bin/setup.tt", "bin/setup"
73
- copy_file "bin/ci", "bin/ci"
74
- chmod "bin/setup", 0o755
75
- chmod "bin/ci", 0o755
76
- end
77
-
78
- # 5. Initializers
75
+ # 4. Initializers
79
76
  def create_initializers
80
77
  copy_file "config/initializers/generators.rb",
81
78
  "config/initializers/generators.rb"
@@ -104,6 +101,18 @@ module Maquina
104
101
  RUBY
105
102
  end
106
103
  end
104
+
105
+ unless content.include?("solid_queue")
106
+ inject_into_file "config/application.rb",
107
+ after: /class Application < Rails::Application\n/ do
108
+ <<~RUBY.indent(4)
109
+
110
+ # Use Solid Queue as the Active Job backend in all environments except test
111
+ config.active_job.queue_adapter = :solid_queue unless Rails.env.test?
112
+ config.solid_queue.connects_to = {database: {writing: :queue}}
113
+ RUBY
114
+ end
115
+ end
107
116
  end
108
117
 
109
118
  # 8. Install Rails features
@@ -113,7 +122,6 @@ module Maquina
113
122
  Bundler.with_unbundled_env do
114
123
  system("bin/rails action_text:install", chdir: destination_root)
115
124
  system("bin/rails active_storage:install", chdir: destination_root)
116
- system("bin/rails db:migrate", chdir: destination_root)
117
125
  end
118
126
  end
119
127
 
@@ -161,6 +169,12 @@ module Maquina
161
169
  "<body>",
162
170
  '<body data-turbo-refresh-method="morph" data-turbo-refresh-scroll="preserve">'
163
171
  end
172
+
173
+ if content.include?('class="container mx-auto mt-28 px-5 flex"')
174
+ gsub_file "app/views/layouts/application.html.erb",
175
+ '<main class="container mx-auto mt-28 px-5 flex">',
176
+ "<main>"
177
+ end
164
178
  end
165
179
 
166
180
  # 11. Install authentication
@@ -169,9 +183,9 @@ module Maquina
169
183
 
170
184
  case options[:auth]
171
185
  when "clave"
172
- generate "maquina:clave"
186
+ generate "maquina:clave", "--quiet"
173
187
  when "registration"
174
- generate "maquina:registration"
188
+ generate "maquina:registration", "--quiet"
175
189
  end
176
190
  end
177
191
 
@@ -179,17 +193,40 @@ module Maquina
179
193
  def install_maquina_generators
180
194
  return unless rails_app?
181
195
 
182
- generate "maquina:rack_attack"
183
- generate "maquina:solid_queue"
184
- generate "maquina:mission_control_jobs", "--prefix", options[:prefix]
185
- generate "maquina:solid_errors", "--prefix", options[:prefix]
196
+ generate "maquina:rack_attack", "--quiet"
197
+ generate "maquina:mission_control_jobs", "--prefix", options[:prefix], "--quiet"
198
+ generate "maquina:solid_errors", "--prefix", options[:prefix], "--quiet"
186
199
 
187
200
  Bundler.with_unbundled_env do
188
- system("bin/rails maquina_components:install", chdir: destination_root)
201
+ system("bin/rails generate solid_queue:install", chdir: destination_root)
202
+ system("bin/rails generate solid_errors:install", chdir: destination_root)
203
+ system("bin/rails generate solid_cache:install", chdir: destination_root)
204
+ system("bin/rails generate solid_cable:install", chdir: destination_root)
205
+ system("bin/rails generate maquina_components:install", chdir: destination_root)
206
+ end
207
+ end
208
+
209
+ # 13. Restore custom layouts overwritten by gem installers
210
+ def restore_custom_layouts
211
+ return unless rails_app?
212
+
213
+ solid_errors_layout = File.expand_path(
214
+ "../solid_errors/templates/app/views/layouts/solid_errors/application.html.erb",
215
+ __dir__
216
+ )
217
+
218
+ if File.exist?(solid_errors_layout)
219
+ create_file "app/views/layouts/solid_errors/application.html.erb",
220
+ File.read(solid_errors_layout), force: true
189
221
  end
190
222
  end
191
223
 
192
- # 13. Create home page
224
+ # 14. Configure multiple databases (after installers so we overwrite their database.yml)
225
+ def configure_databases
226
+ template "config/database.yml.tt", "config/database.yml", force: true
227
+ end
228
+
229
+ # 15. Create home page
193
230
  def create_home_page
194
231
  template "app/controllers/home_controller.rb",
195
232
  "app/controllers/home_controller.rb"
@@ -199,18 +236,18 @@ module Maquina
199
236
  route_file = File.join(destination_root, "config/routes.rb")
200
237
  if File.exist?(route_file)
201
238
  content = File.read(route_file)
202
- unless content.include?("root")
239
+ unless content.match?(/^\s*root\s/)
203
240
  route 'root "home#index"'
204
241
  end
205
242
  end
206
243
  end
207
244
 
208
- # 14. Create README
245
+ # 16. Create README
209
246
  def create_readme
210
247
  template "README.md.erb", "README.md"
211
248
  end
212
249
 
213
- # 15. Create database.yml.example
250
+ # 17. Create database.yml.example
214
251
  def create_database_sample
215
252
  db_config = File.join(destination_root, "config/database.yml")
216
253
  if File.exist?(db_config)
@@ -218,26 +255,43 @@ module Maquina
218
255
  end
219
256
  end
220
257
 
221
- # 16. Post-install message
258
+ # 18. Run all migrations
259
+ def run_migrations
260
+ return unless rails_app?
261
+
262
+ Bundler.with_unbundled_env do
263
+ system("bin/rails db:prepare", chdir: destination_root)
264
+ end
265
+ end
266
+
267
+ # 19. Post-install message
222
268
  def show_post_install
223
269
  say ""
270
+ say "=" * 60, :green
224
271
  say "Your Rails app is ready!", :green
272
+ say "=" * 60, :green
225
273
  say ""
226
- say "Manual steps:", :yellow
227
- say " 1. bin/rails generate solid_errors:install"
228
- say " (decline initializer overwrite to keep your config)"
229
- say " 2. bin/rails db:migrate"
230
- say " 3. Set credentials: bin/rails credentials:edit"
274
+ say "Next steps:", :yellow
275
+ say " 1. Set credentials: bin/rails credentials:edit"
231
276
  say " backstage:"
232
277
  say " username: your_user"
233
278
  say " password: your_password"
234
- say " 4. Start the app: bin/dev"
279
+ say " 2. Start the app: bin/dev"
280
+ say ""
281
+ say "Installed components:", :yellow
282
+ say " - Rack::Attack: rate limiting and blocklists (config/initializers/rack_attack.rb)"
283
+ say " - Solid Queue: background jobs (config/solid_queue.yml)"
284
+ say " - Mission Control Jobs: job dashboard at #{options[:prefix]}/mission_control_jobs"
285
+ say " - Solid Errors: error tracking at #{options[:prefix]}/solid_errors"
286
+ say " - Maquina Components: UI components"
235
287
  if options[:auth] != "none"
236
288
  say ""
237
289
  say "Authentication (#{options[:auth]}):", :yellow
238
- say " - Run bin/rails db:migrate if you haven't already"
239
- say " - Visit /registrations/new to sign up" if options[:auth] == "registration"
240
290
  say " - Visit /session/new to sign in"
291
+ say " - Visit /registrations/new to sign up" if options[:auth] == "registration"
292
+ say " - Visit /registration/new to sign up" if options[:auth] == "clave"
293
+ say " - Customize: app/controllers/concerns/authentication.rb"
294
+ say " - Locales: config/locales/"
241
295
  end
242
296
  say ""
243
297
  end
@@ -0,0 +1,5 @@
1
+ require:
2
+ - standard
3
+
4
+ inherit_gem:
5
+ standard: config/base.yml
@@ -0,0 +1 @@
1
+ ruby_version: 3.2
@@ -1,2 +1,3 @@
1
1
  web: bin/rails server -p <%= options[:port] %>
2
2
  css: bin/rails tailwindcss:watch
3
+ solid_queue: bin/rails solid_queue:start
@@ -1,32 +1,98 @@
1
1
  # <%= File.basename(destination_root).titleize %>
2
2
 
3
+ Built with [maquina.app](https://maquina.app) — production-tested tools for developers who ship alone.
4
+
3
5
  ## Getting Started
4
6
 
7
+ ### Prerequisites
8
+
9
+ - Ruby 3.2+
10
+ - Rails 8+
11
+ - PostgreSQL (or SQLite for development)
12
+
13
+ ### Setup
14
+
5
15
  ```bash
6
- bin/setup
7
- bin/dev
16
+ bin/setup # Install dependencies and prepare databases
17
+ bin/dev # Start all processes (web, css, solid_queue)
8
18
  ```
9
19
 
10
- ## Development
20
+ Your app will be running at **http://localhost:<%= options[:port] %>**.
21
+
22
+ ## What's Included
11
23
 
12
- - **Server:** http://localhost:<%= options[:port] %>
13
- - **Jobs dashboard:** http://localhost:<%= options[:port] %><%= options[:prefix] %>/mission_control_jobs
14
- - **Errors dashboard:** http://localhost:<%= options[:port] %><%= options[:prefix] %>/solid_errors
24
+ | Feature | Description |
25
+ |---------|-------------|
26
+ <% if options[:auth] != "none" -%>
27
+ | **Authentication** | <%= options[:auth] == "clave" ? "Clave passwordless email-code authentication" : "Registration-based email/password authentication" %> |
28
+ <% end -%>
29
+ | **Background Jobs** | Solid Queue with Mission Control Jobs dashboard |
30
+ | **Error Tracking** | Solid Errors with custom UI |
31
+ | **Rate Limiting** | Rack::Attack with sensible defaults |
32
+ | **UI Components** | Maquina Components (ERB partials + Tailwind + Stimulus) |
33
+ | **Caching** | Solid Cache |
34
+ | **WebSockets** | Solid Cable |
35
+ | **Rich Text** | Action Text |
36
+ | **File Storage** | Active Storage (S3-ready in production) |
37
+ | **Multi-database** | Separate databases for queue, cache, cable, and errors |
38
+
39
+ ## Development URLs
40
+
41
+ | URL | Description |
42
+ |-----|-------------|
43
+ | http://localhost:<%= options[:port] %> | Application |
44
+ | http://localhost:<%= options[:port] %><%= options[:prefix] %>/mission_control_jobs | Jobs dashboard |
45
+ | http://localhost:<%= options[:port] %><%= options[:prefix] %>/solid_errors | Errors dashboard |
46
+ <% if options[:auth] != "none" -%>
47
+ | http://localhost:<%= options[:port] %>/session/new | Sign in |
48
+ <% if options[:auth] == "registration" -%>
49
+ | http://localhost:<%= options[:port] %>/registrations/new | Sign up |
50
+ <% elsif options[:auth] == "clave" -%>
51
+ | http://localhost:<%= options[:port] %>/registration/new | Sign up |
52
+ <% end -%>
53
+ <% end -%>
15
54
 
16
55
  ## Scripts
17
56
 
18
- - `bin/setup` — Install dependencies and prepare database
19
- - `bin/ci` — Run full CI suite (lint, security, tests)
57
+ - `bin/setup` — Install dependencies and prepare databases
20
58
  - `bin/dev` — Start all processes (web, css, solid_queue)
21
59
 
22
60
  ## Credentials
23
61
 
62
+ Edit credentials with:
63
+
24
64
  ```bash
25
65
  bin/rails credentials:edit
26
66
  ```
27
67
 
68
+ Add backstage credentials for the jobs and errors dashboards:
69
+
28
70
  ```yaml
29
71
  backstage:
30
72
  username: your_user
31
73
  password: your_password
32
74
  ```
75
+
76
+ ## Maquina Ecosystem
77
+
78
+ ### UI Components
79
+
80
+ [Maquina Components](https://maquina.app/documentation/components/) — a library of ERB partials, Tailwind CSS styles, and Stimulus controllers for building consistent, accessible UIs in Rails.
81
+
82
+ ### AI Tools
83
+
84
+ Maquina provides a suite of AI-powered tools to accelerate your Rails development:
85
+
86
+ - **Rails MCP Server** — Model Context Protocol server for Rails applications
87
+ - **Rails Simplifier** — simplify and refine Rails code following 37signals patterns
88
+ - **Rails Upgrade Assistant** — comprehensive Rails upgrade reports and migration guides
89
+ - **Maquina UI Standards** — build consistent UIs using maquina_components
90
+ - **Neovim MCP Server** — MCP server for Neovim integration
91
+
92
+ Learn more at [maquina.app/documentation/ai-tools](https://maquina.app/documentation/ai-tools/).
93
+
94
+ ## Learn More
95
+
96
+ Visit [maquina.app](https://maquina.app) for full documentation.
97
+
98
+ Maquina is built for the one-person framework philosophy: production-first, standard Rails, designed to scale with a small team.