aidp 0.9.6 → 0.11.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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +194 -25
  3. data/lib/aidp/analyze/error_handler.rb +4 -2
  4. data/lib/aidp/{analysis → analyze}/kb_inspector.rb +93 -89
  5. data/lib/aidp/analyze/prioritizer.rb +3 -2
  6. data/lib/aidp/analyze/progress.rb +2 -1
  7. data/lib/aidp/analyze/ruby_maat_integration.rb +7 -3
  8. data/lib/aidp/analyze/runner.rb +73 -11
  9. data/lib/aidp/{analysis → analyze}/seams.rb +1 -1
  10. data/lib/aidp/analyze/steps.rb +10 -8
  11. data/lib/aidp/{analysis → analyze}/tree_sitter_grammar_loader.rb +11 -5
  12. data/lib/aidp/{analysis → analyze}/tree_sitter_scan.rb +21 -15
  13. data/lib/aidp/cli/checkpoint_command.rb +98 -0
  14. data/lib/aidp/cli/first_run_wizard.rb +83 -103
  15. data/lib/aidp/cli/jobs_command.rb +270 -36
  16. data/lib/aidp/cli/terminal_io.rb +3 -3
  17. data/lib/aidp/cli.rb +411 -69
  18. data/lib/aidp/config.rb +5 -8
  19. data/lib/aidp/debug_logger.rb +4 -4
  20. data/lib/aidp/debug_mixin.rb +11 -4
  21. data/lib/aidp/execute/checkpoint.rb +282 -0
  22. data/lib/aidp/execute/checkpoint_display.rb +221 -0
  23. data/lib/aidp/execute/progress.rb +2 -1
  24. data/lib/aidp/execute/prompt_manager.rb +62 -0
  25. data/lib/aidp/execute/runner.rb +67 -20
  26. data/lib/aidp/execute/steps.rb +36 -27
  27. data/lib/aidp/execute/work_loop_runner.rb +308 -0
  28. data/lib/aidp/execute/workflow_selector.rb +50 -26
  29. data/lib/aidp/harness/condition_detector.rb +4 -4
  30. data/lib/aidp/harness/config_schema.rb +40 -0
  31. data/lib/aidp/harness/config_validator.rb +3 -6
  32. data/lib/aidp/harness/configuration.rb +35 -1
  33. data/lib/aidp/harness/enhanced_runner.rb +25 -4
  34. data/lib/aidp/harness/error_handler.rb +103 -28
  35. data/lib/aidp/harness/provider_factory.rb +6 -1
  36. data/lib/aidp/harness/provider_manager.rb +273 -19
  37. data/lib/aidp/harness/runner.rb +14 -6
  38. data/lib/aidp/harness/simple_user_interface.rb +6 -4
  39. data/lib/aidp/harness/status_display.rb +118 -106
  40. data/lib/aidp/harness/test_runner.rb +83 -0
  41. data/lib/aidp/harness/ui/enhanced_tui.rb +7 -5
  42. data/lib/aidp/harness/ui/enhanced_workflow_selector.rb +22 -4
  43. data/lib/aidp/harness/ui/error_handler.rb +7 -2
  44. data/lib/aidp/harness/ui/frame_manager.rb +61 -39
  45. data/lib/aidp/harness/ui/job_monitor.rb +2 -0
  46. data/lib/aidp/harness/ui/navigation/main_menu.rb +27 -16
  47. data/lib/aidp/harness/ui/navigation/menu_item.rb +1 -0
  48. data/lib/aidp/harness/ui/navigation/menu_state.rb +1 -0
  49. data/lib/aidp/harness/ui/navigation/submenu.rb +1 -0
  50. data/lib/aidp/harness/ui/navigation/workflow_selector.rb +2 -0
  51. data/lib/aidp/harness/ui/progress_display.rb +26 -7
  52. data/lib/aidp/harness/ui/question_collector.rb +2 -0
  53. data/lib/aidp/harness/ui/spinner_group.rb +2 -0
  54. data/lib/aidp/harness/ui/spinner_helper.rb +1 -1
  55. data/lib/aidp/harness/ui/status_manager.rb +4 -2
  56. data/lib/aidp/harness/ui/status_widget.rb +20 -9
  57. data/lib/aidp/harness/ui/workflow_controller.rb +27 -9
  58. data/lib/aidp/harness/user_interface.rb +338 -330
  59. data/lib/aidp/jobs/background_runner.rb +278 -0
  60. data/lib/aidp/message_display.rb +48 -0
  61. data/lib/aidp/provider_manager.rb +13 -7
  62. data/lib/aidp/providers/anthropic.rb +101 -18
  63. data/lib/aidp/providers/base.rb +51 -1
  64. data/lib/aidp/providers/codex.rb +248 -0
  65. data/lib/aidp/providers/cursor.rb +39 -48
  66. data/lib/aidp/providers/gemini.rb +26 -16
  67. data/lib/aidp/providers/github_copilot.rb +263 -0
  68. data/lib/aidp/providers/opencode.rb +38 -47
  69. data/lib/aidp/version.rb +1 -1
  70. data/lib/aidp/workflows/definitions.rb +357 -0
  71. data/lib/aidp/workflows/selector.rb +171 -0
  72. data/lib/aidp.rb +16 -4
  73. data/templates/planning/generate_llm_style_guide.md +119 -0
  74. metadata +43 -31
  75. data/lib/aidp/analyze/progress_visualizer.rb +0 -314
  76. /data/templates/{ANALYZE/02_ARCHITECTURE_ANALYSIS.md → analysis/analyze_architecture.md} +0 -0
  77. /data/templates/{ANALYZE/05_DOCUMENTATION_ANALYSIS.md → analysis/analyze_documentation.md} +0 -0
  78. /data/templates/{ANALYZE/04_FUNCTIONALITY_ANALYSIS.md → analysis/analyze_functionality.md} +0 -0
  79. /data/templates/{ANALYZE/01_REPOSITORY_ANALYSIS.md → analysis/analyze_repository.md} +0 -0
  80. /data/templates/{ANALYZE/06_STATIC_ANALYSIS.md → analysis/analyze_static_code.md} +0 -0
  81. /data/templates/{ANALYZE/03_TEST_ANALYSIS.md → analysis/analyze_tests.md} +0 -0
  82. /data/templates/{ANALYZE/07_REFACTORING_RECOMMENDATIONS.md → analysis/recommend_refactoring.md} +0 -0
  83. /data/templates/{ANALYZE/06a_tree_sitter_scan.md → analysis/scan_with_tree_sitter.md} +0 -0
  84. /data/templates/{EXECUTE/11_STATIC_ANALYSIS.md → implementation/configure_static_analysis.md} +0 -0
  85. /data/templates/{EXECUTE/14_DOCS_PORTAL.md → implementation/create_documentation_portal.md} +0 -0
  86. /data/templates/{EXECUTE/10_IMPLEMENTATION_AGENT.md → implementation/implement_features.md} +0 -0
  87. /data/templates/{EXECUTE/13_DELIVERY_ROLLOUT.md → implementation/plan_delivery.md} +0 -0
  88. /data/templates/{EXECUTE/15_POST_RELEASE.md → implementation/review_post_release.md} +0 -0
  89. /data/templates/{EXECUTE/09_SCAFFOLDING_DEVEX.md → implementation/setup_scaffolding.md} +0 -0
  90. /data/templates/{EXECUTE/02A_ARCH_GATE_QUESTIONS.md → planning/ask_architecture_questions.md} +0 -0
  91. /data/templates/{EXECUTE/00_PRD.md → planning/create_prd.md} +0 -0
  92. /data/templates/{EXECUTE/08_TASKS.md → planning/create_tasks.md} +0 -0
  93. /data/templates/{EXECUTE/04_DOMAIN_DECOMPOSITION.md → planning/decompose_domain.md} +0 -0
  94. /data/templates/{EXECUTE/01_NFRS.md → planning/define_nfrs.md} +0 -0
  95. /data/templates/{EXECUTE/05_CONTRACTS.md → planning/design_apis.md} +0 -0
  96. /data/templates/{EXECUTE/02_ARCHITECTURE.md → planning/design_architecture.md} +0 -0
  97. /data/templates/{EXECUTE/06_THREAT_MODEL.md → planning/design_data_model.md} +0 -0
  98. /data/templates/{EXECUTE/03_ADR_FACTORY.md → planning/generate_adrs.md} +0 -0
  99. /data/templates/{EXECUTE/12_OBSERVABILITY_SLOS.md → planning/plan_observability.md} +0 -0
  100. /data/templates/{EXECUTE/07_TEST_PLAN.md → planning/plan_testing.md} +0 -0
