railsforge 1.0.2 → 2.0.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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +105 -444
  3. data/lib/railsforge/analyzers/controller_analyzer.rb +29 -55
  4. data/lib/railsforge/analyzers/database_analyzer.rb +16 -30
  5. data/lib/railsforge/analyzers/metrics_analyzer.rb +8 -22
  6. data/lib/railsforge/analyzers/model_analyzer.rb +29 -46
  7. data/lib/railsforge/analyzers/performance_analyzer.rb +34 -94
  8. data/lib/railsforge/analyzers/refactor_analyzer.rb +77 -57
  9. data/lib/railsforge/analyzers/security_analyzer.rb +34 -91
  10. data/lib/railsforge/analyzers/spec_analyzer.rb +17 -31
  11. data/lib/railsforge/cli.rb +14 -650
  12. data/lib/railsforge/cli_minimal.rb +8 -55
  13. data/lib/railsforge/doctor.rb +52 -225
  14. data/lib/railsforge/formatter.rb +102 -0
  15. data/lib/railsforge/issue.rb +23 -0
  16. data/lib/railsforge/loader.rb +4 -64
  17. data/lib/railsforge/version.rb +1 -1
  18. metadata +14 -82
  19. data/lib/railsforge/api_generator.rb +0 -397
  20. data/lib/railsforge/audit.rb +0 -289
  21. data/lib/railsforge/config.rb +0 -181
  22. data/lib/railsforge/database_analyzer.rb +0 -300
  23. data/lib/railsforge/feature_generator.rb +0 -560
  24. data/lib/railsforge/generator.rb +0 -313
  25. data/lib/railsforge/generators/api_generator.rb +0 -392
  26. data/lib/railsforge/generators/base_generator.rb +0 -75
  27. data/lib/railsforge/generators/demo_generator.rb +0 -307
  28. data/lib/railsforge/generators/devops_generator.rb +0 -287
  29. data/lib/railsforge/generators/form_generator.rb +0 -180
  30. data/lib/railsforge/generators/job_generator.rb +0 -176
  31. data/lib/railsforge/generators/monitoring_generator.rb +0 -134
  32. data/lib/railsforge/generators/policy_generator.rb +0 -220
  33. data/lib/railsforge/generators/presenter_generator.rb +0 -173
  34. data/lib/railsforge/generators/query_generator.rb +0 -174
  35. data/lib/railsforge/generators/serializer_generator.rb +0 -166
  36. data/lib/railsforge/generators/service_generator.rb +0 -122
  37. data/lib/railsforge/generators/stimulus_controller_generator.rb +0 -129
  38. data/lib/railsforge/generators/test_generator.rb +0 -289
  39. data/lib/railsforge/generators/view_component_generator.rb +0 -169
  40. data/lib/railsforge/graph.rb +0 -270
  41. data/lib/railsforge/mailer_generator.rb +0 -191
  42. data/lib/railsforge/plugins/plugin_loader.rb +0 -60
  43. data/lib/railsforge/plugins.rb +0 -30
  44. data/lib/railsforge/profiles.rb +0 -99
  45. data/lib/railsforge/refactor_analyzer.rb +0 -401
  46. data/lib/railsforge/refactor_controller.rb +0 -277
  47. data/lib/railsforge/refactors/refactor_controller.rb +0 -117
  48. data/lib/railsforge/template_loader.rb +0 -105
  49. data/lib/railsforge/templates/v1/form/spec_template.rb +0 -18
  50. data/lib/railsforge/templates/v1/form/template.rb +0 -28
  51. data/lib/railsforge/templates/v1/job/spec_template.rb +0 -17
  52. data/lib/railsforge/templates/v1/job/template.rb +0 -13
  53. data/lib/railsforge/templates/v1/policy/spec_template.rb +0 -41
  54. data/lib/railsforge/templates/v1/policy/template.rb +0 -57
  55. data/lib/railsforge/templates/v1/presenter/spec_template.rb +0 -12
  56. data/lib/railsforge/templates/v1/presenter/template.rb +0 -13
  57. data/lib/railsforge/templates/v1/query/spec_template.rb +0 -12
  58. data/lib/railsforge/templates/v1/query/template.rb +0 -16
  59. data/lib/railsforge/templates/v1/serializer/spec_template.rb +0 -13
  60. data/lib/railsforge/templates/v1/serializer/template.rb +0 -11
  61. data/lib/railsforge/templates/v1/service/spec_template.rb +0 -12
  62. data/lib/railsforge/templates/v1/service/template.rb +0 -25
  63. data/lib/railsforge/templates/v1/stimulus_controller/template.rb +0 -35
  64. data/lib/railsforge/templates/v1/view_component/template.rb +0 -24
  65. data/lib/railsforge/templates/v2/job/template.rb +0 -49
  66. data/lib/railsforge/templates/v2/query/template.rb +0 -66
  67. data/lib/railsforge/templates/v2/service/spec_template.rb +0 -33
  68. data/lib/railsforge/templates/v2/service/template.rb +0 -71
  69. data/lib/railsforge/templates/v3/job/template.rb +0 -72
  70. data/lib/railsforge/templates/v3/query/spec_template.rb +0 -54
  71. data/lib/railsforge/templates/v3/query/template.rb +0 -115
  72. data/lib/railsforge/templates/v3/service/spec_template.rb +0 -51
  73. data/lib/railsforge/templates/v3/service/template.rb +0 -93
  74. data/lib/railsforge/wizard.rb +0 -265
  75. data/lib/railsforge/wizard_tui.rb +0 -286
