aidp 0.7.0 β†’ 0.8.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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +60 -214
  3. data/bin/aidp +1 -1
  4. data/lib/aidp/analysis/kb_inspector.rb +38 -23
  5. data/lib/aidp/analysis/seams.rb +2 -31
  6. data/lib/aidp/analysis/tree_sitter_grammar_loader.rb +0 -13
  7. data/lib/aidp/analysis/tree_sitter_scan.rb +3 -20
  8. data/lib/aidp/analyze/error_handler.rb +2 -75
  9. data/lib/aidp/analyze/json_file_storage.rb +292 -0
  10. data/lib/aidp/analyze/progress.rb +12 -0
  11. data/lib/aidp/analyze/progress_visualizer.rb +12 -17
  12. data/lib/aidp/analyze/ruby_maat_integration.rb +13 -31
  13. data/lib/aidp/analyze/runner.rb +256 -87
  14. data/lib/aidp/cli/jobs_command.rb +100 -432
  15. data/lib/aidp/cli.rb +309 -239
  16. data/lib/aidp/config.rb +298 -10
  17. data/lib/aidp/debug_logger.rb +195 -0
  18. data/lib/aidp/debug_mixin.rb +187 -0
  19. data/lib/aidp/execute/progress.rb +9 -0
  20. data/lib/aidp/execute/runner.rb +221 -40
  21. data/lib/aidp/execute/steps.rb +17 -7
  22. data/lib/aidp/execute/workflow_selector.rb +211 -0
  23. data/lib/aidp/harness/completion_checker.rb +268 -0
  24. data/lib/aidp/harness/condition_detector.rb +1526 -0
  25. data/lib/aidp/harness/config_loader.rb +373 -0
  26. data/lib/aidp/harness/config_manager.rb +382 -0
  27. data/lib/aidp/harness/config_schema.rb +1006 -0
  28. data/lib/aidp/harness/config_validator.rb +355 -0
  29. data/lib/aidp/harness/configuration.rb +477 -0
  30. data/lib/aidp/harness/enhanced_runner.rb +494 -0
  31. data/lib/aidp/harness/error_handler.rb +616 -0
  32. data/lib/aidp/harness/provider_config.rb +423 -0
  33. data/lib/aidp/harness/provider_factory.rb +306 -0
  34. data/lib/aidp/harness/provider_manager.rb +1269 -0
  35. data/lib/aidp/harness/provider_type_checker.rb +88 -0
  36. data/lib/aidp/harness/runner.rb +411 -0
  37. data/lib/aidp/harness/state/errors.rb +28 -0
  38. data/lib/aidp/harness/state/metrics.rb +219 -0
  39. data/lib/aidp/harness/state/persistence.rb +128 -0
  40. data/lib/aidp/harness/state/provider_state.rb +132 -0
  41. data/lib/aidp/harness/state/ui_state.rb +68 -0
  42. data/lib/aidp/harness/state/workflow_state.rb +123 -0
  43. data/lib/aidp/harness/state_manager.rb +586 -0
  44. data/lib/aidp/harness/status_display.rb +888 -0
  45. data/lib/aidp/harness/ui/base.rb +16 -0
  46. data/lib/aidp/harness/ui/enhanced_tui.rb +545 -0
  47. data/lib/aidp/harness/ui/enhanced_workflow_selector.rb +252 -0
  48. data/lib/aidp/harness/ui/error_handler.rb +132 -0
  49. data/lib/aidp/harness/ui/frame_manager.rb +361 -0
  50. data/lib/aidp/harness/ui/job_monitor.rb +500 -0
  51. data/lib/aidp/harness/ui/navigation/main_menu.rb +311 -0
  52. data/lib/aidp/harness/ui/navigation/menu_formatter.rb +120 -0
  53. data/lib/aidp/harness/ui/navigation/menu_item.rb +142 -0
  54. data/lib/aidp/harness/ui/navigation/menu_state.rb +139 -0
  55. data/lib/aidp/harness/ui/navigation/submenu.rb +202 -0
  56. data/lib/aidp/harness/ui/navigation/workflow_selector.rb +176 -0
  57. data/lib/aidp/harness/ui/progress_display.rb +280 -0
  58. data/lib/aidp/harness/ui/question_collector.rb +141 -0
  59. data/lib/aidp/harness/ui/spinner_group.rb +184 -0
  60. data/lib/aidp/harness/ui/spinner_helper.rb +152 -0
  61. data/lib/aidp/harness/ui/status_manager.rb +312 -0
  62. data/lib/aidp/harness/ui/status_widget.rb +280 -0
  63. data/lib/aidp/harness/ui/workflow_controller.rb +312 -0
  64. data/lib/aidp/harness/user_interface.rb +2381 -0
  65. data/lib/aidp/provider_manager.rb +131 -7
  66. data/lib/aidp/providers/anthropic.rb +28 -103
  67. data/lib/aidp/providers/base.rb +170 -0
  68. data/lib/aidp/providers/cursor.rb +52 -181
  69. data/lib/aidp/providers/gemini.rb +24 -107
  70. data/lib/aidp/providers/macos_ui.rb +99 -5
  71. data/lib/aidp/providers/opencode.rb +194 -0
  72. data/lib/aidp/storage/csv_storage.rb +172 -0
  73. data/lib/aidp/storage/file_manager.rb +214 -0
  74. data/lib/aidp/storage/json_storage.rb +140 -0
  75. data/lib/aidp/version.rb +1 -1
  76. data/lib/aidp.rb +54 -39
  77. data/templates/COMMON/AGENT_BASE.md +11 -0
  78. data/templates/EXECUTE/00_PRD.md +4 -4
  79. data/templates/EXECUTE/02_ARCHITECTURE.md +5 -4
  80. data/templates/EXECUTE/07_TEST_PLAN.md +4 -1
  81. data/templates/EXECUTE/08_TASKS.md +4 -4
  82. data/templates/EXECUTE/10_IMPLEMENTATION_AGENT.md +4 -4
  83. data/templates/README.md +279 -0
  84. data/templates/aidp-development.yml.example +373 -0
  85. data/templates/aidp-minimal.yml.example +48 -0
  86. data/templates/aidp-production.yml.example +475 -0
  87. data/templates/aidp.yml.example +598 -0
  88. metadata +93 -69
  89. data/lib/aidp/analyze/agent_personas.rb +0 -71
  90. data/lib/aidp/analyze/agent_tool_executor.rb +0 -439
  91. data/lib/aidp/analyze/data_retention_manager.rb +0 -421
  92. data/lib/aidp/analyze/database.rb +0 -260
  93. data/lib/aidp/analyze/dependencies.rb +0 -335
  94. data/lib/aidp/analyze/export_manager.rb +0 -418
  95. data/lib/aidp/analyze/focus_guidance.rb +0 -517
  96. data/lib/aidp/analyze/incremental_analyzer.rb +0 -533
  97. data/lib/aidp/analyze/language_analysis_strategies.rb +0 -897
  98. data/lib/aidp/analyze/large_analysis_progress.rb +0 -499
  99. data/lib/aidp/analyze/memory_manager.rb +0 -339
  100. data/lib/aidp/analyze/metrics_storage.rb +0 -336
  101. data/lib/aidp/analyze/parallel_processor.rb +0 -454
  102. data/lib/aidp/analyze/performance_optimizer.rb +0 -691
  103. data/lib/aidp/analyze/repository_chunker.rb +0 -697
  104. data/lib/aidp/analyze/static_analysis_detector.rb +0 -577
  105. data/lib/aidp/analyze/storage.rb +0 -655
  106. data/lib/aidp/analyze/tool_configuration.rb +0 -441
  107. data/lib/aidp/analyze/tool_modernization.rb +0 -750
  108. data/lib/aidp/database/pg_adapter.rb +0 -148
  109. data/lib/aidp/database_config.rb +0 -69
  110. data/lib/aidp/database_connection.rb +0 -72
  111. data/lib/aidp/job_manager.rb +0 -41
  112. data/lib/aidp/jobs/base_job.rb +0 -45
  113. data/lib/aidp/jobs/provider_execution_job.rb +0 -83
  114. data/lib/aidp/project_detector.rb +0 -117
  115. data/lib/aidp/providers/agent_supervisor.rb +0 -348
  116. data/lib/aidp/providers/supervised_base.rb +0 -317
  117. data/lib/aidp/providers/supervised_cursor.rb +0 -22
  118. data/lib/aidp/sync.rb +0 -13
  119. data/lib/aidp/workspace.rb +0 -19
