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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +128 -151
  3. data/bin/aidp +1 -1
  4. data/lib/aidp/analysis/kb_inspector.rb +471 -0
  5. data/lib/aidp/analysis/seams.rb +159 -0
  6. data/lib/aidp/analysis/tree_sitter_grammar_loader.rb +480 -0
  7. data/lib/aidp/analysis/tree_sitter_scan.rb +686 -0
  8. data/lib/aidp/analyze/error_handler.rb +2 -78
  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/analyze/steps.rb +6 -0
  15. data/lib/aidp/cli/jobs_command.rb +103 -435
  16. data/lib/aidp/cli.rb +317 -191
  17. data/lib/aidp/config.rb +298 -10
  18. data/lib/aidp/debug_logger.rb +195 -0
  19. data/lib/aidp/debug_mixin.rb +187 -0
  20. data/lib/aidp/execute/progress.rb +9 -0
  21. data/lib/aidp/execute/runner.rb +221 -40
  22. data/lib/aidp/execute/steps.rb +17 -7
  23. data/lib/aidp/execute/workflow_selector.rb +211 -0
  24. data/lib/aidp/harness/completion_checker.rb +268 -0
  25. data/lib/aidp/harness/condition_detector.rb +1526 -0
  26. data/lib/aidp/harness/config_loader.rb +373 -0
  27. data/lib/aidp/harness/config_manager.rb +382 -0
  28. data/lib/aidp/harness/config_schema.rb +1006 -0
  29. data/lib/aidp/harness/config_validator.rb +355 -0
  30. data/lib/aidp/harness/configuration.rb +477 -0
  31. data/lib/aidp/harness/enhanced_runner.rb +494 -0
  32. data/lib/aidp/harness/error_handler.rb +616 -0
  33. data/lib/aidp/harness/provider_config.rb +423 -0
  34. data/lib/aidp/harness/provider_factory.rb +306 -0
  35. data/lib/aidp/harness/provider_manager.rb +1269 -0
  36. data/lib/aidp/harness/provider_type_checker.rb +88 -0
  37. data/lib/aidp/harness/runner.rb +411 -0
  38. data/lib/aidp/harness/state/errors.rb +28 -0
  39. data/lib/aidp/harness/state/metrics.rb +219 -0
  40. data/lib/aidp/harness/state/persistence.rb +128 -0
  41. data/lib/aidp/harness/state/provider_state.rb +132 -0
  42. data/lib/aidp/harness/state/ui_state.rb +68 -0
  43. data/lib/aidp/harness/state/workflow_state.rb +123 -0
  44. data/lib/aidp/harness/state_manager.rb +586 -0
  45. data/lib/aidp/harness/status_display.rb +888 -0
  46. data/lib/aidp/harness/ui/base.rb +16 -0
  47. data/lib/aidp/harness/ui/enhanced_tui.rb +545 -0
  48. data/lib/aidp/harness/ui/enhanced_workflow_selector.rb +252 -0
  49. data/lib/aidp/harness/ui/error_handler.rb +132 -0
  50. data/lib/aidp/harness/ui/frame_manager.rb +361 -0
  51. data/lib/aidp/harness/ui/job_monitor.rb +500 -0
  52. data/lib/aidp/harness/ui/navigation/main_menu.rb +311 -0
  53. data/lib/aidp/harness/ui/navigation/menu_formatter.rb +120 -0
  54. data/lib/aidp/harness/ui/navigation/menu_item.rb +142 -0
  55. data/lib/aidp/harness/ui/navigation/menu_state.rb +139 -0
  56. data/lib/aidp/harness/ui/navigation/submenu.rb +202 -0
  57. data/lib/aidp/harness/ui/navigation/workflow_selector.rb +176 -0
  58. data/lib/aidp/harness/ui/progress_display.rb +280 -0
  59. data/lib/aidp/harness/ui/question_collector.rb +141 -0
  60. data/lib/aidp/harness/ui/spinner_group.rb +184 -0
  61. data/lib/aidp/harness/ui/spinner_helper.rb +152 -0
  62. data/lib/aidp/harness/ui/status_manager.rb +312 -0
  63. data/lib/aidp/harness/ui/status_widget.rb +280 -0
  64. data/lib/aidp/harness/ui/workflow_controller.rb +312 -0
  65. data/lib/aidp/harness/user_interface.rb +2381 -0
  66. data/lib/aidp/provider_manager.rb +131 -7
  67. data/lib/aidp/providers/anthropic.rb +28 -109
  68. data/lib/aidp/providers/base.rb +170 -0
  69. data/lib/aidp/providers/cursor.rb +52 -183
  70. data/lib/aidp/providers/gemini.rb +24 -109
  71. data/lib/aidp/providers/macos_ui.rb +99 -5
  72. data/lib/aidp/providers/opencode.rb +194 -0
  73. data/lib/aidp/storage/csv_storage.rb +172 -0
  74. data/lib/aidp/storage/file_manager.rb +214 -0
  75. data/lib/aidp/storage/json_storage.rb +140 -0
  76. data/lib/aidp/version.rb +1 -1
  77. data/lib/aidp.rb +56 -35
  78. data/templates/ANALYZE/06a_tree_sitter_scan.md +217 -0
  79. data/templates/COMMON/AGENT_BASE.md +11 -0
  80. data/templates/EXECUTE/00_PRD.md +4 -4
  81. data/templates/EXECUTE/02_ARCHITECTURE.md +5 -4
  82. data/templates/EXECUTE/07_TEST_PLAN.md +4 -1
  83. data/templates/EXECUTE/08_TASKS.md +4 -4
  84. data/templates/EXECUTE/10_IMPLEMENTATION_AGENT.md +4 -4
  85. data/templates/README.md +279 -0
  86. data/templates/aidp-development.yml.example +373 -0
  87. data/templates/aidp-minimal.yml.example +48 -0
  88. data/templates/aidp-production.yml.example +475 -0
  89. data/templates/aidp.yml.example +598 -0
  90. metadata +106 -64
  91. data/lib/aidp/analyze/agent_personas.rb +0 -71
  92. data/lib/aidp/analyze/agent_tool_executor.rb +0 -445
  93. data/lib/aidp/analyze/data_retention_manager.rb +0 -426
  94. data/lib/aidp/analyze/database.rb +0 -260
  95. data/lib/aidp/analyze/dependencies.rb +0 -335
  96. data/lib/aidp/analyze/export_manager.rb +0 -425
  97. data/lib/aidp/analyze/focus_guidance.rb +0 -517
  98. data/lib/aidp/analyze/incremental_analyzer.rb +0 -543
  99. data/lib/aidp/analyze/language_analysis_strategies.rb +0 -897
  100. data/lib/aidp/analyze/large_analysis_progress.rb +0 -504
  101. data/lib/aidp/analyze/memory_manager.rb +0 -365
  102. data/lib/aidp/analyze/metrics_storage.rb +0 -336
  103. data/lib/aidp/analyze/parallel_processor.rb +0 -460
  104. data/lib/aidp/analyze/performance_optimizer.rb +0 -694
  105. data/lib/aidp/analyze/repository_chunker.rb +0 -704
  106. data/lib/aidp/analyze/static_analysis_detector.rb +0 -577
  107. data/lib/aidp/analyze/storage.rb +0 -662
  108. data/lib/aidp/analyze/tool_configuration.rb +0 -456
  109. data/lib/aidp/analyze/tool_modernization.rb +0 -750
  110. data/lib/aidp/database/pg_adapter.rb +0 -148
  111. data/lib/aidp/database_config.rb +0 -69
  112. data/lib/aidp/database_connection.rb +0 -72
  113. data/lib/aidp/database_migration.rb +0 -158
  114. data/lib/aidp/job_manager.rb +0 -41
  115. data/lib/aidp/jobs/base_job.rb +0 -47
  116. data/lib/aidp/jobs/provider_execution_job.rb +0 -96
  117. data/lib/aidp/project_detector.rb +0 -117
  118. data/lib/aidp/providers/agent_supervisor.rb +0 -348
  119. data/lib/aidp/providers/supervised_base.rb +0 -317
  120. data/lib/aidp/providers/supervised_cursor.rb +0 -22
  121. data/lib/aidp/sync.rb +0 -13
  122. 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