@@ -10,7 +10,9 @@ module Aidp
10
10
  # Handles status display using CLI UI spinners
11
11
  class StatusWidget < Base
12
12
  class StatusError < StandardError; end
13
+
13
14
  class InvalidStatusError < StatusError; end
15
+
14
16
  class DisplayError < StatusError; end
15
17
 
16
18
  def initialize(ui_components = {})
@@ -18,6 +20,7 @@ module Aidp
18
20
  @spinner = ui_components[:spinner] || TTY::Spinner
19
21
  @pastel = Pastel.new
20
22
  @formatter = ui_components[:formatter] || StatusFormatter.new
23
+ @output = ui_components[:output]
21
24
  @status_history = []
22
25
  @current_spinner = nil
23
26
  @spinner_active = false
@@ -28,7 +31,7 @@ module Aidp
28
31
 
29
32
  formatted_message = @formatter.format_status_message(message)
30
33
  @spinner.spin(formatted_message) do |spinner|
31
- yield(spinner) if block_given?
34
+ yield(spinner) if block
32
35
  end
33
36
  rescue => e
34
37
  raise DisplayError, "Failed to show status: #{e.message}"
@@ -56,7 +59,7 @@ module Aidp
56
59
  validate_message(message)
57
60
 
58
61
  formatted_message = @formatter.format_success_message(message)
59
- puts(formatted_message)
62
+ display_message(formatted_message)
60
63
  rescue => e
61
64
  raise DisplayError, "Failed to show success status: #{e.message}"
62
65
  end