@@ -1,685 +1,49 @@
1
- # CLI module for RailsForge
2
- # Handles all CLI commands
1
+ # CLI RailsForge v2 command dispatcher
2
+ # Supported commands: doctor
3
3
 
4
4
  module RailsForge
5
- # CLI class handles command-line interface
6
5
  class CLI
7
- # Main entry point
8
6
  def self.start(args)
9
7
  command = args.shift
10
8
 
11
9
  case command
12
- when "new"
13
- handle_new_command(args)
14
- when "generate", "g"
15
- handle_generate_command(args)
16
- when "analyze", "a"
17
- handle_analyze_command(args)
18
- when "refactor", "r"
19
- handle_refactor_command(args)
20
10
  when "doctor"
21
11
  handle_doctor_command(args)
22
- when "audit"
23
- handle_audit_command(args)
24
- when "graph"
25
- handle_graph_command(args)
26
- when "wizard", "wiz"
27
- handle_wizard_command(args)
28
- when "plugins", "plug"
29
- handle_plugins_command(args)
30
- when "config", "cfg"
31
- handle_config_command(args)
32
- when "profiles"
33
- puts RailsForge::Profile.show_available
34
12
  when "--version", "-v"
35
13
  puts "RailsForge #{VERSION}"
36
14
  when nil, "--help", "-h"
37
15
  display_help
38
16
  else
39
17
  puts "Unknown command: #{command}"
40
- display_help
18
+ puts "Run `railsforge --help` for usage."
41
19
  exit 1
42
20
  end
43
21
  end
44
22
 
45
- # Display help
46
23
  def self.display_help
47
24
  puts <<~HELP
48
- RailsForge - A Rails development toolkit
25
+ RailsForge Rails application health diagnostics
49
26
 
50
27
  Usage:
51
- railsforge new <app_name> Create a new Rails app
52
- railsforge generate service <name> Generate a service object
53
- railsforge generate query <name> Generate a query object
54
- railsforge generate job <name> Generate a job object
55
- railsforge generate demo <name> Generate a demo project
56
- railsforge generate devops Generate Docker/CI-CD configs
57
- railsforge generate monitoring Generate Sentry/Lograge configs
58
- railsforge generate test <name> Generate test files
59
- railsforge analyze Analyze code quality
60
- railsforge doctor Full project health check
61
- railsforge audit Architecture audit
62
- railsforge graph Dependency graph
63
- railsforge refactor Refactoring suggestions
64
- railsforge wizard Interactive project setup
65
- railsforge plugins Plugin management
66
- railsforge config Configuration
67
- railsforge profiles List available profiles
68
- railsforge --version, -v Show version
69
- railsforge --help, -h Show this help
28
+ railsforge doctor Run full diagnostic scan
29
+ railsforge doctor --format=json Output as JSON
30
+ railsforge --version Show version
31
+ railsforge --help Show this help
70
32
  HELP
71
33
  end
72
34
 
