aidp 0.9.6 → 0.10.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aidp/analyze/error_handler.rb +4 -2
  3. data/lib/aidp/{analysis → analyze}/kb_inspector.rb +106 -89
  4. data/lib/aidp/analyze/prioritizer.rb +3 -2
  5. data/lib/aidp/analyze/ruby_maat_integration.rb +20 -3
  6. data/lib/aidp/analyze/runner.rb +27 -9
  7. data/lib/aidp/{analysis → analyze}/seams.rb +1 -1
  8. data/lib/aidp/analyze/steps.rb +7 -7
  9. data/lib/aidp/{analysis → analyze}/tree_sitter_grammar_loader.rb +22 -5
  10. data/lib/aidp/{analysis → analyze}/tree_sitter_scan.rb +32 -15
  11. data/lib/aidp/cli/first_run_wizard.rb +37 -28
  12. data/lib/aidp/cli/jobs_command.rb +37 -18
  13. data/lib/aidp/cli/terminal_io.rb +3 -3
  14. data/lib/aidp/cli.rb +131 -63
  15. data/lib/aidp/execute/runner.rb +27 -9
  16. data/lib/aidp/execute/steps.rb +18 -18
  17. data/lib/aidp/execute/workflow_selector.rb +36 -21
  18. data/lib/aidp/harness/enhanced_runner.rb +3 -3
  19. data/lib/aidp/harness/provider_factory.rb +3 -1
  20. data/lib/aidp/harness/provider_manager.rb +34 -15
  21. data/lib/aidp/harness/runner.rb +24 -5
  22. data/lib/aidp/harness/simple_user_interface.rb +19 -4
  23. data/lib/aidp/harness/status_display.rb +121 -104
  24. data/lib/aidp/harness/ui/enhanced_tui.rb +5 -5
  25. data/lib/aidp/harness/ui/error_handler.rb +3 -2
  26. data/lib/aidp/harness/ui/frame_manager.rb +52 -32
  27. data/lib/aidp/harness/ui/navigation/main_menu.rb +23 -14
  28. data/lib/aidp/harness/ui/progress_display.rb +28 -5
  29. data/lib/aidp/harness/ui/status_widget.rb +17 -8
  30. data/lib/aidp/harness/ui/workflow_controller.rb +25 -9
  31. data/lib/aidp/harness/user_interface.rb +341 -328
  32. data/lib/aidp/provider_manager.rb +10 -6
  33. data/lib/aidp/providers/anthropic.rb +3 -3
  34. data/lib/aidp/providers/base.rb +20 -1
  35. data/lib/aidp/providers/cursor.rb +6 -8
  36. data/lib/aidp/providers/gemini.rb +3 -3
  37. data/lib/aidp/providers/github_copilot.rb +264 -0
  38. data/lib/aidp/providers/opencode.rb +6 -8
  39. data/lib/aidp/version.rb +1 -1
  40. data/lib/aidp.rb +4 -4
  41. metadata +6 -6
  42. data/lib/aidp/analyze/progress_visualizer.rb +0 -314
@@ -20,6 +20,21 @@ module Aidp
20
20
 
21
21
  private
22
22
 
23
+ # Helper method for consistent message display using TTY::Prompt
24
+ def display_message(message, type: :info)
25
+ color = case type
26
+ when :error then :red
27
+ when :success then :green
28
+ when :warning then :yellow
29
+ when :info then :blue
30
+ when :highlight then :cyan
31
+ when :muted then :bright_black
32
+ else :white
33
+ end
34
+
35
+ @prompt.say(message, color: color)
36
+ end
37
+
23
38
  # Helper method to handle input consistently with TTY::Prompt
24
39
  # Fixed to avoid keystroke loss issues with TTY::Prompt's required validation
25
40
  def get_input_with_prompt(message, required: false, default: nil)
@@ -36,7 +51,7 @@ module Aidp
36
51
  if default
37
52
  return default
38
53
  elsif required
39
- puts "❌ This field is required. Please provide a response."
54
+ display_message("❌ This field is required. Please provide a response.", type: :error)
40
55
  next
41
56
  else
42
57
  return nil
@@ -82,7 +97,7 @@ module Aidp
82
97
 
83
98
  # Validate response if required
84
99
  if question_data[:required] != false && (response.nil? || response.to_s.strip.empty?)
85
- puts "❌ This question is required. Please provide a response."
100
+ display_message("❌ This question is required. Please provide a response.", type: :error)
86
101
  redo
87
102
  end
88
103
 
@@ -99,11 +114,11 @@ module Aidp
99
114
 
100
115
  # Display feedback context
101
116
  def display_feedback_context(context)
102
- puts "\n📋 Context:"
103
- puts "-" * 30
117
+ display_message("\n📋 Context:", type: :highlight)
118
+ display_message("-" * 30, type: :muted)
104
119
 
105
120
  if context[:type]
106
- puts "Type: #{context[:type]}"
121
+ display_message("Type: #{context[:type]}", type: :info)
107
122
  end
108
123
 
109
124
  if context[:urgency]
@@ -113,23 +128,23 @@ module Aidp
113
128
  "low" => "🟢"
114
129
  }
115
130
  urgency_emoji = urgency_emojis[context[:urgency]] || "ℹ️"
116
- puts "Urgency: #{urgency_emoji} #{context[:urgency].capitalize}"
131
+ display_message("Urgency: #{urgency_emoji} #{context[:urgency].capitalize}", type: :info)
117
132
  end
118
133
 
119
134
  if context[:description]
120
- puts "Description: #{context[:description]}"
135
+ display_message("Description: #{context[:description]}", type: :info)
121
136
  end
122
137
 
123
138
  if context[:agent_output]
124
- puts "\nAgent Output:"
125
- puts context[:agent_output]
139
+ display_message("\nAgent Output:", type: :info)
140
+ display_message(context[:agent_output], type: :info)
126
141
  end
127
142
  end
128
143
 
129
144
  # Display question presentation header
130
145
  def display_question_presentation_header(questions, context)
131
- puts "\n🤖 Agent needs your feedback:"
132
- puts "=" * 60
146
+ display_message("\n🤖 Agent needs your feedback:", type: :highlight)
147
+ display_message("=" * 60, type: :muted)
133
148
 
134
149
  # Display question overview
135
150
  display_question_overview(questions)
@@ -139,8 +154,8 @@ module Aidp
139
154
  display_context_summary(context)
140
155
  end
141
156
 
142
- puts "\n📝 Questions to answer:"
143
- puts "-" * 40
157
+ display_message("\n📝 Questions to answer:", type: :info)
158
+ display_message("-" * 40, type: :muted)
144
159
  end
145
160
 
146
161
  # Display question overview
@@ -151,23 +166,23 @@ module Aidp
151
166
 
152
167
  question_types = questions.map { |q| q[:type] || "text" }.uniq
153
168
 
154
- puts "📊 Overview:"
155
- puts " Total questions: #{total_questions}"
156
- puts " Required: #{required_questions}"
157
- puts " Optional: #{optional_questions}"
158
- puts " Question types: #{question_types.join(", ")}"
169
+ display_message("📊 Overview:", type: :info)
170
+ display_message(" Total questions: #{total_questions}", type: :info)
171
+ display_message(" Required: #{required_questions}", type: :info)
172
+ display_message(" Optional: #{optional_questions}", type: :info)
173
+ display_message(" Question types: #{question_types.join(", ")}", type: :info)
159
174
 
160
175
  # Estimate completion time
161
176
  estimated_time = estimate_completion_time(questions)
162
- puts " Estimated time: #{estimated_time}"
177
+ display_message(" Estimated time: #{estimated_time}", type: :info)
163
178
  end
164
179
 
165
180
  # Display context summary
166
181
  def display_context_summary(context)
167
- puts "\n📋 Context Summary:"
182
+ display_message("\n📋 Context Summary:", type: :info)
168
183
 
169
184
  if context[:type]
170
- puts " Type: #{context[:type]}"
185
+ display_message(" Type: #{context[:type]}", type: :info)
171
186
  end
172
187
 
