aidp 0.5.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.
- checksums.yaml +4 -4
- data/README.md +128 -151
- data/bin/aidp +1 -1
- data/lib/aidp/analysis/kb_inspector.rb +471 -0
- data/lib/aidp/analysis/seams.rb +159 -0
- data/lib/aidp/analysis/tree_sitter_grammar_loader.rb +480 -0
- data/lib/aidp/analysis/tree_sitter_scan.rb +686 -0
- data/lib/aidp/analyze/error_handler.rb +2 -78
- data/lib/aidp/analyze/json_file_storage.rb +292 -0
- data/lib/aidp/analyze/progress.rb +12 -0
- data/lib/aidp/analyze/progress_visualizer.rb +12 -17
- data/lib/aidp/analyze/ruby_maat_integration.rb +13 -31
- data/lib/aidp/analyze/runner.rb +256 -87
- data/lib/aidp/analyze/steps.rb +6 -0
- data/lib/aidp/cli/jobs_command.rb +103 -435
- data/lib/aidp/cli.rb +317 -191
- data/lib/aidp/config.rb +298 -10
- data/lib/aidp/debug_logger.rb +195 -0
- data/lib/aidp/debug_mixin.rb +187 -0
- data/lib/aidp/execute/progress.rb +9 -0
- data/lib/aidp/execute/runner.rb +221 -40
- data/lib/aidp/execute/steps.rb +17 -7
- data/lib/aidp/execute/workflow_selector.rb +211 -0
- data/lib/aidp/harness/completion_checker.rb +268 -0
- data/lib/aidp/harness/condition_detector.rb +1526 -0
- data/lib/aidp/harness/config_loader.rb +373 -0
- data/lib/aidp/harness/config_manager.rb +382 -0
- data/lib/aidp/harness/config_schema.rb +1006 -0
- data/lib/aidp/harness/config_validator.rb +355 -0
- data/lib/aidp/harness/configuration.rb +477 -0
- data/lib/aidp/harness/enhanced_runner.rb +494 -0
- data/lib/aidp/harness/error_handler.rb +616 -0
- data/lib/aidp/harness/provider_config.rb +423 -0
- data/lib/aidp/harness/provider_factory.rb +306 -0
- data/lib/aidp/harness/provider_manager.rb +1269 -0
- data/lib/aidp/harness/provider_type_checker.rb +88 -0
- data/lib/aidp/harness/runner.rb +411 -0
- data/lib/aidp/harness/state/errors.rb +28 -0
- data/lib/aidp/harness/state/metrics.rb +219 -0
- data/lib/aidp/harness/state/persistence.rb +128 -0
- data/lib/aidp/harness/state/provider_state.rb +132 -0
- data/lib/aidp/harness/state/ui_state.rb +68 -0
- data/lib/aidp/harness/state/workflow_state.rb +123 -0
- data/lib/aidp/harness/state_manager.rb +586 -0
- data/lib/aidp/harness/status_display.rb +888 -0
- data/lib/aidp/harness/ui/base.rb +16 -0
- data/lib/aidp/harness/ui/enhanced_tui.rb +545 -0
- data/lib/aidp/harness/ui/enhanced_workflow_selector.rb +252 -0
- data/lib/aidp/harness/ui/error_handler.rb +132 -0
- data/lib/aidp/harness/ui/frame_manager.rb +361 -0
- data/lib/aidp/harness/ui/job_monitor.rb +500 -0
- data/lib/aidp/harness/ui/navigation/main_menu.rb +311 -0
- data/lib/aidp/harness/ui/navigation/menu_formatter.rb +120 -0
- data/lib/aidp/harness/ui/navigation/menu_item.rb +142 -0
- data/lib/aidp/harness/ui/navigation/menu_state.rb +139 -0
- data/lib/aidp/harness/ui/navigation/submenu.rb +202 -0
- data/lib/aidp/harness/ui/navigation/workflow_selector.rb +176 -0
- data/lib/aidp/harness/ui/progress_display.rb +280 -0
- data/lib/aidp/harness/ui/question_collector.rb +141 -0
- data/lib/aidp/harness/ui/spinner_group.rb +184 -0
- data/lib/aidp/harness/ui/spinner_helper.rb +152 -0
- data/lib/aidp/harness/ui/status_manager.rb +312 -0
- data/lib/aidp/harness/ui/status_widget.rb +280 -0
- data/lib/aidp/harness/ui/workflow_controller.rb +312 -0
- data/lib/aidp/harness/user_interface.rb +2381 -0
- data/lib/aidp/provider_manager.rb +131 -7
- data/lib/aidp/providers/anthropic.rb +28 -109
- data/lib/aidp/providers/base.rb +170 -0
- data/lib/aidp/providers/cursor.rb +52 -183
- data/lib/aidp/providers/gemini.rb +24 -109
- data/lib/aidp/providers/macos_ui.rb +99 -5
- data/lib/aidp/providers/opencode.rb +194 -0
- data/lib/aidp/storage/csv_storage.rb +172 -0
- data/lib/aidp/storage/file_manager.rb +214 -0
- data/lib/aidp/storage/json_storage.rb +140 -0
- data/lib/aidp/version.rb +1 -1
- data/lib/aidp.rb +56 -35
- data/templates/ANALYZE/06a_tree_sitter_scan.md +217 -0
- data/templates/COMMON/AGENT_BASE.md +11 -0
- data/templates/EXECUTE/00_PRD.md +4 -4
- data/templates/EXECUTE/02_ARCHITECTURE.md +5 -4
- data/templates/EXECUTE/07_TEST_PLAN.md +4 -1
- data/templates/EXECUTE/08_TASKS.md +4 -4
- data/templates/EXECUTE/10_IMPLEMENTATION_AGENT.md +4 -4
- data/templates/README.md +279 -0
- data/templates/aidp-development.yml.example +373 -0
- data/templates/aidp-minimal.yml.example +48 -0
- data/templates/aidp-production.yml.example +475 -0
- data/templates/aidp.yml.example +598 -0
- metadata +106 -64
- data/lib/aidp/analyze/agent_personas.rb +0 -71
- data/lib/aidp/analyze/agent_tool_executor.rb +0 -445
- data/lib/aidp/analyze/data_retention_manager.rb +0 -426
- data/lib/aidp/analyze/database.rb +0 -260
- data/lib/aidp/analyze/dependencies.rb +0 -335
- data/lib/aidp/analyze/export_manager.rb +0 -425
- data/lib/aidp/analyze/focus_guidance.rb +0 -517
- data/lib/aidp/analyze/incremental_analyzer.rb +0 -543
- data/lib/aidp/analyze/language_analysis_strategies.rb +0 -897
- data/lib/aidp/analyze/large_analysis_progress.rb +0 -504
- data/lib/aidp/analyze/memory_manager.rb +0 -365
- data/lib/aidp/analyze/metrics_storage.rb +0 -336
- data/lib/aidp/analyze/parallel_processor.rb +0 -460
- data/lib/aidp/analyze/performance_optimizer.rb +0 -694
- data/lib/aidp/analyze/repository_chunker.rb +0 -704
- data/lib/aidp/analyze/static_analysis_detector.rb +0 -577
- data/lib/aidp/analyze/storage.rb +0 -662
- data/lib/aidp/analyze/tool_configuration.rb +0 -456
- data/lib/aidp/analyze/tool_modernization.rb +0 -750
- data/lib/aidp/database/pg_adapter.rb +0 -148
- data/lib/aidp/database_config.rb +0 -69
- data/lib/aidp/database_connection.rb +0 -72
- data/lib/aidp/database_migration.rb +0 -158
- data/lib/aidp/job_manager.rb +0 -41
- data/lib/aidp/jobs/base_job.rb +0 -47
- data/lib/aidp/jobs/provider_execution_job.rb +0 -96
- data/lib/aidp/project_detector.rb +0 -117
- data/lib/aidp/providers/agent_supervisor.rb +0 -348
- data/lib/aidp/providers/supervised_base.rb +0 -317
- data/lib/aidp/providers/supervised_cursor.rb +0 -22
- data/lib/aidp/sync.rb +0 -13
- 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
|