@@ -0,0 +1,312 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pastel"
4
+ require_relative "base"
5
+ require_relative "status_manager"
6
+ require_relative "frame_manager"
7
+
8
+ module Aidp
9
+ module Harness
10
+ module UI
11
+ # Workflow control interface for pause/resume/cancel/stop
12
+ class WorkflowController < Base
13
+ class WorkflowError < StandardError; end
14
+ class InvalidStateError < WorkflowError; end
15
+ class ControlError < WorkflowError; end
16
+
17
+ WORKFLOW_STATES = {
18
+ running: "Running",
19
+ paused: "Paused",
20
+ cancelled: "Cancelled",
21
+ stopped: "Stopped",
22
+ completed: "Completed"
23
+ }.freeze
24
+
25
+ def initialize(ui_components = {})
26
+ super()
27
+ @status_manager = ui_components[:status_manager] || StatusManager.new
28
+ @frame_manager = ui_components[:frame_manager] || FrameManager.new
29
+ @formatter = ui_components[:formatter] || WorkflowControllerFormatter.new
30
+
31
+ @current_state = :running
32
+ @state_history = []
33
+ @pause_time = nil
34
+ @control_thread = nil
35
+ @control_mutex = Mutex.new
36
+ end
37
+
38
+ def pause_workflow(reason = "User requested pause")
39
+ validate_state_transition(:pause)
40
+
41
+ @control_mutex.synchronize do
42
+ @current_state = :paused
43
+ @pause_time = Time.now
44
+ record_state_change(:paused, reason)
45
+ @status_manager.show_warning_status("Workflow paused: #{reason}")
46
+ end
47
+ rescue InvalidStateError => e
48
+ raise e
49
+ rescue => e
50
+ raise ControlError, "Failed to pause workflow: #{e.message}"
51
+ end
52
+
53
+ def resume_workflow(reason = "User requested resume")
54
+ validate_state_transition(:resume)
55
+
56
+ @control_mutex.synchronize do
57
+ @current_state = :running
58
+ pause_duration = calculate_pause_duration
59
+ record_state_change(:running, reason, pause_duration)
60
+ @status_manager.show_success_status("Workflow resumed: #{reason}")
61
+ end
62
+ rescue InvalidStateError => e
63
+ raise e
64
+ rescue => e
65
+ raise ControlError, "Failed to resume workflow: #{e.message}"
66
+ end
67
+
68
+ def cancel_workflow(reason = "User requested cancellation")
69
+ validate_state_transition(:cancel)
70
+
71
+ @control_mutex.synchronize do
72
+ @current_state = :cancelled
73
+ record_state_change(:cancelled, reason)
74
+ @status_manager.show_warning_status("Workflow cancelled: #{reason}")
75
+ cleanup_workflow_resources
76
+ end
77
+ rescue InvalidStateError => e
78
+ raise e
79
+ rescue => e
80
+ raise ControlError, "Failed to cancel workflow: #{e.message}"
81
+ end
82
+
83
+ def stop_workflow(reason = "User requested stop")
84
+ validate_state_transition(:stop)
85
+
86
+ @control_mutex.synchronize do
87
+ @current_state = :stopped
88
+ record_state_change(:stopped, reason)
89
+ @status_manager.show_error_status("Workflow stopped: #{reason}")
90
+ cleanup_workflow_resources
91
+ end
92
+ rescue => e
93
+ raise ControlError, "Failed to stop workflow: #{e.message}"
94
+ end
95
+
96
+ def complete_workflow(reason = "Workflow completed successfully")
97
+ validate_state_transition(:complete)
98
+
99
+ @control_mutex.synchronize do
100
+ @current_state = :completed
101
+ record_state_change(:completed, reason)
102
+ @status_manager.show_success_status("Workflow completed: #{reason}")
103
+ end
104
+ rescue InvalidStateError => e
105
+ raise e
106
+ rescue => e
107
+ raise ControlError, "Failed to complete workflow: #{e.message}"
108
+ end
109
+
110
+ def current_state
111
+ @control_mutex.synchronize { @current_state }
112
+ end
113
+
114
+ def running?
115
+ @current_state == :running
116
+ end
117
+
118
+ def paused?
119
+ @current_state == :paused
120
+ end
121
+
122
+ def cancelled?
123
+ @current_state == :cancelled
124
+ end
125
+
126
+ def stopped?
127
+ @current_state == :stopped
128
+ end
129
+
130
+ def completed?
131
+ @current_state == :completed
132
+ end
133
+
134
+ def can_pause?
135
+ running?
136
+ end
137
+
138
+ def can_resume?
139
+ paused?
140
+ end
141
+
142
+ def can_cancel?
143
+ running? || paused?
144
+ end
145
+
146
+ def can_stop?
147
+ running? || paused?
148
+ end
149
+
150
+ def can_complete?
151
+ running?
152
+ end
153
+
154
+ def get_workflow_status
155
+ @control_mutex.synchronize do
156
+ {
157
+ state: @current_state,
158
+ state_name: WORKFLOW_STATES[@current_state],
159
+ pause_time: @pause_time,
160
+ state_history: @state_history.dup,
161
+ can_pause: can_pause?,
162
+ can_resume: can_resume?,
163
+ can_cancel: can_cancel?,
164
+ can_stop: can_stop?,
165
+ can_complete: can_complete?
166
+ }
167
+ end
168
+ end
169
+
170
+ def display_workflow_status
171
+ @frame_manager.section("Workflow Status") do
172
+ status = get_workflow_status
173
+ display_status_info(status)
174
+ end
175
+ end
176
+
177
+ def start_control_interface
178
+ return if @control_thread&.alive?
179
+
180
+ @control_thread = Thread.new do
181
+ control_interface_loop
182
+ end
183
+ end
184
+
185
+ def stop_control_interface
186
+ @control_thread&.kill
187
+ @control_thread = nil
188
+ end
189
+
190
+ private
191
+
192
+ def validate_state_transition(action)
193
+ case action
194
+ when :pause
195
+ raise InvalidStateError, "Cannot pause workflow in #{@current_state} state" unless can_pause?
196
+ when :resume
197
+ raise InvalidStateError, "Cannot resume workflow in #{@current_state} state" unless can_resume?
198
+ when :cancel
199
+ raise InvalidStateError, "Cannot cancel workflow in #{@current_state} state" unless can_cancel?
200
+ when :stop
201
+ raise InvalidStateError, "Cannot stop workflow in #{@current_state} state" unless can_stop?
202
+ when :complete
203
+ raise InvalidStateError, "Cannot complete workflow in #{@current_state} state" unless can_complete?
204
+ else
205
+ raise InvalidStateError, "Unknown action: #{action}"
206
+ end
207
+ end
208
+
209
+ def record_state_change(new_state, reason, additional_data = nil)
210
+ state_change = {
211
+ from_state: @current_state,
212
+ to_state: new_state,
213
+ reason: reason,
214
+ timestamp: Time.now,
215
+ additional_data: additional_data
216
+ }
217
+
218
+ @state_history << state_change
219
+ end
220
+
221
+ def calculate_pause_duration
222
+ return nil unless @pause_time
223
+ Time.now - @pause_time
224
+ end
225
+
226
+ def cleanup_workflow_resources
227
+ # Placeholder for cleanup logic
228
+ # This would clean up any resources, connections, etc.
229
+ end
230
+
231
+ def display_status_info(status)
232
+ puts("Current State: #{@formatter.format_state(status[:state])}")
233
+ puts("State Name: #{status[:state_name]}")
234
+
235
+ if status[:pause_time]
236
+ puts("Paused Since: #{status[:pause_time]}")
237
+ end
238
+
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"}")
245
+ end
246
+
247
+ def control_interface_loop
248
+ loop do
249
+ handle_control_input
250
+ sleep(0.1) # Small delay to prevent excessive CPU usage
251
+ rescue => e
252
+ @status_manager.show_error_status("Control interface error: #{e.message}")
253
+ end
254
+ end
255
+
256
+ def handle_control_input
257
+ # Placeholder for control input handling
258
+ # This would listen for keyboard input or other control signals
259
+ end
260
+ end
261
+
262
+ # Formats workflow controller display
263
+ class WorkflowControllerFormatter
264
+ def initialize
265
+ @pastel = Pastel.new
266
+ end
267
+
268
+ def format_state(state)
269
+ case state
270
+ when :running
271
+ @pastel.green("🟒 Running")
272
+ when :paused
273
+ @pastel.yellow("🟑 Paused")
274
+ when :cancelled
275
+ @pastel.red("πŸ”΄ Cancelled")
276
+ when :stopped
277
+ @pastel.red("⏹️ Stopped")
278
+ when :completed
279
+ @pastel.green("βœ… Completed")
280
+ else
281
+ @pastel.dim("❓ #{state.to_s.capitalize}")
282
+ end
283
+ end
284
+
285
+ def format_state_transition(from_state, to_state)
286
+ @pastel.bold(@pastel.blue("πŸ”„ #{from_state.to_s.capitalize} β†’ #{to_state.to_s.capitalize}"))
287
+ end
288
+
289
+ def format_control_action(action)
290
+ case action
291
+ when :pause
292
+ @pastel.yellow("⏸️ Pause")
293
+ when :resume
294
+ @pastel.green("▢️ Resume")
295
+ when :cancel
296
+ @pastel.red("❌ Cancel")
297
+ when :stop
298
+ @pastel.red("⏹️ Stop")
299
+ when :complete
300
+ @pastel.green("βœ… Complete")
301
+ else
302
+ @pastel.dim("❓ #{action.to_s.capitalize}")
303
+ end
304
+ end
305
+
306
+ def format_control_help
307
+ @pastel.bold(@pastel.blue("⌨️ Workflow Control Help"))
308
+ end
309
+ end
310
+ end
311
+ end
312
+ end