173
188
  if context[:urgency]
@@ -177,11 +192,11 @@ module Aidp
177
192
  "low" => "🟢"
178
193
  }
179
194
  urgency_emoji = urgency_emojis[context[:urgency]] || "ℹ️"
180
- puts " Urgency: #{urgency_emoji} #{context[:urgency].capitalize}"
195
+ display_message(" Urgency: #{urgency_emoji} #{context[:urgency].capitalize}", type: :info)
181
196
  end
182
197
 
183
198
  if context[:description]
184
- puts " Description: #{context[:description]}"
199
+ display_message(" Description: #{context[:description]}", type: :info)
185
200
  end
186
201
  end
187
202
 
@@ -230,9 +245,9 @@ module Aidp
230
245
  required = question_data[:required] != false
231
246
 
232
247
  # Display question header
233
- puts "\n" + "=" * 60
234
- puts "📝 Question #{question_number} of #{total_questions}"
235
- puts "=" * 60
248
+ display_message("\n" + "=" * 60, type: :muted)
249
+ display_message("📝 Question #{question_number} of #{total_questions}", type: :highlight)
250
+ display_message("=" * 60, type: :muted)
236
251
 
237
252
  # Display question text with formatting
238
253
  display_question_text(question_text, question_type)
@@ -243,7 +258,7 @@ module Aidp
243
258
  # Display question instructions
244
259
  display_question_instructions(question_type, options, default_value, required)
245
260
 
246
- puts "\n" + "-" * 60
261
+ display_message("\n" + "-" * 60, type: :muted)
247
262
  end
248
263
 
249
264
  # Display question text with formatting
@@ -260,96 +275,96 @@ module Aidp
260
275
  }
261
276
  type_emoji = type_emojis[question_type] || "❓"
262
277
 
263
- puts "#{type_emoji} #{question_text}"
278
+ display_message("#{type_emoji} #{question_text}", type: :info)
264
279
  end
265
280
 
266
281
  # Display question metadata
267
282
  def display_question_metadata(question_type, expected_input, options, default_value, required)
268
- puts "\n📋 Question Details:"
283
+ display_message("\n📋 Question Details:", type: :info)
269
284
 
270
285
  # Question type
271
- puts " Type: #{question_type.capitalize}"
286
+ display_message(" Type: #{question_type.capitalize}", type: :info)
272
287
 
273
288
  # Expected input
274
289
  if expected_input != "text"
275
- puts " Expected input: #{expected_input}"
290
+ display_message(" Expected input: #{expected_input}", type: :info)
276
291
  end
277
292
 
278
293
  # Options
279
294
  if options && !options.empty?
280
- puts " Options: #{options.length} available"
295
+ display_message(" Options: #{options.length} available", type: :info)
281
296
  end
282
297
 
283
298
  # Default value
284
299
  if default_value
285
- puts " Default: #{default_value}"
300
+ display_message(" Default: #{default_value}", type: :info)
286
301
  end
287
302
 
288
303
  # Required status
289
304
  status = required ? "Required" : "Optional"
290
305
  status_emoji = required ? "🔴" : "🟢"
291
- puts " Status: #{status_emoji} #{status}"
306
+ display_message(" Status: #{status_emoji} #{status}", type: :info)
292
307
  end
293
308
 
294
309
  # Display question instructions
295
310
  def display_question_instructions(question_type, options, default_value, required)
296
- puts "\n💡 Instructions:"
311
+ display_message("\n💡 Instructions:", type: :info)
297
312
 
298
313
  case question_type
299
314
  when "text"
300
- puts " • Enter your text response"
301
- puts " • Use @ for file selection if needed"
302
- puts " • Press Enter when done"
315
+ display_message(" • Enter your text response", type: :info)
316
+ display_message(" • Use @ for file selection if needed", type: :info)
317
+ display_message(" • Press Enter when done", type: :info)
303
318
  when "choice"
304
- puts " • Select from the numbered options below"
305
- puts " • Enter the number of your choice"
306
- puts " • Press Enter to confirm"
319
+ display_message(" • Select from the numbered options below", type: :info)
320
+ display_message(" • Enter the number of your choice", type: :info)
321
+ display_message(" • Press Enter to confirm", type: :info)
307
322
  when "confirmation"
308
- puts " • Enter 'y' or 'yes' for Yes"
309
- puts " • Enter 'n' or 'no' for No"
310
- puts " • Press Enter for default"
323
+ display_message(" • Enter 'y' or 'yes' for Yes", type: :info)
324
+ display_message(" • Enter 'n' or 'no' for No", type: :info)
325
+ display_message(" • Press Enter for default", type: :info)
311
326
  when "file"
312
- puts " • Enter file path directly"
313
- puts " • Use @ to browse and select files"
314
- puts " • File must exist and be readable"
327
+ display_message(" • Enter file path directly", type: :info)
328
+ display_message(" • Use @ to browse and select files", type: :info)
329
+ display_message(" • File must exist and be readable", type: :info)
315
330
  when "number"
316
- puts " • Enter a valid number"
317
- puts " • Use decimal point for decimals"
318
- puts " • Press Enter when done"
331
+ display_message(" • Enter a valid number", type: :info)
332
+ display_message(" • Use decimal point for decimals", type: :info)
333
+ display_message(" • Press Enter when done", type: :info)
319
334
  when "email"
320
- puts " • Enter a valid email address"
321
- puts " • Format: user@domain.com"
322
- puts " • Press Enter when done"
335
+ display_message(" • Enter a valid email address", type: :info)
336
+ display_message(" • Format: user@domain.com", type: :info)
337
+ display_message(" • Press Enter when done", type: :info)
323
338
  when "url"
324
- puts " • Enter a valid URL"
325
- puts " • Format: https://example.com"
326
- puts " • Press Enter when done"
339
+ display_message(" • Enter a valid URL", type: :info)
340
+ display_message(" • Format: https://example.com", type: :info)
341
+ display_message(" • Press Enter when done", type: :info)
327
342
  end
328
343
 
329
344
  # Additional instructions based on options
330
345
  if options && !options.empty?
331
- puts "\n📋 Available Options:"
346
+ display_message("\n📋 Available Options:", type: :info)
332
347
  options.each_with_index do |option, index|
333
348
  marker = (default_value && option == default_value) ? " (default)" : ""
334
- puts " #{index + 1}. #{option}#{marker}"
349
+ display_message(" #{index + 1}. #{option}#{marker}", type: :info)
335
350
  end
336
351
  end
337
352
 
338
353
  # Default value instructions
339
354
  if default_value
340
- puts "\n⚡ Quick Answer:"
341
- puts " • Press Enter to use default: #{default_value}"
355
+ display_message("\n⚡ Quick Answer:", type: :info)
356
+ display_message(" • Press Enter to use default: #{default_value}", type: :info)
342
357
  end
343
358
 
344
359
  # Required field instructions
345
360
  if required
346
- puts "\n⚠️ Required Field:"
347
- puts " • This question must be answered"
348
- puts " • Cannot be left blank"
361
+ display_message("\n⚠️ Required Field:", type: :info)
362
+ display_message(" • This question must be answered", type: :info)
363
+ display_message(" • Cannot be left blank", type: :info)
349
364
  else
350
- puts "\n✅ Optional Field:"
351
- puts " • This question can be skipped"
352
- puts " • Press Enter to leave blank"
365
+ display_message("\n✅ Optional Field:", type: :info)
366
+ display_message(" • This question can be skipped", type: :info)
367
+ display_message(" • Press Enter to leave blank", type: :info)
353
368
  end
354
369
  end
355
370
 
@@ -358,13 +373,13 @@ module Aidp
358
373
  progress_percentage = (current_index.to_f / total_questions * 100).round(1)
359
374
  progress_bar = generate_progress_bar(progress_percentage)
360
375
 
361
- puts "\n📊 Progress: #{progress_bar} #{progress_percentage}% (#{current_index}/#{total_questions})"
376
+ display_message("\n📊 Progress: #{progress_bar} #{progress_percentage}% (#{current_index}/#{total_questions})", type: :info)
362
377
 