73
- # Handle new command
74
- def self.handle_new_command(args)
75
- options = {}
76
- app_name = nil
77
- interactive = true
78
-
79
- args.each do |arg|
80
- if arg.start_with?("--")
81
- key, value = arg[2..].split("=", 2)
82
- interactive = false
83
- case key
84
- when "auth"
85
- options[:auth] = value || "devise"
86
- when "admin"
87
- options[:admin] = value || "activeadmin"
88
- when "jobs"
89
- options[:jobs] = value || "sidekiq"
90
- when "profile"
91
- options[:profile] = value
92
- end
93
- elsif !arg.start_with?("-") && app_name.nil?
94
- app_name = arg
95
- end
96
- end
97
-
98
- if app_name.nil?
99
- puts "Usage: railsforge new <app_name> [options]"
100
- exit 1
101
- end
102
-
103
- if interactive
104
- options = prompt_for_features(app_name)
105
- end
106
-
107
- begin
108
- result = RailsForge::Generator.create_app(app_name, options)
109
- puts "\n#{result}"
110
- rescue => e
111
- puts "Error: #{e.message}"
112
- exit 1
113
- end
114
- end
115
-
116
- # Prompt for features
117
- def self.prompt_for_features(app_name)
118
- options = {}
119
- puts "\n#{'=' * 50}"
120
- puts "RailsForge Interactive Setup"
121
- puts "#{'=' * 50}"
122
-
123
- if prompt_yes_no("Add authentication?")
124
- options[:auth] = "devise"
125
- end
126
-
127
- if prompt_yes_no("Add admin panel?")
128
- options[:admin] = "activeadmin"
129
- end
130
-
131
- if prompt_yes_no("Add background jobs?")
132
- options[:jobs] = "sidekiq"
133
- end
134
-
135
- options
136
- end
137
-
138
- # Prompt yes/no
139
- def self.prompt_yes_no(question, default: false)
140
- suffix = default ? " [Y/n]" : " [y/N]"
141
- print "#{question}#{suffix}: "
142
- answer = STDIN.gets.strip.downcase
143
- return default if answer.empty?
144
- answer == "y" || answer == "yes"
145
- end
146
-
147
- # Handle generate command
148
- def self.handle_generate_command(args)
149
- template_version = "v1"
150
- dry_run = false
151
-
152
- # Parse options
153
- args = args.reject do |arg|
154
- if arg.start_with?("--template=")
155
- template_version = arg.split("=").last
156
- true
157
- elsif arg == "--dry-run"
158
- dry_run = true
159
- true
160
- else
161
- false
162
- end
163
- end
164
-
165
- generator_type = args.shift
166
- names = args # Multiple names allowed for bulk generation
167
-
168
- # Generators that don't require names
169
- no_name_generators = ["devops", "ops", "monitoring", "mon"]
170
-
171
- # Handle bulk generation
172
- if names.empty? && generator_type && !no_name_generators.include?(generator_type)
173
- puts "Error: Name required"
174
- exit 1
175
- end
176
-
177
- case generator_type
178
- when "service", "s"
179
- handle_generate_bulk(:service, names, template_version, dry_run)
180
- when "query", "q"
181
- handle_generate_bulk(:query, names, template_version, dry_run)
182
- when "job", "j"
183
- handle_generate_bulk(:job, names, template_version, dry_run)
184
- when "form", "f"
185
- handle_generate_bulk(:form, names, template_version, dry_run)
186
- when "presenter", "p"
187
- handle_generate_bulk(:presenter, names, template_version, dry_run)
188
- when "policy", "pol"
189
- handle_generate_bulk(:policy, names, template_version, dry_run)
190
- when "serializer", "ser"
191
- handle_generate_bulk(:serializer, names, template_version, dry_run)
192
- when "component", "c"
193
- handle_generate_bulk(:component, names, template_version, dry_run)
194
- when "stimulus", "stim"
195
- handle_generate_bulk(:stimulus, names, template_version, dry_run)
196
- when "demo"
197
- handle_generate_demo(args, names.first)
198
- when "devops", "ops"
199
- handle_generate_devops(args)
200
- when "monitoring", "mon"
201
- handle_generate_monitoring(args)
202
- when "test", "t"
203
- handle_generate_test(args, names.first)
204
- when "mailer", "mail"
205
- handle_generate_bulk(:mailer, names, template_version, dry_run)
206
- when "feature", "feat"
207
- handle_generate_feature(args, names.first)
208
- when "api"
209
- handle_generate_api(args, names.first)
210
- else
211
- puts "Usage: railsforge generate <type> <name> [<name>...]"
212
- puts "Types: service, query, job, form, presenter, policy, serializer, component, stimulus, mailer, feature, api"
213
- puts "Options: --template=v2, --dry-run"
214
- exit 1
215
- end
216
- end
217
-
218
- # Handle bulk generation
219
- def self.handle_generate_bulk(type, names, template_version, dry_run)
220
- if dry_run
221
- puts "Dry run - would generate:"
222
- names.each { |name| puts " - #{type}: #{name} (template: #{template_version})" }
223
- return
224
- end
225
-
226
- results = []
227
- names.each do |name|
228
- result = generate_single(type, name, template_version)
229
- results << result
230
- end
231
-
232
- puts results.join("\n")
233
- end
234
-
235
- # Generate a single item
236
- def self.generate_single(type, name, template_version)
237
- case type
238
- when :service
239
- "Generating service: #{name}\n" + RailsForge::Generators::ServiceGenerator.generate(name, with_spec: true, template_version: template_version)
240
- when :query
241
- "Generating query: #{name}\n" + RailsForge::Generators::QueryGenerator.generate(name, with_spec: true, template_version: template_version)
242
- when :job
243
- "Generating job: #{name}\n" + RailsForge::Generators::JobGenerator.generate(name, with_spec: true, template_version: template_version)
244
- when :form
245
- "Generating form: #{name}\n" + RailsForge::Generators::FormGenerator.generate(name, with_spec: true, template_version: template_version)
246
- when :presenter
247
- "Generating presenter: #{name}\n" + RailsForge::Generators::PresenterGenerator.generate(name, with_spec: true, template_version: template_version)
248
- when :policy
249
- "Generating policy: #{name}\n" + RailsForge::Generators::PolicyGenerator.generate(name, with_spec: true, template_version: template_version)
250
- when :serializer
251
- "Generating serializer: #{name}\n" + RailsForge::Generators::SerializerGenerator.generate(name, with_spec: true, template_version: template_version)
252
- when :component
253
- "Generating component: #{name}\n" + RailsForge::Generators::ViewComponentGenerator.new(name, template_version: template_version).generate
254
- when :stimulus
255
- "Generating stimulus: #{name}\n" + RailsForge::Generators::StimulusControllerGenerator.new(name, template_version: template_version).generate
256
- when :mailer
257
- "Generating mailer: #{name}\n" + RailsForge::MailerGenerator.generate(name, with_spec: true)
258
- when :feature
259
- "Generating feature: #{name}\n" + RailsForge::FeatureGenerator.generate(name, with_spec: true)
260
- when :api
261
- "Generating API: #{name}\n" + RailsForge::Generators::ApiGenerator.generate(name, with_spec: true)
262
- else
263
- "Generator for #{type} not fully implemented"
264
- end
265
- rescue => e
266
- "Error generating #{name}: #{e.message}"
267
- end
268
-
269
- # Generate service
270
- def self.handle_generate_service(args, name, template_version)
271
- with_spec = !args.include?("--no-spec")
272
-
273
- begin
274
- puts "Generating service: #{name}..."
275
- result = RailsForge::Generators::ServiceGenerator.generate(name, with_spec: with_spec, template_version: template_version)
276
- puts "\n#{result}"
277
- rescue => e
278
- puts "Error: #{e.message}"
279
- exit 1
280
- end
281
- end
282
-
283
- # Generate query
284
- def self.handle_generate_query(args, name, template_version)
285
- with_spec = !args.include?("--no-spec")
286
-
287
- begin
288
- puts "Generating query: #{name}..."
289
- result = RailsForge::Generators::QueryGenerator.generate(name, with_spec: with_spec, template_version: template_version)
290
- puts "\n#{result}"
291
- rescue => e
292
- puts "Error: #{e.message}"
293
- exit 1
294
- end
295
- end
296
-
297
- # Generate job
298
- def self.handle_generate_job(args, name, template_version)
299
- with_spec = !args.include?("--no-spec")
300
-
301
- begin
302
- puts "Generating job: #{name}..."
303
- result = RailsForge::Generators::JobGenerator.generate(name, with_spec: with_spec, template_version: template_version)
304
- puts "\n#{result}"
305
- rescue => e
306
- puts "Error: #{e.message}"
307
- exit 1
308
- end
309
- end
310
-
311
- # Generate form
312
- def self.handle_generate_form(args, name, template_version)
313
- with_spec = !args.include?("--no-spec")
314
-
315
- begin
316
- puts "Generating form: #{name}..."
317
- result = RailsForge::Generators::FormGenerator.generate(name, with_spec: with_spec, template_version: template_version)
318
- puts "\n#{result}"
319
- rescue => e
320
- puts "Error: #{e.message}"
321
- exit 1
322
- end
323
- end
324
-
325
- # Generate presenter
326
- def self.handle_generate_presenter(args, name, template_version)
327
- with_spec = !args.include?("--no-spec")
328
-
329
- begin
330
- puts "Generating presenter: #{name}..."
331
- result = RailsForge::Generators::PresenterGenerator.generate(name, with_spec: with_spec, template_version: template_version)
332
- puts "\n#{result}"
333
- rescue => e
334
- puts "Error: #{e.message}"
335
- exit 1
336
- end
337
- end
338
-
339
- # Generate policy
340
- def self.handle_generate_policy(args, name, template_version)
341
- with_spec = !args.include?("--no-spec")
342
-
343
- begin
344
- puts "Generating policy: #{name}..."
345
- result = RailsForge::Generators::PolicyGenerator.generate(name, with_spec: with_spec, template_version: template_version)
346
- puts "\n#{result}"
347
- rescue => e
348
- puts "Error: #{e.message}"
349
- exit 1
350
- end
351
- end
352
-
353
- # Generate serializer
354
- def self.handle_generate_serializer(args, name, template_version)
355
- with_spec = !args.include?("--no-spec")
356
-
357
- begin
358
- puts "Generating serializer: #{name}..."
359
- result = RailsForge::Generators::SerializerGenerator.generate(name, with_spec: with_spec, template_version: template_version)
360
- puts "\n#{result}"
361
- rescue => e
362
- puts "Error: #{e.message}"
363
- exit 1
364
- end
365
- end
366
-
367
- # Generate mailer
368
- def self.handle_generate_mailer(args, name)
369
- with_spec = !args.include?("--no-spec")
370
-
371
- begin
372
- puts "Generating mailer: #{name}..."
373
- result = RailsForge::Generators::MailerGenerator.generate(name, with_spec: with_spec)
374
- puts "\n#{result}"
375
- rescue => e
376
- puts "Error: #{e.message}"
377
- exit 1
378
- end
379
- end
380
-
381
- # Generate feature
382
- def self.handle_generate_feature(args, name)
383
- with_spec = !args.include?("--no-spec")
384
-
385
- begin
386
- puts "Generating feature: #{name}..."
387
- result = RailsForge::Generators::FeatureGenerator.generate(name, with_spec: with_spec)
388
- puts "\n#{result}"
389
- rescue => e
390
- puts "Error: #{e.message}"
391
- exit 1
392
- end
393
- end
394
-
395
- # Generate API
396
- def self.handle_generate_api(args, name)
397
- with_spec = !args.include?("--no-spec")
398
-
399
- begin
400
- puts "Generating API resource: #{name}..."
401
- result = RailsForge::Generators::ApiGenerator.generate(name, with_spec: with_spec)
402
- puts "\n#{result}"
403
- rescue => e
404
- puts "Error: #{e.message}"
405
- exit 1
406
- end
407
- end
408
-
409
- # Generate demo project
410
- def self.handle_generate_demo(args, name)
411
- options = {}
412
- args.each do |arg|
413
- if arg.start_with?("--")
414
- key, value = arg[2..].split("=", 2)
415
- options[key.to_sym] = value || true
416
- end
417
- end
418
-
419
- begin
420
- puts "Generating demo project: #{name}..."
421
- result = RailsForge::Generators::DemoGenerator.new(name, options).generate
422
- puts "\n#{result}"
423
- rescue => e
424
- puts "Error: #{e.message}"
425
- exit 1
426
- end
427
- end
428
-
429
- # Generate devops configs
430
- def self.handle_generate_devops(args)
431
- options = {}
432
- args.each do |arg|
433
- if arg.start_with?("--")
434
- key, value = arg[2..].split("=", 2)
435
- options[key.to_sym] = value || true
436
- end
437
- end
438
-
439
- begin
440
- puts "Generating DevOps configurations..."
441
- result = RailsForge::Generators::DevopsGenerator.new("devops", options).generate
442
- puts "\n#{result}"
443
- rescue => e
444
- puts "Error: #{e.message}"
445
- exit 1
446
- end
447
- end
448
-
449
- # Generate monitoring configs
450
- def self.handle_generate_monitoring(args)
451
- options = {}
452
- args.each do |arg|
453
- if arg.start_with?("--")
454
- key, value = arg[2..].split("=", 2)
455
- options[key.to_sym] = value || true
456
- end
457
- end
458
-
459
- begin
460
- puts "Generating Monitoring configurations..."
461
- result = RailsForge::Generators::MonitoringGenerator.new("monitoring", options).generate
462
- puts "\n#{result}"
463
- rescue => e
464
- puts "Error: #{e.message}"
465
- exit 1
466
- end
467
- end
468
-
469
- # Generate test files
470
- def self.handle_generate_test(args, name)
471
- options = { type: "model" }
472
- args.each do |arg|
473
- if arg.start_with?("--")
474
- key, value = arg[2..].split("=", 2)
475
- options[key.to_sym] = value || true
476
- end
477
- end
478
-
479
- begin
480
- puts "Generating test files for: #{name}..."
481
- result = RailsForge::Generators::TestGenerator.new(name, options).generate
482
- puts "\n#{result}"
483
- rescue => e
484
- puts "Error: #{e.message}"
485
- exit 1
486
- end
487
- end
488
-
489
- # Handle analyze command
490
- def self.handle_analyze_command(args)
491
- target = args.shift
492
-
493
- case target
494
- when nil, "controllers", "c"
495
- analyze_controllers
496
- when "models", "m"
497
- analyze_models
498
- when "specs", "spec", "s"
499
- analyze_specs
500
- when "db", "database", "d"
501
- analyze_db
502
- when "metrics", "metric", "met"
503
- analyze_metrics(args)
504
- when "security", "sec", "security"
505
- analyze_security
506
- when "performance", "perf", "p"
507
- analyze_performance
508
- when "all", "full", "a"
509
- analyze_all
510
- else
511
- puts "Unknown analyze target: #{target}"
512
- puts "Available: controllers, models, specs, db, metrics, security, performance, all"
513
- exit 1
514
- end
515
- end
516
-
517
- def self.analyze_security
518
- results = RailsForge::Analyzers::SecurityAnalyzer.analyze
519
- RailsForge::Analyzers::SecurityAnalyzer.print_report(results)
520
- end
521
-
522
- def self.analyze_performance
523
- results = RailsForge::Analyzers::PerformanceAnalyzer.analyze
524
- RailsForge::Analyzers::PerformanceAnalyzer.print_report(results)
525
- end
526
-
527
- def self.analyze_controllers
528
- results = RailsForge::Analyzers::ControllerAnalyzer.analyze
529
- RailsForge::Analyzers::ControllerAnalyzer.print_results(results)
530
- end
531
-
532
- def self.analyze_models
533
- results = RailsForge::Analyzers::ModelAnalyzer.analyze
534
- RailsForge::Analyzers::ModelAnalyzer.print_results(results)
535
- end
536
-
537
- def self.analyze_specs
538
- results = RailsForge::Analyzers::SpecAnalyzer.analyze
539
- RailsForge::Analyzers::SpecAnalyzer.print_results(results)
540
- end
541
-
542
- def self.analyze_db
543
- results = RailsForge::Analyzers::DatabaseAnalyzer.analyze
544
- RailsForge::Analyzers::DatabaseAnalyzer.print_report(results)
545
- end
546
-
547
- def self.analyze_metrics(args)
548
- results = RailsForge::Analyzers::MetricsAnalyzer.analyze
549
- RailsForge::Analyzers::MetricsAnalyzer.print_results(results)
550
- end
551
-
552
- def self.analyze_all
553
- RailsForge::ReportFormatter.generate_report
554
- end
555
-
556
- # Handle refactor command
557
- def self.handle_refactor_command(args)
558
- target = args.shift
559
-
560
- case target
561
- when nil, "controllers", "c"
562
- refactor_controllers
563
- when "models", "m"
564
- refactor_models
565
- when "controller"
566
- refactor_specific_controller(args.shift)
567
- else
568
- puts "Usage: railsforge refactor [controllers|models|controller <name>]"
569
- exit 1
570
- end
571
- end
572
-
573
- def self.refactor_controllers
574
- results = RailsForge::Analyzers::RefactorAnalyzer.analyze_controllers
575
- RailsForge::Analyzers::RefactorAnalyzer.print_report(results)
576
- end
577
-
578
- def self.refactor_models
579
- results = RailsForge::Analyzers::RefactorAnalyzer.analyze_models
580
- RailsForge::Analyzers::RefactorAnalyzer.print_report(results)
581
- end
582
-
583
- def self.refactor_specific_controller(name)
584
- refactor = RailsForge::Refactors::RefactorController.new
585
- refactor.refactor(name)
586
- end
587
-
588
- # Handle doctor command
589
35
  def self.handle_doctor_command(args)
