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.
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 +1 -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,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