363
378
  # Show estimated time remaining
364
379
  if current_index < total_questions
365
380
  remaining_questions = total_questions - current_index
366
381
  estimated_remaining = estimate_remaining_time(remaining_questions)
367
- puts "⏱️ Estimated time remaining: #{estimated_remaining}"
382
+ display_message("⏱️ Estimated time remaining: #{estimated_remaining}", type: :info)
368
383
  end
369
384
  end
370
385
 
@@ -391,34 +406,34 @@ module Aidp
391
406
 
392
407
  # Display question completion summary
393
408
  def display_question_completion_summary(responses, questions)
394
- puts "\n" + "=" * 60
395
- puts "✅ Question Completion Summary"
396
- puts "=" * 60
409
+ display_message("\n" + "=" * 60, type: :muted)
410
+ display_message("✅ Question Completion Summary", type: :success)
411
+ display_message("=" * 60, type: :muted)
397
412
 
398
413
  # Show completion statistics
399
414
  total_questions = questions.length
400
415
  answered_questions = responses.values.count { |v| !v.nil? && !v.to_s.strip.empty? }
401
416
  skipped_questions = total_questions - answered_questions
402
417
 
403
- puts "📊 Statistics:"
404
- puts " Total questions: #{total_questions}"
405
- puts " Answered: #{answered_questions}"
406
- puts " Skipped: #{skipped_questions}"
407
- puts " Completion rate: #{(answered_questions.to_f / total_questions * 100).round(1)}%"
418
+ display_message("📊 Statistics:", type: :info)
419
+ display_message(" Total questions: #{total_questions}", type: :info)
420
+ display_message(" Answered: #{answered_questions}", type: :info)
421
+ display_message(" Skipped: #{skipped_questions}", type: :info)
422
+ display_message(" Completion rate: #{(answered_questions.to_f / total_questions * 100).round(1)}%", type: :info)
408
423
 
409
424
  # Show response summary
410
- puts "\n📝 Response Summary:"
425
+ display_message("\n📝 Response Summary:", type: :info)
411
426
  responses.each do |key, value|
412
427
  question_number = key.gsub("question_", "")
413
428
  if value.nil? || value.to_s.strip.empty?
414
- puts " #{question_number}. [Skipped]"
429
+ display_message(" #{question_number}. [Skipped]", type: :muted)
415
430
  else
416
431
  display_value = (value.to_s.length > 50) ? "#{value.to_s[0..47]}..." : value.to_s
417
- puts " #{question_number}. #{display_value}"
432
+ display_message(" #{question_number}. #{display_value}", type: :info)
418
433
  end
419
434
  end
420
435
 
421
- puts "\n🚀 Continuing execution..."
436
+ display_message("\n🚀 Continuing execution...", type: :success)
422
437
  end
423
438
 
424
439
  # Display question information (legacy method for compatibility)
@@ -460,7 +475,7 @@ module Aidp
460
475
  "Required: No"
461
476
  end
462
477
 
463
- puts " #{info_parts.join(" | ")}"
478
+ display_message(" #{info_parts.join(" | ")}", type: :info)
464
479
  end
465
480
 
466
481
  # Get response for a specific question with enhanced validation
@@ -496,15 +511,15 @@ module Aidp
496
511
  def handle_input_error(error, question_data, retry_count = 0)
497
512
  max_retries = 3
498
513
 
499
- puts "\n🚨 Input Error:"
500
- puts " #{error.message}"
514
+ display_message("\n🚨 Input Error:", type: :error)
515
+ display_message(" #{error.message}", type: :error)
501
516
 
502
517
  if retry_count < max_retries
503
- puts "\n🔄 Retry Options:"
504
- puts " 1. Try again"
505
- puts " 2. Skip this question"
506
- puts " 3. Get help"
507
- puts " 4. Cancel all questions"
518
+ display_message("\n🔄 Retry Options:", type: :info)
519
+ display_message(" 1. Try again", type: :info)
520
+ display_message(" 2. Skip this question", type: :info)
521
+ display_message(" 3. Get help", type: :info)
522
+ display_message(" 4. Cancel all questions", type: :info)
508
523
 