@@ -65,7 +68,7 @@ module Aidp
65
68
  validate_message(message)
66
69
 
67
70
  formatted_message = @formatter.format_error_message(message)
68
- puts(formatted_message)
71
+ display_message(formatted_message)
69
72
  rescue => e
70
73
  raise DisplayError, "Failed to show error status: #{e.message}"
71
74
  end
@@ -74,7 +77,7 @@ module Aidp
74
77
  validate_message(message)
75
78
 
76
79
  formatted_message = @formatter.format_warning_message(message)
77
- puts(formatted_message)
80
+ display_message(formatted_message)
78
81
  rescue => e
79
82
  raise DisplayError, "Failed to show warning status: #{e.message}"
80
83
  end
@@ -181,6 +184,14 @@ module Aidp
181
184
 
182
185
  private
183
186
 
187
+ def display_message(message)
188
+ if @output
189
+ @output.say(message)
190
+ else
191
+ puts message
192
+ end
193
+ end
194
+
184
195
  def validate_message(message)
185
196
  raise InvalidStatusError, "Message cannot be empty" if message.to_s.strip.empty?
186
197
  end
@@ -211,22 +222,22 @@ module Aidp
211
222
  end
212
223
 
213
224
  def display_loading_status(message)
214
- puts("⏳ #{message}")
225
+ display_message("⏳ #{message}")
215
226
  end
216
227
 
217
228
  def display_success_status(message)
218
- puts("✅ #{message}")
229
+ display_message("✅ #{message}")
219
230
  end
220
231
 
221
232
  def display_error_status(message, error_data)
222
- puts("❌ #{message}")
233
+ display_message("❌ #{message}")
223
234
  if error_data && error_data[:message]
224
- puts(" #{error_data[:message]}")
235
+ display_message(" #{error_data[:message]}")
225
236
  end
226
237
  end
227
238
 
228
239
  def display_warning_status(message)
229
- puts("⚠️ #{message}")
240
+ display_message("⚠️ #{message}")
230
241
  end
231
242
  end
232
243
 
@@ -11,7 +11,9 @@ module Aidp
11
11
  # Workflow control interface for pause/resume/cancel/stop
12
12
  class WorkflowController < Base
13
13
  class WorkflowError < StandardError; end
14
+
14
15
  class InvalidStateError < WorkflowError; end
16
+
15
17
  class ControlError < WorkflowError; end
16
18
 
17
19
  WORKFLOW_STATES = {
@@ -27,6 +29,7 @@ module Aidp
27
29
  @status_manager = ui_components[:status_manager] || StatusManager.new
28
30
  @frame_manager = ui_components[:frame_manager] || FrameManager.new
29
31
  @formatter = ui_components[:formatter] || WorkflowControllerFormatter.new
32
+ @output = ui_components[:output]
30
33
 
31
34
  @current_state = :running
32
35
  @state_history = []
@@ -187,8 +190,23 @@ module Aidp
187
190
  @control_thread = nil
188
191
  end
189
192
 
193
+ # Testing helper method to set state
194
+ def set_state_for_testing(state)
195
+ @control_mutex.synchronize do
196
+ @current_state = state
197
+ end
198
+ end
199
+
190
200
  private
191
201
 
202
+ def display_message(message)
203
+ if @output
204
+ @output.say(message)
205
+ else
206
+ puts message
207
+ end
208
+ end
209
+
192
210
  def validate_state_transition(action)
193
211
  case action
194
212
  when :pause
@@ -229,19 +247,19 @@ module Aidp
229
247
  end
230
248
 
231
249
  def display_status_info(status)
232
- puts("Current State: #{@formatter.format_state(status[:state])}")
233
- puts("State Name: #{status[:state_name]}")
250
+ display_message("Current State: #{@formatter.format_state(status[:state])}")
251
+ display_message("State Name: #{status[:state_name]}")
234
252
 
235
253
  if status[:pause_time]
236
- puts("Paused Since: #{status[:pause_time]}")
254
+ display_message("Paused Since: #{status[:pause_time]}")
237
255
  end
238
256
 
239
- puts("\nAvailable Actions:")
240
- puts(" Pause: #{status[:can_pause] ? "Yes" : "No"}")
241
- puts(" Resume: #{status[:can_resume] ? "Yes" : "No"}")
242
- puts(" Cancel: #{status[:can_cancel] ? "Yes" : "No"}")
243
- puts(" Stop: #{status[:can_stop] ? "Yes" : "No"}")
244
- puts(" Complete: #{status[:can_complete] ? "Yes" : "No"}")
257
+ display_message("\nAvailable Actions:")
258
+ display_message(" Pause: #{status[:can_pause] ? "Yes" : "No"}")
259
+ display_message(" Resume: #{status[:can_resume] ? "Yes" : "No"}")
260
+ display_message(" Cancel: #{status[:can_cancel] ? "Yes" : "No"}")
261
+ display_message(" Stop: #{status[:can_stop] ? "Yes" : "No"}")
262
+ display_message(" Complete: #{status[:can_complete] ? "Yes" : "No"}")
245
263
  end
246
264
 
247
265
  def control_interface_loop