aidp 0.7.0 → 0.8.1
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 +60 -214
- data/bin/aidp +1 -1
- data/lib/aidp/analysis/kb_inspector.rb +38 -23
- data/lib/aidp/analysis/seams.rb +2 -31
- data/lib/aidp/analysis/tree_sitter_grammar_loader.rb +1 -13
- data/lib/aidp/analysis/tree_sitter_scan.rb +3 -20
- data/lib/aidp/analyze/error_handler.rb +2 -75
- 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/cli/jobs_command.rb +100 -432
- data/lib/aidp/cli.rb +309 -239
- 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 -103
- data/lib/aidp/providers/base.rb +170 -0
- data/lib/aidp/providers/cursor.rb +52 -181
- data/lib/aidp/providers/gemini.rb +24 -107
- 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 +54 -39
- 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 +93 -69
- data/lib/aidp/analyze/agent_personas.rb +0 -71
- data/lib/aidp/analyze/agent_tool_executor.rb +0 -439
- data/lib/aidp/analyze/data_retention_manager.rb +0 -421
- data/lib/aidp/analyze/database.rb +0 -260
- data/lib/aidp/analyze/dependencies.rb +0 -335
- data/lib/aidp/analyze/export_manager.rb +0 -418
- data/lib/aidp/analyze/focus_guidance.rb +0 -517
- data/lib/aidp/analyze/incremental_analyzer.rb +0 -533
- data/lib/aidp/analyze/language_analysis_strategies.rb +0 -897
- data/lib/aidp/analyze/large_analysis_progress.rb +0 -499
- data/lib/aidp/analyze/memory_manager.rb +0 -339
- data/lib/aidp/analyze/metrics_storage.rb +0 -336
- data/lib/aidp/analyze/parallel_processor.rb +0 -454
- data/lib/aidp/analyze/performance_optimizer.rb +0 -691
- data/lib/aidp/analyze/repository_chunker.rb +0 -697
- data/lib/aidp/analyze/static_analysis_detector.rb +0 -577
- data/lib/aidp/analyze/storage.rb +0 -655
- data/lib/aidp/analyze/tool_configuration.rb +0 -441
- 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/job_manager.rb +0 -41
- data/lib/aidp/jobs/base_job.rb +0 -45
- data/lib/aidp/jobs/provider_execution_job.rb +0 -83
- 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,306 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "provider_config"
|
4
|
+
require_relative "../providers/base"
|
5
|
+
require_relative "../providers/cursor"
|
6
|
+
require_relative "../providers/anthropic"
|
7
|
+
require_relative "../providers/gemini"
|
8
|
+
require_relative "../providers/macos_ui"
|
9
|
+
require_relative "../providers/opencode"
|
10
|
+
|
11
|
+
module Aidp
|
12
|
+
module Harness
|
13
|
+
# Factory for creating configured provider instances
|
14
|
+
class ProviderFactory
|
15
|
+
PROVIDER_CLASSES = {
|
16
|
+
"cursor" => Aidp::Providers::Cursor,
|
17
|
+
"anthropic" => Aidp::Providers::Anthropic,
|
18
|
+
"gemini" => Aidp::Providers::Gemini,
|
19
|
+
"macos" => Aidp::Providers::MacOSUI,
|
20
|
+
"opencode" => Aidp::Providers::Opencode
|
21
|
+
}.freeze
|
22
|
+
|
23
|
+
def initialize(config_manager = nil)
|
24
|
+
@config_manager = config_manager || ConfigManager.new
|
25
|
+
@provider_configs = {}
|
26
|
+
@provider_instances = {}
|
27
|
+
end
|
28
|
+
|
29
|
+
# Create a provider instance with configuration
|
30
|
+
def create_provider(provider_name, options = {})
|
31
|
+
provider_name = provider_name.to_s
|
32
|
+
cache_key = "#{provider_name}_#{options.hash}"
|
33
|
+
|
34
|
+
# Return cached instance if available
|
35
|
+
if @provider_instances[cache_key] && !options[:force_reload]
|
36
|
+
return @provider_instances[cache_key]
|
37
|
+
end
|
38
|
+
|
39
|
+
# Get provider configuration
|
40
|
+
provider_config = get_provider_config(provider_name)
|
41
|
+
|
42
|
+
# Check if provider is configured and enabled
|
43
|
+
unless provider_config.configured?(options)
|
44
|
+
raise "Provider '#{provider_name}' is not configured"
|
45
|
+
end
|
46
|
+
|
47
|
+
unless provider_config.enabled?(options)
|
48
|
+
raise "Provider '#{provider_name}' is disabled"
|
49
|
+
end
|
50
|
+
|
51
|
+
# Get provider class
|
52
|
+
provider_class = get_provider_class(provider_name)
|
53
|
+
raise "Unknown provider: #{provider_name}" unless provider_class
|
54
|
+
|
55
|
+
# Create provider instance
|
56
|
+
provider_instance = provider_class.new
|
57
|
+
|
58
|
+
# Configure the provider instance
|
59
|
+
configure_provider(provider_instance, provider_config, options)
|
60
|
+
|
61
|
+
# Cache the instance
|
62
|
+
@provider_instances[cache_key] = provider_instance
|
63
|
+
|
64
|
+
provider_instance
|
65
|
+
end
|
66
|
+
|
67
|
+
# Create multiple provider instances
|
68
|
+
def create_providers(provider_names, options = {})
|
69
|
+
provider_names.map do |provider_name|
|
70
|
+
create_provider(provider_name, options)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Create all configured providers
|
75
|
+
def create_all_providers(options = {})
|
76
|
+
configured_providers = @config_manager.get_provider_names(options)
|
77
|
+
create_providers(configured_providers, options)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Create providers by priority
|
81
|
+
def create_providers_by_priority(options = {})
|
82
|
+
all_providers = @config_manager.get_all_providers(options)
|
83
|
+
|
84
|
+
# Sort by priority (lower number = higher priority)
|
85
|
+
sorted_providers = all_providers.sort_by do |name, config|
|
86
|
+
priority = config[:priority] || config["priority"] || 1
|
87
|
+
[priority, name]
|
88
|
+
end
|
89
|
+
|
90
|
+
sorted_providers.map do |name, _config|
|
91
|
+
create_provider(name, options)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Create providers by weight (for load balancing)
|
96
|
+
def create_providers_by_weight(options = {})
|
97
|
+
all_providers = @config_manager.get_all_providers(options)
|
98
|
+
weighted_providers = []
|
99
|
+
|
100
|
+
all_providers.each do |name, config|
|
101
|
+
weight = config[:weight] || config["weight"] || 1
|
102
|
+
weight.times { weighted_providers << name }
|
103
|
+
end
|
104
|
+
|
105
|
+
weighted_providers.shuffle.map do |name|
|
106
|
+
create_provider(name, options)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# Get provider configuration
|
111
|
+
def get_provider_config(provider_name)
|
112
|
+
@provider_configs[provider_name.to_s] ||= ProviderConfig.new(provider_name, @config_manager)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Get provider class
|
116
|
+
def get_provider_class(provider_name)
|
117
|
+
PROVIDER_CLASSES[provider_name.to_s]
|
118
|
+
end
|
119
|
+
|
120
|
+
# Check if provider is supported
|
121
|
+
def provider_supported?(provider_name)
|
122
|
+
PROVIDER_CLASSES.key?(provider_name.to_s)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Get supported provider names
|
126
|
+
def get_supported_providers
|
127
|
+
PROVIDER_CLASSES.keys
|
128
|
+
end
|
129
|
+
|
130
|
+
# Get configured provider names
|
131
|
+
def get_configured_providers(options = {})
|
132
|
+
@config_manager.get_provider_names(options)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Get enabled provider names
|
136
|
+
def get_enabled_providers(options = {})
|
137
|
+
configured_providers = get_configured_providers(options)
|
138
|
+
configured_providers.select do |provider_name|
|
139
|
+
provider_config = get_provider_config(provider_name)
|
140
|
+
provider_config.enabled?(options)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Get provider capabilities
|
145
|
+
def get_provider_capabilities(provider_name, options = {})
|
146
|
+
provider_config = get_provider_config(provider_name)
|
147
|
+
provider_config.get_capabilities(options)
|
148
|
+
end
|
149
|
+
|
150
|
+
# Check if provider supports feature
|
151
|
+
def provider_supports_feature?(provider_name, feature, options = {})
|
152
|
+
provider_config = get_provider_config(provider_name)
|
153
|
+
provider_config.supports_feature?(feature, options)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Get provider models
|
157
|
+
def get_provider_models(provider_name, options = {})
|
158
|
+
provider_config = get_provider_config(provider_name)
|
159
|
+
provider_config.get_models(options)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Get provider summary
|
163
|
+
def get_provider_summary(provider_name, options = {})
|
164
|
+
provider_config = get_provider_config(provider_name)
|
165
|
+
provider_config.get_summary(options)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Get all provider summaries
|
169
|
+
def get_all_provider_summaries(options = {})
|
170
|
+
configured_providers = get_configured_providers(options)
|
171
|
+
configured_providers.map do |provider_name|
|
172
|
+
get_provider_summary(provider_name, options)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# Validate provider configuration
|
177
|
+
def validate_provider_config(provider_name, options = {})
|
178
|
+
provider_config = get_provider_config(provider_name)
|
179
|
+
errors = []
|
180
|
+
|
181
|
+
# Check if provider is configured
|
182
|
+
unless provider_config.configured?(options)
|
183
|
+
errors << "Provider '#{provider_name}' is not configured"
|
184
|
+
return errors
|
185
|
+
end
|
186
|
+
|
187
|
+
# Check if provider is supported
|
188
|
+
unless provider_supported?(provider_name)
|
189
|
+
errors << "Provider '#{provider_name}' is not supported"
|
190
|
+
end
|
191
|
+
|
192
|
+
# Check required configuration
|
193
|
+
if provider_config.usage_based_provider?(options)
|
194
|
+
api_key = provider_config.get_api_key(options)
|
195
|
+
unless api_key && !api_key.empty?
|
196
|
+
errors << "API key not configured for provider '#{provider_name}'"
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Check models configuration
|
201
|
+
models = provider_config.get_models(options)
|
202
|
+
if models.empty?
|
203
|
+
errors << "No models configured for provider '#{provider_name}'"
|
204
|
+
end
|
205
|
+
|
206
|
+
errors
|
207
|
+
end
|
208
|
+
|
209
|
+
# Validate all provider configurations
|
210
|
+
def validate_all_provider_configs(options = {})
|
211
|
+
configured_providers = get_configured_providers(options)
|
212
|
+
all_errors = {}
|
213
|
+
|
214
|
+
configured_providers.each do |provider_name|
|
215
|
+
errors = validate_provider_config(provider_name, options)
|
216
|
+
all_errors[provider_name] = errors unless errors.empty?
|
217
|
+
end
|
218
|
+
|
219
|
+
all_errors
|
220
|
+
end
|
221
|
+
|
222
|
+
# Clear provider cache
|
223
|
+
def clear_cache
|
224
|
+
@provider_instances.clear
|
225
|
+
@provider_configs.clear
|
226
|
+
end
|
227
|
+
|
228
|
+
# Reload configuration
|
229
|
+
def reload_config
|
230
|
+
clear_cache
|
231
|
+
@config_manager.reload_config
|
232
|
+
end
|
233
|
+
|
234
|
+
private
|
235
|
+
|
236
|
+
def configure_provider(provider_instance, provider_config, options)
|
237
|
+
# Set basic configuration
|
238
|
+
if provider_instance.respond_to?(:configure)
|
239
|
+
provider_instance.configure(provider_config.get_config(options))
|
240
|
+
end
|
241
|
+
|
242
|
+
# Set harness context if available
|
243
|
+
if provider_instance.respond_to?(:set_harness_context)
|
244
|
+
# This would be set by the harness runner
|
245
|
+
# provider_instance.set_harness_context(harness_runner)
|
246
|
+
end
|
247
|
+
|
248
|
+
# Set monitoring configuration
|
249
|
+
monitoring_config = provider_config.get_monitoring_config(options)
|
250
|
+
if provider_instance.respond_to?(:set_monitoring_config)
|
251
|
+
provider_instance.set_monitoring_config(monitoring_config)
|
252
|
+
end
|
253
|
+
|
254
|
+
# Set rate limiting configuration
|
255
|
+
rate_limit_config = provider_config.get_rate_limit_config(options)
|
256
|
+
if provider_instance.respond_to?(:set_rate_limit_config)
|
257
|
+
provider_instance.set_rate_limit_config(rate_limit_config)
|
258
|
+
end
|
259
|
+
|
260
|
+
# Set retry configuration
|
261
|
+
retry_config = provider_config.get_retry_config(options)
|
262
|
+
if provider_instance.respond_to?(:set_retry_config)
|
263
|
+
provider_instance.set_retry_config(retry_config)
|
264
|
+
end
|
265
|
+
|
266
|
+
# Set circuit breaker configuration
|
267
|
+
circuit_breaker_config = provider_config.get_circuit_breaker_config(options)
|
268
|
+
if provider_instance.respond_to?(:set_circuit_breaker_config)
|
269
|
+
provider_instance.set_circuit_breaker_config(circuit_breaker_config)
|
270
|
+
end
|
271
|
+
|
272
|
+
# Set cost configuration
|
273
|
+
cost_config = provider_config.get_cost_config(options)
|
274
|
+
if provider_instance.respond_to?(:set_cost_config)
|
275
|
+
provider_instance.set_cost_config(cost_config)
|
276
|
+
end
|
277
|
+
|
278
|
+
# Set health check configuration
|
279
|
+
health_check_config = provider_config.get_health_check_config(options)
|
280
|
+
if provider_instance.respond_to?(:set_health_check_config)
|
281
|
+
provider_instance.set_health_check_config(health_check_config)
|
282
|
+
end
|
283
|
+
|
284
|
+
# Set log configuration
|
285
|
+
log_config = provider_config.get_log_config(options)
|
286
|
+
if provider_instance.respond_to?(:set_log_config)
|
287
|
+
provider_instance.set_log_config(log_config)
|
288
|
+
end
|
289
|
+
|
290
|
+
# Set cache configuration
|
291
|
+
cache_config = provider_config.get_cache_config(options)
|
292
|
+
if provider_instance.respond_to?(:set_cache_config)
|
293
|
+
provider_instance.set_cache_config(cache_config)
|
294
|
+
end
|
295
|
+
|
296
|
+
# Set security configuration
|
297
|
+
security_config = provider_config.get_security_config(options)
|
298
|
+
if provider_instance.respond_to?(:set_security_config)
|
299
|
+
provider_instance.set_security_config(security_config)
|
300
|
+
end
|
301
|
+
|
302
|
+
provider_instance
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|