509
524
  choice = @prompt.select("Choose an option:", {
510
525
  "Try again" => "1",
@@ -515,23 +530,23 @@ module Aidp
515
530
 
516
531
  case choice
517
532
  when "1"
518
- puts "🔄 Retrying..."
533
+ display_message("🔄 Retrying...", type: :info)
519
534
  :retry
520
535
  when "2"
521
- puts "⏭️ Skipping question..."
536
+ display_message("⏭️ Skipping question...", type: :warning)
522
537
  :skip
523
538
  when "3"
524
539
  show_question_help(question_data)
525
540
  :retry
526
541
  when "4"
527
- puts "❌ Cancelling all questions..."
542
+ display_message("❌ Cancelling all questions...", type: :error)
528
543
  :cancel
529
544
  else
530
- puts "❌ Invalid choice. Retrying..."
545
+ display_message("❌ Invalid choice. Retrying...", type: :error)
531
546
  :retry
532
547
  end
533
548
  else
534
- puts "\n❌ Maximum retries exceeded. Skipping question..."
549
+ display_message("\n❌ Maximum retries exceeded. Skipping question...", type: :error)
535
550
  :skip
536
551
  end
537
552
  end
@@ -540,74 +555,74 @@ module Aidp
540
555
  def show_question_help(question_data)
541
556
  question_type = question_data[:type] || "text"
542
557
 
543
- puts "\n📖 Help for #{question_type.capitalize} Question:"
544
- puts "=" * 50
558
+ display_message("\n📖 Help for #{question_type.capitalize} Question:", type: :info)
559
+ display_message("=" * 50, type: :muted)
545
560
 
546
561
  case question_type
547
562
  when "text"
548
- puts "• Enter any text response"
549
- puts "• Use @ for file selection if needed"
550
- puts "• Press Enter when done"
563
+ display_message("• Enter any text response", type: :info)
564
+ display_message("• Use @ for file selection if needed", type: :info)
565
+ display_message("• Press Enter when done", type: :info)
551
566
  when "choice"
552
- puts "• Select from the numbered options"
553
- puts "• Enter the number of your choice"
554
- puts "• Or type the option text directly"
567
+ display_message("• Select from the numbered options", type: :info)
568
+ display_message("• Enter the number of your choice", type: :info)
569
+ display_message("• Or type the option text directly", type: :info)
555
570
  when "confirmation"
556
- puts "• Enter 'y' or 'yes' for Yes"
557
- puts "• Enter 'n' or 'no' for No"
558
- puts "• Press Enter for default"
571
+ display_message("• Enter 'y' or 'yes' for Yes", type: :info)
572
+ display_message("• Enter 'n' or 'no' for No", type: :info)
573
+ display_message("• Press Enter for default", type: :info)
559
574
  when "file"
560
- puts "• Enter file path directly"
561
- puts "• Use @ to browse and select files"
562
- puts "• File must exist and be readable"
575
+ display_message("• Enter file path directly", type: :info)
576
+ display_message("• Use @ to browse and select files", type: :info)
577
+ display_message("• File must exist and be readable", type: :info)
563
578
  when "number"
564
- puts "• Enter a valid number"
565
- puts "• Use decimal point for decimals"
566
- puts "• Check range requirements"
579
+ display_message("• Enter a valid number", type: :info)
580
+ display_message("• Use decimal point for decimals", type: :info)
581
+ display_message("• Check range requirements", type: :info)
567
582
  when "email"
568
- puts "• Enter a valid email address"
569
- puts "• Format: user@domain.com"
570
- puts "• Check for typos"
583
+ display_message("• Enter a valid email address", type: :info)
584
+ display_message("• Format: user@domain.com", type: :info)
585
+ display_message("• Check for typos", type: :info)
571
586
  when "url"
572
- puts "• Enter a valid URL"
573
- puts "• Format: https://example.com"
574
- puts "• Include protocol (http:// or https://)"
587
+ display_message("• Enter a valid URL", type: :info)
588
+ display_message("• Format: https://example.com", type: :info)
589
+ display_message("• Include protocol (http:// or https://)", type: :info)
575
590
  end
576
591
 
577
- puts "\nPress Enter to continue..."
592
+ display_message("\nPress Enter to continue...", type: :info)
578
593
  @prompt.keypress("Press any key to continue...")
579
594
  end
580
595
 
581
596
  # Enhanced error handling and validation display
582
597
  def display_validation_error(validation_result, _input_type)
583
- puts "\n❌ Validation Error:"
584
- puts " #{validation_result[:error_message]}"
598
+ display_message("\n❌ Validation Error:", type: :error)
599
+ display_message(" #{validation_result[:error_message]}", type: :error)
585
600
 
586
601
  if validation_result[:suggestions].any?
587
- puts "\n💡 Suggestions:"
602
+ display_message("\n💡 Suggestions:", type: :info)
588
603
  validation_result[:suggestions].each do |suggestion|
589
- puts " • #{suggestion}"
604
+ display_message(" • #{suggestion}", type: :info)
590
605
  end
591
606
  end
592
607
 
593
608
  if validation_result[:warnings].any?
594
- puts "\n⚠️ Warnings:"
609
+ display_message("\n⚠️ Warnings:", type: :warning)
595
610
  validation_result[:warnings].each do |warning|
596
- puts " • #{warning}"
611
+ display_message(" • #{warning}", type: :warning)
597
612
  end
598
613
  end
599
614
 
600
- puts "\n🔄 Please try again..."
615
+ display_message("\n🔄 Please try again...", type: :info)
601
616
  end
602
617
 
603
618
  # Display validation warnings
604
619
  def display_validation_warnings(validation_result)
605
620
  if validation_result[:warnings].any?
606
- puts "\n⚠️ Warnings:"
621
+ display_message("\n⚠️ Warnings:", type: :warning)
607
622
  validation_result[:warnings].each do |warning|
608
- puts " • #{warning}"
623
+ display_message(" • #{warning}", type: :warning)
609
624
  end
610
- puts "\nPress Enter to continue or type 'fix' to correct..."
625
+ display_message("\nPress Enter to continue or type 'fix' to correct...", type: :info)
611
626
 
612
627
  input = @prompt.ask("")
613
628
  return input&.strip&.downcase == "fix"
@@ -652,10 +667,10 @@ module Aidp
652
667
  def get_choice_response(options, default_value, required)
653
668
  return nil if options.nil? || options.empty?
654
669
 
655
- puts "\n Available options:"
670
+ display_message("\n Available options:", type: :info)
656
671
  options.each_with_index do |option, index|
657
672
  marker = (default_value && option == default_value) ? " (default)" : ""
658
- puts " #{index + 1}. #{option}#{marker}"
673
+ display_message(" #{index + 1}. #{option}#{marker}", type: :info)
659
674
  end
660
675
 
661
676
  loop do
@@ -669,7 +684,7 @@ module Aidp
669
684
  if default_value
670
685
  return default_value
671
686
  elsif required
672
- puts "❌ Please make a selection."
687
+ display_message("❌ Please make a selection.", type: :error)
673
688
  next
674
689
  else
675
690
  return nil
@@ -749,7 +764,7 @@ module Aidp
749
764
  if default_value
750
765
  return default_value
751
766
  elsif required
752
- puts "❌ Please provide a file path."
767
+ display_message("❌ Please provide a file path.", type: :error)
753
768
  next
754
769
  else
755
770
  return nil
@@ -792,7 +807,7 @@ module Aidp
792
807
  if default_value
793
808
  return default_value
794
809
  elsif required
795
- puts "❌ Please provide a number."
810
+ display_message("❌ Please provide a number.", type: :error)
796
811
  next
797
812
  else
798
813
  return nil
@@ -820,7 +835,7 @@ module Aidp
820
835
  return Float(input.strip)
821
836
  end
822
837
  rescue ArgumentError
823
- puts "❌ Please enter a valid #{expected_input}."
838
+ display_message("❌ Please enter a valid #{expected_input}.", type: :error)
824
839
  next
825
840
  end
826
841
  end
@@ -839,7 +854,7 @@ module Aidp
839
854
  if default_value
840
855
  return default_value
841
856
  elsif required
842
- puts "❌ Please provide an email address."
857
+ display_message("❌ Please provide an email address.", type: :error)
843
858
  next
844
859
  else
845
860
  return nil
@@ -876,7 +891,7 @@ module Aidp
876
891
  if default_value
877
892
  return default_value
878
893
  elsif required
879
- puts "❌ Please provide a URL."
894
+ display_message("❌ Please provide a URL.", type: :error)
880
895
  next
881
896
  else
882
897
  return nil
@@ -1323,7 +1338,7 @@ module Aidp
1323
1338
 
1324
1339
  # Handle empty input
1325
1340
  if input.nil? || input.strip.empty?
1326
- puts "Please provide a response."
1341
+ display_message("Please provide a response.", type: :error)
1327
1342
  next
1328
1343
  end
1329
1344
 
@@ -1351,8 +1366,8 @@ module Aidp
1351
1366
  available_files = find_files_advanced(search_options)
1352
1367
 
1353
1368
  if available_files.empty?
1354
- puts "No files found matching '#{search_options[:term]}'. Please try again."
1355
- puts "💡 Try: @ (all files), @.rb (Ruby files), @config (files with 'config'), @lib/ (files in lib directory)"
1369
+ display_message("No files found matching '#{search_options[:term]}'. Please try again.", type: :warning)
1370
+ display_message("💡 Try: @ (all files), @.rb (Ruby files), @config (files with 'config'), @lib/ (files in lib directory)", type: :info)
1356
1371
  return nil
1357
1372
  end
1358
1373
 
@@ -1364,7 +1379,7 @@ module Aidp
1364
1379
 
1365
1380
  if selection && selection >= 0 && selection < available_files.size
1366
1381
  selected_file = available_files[selection]
1367
- puts "✅ Selected: #{selected_file}"
1382
+ display_message("✅ Selected: #{selected_file}", type: :success)
1368
1383
 
1369
1384
  # Show file preview if requested
1370
1385
  if search_options[:preview]
@@ -1376,7 +1391,7 @@ module Aidp
1376
1391
  # User wants to refine search
1377
1392
  handle_file_selection("@#{search_term}")
1378
1393
  else
1379
- puts "❌ Invalid selection. Please try again."
1394
+ display_message("❌ Invalid selection. Please try again.", type: :error)
1380
1395
  nil
1381
1396
  end
1382
1397
  end
@@ -1580,21 +1595,21 @@ module Aidp
1580
1595
 
1581
1596
  # Display advanced file selection menu
1582
1597
  def display_advanced_file_menu(files, search_options)
1583
- puts "\n📁 Available files:"
1584
- puts "Search: #{search_options[:term]} | Extensions: #{search_options[:extensions].join(", ")} | Directories: #{search_options[:directories].join(", ")}"
1585
- puts "-" * 80
1598
+ display_message("\n📁 Available files:", type: :info)
1599
+ display_message("Search: #{search_options[:term]} | Extensions: #{search_options[:extensions].join(", ")} | Directories: #{search_options[:directories].join(", ")}", type: :info)
1600
+ display_message("-" * 80, type: :muted)
1586
1601
 
1587
1602
  files.each_with_index do |file, index|
1588
1603
  file_info = get_file_info(file)
1589
- puts " #{index + 1}. #{file_info[:display_name]}"
1590
- puts " 📄 #{file_info[:size]} | 📅 #{file_info[:modified]} | 🏷️ #{file_info[:type]}"
1604
+ display_message(" #{index + 1}. #{file_info[:display_name]}", type: :info)
1605
+ display_message(" 📄 #{file_info[:size]} | 📅 #{file_info[:modified]} | 🏷️ #{file_info[:type]}", type: :muted)
1591
1606
  end
1592
1607
 
1593
- puts "\nOptions:"
1594
- puts " 0. Cancel"
1595
- puts " -1. Refine search"
1596
- puts " p. Preview selected file"
1597
- puts " h. Show help"
1608
+ display_message("\nOptions:", type: :info)
1609
+ display_message(" 0. Cancel", type: :info)
1610
+ display_message(" -1. Refine search", type: :info)
1611
+ display_message(" p. Preview selected file", type: :info)
1612
+ display_message(" h. Show help", type: :info)
1598
1613
  end
1599
1614
 
1600
1615
  # Get file information for display
@@ -1666,7 +1681,7 @@ module Aidp
1666
1681
  input = @prompt.ask("Select file (0-#{max_files}, -1=refine, p=preview, h=help): ")
1667
1682
 
1668
1683
  if input.nil? || input.strip.empty?
1669
- puts "Please enter a selection."
1684
+ display_message("Please enter a selection.", type: :error)
1670
1685
  next
1671
1686
  end
1672
1687
 
@@ -1678,7 +1693,7 @@ module Aidp
1678
1693
  show_file_selection_help
1679
1694
  next
1680
1695
  when "p", "preview"
1681
- puts "💡 Select a file number first, then use 'p' to preview it."
1696
+ display_message("💡 Select a file number first, then use 'p' to preview it.", type: :info)
1682
1697
  next
1683
1698
  end
1684
1699
 
@@ -1691,71 +1706,71 @@ module Aidp
1691
1706
  elsif selection.between?(1, max_files)
1692
1707
  return selection - 1 # Convert to 0-based index
1693
1708
  else
1694
- puts "Please enter a number between 0 and #{max_files}, or use -1, p, h."
1709
+ display_message("Please enter a number between 0 and #{max_files}, or use -1, p, h.", type: :error)
1695
1710
  end
1696
1711
  rescue ArgumentError
1697
- puts "Please enter a valid number or command (0-#{max_files}, -1, p, h)."
1712
+ display_message("Please enter a valid number or command (0-#{max_files}, -1, p, h).", type: :error)
1698
1713
  end
1699
1714
  end
1700
1715
  end
1701
1716
 
1702
1717
  # Show file selection help
1703
1718
  def show_file_selection_help
1704
- puts "\n📖 File Selection Help:"
1705
- puts "=" * 40
1706
-
1707
- puts "\n🔍 Search Examples:"
1708
- puts " @ - Show all files"
1709
- puts " @.rb - Show Ruby files only"
1710
- puts " @config - Show files with 'config' in name"
1711
- puts " @lib/ - Show files in lib directory"
1712
- puts " @spec preview - Show spec files with preview option"
1713
- puts " @.js case - Show JavaScript files (case sensitive)"
1714
-
1715
- puts "\n⌨️ Selection Commands:"
1716
- puts " 1-50 - Select file by number"
1717
- puts " 0 - Cancel selection"
1718
- puts " -1 - Refine search"
1719
- puts " p - Preview selected file"
1720
- puts " h - Show this help"
1721
-
1722
- puts "\n💡 Tips:"
1723
- puts " • Files are sorted by relevance and type"
1724
- puts " • Use extension filters for specific file types"
1725
- puts " • Use directory filters to limit search scope"
1726
- puts " • Preview option shows file content before selection"
1719
+ display_message("\n📖 File Selection Help:", type: :info)
1720
+ display_message("=" * 40, type: :muted)
1721
+
1722
+ display_message("\n🔍 Search Examples:", type: :info)
1723
+ display_message(" @ - Show all files", type: :info)
1724
+ display_message(" @.rb - Show Ruby files only", type: :info)
1725
+ display_message(" @config - Show files with 'config' in name", type: :info)
1726
+ display_message(" @lib/ - Show files in lib directory", type: :info)
1727
+ display_message(" @spec preview - Show spec files with preview option", type: :info)
1728
+ display_message(" @.js case - Show JavaScript files (case sensitive)", type: :info)
1729
+
1730
+ display_message("\n⌨️ Selection Commands:", type: :info)
1731
+ display_message(" 1-50 - Select file by number", type: :info)
1732
+ display_message(" 0 - Cancel selection", type: :info)
1733
+ display_message(" -1 - Refine search", type: :info)
1734
+ display_message(" p - Preview selected file", type: :info)
1735
+ display_message(" h - Show this help", type: :info)
1736
+
1737
+ display_message("\n💡 Tips:", type: :info)
1738
+ display_message(" • Files are sorted by relevance and type", type: :info)
1739
+ display_message(" • Use extension filters for specific file types", type: :info)
1740
+ display_message(" • Use directory filters to limit search scope", type: :info)
1741
+ display_message(" • Preview option shows file content before selection", type: :info)
1727
1742
  end
1728
1743
 
1729
1744
  # Show file preview
1730
1745
  def show_file_preview(file_path)
1731
- puts "\n📄 File Preview: #{file_path}"
1732
- puts "=" * 60
1746
+ display_message("\n📄 File Preview: #{file_path}", type: :highlight)
1747
+ display_message("=" * 60, type: :muted)
1733
1748
 
1734
1749
  begin
1735
1750
  content = File.read(file_path)
1736
1751
  lines = content.lines
1737
1752
 
1738
- puts "📊 File Info:"
1739
- puts " Size: #{format_file_size(File.size(file_path))}"
1740
- puts " Lines: #{lines.count}"
1741
- puts " Modified: #{File.mtime(file_path).strftime("%Y-%m-%d %H:%M:%S")}"
1742
- puts " Type: #{get_file_type(file_path)}"
1753
+ display_message("📊 File Info:", type: :info)
1754
+ display_message(" Size: #{format_file_size(File.size(file_path))}", type: :info)
1755
+ display_message(" Lines: #{lines.count}", type: :info)
1756
+ display_message(" Modified: #{File.mtime(file_path).strftime("%Y-%m-%d %H:%M:%S")}", type: :info)
1757
+ display_message(" Type: #{get_file_type(file_path)}", type: :info)
1743
1758
 
1744
- puts "\n📝 Content Preview (first 20 lines):"
1745
- puts "-" * 40
1759
+ display_message("\n📝 Content Preview (first 20 lines):", type: :info)
1760
+ display_message("-" * 40, type: :muted)
1746
1761
 
1747
1762
  lines.first(20).each_with_index do |line, index|
1748
- puts "#{(index + 1).to_s.rjust(3)}: #{line.chomp}"
1763
+ display_message("#{(index + 1).to_s.rjust(3)}: #{line.chomp}", type: :info)
1749
1764
  end
1750
1765
 
1751
1766
  if lines.count > 20
1752
- puts "... (#{lines.count - 20} more lines)"
1767
+ display_message("... (#{lines.count - 20} more lines)", type: :muted)
1753
1768
  end
1754
1769
  rescue => e
1755
- puts "❌ Error reading file: #{e.message}"
1770
+ display_message("❌ Error reading file: #{e.message}", type: :error)
1756
1771
  end
1757
1772
 
1758
- puts "\nPress Enter to continue..."
1773
+ display_message("\nPress Enter to continue...", type: :info)
1759
1774
  @prompt.keypress("Press any key to continue...")
1760
1775
  end
1761
1776
 
@@ -1783,17 +1798,17 @@ module Aidp
1783
1798
  when "n", "no"
1784
1799
  return false
1785
1800
  else
1786
- puts "Please enter 'y' or 'n'."
1801
+ display_message("Please enter 'y' or 'n'.", type: :error)
1787
1802
  end
1788
1803
  end
1789
1804
  end
1790
1805
 
1791
1806
  # Get choice from multiple options
1792
1807
  def get_choice(message, options, default: nil)
1793
- puts "\n#{message}"
1808
+ display_message("\n#{message}", type: :info)
1794
1809
  options.each_with_index do |option, index|
1795
1810
  marker = (default && index == default) ? " (default)" : ""
1796
- puts " #{index + 1}. #{option}#{marker}"
1811
+ display_message(" #{index + 1}. #{option}#{marker}", type: :info)
1797
1812
  end
1798
1813
 
1799
1814
  loop do
@@ -1801,7 +1816,7 @@ module Aidp
1801
1816
 
1802
1817
  if input.nil? || input.strip.empty?
1803
1818
  return default if default
1804
- puts "Please make a selection."
1819
+ display_message("Please make a selection.", type: :error)
1805
1820
  next
1806
1821
  end
1807
1822
 
@@ -1810,10 +1825,10 @@ module Aidp
1810
1825
  if choice.between?(1, options.size)
1811
1826
  return choice - 1 # Convert to 0-based index
1812
1827
  else
1813
- puts "Please enter a number between 1 and #{options.size}."
1828
+ display_message("Please enter a number between 1 and #{options.size}.", type: :error)
1814
1829
  end
1815
1830
  rescue ArgumentError
1816
- puts "Please enter a valid number."
1831
+ display_message("Please enter a valid number.", type: :error)
1817
1832
  end
1818
1833
  end
1819
1834
  end
@@ -1821,13 +1836,11 @@ module Aidp
1821
1836
  # Display progress message
1822
1837
  def show_progress(message)
1823
1838
  print "\r#{message}".ljust(80)
1824
- $stdout.flush
1825
1839
  end
1826
1840
 
1827
1841
  # Clear progress message
1828
1842
  def clear_progress
1829
1843
  print "\r" + " " * 80 + "\r"
1830
- $stdout.flush
1831
1844
  end
1832
1845
 
1833
1846
  # Get input history
@@ -1842,43 +1855,43 @@ module Aidp
1842
1855
 
1843
1856
  # Display interactive help
1844
1857
  def show_help
1845
- puts "\n📖 Interactive Prompt Help:"
1846
- puts "=" * 40
1847
-
1848
- puts "\n🔤 Input Types:"
1849
- puts " • Text: Free-form text input"
1850
- puts " • Choice: Select from predefined options"
1851
- puts " • Confirmation: Yes/No questions"
1852
- puts " • File: File path with @ browsing"
1853
- puts " • Number: Integer or decimal numbers"
1854
- puts " • Email: Email address format"
1855
- puts " • URL: Web URL format"
1856
-
1857
- puts "\n⌨️ Special Commands:"
1858
- puts " • @: Browse and select files"
1859
- puts " • Enter: Use default value (if available)"
1860
- puts " • Ctrl+C: Cancel operation"
1861
-
1862
- puts "\n📁 File Selection:"
1863
- puts " • Type @ to browse files"
1864
- puts " • Type @search to filter files"
1865
- puts " • Select by number or type 0 to cancel"
1866
-
1867
- puts "\n✅ Validation:"
1868
- puts " • Required fields must be filled"
1869
- puts " • Input format is validated automatically"
1870
- puts " • Invalid input shows error and retries"
1871
-
1872
- puts "\n💡 Tips:"
1873
- puts " • Use Tab for auto-completion"
1874
- puts " • Arrow keys for history navigation"
1875
- puts " • Default values are shown in prompts"
1858
+ display_message("\n📖 Interactive Prompt Help:", type: :info)
1859
+ display_message("=" * 40, type: :info)
1860
+
1861
+ display_message("\n🔤 Input Types:", type: :info)
1862
+ display_message(" • Text: Free-form text input", type: :info)
1863
+ display_message(" • Choice: Select from predefined options", type: :info)
1864
+ display_message(" • Confirmation: Yes/No questions", type: :info)
1865
+ display_message(" • File: File path with @ browsing", type: :info)
1866
+ display_message(" • Number: Integer or decimal numbers", type: :info)
1867
+ display_message(" • Email: Email address format", type: :info)
1868
+ display_message(" • URL: Web URL format", type: :info)
1869
+
1870
+ display_message("\n⌨️ Special Commands:", type: :info)
1871
+ display_message(" • @: Browse and select files", type: :info)
1872
+ display_message(" • Enter: Use default value (if available)", type: :info)
1873
+ display_message(" • Ctrl+C: Cancel operation", type: :info)
1874
+
1875
+ display_message("\n📁 File Selection:", type: :info)
1876
+ display_message(" • Type @ to browse files", type: :info)
1877
+ display_message(" • Type @search to filter files", type: :info)
1878
+ display_message(" • Select by number or type 0 to cancel", type: :info)
1879
+
1880
+ display_message("\n✅ Validation:", type: :info)
1881
+ display_message(" • Required fields must be filled", type: :info)
1882
+ display_message(" • Input format is validated automatically", type: :info)
1883
+ display_message(" • Invalid input shows error and retries", type: :info)
1884
+
1885
+ display_message("\n💡 Tips:", type: :info)
1886
+ display_message(" • Use Tab for auto-completion", type: :info)
1887
+ display_message(" • Arrow keys for history navigation", type: :info)
1888
+ display_message(" • Default values are shown in prompts", type: :info)
1876
1889
  end
1877
1890
 
1878
1891
  # Display question summary
1879
1892
  def display_question_summary(questions)
1880
- puts "\n📋 Question Summary:"
1881
- puts "-" * 30
1893
+ display_message("\n📋 Question Summary:", type: :info)
1894
+ display_message("-" * 30, type: :info)
1882
1895
 
1883
1896
  questions.each_with_index do |question_data, index|
1884
1897
  question_number = question_data[:number] || (index + 1)
@@ -1898,14 +1911,14 @@ module Aidp
1898
1911
  }
1899
1912
  type_emoji = type_emojis[question_type] || "❓"
1900
1913
 
1901
- puts " #{question_number}. #{type_emoji} #{question_text} (#{status})"
1914
+ display_message(" #{question_number}. #{type_emoji} #{question_text} (#{status})", type: :info)
1902
1915
  end
1903
1916
  end
1904
1917
 
1905
1918
  # Get user preferences for feedback collection
1906
1919
  def get_user_preferences
1907
- puts "\n⚙️ User Preferences:"
1908
- puts "-" * 25
1920
+ display_message("\n⚙️ User Preferences:", type: :info)
1921
+ display_message("-" * 25, type: :muted)
1909
1922
 
1910
1923
  preferences = {}
1911
1924
 
@@ -1967,14 +1980,14 @@ module Aidp
1967
1980
  # Show help if needed
1968
1981
  if should_show_help?(questions.first&.dig(:type), seen_types)
1969
1982
  show_help
1970
- puts "\nPress Enter to continue..."
1983
+ display_message("\nPress Enter to continue...", type: :info)
1971
1984
  @prompt.keypress("Press any key to continue...")
1972
1985
  end
1973
1986
 
1974
1987
  # Display question summary if verbose
1975
1988
  if @verbose_mode
1976
1989
  display_question_summary(questions)
1977
- puts "\nPress Enter to start answering questions..."
1990
+ display_message("\nPress Enter to start answering questions...", type: :info)
1978
1991
  @prompt.keypress("Press any key to continue...")
1979
1992
  end
1980
1993
 
@@ -1995,7 +2008,7 @@ module Aidp
1995
2008
  default_value = options[:default]
1996
2009
  required = options[:required] != false
1997
2010
 
1998
- puts "\n❓ #{question}"
2011
+ display_message("\n❓ #{question}", type: :info)
1999
2012
 
2000
2013
  case question_type
2001
2014
  when "text"
@@ -2013,8 +2026,8 @@ module Aidp
2013
2026
  def collect_batch_feedback(questions)
2014
2027
  responses = {}
2015
2028
 
2016
- puts "\n📝 Quick Feedback Collection:"
2017
- puts "=" * 35
2029
+ display_message("\n📝 Quick Feedback Collection:", type: :info)
2030
+ display_message("=" * 35, type: :muted)
2018
2031
 
2019
2032
  questions.each_with_index do |question_data, index|
2020
2033
  question_number = index + 1
@@ -2023,7 +2036,7 @@ module Aidp
2023
2036
  default_value = question_data[:default]
2024
2037
  required = question_data[:required] != false
2025
2038
 
2026
- puts "\n#{question_number}. #{question_text}"
2039
+ display_message("\n#{question_number}. #{question_text}", type: :info)
2027
2040
 
2028
2041
  response = get_quick_feedback(question_text, {
2029
2042
  type: question_type,
@@ -2035,7 +2048,7 @@ module Aidp
2035
2048
  responses["question_#{question_number}"] = response
2036
2049
  end
2037
2050
 
2038
- puts "\n✅ Batch feedback collected."
2051
+ display_message("\n✅ Batch feedback collected.", type: :success)
2039
2052
  responses
2040
2053
  end
2041
2054
 
@@ -2059,13 +2072,13 @@ module Aidp
2059
2072
  end
2060
2073
  end
2061
2074
 
2062
- puts "\n🎮 Control Interface Started"
2063
- puts " Press 'p' + Enter to pause"
2064
- puts " Press 'r' + Enter to resume"
2065
- puts " Press 's' + Enter to stop"
2066
- puts " Press 'h' + Enter for help"
2067
- puts " Press 'q' + Enter to quit control interface"
2068
- puts "=" * 50
2075
+ display_message("\n🎮 Control Interface Started", type: :success)
2076
+ display_message(" Press 'p' + Enter to pause", type: :info)
2077
+ display_message(" Press 'r' + Enter to resume", type: :info)
2078
+ display_message(" Press 's' + Enter to stop", type: :info)
2079
+ display_message(" Press 'h' + Enter for help", type: :info)
2080
+ display_message(" Press 'q' + Enter to quit control interface", type: :info)
2081
+ display_message("=" * 50, type: :muted)
2069
2082
  end
2070
2083
 
2071
2084
  # Stop the control interface
@@ -2077,7 +2090,7 @@ module Aidp
2077
2090
  end
2078
2091
  end
2079
2092
 
2080
- puts "\n🛑 Control Interface Stopped"
2093
+ display_message("\n🛑 Control Interface Stopped", type: :info)
2081
2094
  end
2082
2095
 
2083
2096
  # Check if pause is requested
@@ -2101,7 +2114,7 @@ module Aidp
2101
2114
  @pause_requested = true
2102
2115
  @resume_requested = false
2103
2116
  end
2104
- puts "\n⏸️ Pause requested..."
2117
+ display_message("\n⏸️ Pause requested...", type: :warning)
2105
2118
  end
2106
2119
 
2107
2120
  # Request stop
@@ -2111,7 +2124,7 @@ module Aidp
2111
2124
  @pause_requested = false
2112
2125
  @resume_requested = false
2113
2126
  end
2114
- puts "\n🛑 Stop requested..."
2127
+ display_message("\n🛑 Stop requested...", type: :error)
2115
2128
  end
2116
2129
 
2117
2130
  # Request resume
@@ -2120,7 +2133,7 @@ module Aidp
2120
2133
  @resume_requested = true
2121
2134
  @pause_requested = false
2122
2135
  end
2123
- puts "\n▶️ Resume requested..."
2136
+ display_message("\n▶️ Resume requested...", type: :success)
2124
2137
  end
2125
2138
 
2126
2139
  # Clear all control requests
@@ -2155,14 +2168,14 @@ module Aidp
2155
2168
 
2156
2169
  # Handle pause state
2157
2170
  def handle_pause_state
2158
- puts "\n⏸️ HARNESS PAUSED"
2159
- puts "=" * 50
2160
- puts "🎮 Control Options:"
2161
- puts " 'r' + Enter: Resume execution"
2162
- puts " 's' + Enter: Stop execution"
2163
- puts " 'h' + Enter: Show help"
2164
- puts " 'q' + Enter: Quit control interface"
2165
- puts "=" * 50
2171
+ display_message("\n⏸️ HARNESS PAUSED", type: :warning)
2172
+ display_message("=" * 50, type: :muted)
2173
+ display_message("🎮 Control Options:", type: :info)
2174
+ display_message(" 'r' + Enter: Resume execution", type: :info)
2175
+ display_message(" 's' + Enter: Stop execution", type: :info)
2176
+ display_message(" 'h' + Enter: Show help", type: :info)
2177
+ display_message(" 'q' + Enter: Quit control interface", type: :info)
2178
+ display_message("=" * 50, type: :muted)
2166
2179
 
2167
2180
  loop do
2168
2181
  input = @prompt.ask("Paused>")
@@ -2180,51 +2193,51 @@ module Aidp
2180
2193
  stop_control_interface
2181
2194
  break
2182
2195
  else
2183
- puts "❌ Invalid command. Type 'h' for help."
2196
+ display_message("❌ Invalid command. Type 'h' for help.", type: :error)
2184
2197
  end
2185
2198
  end
2186
2199
  end
2187
2200
 
2188
2201
  # Handle stop state
2189
2202
  def handle_stop_state
2190
- puts "\n🛑 HARNESS STOPPED"
2191
- puts "=" * 50
2192
- puts "Execution has been stopped by user request."
2193
- puts "You can restart the harness from where it left off."
2194
- puts "=" * 50
2203
+ display_message("\n🛑 HARNESS STOPPED", type: :error)
2204
+ display_message("=" * 50, type: :muted)
2205
+ display_message("Execution has been stopped by user request.", type: :info)
2206
+ display_message("You can restart the harness from where it left off.", type: :info)
2207
+ display_message("=" * 50, type: :muted)
2195
2208
  end
2196
2209
 
2197
2210
  # Handle resume state
2198
2211
  def handle_resume_state
2199
- puts "\n▶️ HARNESS RESUMED"
2200
- puts "=" * 50
2201
- puts "Execution has been resumed."
2202
- puts "=" * 50
2212
+ display_message("\n▶️ HARNESS RESUMED", type: :success)
2213
+ display_message("=" * 50, type: :muted)
2214
+ display_message("Execution has been resumed.", type: :info)
2215
+ display_message("=" * 50, type: :muted)
2203
2216
  end
2204
2217
 
2205
2218
  # Show control help
2206
2219
  def show_control_help
2207
- puts "\n📖 Control Interface Help"
2208
- puts "=" * 50
2209
- puts "🎮 Available Commands:"
2210
- puts " 'p' or 'pause' - Pause the harness execution"
2211
- puts " 'r' or 'resume' - Resume the harness execution"
2212
- puts " 's' or 'stop' - Stop the harness execution"
2213
- puts " 'h' or 'help' - Show this help message"
2214
- puts " 'q' or 'quit' - Quit the control interface"
2215
- puts ""
2216
- puts "📋 Control States:"
2217
- puts " Running - Harness is executing normally"
2218
- puts " Paused - Harness is paused, waiting for resume"
2219
- puts " Stopped - Harness has been stopped by user"
2220
- puts " Resumed - Harness has been resumed from pause"
2221
- puts ""
2222
- puts "💡 Tips:"
2223
- puts " • You can pause/resume/stop at any time during execution"
2224
- puts " • The harness will save its state when paused/stopped"
2225
- puts " • You can restart from where you left off"
2226
- puts " • Use 'h' for help at any time"
2227
- puts "=" * 50
2220
+ display_message("\n📖 Control Interface Help", type: :info)
2221
+ display_message("=" * 50, type: :muted)
2222
+ display_message("🎮 Available Commands:", type: :info)
2223
+ display_message(" 'p' or 'pause' - Pause the harness execution", type: :info)
2224
+ display_message(" 'r' or 'resume' - Resume the harness execution", type: :info)
2225
+ display_message(" 's' or 'stop' - Stop the harness execution", type: :info)
2226
+ display_message(" 'h' or 'help' - Show this help message", type: :info)
2227
+ display_message(" 'q' or 'quit' - Quit the control interface", type: :info)
2228
+ display_message("", type: :info)
2229
+ display_message("📋 Control States:", type: :info)
2230
+ display_message(" Running - Harness is executing normally", type: :info)
2231
+ display_message(" Paused - Harness is paused, waiting for resume", type: :info)
2232
+ display_message(" Stopped - Harness has been stopped by user", type: :info)
2233
+ display_message(" Resumed - Harness has been resumed from pause", type: :info)
2234
+ display_message("", type: :info)
2235
+ display_message("💡 Tips:", type: :info)
2236
+ display_message(" • You can pause/resume/stop at any time during execution", type: :info)
2237
+ display_message(" • The harness will save its state when paused/stopped", type: :info)
2238
+ display_message(" • You can restart from where you left off", type: :info)
2239
+ display_message(" • Use 'h' for help at any time", type: :info)
2240
+ display_message("=" * 50, type: :muted)
2228
2241
  end
2229
2242
 
2230
2243
  # Control interface main loop
@@ -2248,15 +2261,15 @@ module Aidp
2248
2261
  # Empty input, continue
2249
2262
  next
2250
2263
  else
2251
- puts "❌ Invalid command. Type 'h' for help."
2264
+ display_message("❌ Invalid command. Type 'h' for help.", type: :error)
2252
2265
  end
2253
2266
  rescue Interrupt
2254
- puts "\n🛑 Control interface interrupted. Stopping..."
2267
+ display_message("\n🛑 Control interface interrupted. Stopping...", type: :error)
2255
2268
  request_stop
2256
2269
  break
2257
2270
  rescue => e
2258
- puts "❌ Control interface error: #{e.message}"
2259
- puts " Type 'h' for help or 'q' to quit."
2271
+ display_message("❌ Control interface error: #{e.message}", type: :error)
2272
+ display_message(" Type 'h' for help or 'q' to quit.", type: :info)
2260
2273
  end
2261
2274
  end
2262
2275
 
@@ -2280,14 +2293,14 @@ module Aidp
2280
2293
  # Enable control interface
2281
2294
  def enable_control_interface
2282
2295
  @control_interface_enabled = true
2283
- puts "🎮 Control interface enabled"
2296
+ display_message("🎮 Control interface enabled", type: :success)
2284
2297
  end
2285
2298
 
2286
2299
  # Disable control interface
2287
2300
  def disable_control_interface
2288
2301
  @control_interface_enabled = false
2289
2302
  stop_control_interface
2290
- puts "🎮 Control interface disabled"
2303
+ display_message("🎮 Control interface disabled", type: :info)
2291
2304
  end
2292
2305
 
2293
2306
  # Get control status
@@ -2307,29 +2320,29 @@ module Aidp
2307
2320
  def display_control_status
2308
2321
  status = get_control_status
2309
2322
 
2310
- puts "\n🎮 Control Interface Status"
2311
- puts "=" * 40
2312
- puts "Enabled: #{status[:enabled] ? "✅ Yes" : "❌ No"}"
2313
- puts "Pause Requested: #{status[:pause_requested] ? "⏸️ Yes" : "▶️ No"}"
2314
- puts "Stop Requested: #{status[:stop_requested] ? "🛑 Yes" : "▶️ No"}"
2315
- puts "Resume Requested: #{status[:resume_requested] ? "▶️ Yes" : "⏸️ No"}"
2316
- puts "Control Thread: #{status[:control_thread_alive] ? "🟢 Active" : "🔴 Inactive"}"
2317
- puts "=" * 40
2323
+ display_message("\n🎮 Control Interface Status", type: :info)
2324
+ display_message("=" * 40, type: :muted)
2325
+ display_message("Enabled: #{status[:enabled] ? "✅ Yes" : "❌ No"}", type: :info)
2326
+ display_message("Pause Requested: #{status[:pause_requested] ? "⏸️ Yes" : "▶️ No"}", type: :info)
2327
+ display_message("Stop Requested: #{status[:stop_requested] ? "🛑 Yes" : "▶️ No"}", type: :info)
2328
+ display_message("Resume Requested: #{status[:resume_requested] ? "▶️ Yes" : "⏸️ No"}", type: :info)
2329
+ display_message("Control Thread: #{status[:control_thread_alive] ? "🟢 Active" : "🔴 Inactive"}", type: :info)
2330
+ display_message("=" * 40, type: :muted)
2318
2331
  end
2319
2332
 
2320
2333
  # Interactive control menu
2321
2334
  def show_control_menu
2322
- puts "\n🎮 Harness Control Menu"
2323
- puts "=" * 50
2324
- puts "1. Start Control Interface"
2325
- puts "2. Stop Control Interface"
2326
- puts "3. Pause Harness"
2327
- puts "4. Resume Harness"
2328
- puts "5. Stop Harness"
2329
- puts "6. Show Control Status"
2330
- puts "7. Show Help"
2331
- puts "8. Exit Menu"
2332
- puts "=" * 50
2335
+ display_message("\n🎮 Harness Control Menu", type: :info)
2336
+ display_message("=" * 50, type: :muted)
2337
+ display_message("1. Start Control Interface", type: :info)
2338
+ display_message("2. Stop Control Interface", type: :info)
2339
+ display_message("3. Pause Harness", type: :info)
2340
+ display_message("4. Resume Harness", type: :info)
2341
+ display_message("5. Stop Harness", type: :info)
2342
+ display_message("6. Show Control Status", type: :info)
2343
+ display_message("7. Show Help", type: :info)
2344
+ display_message("8. Exit Menu", type: :info)
2345
+ display_message("=" * 50, type: :muted)
2333
2346
 
2334
2347
  loop do
2335
2348
  choice = @prompt.ask("Select option (1-8): ")
@@ -2350,10 +2363,10 @@ module Aidp
2350
2363
  when "7"
2351
2364
  show_control_help
2352
2365
  when "8"
2353
- puts "👋 Exiting control menu..."
2366
+ display_message("👋 Exiting control menu...", type: :info)
2354
2367
  break
2355
2368
  else
2356
- puts "❌ Invalid option. Please select 1-8."
2369
+ display_message("❌ Invalid option. Please select 1-8.", type: :error)
2357
2370
  end
2358
2371
  end
2359
2372
  end
@@ -2361,17 +2374,17 @@ module Aidp
2361
2374
  # Quick control commands
2362
2375
  def quick_pause
2363
2376
  request_pause
2364
- puts "⏸️ Quick pause requested. Use 'r' to resume."
2377
+ display_message("⏸️ Quick pause requested. Use 'r' to resume.", type: :warning)
2365
2378
  end
2366
2379
 
2367
2380
  def quick_resume
2368
2381
  request_resume
2369
- puts "▶️ Quick resume requested."
2382
+ display_message("▶️ Quick resume requested.", type: :success)
2370
2383
  end
2371
2384
 
2372
2385
  def quick_stop
2373
2386
  request_stop
2374
- puts "🛑 Quick stop requested."
2387
+ display_message("🛑 Quick stop requested.", type: :error)
2375
2388
  end
2376
2389
 
2377
2390
  # Control interface with timeout
@@ -2390,7 +2403,7 @@ module Aidp
2390
2403
  handle_resume_state
2391
2404
  break
2392
2405
  elsif Time.now - start_time > timeout_seconds
2393
- puts "\n⏰ Control interface timeout reached. Continuing execution..."
2406
+ display_message("\n⏰ Control interface timeout reached. Continuing execution...", type: :warning)
2394
2407
  break
2395
2408
  elsif ENV["RACK_ENV"] == "test" || defined?(RSpec)
2396
2409
  sleep(0.1)
@@ -2402,11 +2415,11 @@ module Aidp
2402
2415
 
2403
2416
  # Emergency stop
2404
2417
  def emergency_stop
2405
- puts "\n🚨 EMERGENCY STOP INITIATED"
2406
- puts "=" * 50
2407
- puts "All execution will be halted immediately."
2408
- puts "This action cannot be undone."
2409
- puts "=" * 50
2418
+ display_message("\n🚨 EMERGENCY STOP INITIATED", type: :error)
2419
+ display_message("=" * 50, type: :muted)
2420
+ display_message("All execution will be halted immediately.", type: :error)
2421
+ display_message("This action cannot be undone.", type: :error)
2422
+ display_message("=" * 50, type: :muted)
2410
2423
 
2411
2424
  @control_mutex.synchronize do
2412
2425
  @stop_requested = true
@@ -2415,7 +2428,7 @@ module Aidp
2415
2428
  end
2416
2429
 
2417
2430
  stop_control_interface
2418
- puts "🛑 Emergency stop completed."
2431
+ display_message("🛑 Emergency stop completed.", type: :error)
2419
2432
  end
2420
2433
  end
2421
2434
  end