590
- doctor = RailsForge::Doctor.new
591
- doctor.run
592
- rescue => e
593
- puts "Error: #{e.message}"
594
- exit 1
595
- end
596
-
597
- # Handle audit command
598
- def self.handle_audit_command(args)
599
- results = RailsForge::Audit.run
600
- RailsForge::Audit.print_report(results)
601
- rescue => e
602
- puts "Error: #{e.message}"
603
- exit 1
604
- end
36
+ json = args.include?("--format=json") || args.include?("--json")
37
+ result = RailsForge::Doctor.new.run
605
38
 
606
- # Handle graph command
607
- def self.handle_graph_command(args)
608
- graph = RailsForge::Graph.new
609
- graph.generate
610
- rescue => e
611
- puts "Error: #{e.message}"
612
- exit 1
613
- end
614
-
615
- # Handle wizard command
616
- def self.handle_wizard_command(args)
617
- # Check for --tty or --text flag
618
- use_tty = !args.include?("--text") && ENV.fetch("FORCE_TTY", nil) != "false"
619
-
620
- # Try to use TTY wizard if available
621
- if use_tty
622
- begin
623
- require "tty-prompt"
624
- tui = RailsForge::WizardTUI.new
625
- tui.run
626
- return
627
- rescue LoadError
628
- puts "TTY::Prompt not available, falling back to text wizard..."
629
- rescue => e
630
- puts "Warning: TUI failed (#{e.message}), falling back..."
631
- end
632
- end
633
-
634
- # Fall back to text-based wizard
635
- wizard = RailsForge::Wizard.new
636
- options = wizard.run
637
- print "\nCreate this project? (y/N): "
638
- answer = STDIN.gets.strip.downcase
639
- if answer == "y" || answer == "yes"
640
- wizard.execute
39
+ if json
40
+ puts RailsForge::Formatter.render_json(result[:issues], result[:score], result[:metrics])
641
41
  else
642
- puts "Cancelled."
42
+ puts RailsForge::Formatter.render_text(result[:issues], result[:score])
643
43
  end
644
- rescue => e
44
+ rescue RailsForge::Doctor::DoctorError => e
645
45
  puts "Error: #{e.message}"
646
46
  exit 1
647
47
  end
648
-
649
- # Handle plugins command
650
- def self.handle_plugins_command(args)
651
- action = args.shift
652
-
653
- case action
654
- when nil, "list", "ls"
655
- RailsForge::Plugins.show_installed
656
- when "load"
657
- RailsForge::Plugins.load(args.shift)
658
- when "create"
659
- RailsForge::Plugins.create(args.shift)
660
- else
661
- puts "Usage: railsforge plugins [list|load|create]"
662
- end
663
- end
664
-
665
- # Handle config command
666
- def self.handle_config_command(args)
667
- action = args.shift
668
-
669
- case action
670
- when nil, "show"
671
- RailsForge::Config.show
672
- when "init"
673
- RailsForge::Config.init
674
- when "get"
675
- puts RailsForge::Config.get(args.shift)
676
- when "set"
677
- RailsForge::Config.set(args.shift, args.shift)
678
- when "reset"
679
- RailsForge::Config.reset
680
- else
681
- puts "Usage: railsforge config [show|init|get|set|reset]"
682
- end
683
- end
684
48
  end
685
49
  end