aidp 0.3.0 → 0.5.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +59 -4
  3. data/lib/aidp/analyze/agent_personas.rb +1 -1
  4. data/lib/aidp/analyze/database.rb +99 -82
  5. data/lib/aidp/analyze/error_handler.rb +12 -76
  6. data/lib/aidp/analyze/focus_guidance.rb +2 -2
  7. data/lib/aidp/analyze/metrics_storage.rb +336 -0
  8. data/lib/aidp/analyze/prioritizer.rb +2 -2
  9. data/lib/aidp/analyze/ruby_maat_integration.rb +6 -102
  10. data/lib/aidp/analyze/runner.rb +107 -191
  11. data/lib/aidp/analyze/steps.rb +29 -30
  12. data/lib/aidp/analyze/storage.rb +233 -171
  13. data/lib/aidp/cli/jobs_command.rb +489 -0
  14. data/lib/aidp/cli/terminal_io.rb +52 -0
  15. data/lib/aidp/cli.rb +104 -45
  16. data/lib/aidp/core_ext/class_attribute.rb +36 -0
  17. data/lib/aidp/database/pg_adapter.rb +148 -0
  18. data/lib/aidp/database_config.rb +69 -0
  19. data/lib/aidp/database_connection.rb +72 -0
  20. data/lib/aidp/database_migration.rb +158 -0
  21. data/lib/aidp/execute/runner.rb +65 -92
  22. data/lib/aidp/execute/steps.rb +81 -82
  23. data/lib/aidp/job_manager.rb +41 -0
  24. data/lib/aidp/jobs/base_job.rb +47 -0
  25. data/lib/aidp/jobs/provider_execution_job.rb +96 -0
  26. data/lib/aidp/provider_manager.rb +25 -0
  27. data/lib/aidp/providers/agent_supervisor.rb +348 -0
  28. data/lib/aidp/providers/anthropic.rb +166 -3
  29. data/lib/aidp/providers/base.rb +153 -6
  30. data/lib/aidp/providers/cursor.rb +247 -43
  31. data/lib/aidp/providers/gemini.rb +166 -3
  32. data/lib/aidp/providers/supervised_base.rb +317 -0
  33. data/lib/aidp/providers/supervised_cursor.rb +22 -0
  34. data/lib/aidp/version.rb +1 -1
  35. data/lib/aidp.rb +25 -34
  36. data/templates/ANALYZE/01_REPOSITORY_ANALYSIS.md +4 -4
  37. metadata +72 -35
@@ -0,0 +1,317 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "agent_supervisor"
4
+
5
+ module Aidp
6
+ module Providers
7
+ # Base class for providers that use the agent supervisor
8
+ class SupervisedBase
9
+ # Timeout constants are now configurable via environment variables for flexibility
10
+ DEFAULT_TIMEOUT = Integer(ENV.fetch("AIDP_DEFAULT_TIMEOUT", "300")) # 5 minutes for general operations
11
+ QUICK_MODE_TIMEOUT = Integer(ENV.fetch("AIDP_QUICK_MODE_TIMEOUT", "120")) # 2 minutes for testing
12
+ REPOSITORY_ANALYSIS_TIMEOUT = Integer(ENV.fetch("AIDP_REPOSITORY_ANALYSIS_TIMEOUT", "180")) # 3 minutes
13
+ ARCHITECTURE_ANALYSIS_TIMEOUT = Integer(ENV.fetch("AIDP_ARCHITECTURE_ANALYSIS_TIMEOUT", "600")) # 10 minutes
14
+ TEST_ANALYSIS_TIMEOUT = Integer(ENV.fetch("AIDP_TEST_ANALYSIS_TIMEOUT", "300")) # 5 minutes
15
+ FUNCTIONALITY_ANALYSIS_TIMEOUT = Integer(ENV.fetch("AIDP_FUNCTIONALITY_ANALYSIS_TIMEOUT", "600")) # 10 minutes
16
+ DOCUMENTATION_ANALYSIS_TIMEOUT = Integer(ENV.fetch("AIDP_DOCUMENTATION_ANALYSIS_TIMEOUT", "300")) # 5 minutes
17
+ STATIC_ANALYSIS_TIMEOUT = Integer(ENV.fetch("AIDP_STATIC_ANALYSIS_TIMEOUT", "450")) # 7.5 minutes
18
+ REFACTORING_RECOMMENDATIONS_TIMEOUT = Integer(ENV.fetch("AIDP_REFACTORING_RECOMMENDATIONS_TIMEOUT", "600")) # 10 minutes
19
+ ADAPTIVE_TIMEOUT_BUFFER = Float(ENV.fetch("AIDP_ADAPTIVE_TIMEOUT_BUFFER", "1.2")) # 20% buffer for adaptive timeouts
20
+ attr_reader :name, :last_execution_result, :metrics
21
+
22
+ def initialize
23
+ @last_execution_result = nil
24
+ @metrics = {
25
+ total_executions: 0,
26
+ successful_executions: 0,
27
+ timeout_count: 0,
28
+ failure_count: 0,
29
+ average_duration: 0.0,
30
+ total_duration: 0.0
31
+ }
32
+ @job_context = nil
33
+ end
34
+
35
+ # Abstract method - must be implemented by subclasses
36
+ def command
37
+ raise NotImplementedError, "#{self.class} must implement #command"
38
+ end
39
+
40
+ # Abstract method - must be implemented by subclasses
41
+ def provider_name
42
+ raise NotImplementedError, "#{self.class} must implement #provider_name"
43
+ end
44
+
45
+ # Set job context for background execution
46
+ def set_job_context(job_id:, execution_id:, job_manager:)
47
+ @job_context = {
48
+ job_id: job_id,
49
+ execution_id: execution_id,
50
+ job_manager: job_manager
51
+ }
52
+ end
53
+
54
+ # Execute with supervision and recovery
55
+ def send(prompt:, session: nil)
56
+ timeout_seconds = calculate_timeout
57
+ debug = ENV["AIDP_DEBUG"] == "1"
58
+
59
+ log_info("Executing with #{provider_name} provider (timeout: #{timeout_seconds}s)")
60
+
61
+ # Create supervisor
62
+ supervisor = AgentSupervisor.new(
63
+ command,
64
+ timeout_seconds: timeout_seconds,
65
+ debug: debug
66
+ )
67
+
68
+ begin
69
+ # Execute with supervision
70
+ result = supervisor.execute(prompt)
71
+
72
+ # Update metrics
73
+ update_metrics(supervisor, result)
74
+
75
+ # Store result for debugging
76
+ @last_execution_result = result
77
+
78
+ if result[:success]
79
+ log_info("#{provider_name} completed successfully in #{format_duration(result[:duration])}")
80
+ result[:output]
81
+ else
82
+ handle_execution_failure(result, supervisor)
83
+ end
84
+ rescue => e
85
+ log_error("#{provider_name} execution error: #{e.message}")
86
+
87
+ # Try to kill the process if it's still running
88
+ supervisor.kill! if supervisor.active?
89
+
90
+ raise
91
+ end
92
+ end
93
+
94
+ # Get execution statistics
95
+ def stats
96
+ @metrics.dup
97
+ end
98
+
99
+ # Reset statistics
100
+ def reset_stats!
101
+ @metrics = {
102
+ total_executions: 0,
103
+ successful_executions: 0,
104
+ timeout_count: 0,
105
+ failure_count: 0,
106
+ average_duration: 0.0,
107
+ total_duration: 0.0
108
+ }
109
+ end
110
+
111
+ # Check if provider supports activity monitoring
112
+ def supports_activity_monitoring?
113
+ true # Supervised providers always support activity monitoring
114
+ end
115
+
116
+ # Get activity summary for metrics (compatibility with old interface)
117
+ def activity_summary
118
+ return {} unless @last_execution_result
119
+
120
+ {
121
+ provider: provider_name,
122
+ step_name: ENV["AIDP_CURRENT_STEP"],
123
+ start_time: @last_execution_result[:start_time],
124
+ end_time: @last_execution_result[:end_time],
125
+ duration: @last_execution_result[:duration],
126
+ final_state: @last_execution_result[:state],
127
+ stuck_detected: false, # Supervisor handles this differently
128
+ output_count: @last_execution_result[:output_count] || 0
129
+ }
130
+ end
131
+
132
+ # Compatibility methods for old activity monitoring interface
133
+ def setup_activity_monitoring(step_name, callback = nil, timeout = nil)
134
+ # No-op for supervised providers - supervisor handles this
135
+ end
136
+
137
+ def record_activity(message = nil)
138
+ # No-op for supervised providers - supervisor handles this
139
+ end
140
+
141
+ def mark_completed
142
+ # No-op for supervised providers - supervisor handles this
143
+ end
144
+
145
+ def mark_failed(message = nil)
146
+ # No-op for supervised providers - supervisor handles this
147
+ end
148
+
149
+ private
150
+
151
+ def calculate_timeout
152
+ # Priority order for timeout calculation:
153
+ # 1. Quick mode (for testing)
154
+ # 2. Environment variable override
155
+ # 3. Adaptive timeout based on step type
156
+ # 4. Default timeout
157
+
158
+ if ENV["AIDP_QUICK_MODE"]
159
+ log_info("Quick mode enabled - #{QUICK_MODE_TIMEOUT / 60} minute timeout")
160
+ return QUICK_MODE_TIMEOUT
161
+ end
162
+
163
+ provider_timeout_var = "AIDP_#{provider_name.upcase}_TIMEOUT"
164
+ if ENV[provider_timeout_var]
165
+ return ENV[provider_timeout_var].to_i
166
+ end
167
+
168
+ # Adaptive timeout based on step type
169
+ step_timeout = get_adaptive_timeout
170
+ if step_timeout
171
+ log_info("Using adaptive timeout: #{step_timeout} seconds")
172
+ return step_timeout
173
+ end
174
+
175
+ # Default timeout for interactive use
176
+ log_info("Using default timeout: #{DEFAULT_TIMEOUT / 60} minutes")
177
+ DEFAULT_TIMEOUT
178
+ end
179
+
180
+ def get_adaptive_timeout
181
+ # Try to get timeout recommendations from metrics storage
182
+ begin
183
+ require_relative "../analyze/metrics_storage"
184
+ storage = Aidp::Analyze::MetricsStorage.new(Dir.pwd)
185
+ recommendations = storage.calculate_timeout_recommendations
186
+
187
+ # Get current step name from environment or context
188
+ step_name = ENV["AIDP_CURRENT_STEP"] || "unknown"
189
+
190
+ if recommendations[step_name]
191
+ recommended = recommendations[step_name][:recommended_timeout]
192
+ # Add buffer for safety
193
+ return (recommended * ADAPTIVE_TIMEOUT_BUFFER).ceil
194
+ end
195
+ rescue => e
196
+ log_warning("Could not get adaptive timeout: #{e.message}") if ENV["AIDP_DEBUG"]
197
+ end
198
+
199
+ # Fallback timeouts based on step type patterns
200
+ step_name = ENV["AIDP_CURRENT_STEP"] || ""
201
+
202
+ case step_name
203
+ when /REPOSITORY_ANALYSIS/
204
+ REPOSITORY_ANALYSIS_TIMEOUT
205
+ when /ARCHITECTURE_ANALYSIS/
206
+ ARCHITECTURE_ANALYSIS_TIMEOUT
207
+ when /TEST_ANALYSIS/
208
+ TEST_ANALYSIS_TIMEOUT
209
+ when /FUNCTIONALITY_ANALYSIS/
210
+ FUNCTIONALITY_ANALYSIS_TIMEOUT
211
+ when /DOCUMENTATION_ANALYSIS/
212
+ DOCUMENTATION_ANALYSIS_TIMEOUT
213
+ when /STATIC_ANALYSIS/
214
+ STATIC_ANALYSIS_TIMEOUT
215
+ when /REFACTORING_RECOMMENDATIONS/
216
+ REFACTORING_RECOMMENDATIONS_TIMEOUT
217
+ else
218
+ nil # Use default
219
+ end
220
+ end
221
+
222
+ def update_metrics(supervisor, result)
223
+ @metrics[:total_executions] += 1
224
+ @metrics[:total_duration] += supervisor.duration
225
+ @metrics[:average_duration] = @metrics[:total_duration] / @metrics[:total_executions]
226
+
227
+ case result[:state]
228
+ when :completed
229
+ @metrics[:successful_executions] += 1
230
+ when :timeout
231
+ @metrics[:timeout_count] += 1
232
+ when :failed, :killed
233
+ @metrics[:failure_count] += 1
234
+ end
235
+
236
+ # Log metrics update if in job context
237
+ if @job_context
238
+ @job_context[:job_manager].log_message(
239
+ @job_context[:job_id],
240
+ @job_context[:execution_id],
241
+ "Updated execution metrics",
242
+ "debug",
243
+ @metrics
244
+ )
245
+ end
246
+ end
247
+
248
+ def handle_execution_failure(result, supervisor)
249
+ case result[:reason]
250
+ when "user_aborted"
251
+ message = "#{provider_name} was aborted by user after #{format_duration(result[:duration])}"
252
+ log_error(message)
253
+ raise Interrupt, message
254
+ when "non_zero_exit"
255
+ error_msg = result[:error_output].empty? ? "Unknown error" : result[:error_output].strip
256
+ message = "#{provider_name} failed with exit code #{result[:exit_code]}: #{error_msg}"
257
+ log_error(message)
258
+ raise message
259
+ else
260
+ message = "#{provider_name} failed: #{result[:reason] || "Unknown error"}"
261
+ log_error(message)
262
+ raise message
263
+ end
264
+ end
265
+
266
+ def format_duration(seconds)
267
+ minutes = (seconds / 60).to_i
268
+ secs = (seconds % 60).to_i
269
+
270
+ if minutes > 0
271
+ "#{minutes}m #{secs}s"
272
+ else
273
+ "#{secs}s"
274
+ end
275
+ end
276
+
277
+ def log_info(message)
278
+ if @job_context
279
+ @job_context[:job_manager].log_message(
280
+ @job_context[:job_id],
281
+ @job_context[:execution_id],
282
+ message,
283
+ "info"
284
+ )
285
+ else
286
+ puts message
287
+ end
288
+ end
289
+
290
+ def log_warning(message)
291
+ if @job_context
292
+ @job_context[:job_manager].log_message(
293
+ @job_context[:job_id],
294
+ @job_context[:execution_id],
295
+ message,
296
+ "warning"
297
+ )
298
+ else
299
+ puts "⚠️ #{message}"
300
+ end
301
+ end
302
+
303
+ def log_error(message)
304
+ if @job_context
305
+ @job_context[:job_manager].log_message(
306
+ @job_context[:job_id],
307
+ @job_context[:execution_id],
308
+ message,
309
+ "error"
310
+ )
311
+ else
312
+ puts "❌ #{message}"
313
+ end
314
+ end
315
+ end
316
+ end
317
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "supervised_base"
4
+ require_relative "../util"
5
+
6
+ module Aidp
7
+ module Providers
8
+ class SupervisedCursor < SupervisedBase
9
+ def self.available?
10
+ !!Aidp::Util.which("cursor-agent")
11
+ end
12
+
13
+ def provider_name
14
+ "cursor"
15
+ end
16
+
17
+ def command
18
+ ["cursor-agent", "-p"]
19
+ end
20
+ end
21
+ end
22
+ end
data/lib/aidp/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aidp
4
- VERSION = "0.3.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/aidp.rb CHANGED
@@ -1,53 +1,44 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Core extensions
4
+ require "aidp/core_ext/class_attribute"
5
+
3
6
  # Shared modules
4
7
  require "aidp/version"
5
8
  require "aidp/config"
6
9
  require "aidp/workspace"
7
10
  require "aidp/util"
8
11
  require "aidp/cli"
12
+ require "aidp/cli/jobs_command"
9
13
  require "aidp/project_detector"
10
14
  require "aidp/sync"
15
+
16
+ # Database
17
+ require "aidp/database_connection"
18
+
19
+ # Job infrastructure
20
+ require "aidp/job_manager"
21
+ require "aidp/jobs/base_job"
22
+ require "aidp/jobs/provider_execution_job"
23
+
24
+ # Providers
11
25
  require "aidp/providers/base"
12
26
  require "aidp/providers/cursor"
13
27
  require "aidp/providers/anthropic"
14
28
  require "aidp/providers/gemini"
15
29
  require "aidp/providers/macos_ui"
30
+ require "aidp/provider_manager"
16
31
 
17
- # Execute mode modules
18
- require "aidp/execute/steps"
19
- require "aidp/execute/runner"
20
- require "aidp/execute/progress"
21
-
22
- # Analyze mode modules
23
- require "aidp/analyze/steps"
32
+ # Analyze mode
33
+ require "aidp/analyze/error_handler"
34
+ require "aidp/analyze/parallel_processor"
35
+ require "aidp/analyze/repository_chunker"
36
+ require "aidp/analyze/ruby_maat_integration"
24
37
  require "aidp/analyze/runner"
38
+ require "aidp/analyze/steps"
25
39
  require "aidp/analyze/progress"
26
- require "aidp/analyze/dependencies"
27
- require "aidp/analyze/storage"
28
- require "aidp/analyze/prioritizer"
29
- require "aidp/analyze/database"
30
- require "aidp/analyze/ruby_maat_integration"
31
- require "aidp/analyze/feature_analyzer"
32
- require "aidp/analyze/focus_guidance"
33
- require "aidp/analyze/agent_personas"
34
- require "aidp/analyze/agent_tool_executor"
35
- require "aidp/analyze/static_analysis_detector"
36
- require "aidp/analyze/tool_configuration"
37
- require "aidp/analyze/tool_modernization"
38
- require "aidp/analyze/language_analysis_strategies"
39
- require "aidp/analyze/report_generator"
40
- require "aidp/analyze/export_manager"
41
- require "aidp/analyze/incremental_analyzer"
42
- require "aidp/analyze/progress_visualizer"
43
- require "aidp/analyze/data_retention_manager"
44
- require "aidp/analyze/repository_chunker"
45
- require "aidp/analyze/parallel_processor"
46
- require "aidp/analyze/memory_manager"
47
- require "aidp/analyze/large_analysis_progress"
48
- require "aidp/analyze/performance_optimizer"
49
- require "aidp/analyze/error_handler"
50
40
 
51
- module Aidp
52
- class Error < StandardError; end
53
- end
41
+ # Execute mode
42
+ require "aidp/execute/steps"
43
+ require "aidp/execute/runner"
44
+ require "aidp/execute/progress"
@@ -13,7 +13,7 @@ You are a **Repository Analyst**, an expert in version control analysis and code
13
13
 
14
14
  ## Analysis Objectives
15
15
 
16
- 1. **Repository Mining**: Use Code Maat to analyze repository activity
16
+ 1. **Repository Mining**: Use ruby-maat gem to analyze repository activity
17
17
  2. **Churn Analysis**: Identify high-activity areas that may indicate technical debt
18
18
  3. **Coupling Analysis**: Understand dependencies between modules/components
19
19
  4. **Authorship Patterns**: Analyze code ownership and knowledge distribution
@@ -21,10 +21,10 @@ You are a **Repository Analyst**, an expert in version control analysis and code
21
21
 
22
22
  ## Required Analysis Steps
23
23
 
24
- ### 1. Code Maat Integration
24
+ ### 1. Ruby Maat Integration
25
25
 
26
- - Check if Docker is available for Code Maat analysis
27
- - Run Code Maat analysis for the repository
26
+ - Use the ruby-maat gem for repository analysis (no Docker required)
27
+ - Run ruby-maat analysis for the repository
28
28
  - Parse and interpret the results
29
29
 
30
30
  ### 2. Repository Activity Analysis
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aidp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bart Agapinan
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-08-18 00:00:00.000000000 Z
10
+ date: 2025-08-24 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: colorize
@@ -66,25 +66,47 @@ dependencies:
66
66
  - !ruby/object:Gem::Version
67
67
  version: '1.5'
68
68
  - !ruby/object:Gem::Dependency
69
- name: sqlite3
69
+ name: pg
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '1.6'
75
- - - "<"
74
+ version: '1.5'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.5'
82
+ - !ruby/object:Gem::Dependency
83
+ name: que
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
76
87
  - !ruby/object:Gem::Version
77
- version: '3.0'
88
+ version: '2.4'
78
89
  type: :runtime
79
90
  prerelease: false
80
91
  version_requirements: !ruby/object:Gem::Requirement
81
92
  requirements:
82
- - - ">="
93
+ - - "~>"
83
94
  - !ruby/object:Gem::Version
84
- version: '1.6'
85
- - - "<"
95
+ version: '2.4'
96
+ - !ruby/object:Gem::Dependency
97
+ name: sequel
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
86
101
  - !ruby/object:Gem::Version
87
- version: '3.0'
102
+ version: '5.77'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '5.77'
88
110
  - !ruby/object:Gem::Dependency
89
111
  name: thor
90
112
  requirement: !ruby/object:Gem::Requirement
@@ -100,103 +122,103 @@ dependencies:
100
122
  - !ruby/object:Gem::Version
101
123
  version: '1.3'
102
124
  - !ruby/object:Gem::Dependency
103
- name: tty-progressbar
125
+ name: tty-box
104
126
  requirement: !ruby/object:Gem::Requirement
105
127
  requirements:
106
128
  - - "~>"
107
129
  - !ruby/object:Gem::Version
108
- version: '0.18'
130
+ version: '0.7'
109
131
  type: :runtime
110
132
  prerelease: false
111
133
  version_requirements: !ruby/object:Gem::Requirement
112
134
  requirements:
113
135
  - - "~>"
114
136
  - !ruby/object:Gem::Version
115
- version: '0.18'
137
+ version: '0.7'
116
138
  - !ruby/object:Gem::Dependency
117
- name: tty-prompt
139
+ name: tty-cursor
118
140
  requirement: !ruby/object:Gem::Requirement
119
141
  requirements:
120
142
  - - "~>"
121
143
  - !ruby/object:Gem::Version
122
- version: '0.23'
144
+ version: '0.7'
123
145
  type: :runtime
124
146
  prerelease: false
125
147
  version_requirements: !ruby/object:Gem::Requirement
126
148
  requirements:
127
149
  - - "~>"
128
150
  - !ruby/object:Gem::Version
129
- version: '0.23'
151
+ version: '0.7'
130
152
  - !ruby/object:Gem::Dependency
131
- name: tty-spinner
153
+ name: tty-progressbar
132
154
  requirement: !ruby/object:Gem::Requirement
133
155
  requirements:
134
156
  - - "~>"
135
157
  - !ruby/object:Gem::Version
136
- version: '0.9'
158
+ version: '0.18'
137
159
  type: :runtime
138
160
  prerelease: false
139
161
  version_requirements: !ruby/object:Gem::Requirement
140
162
  requirements:
141
163
  - - "~>"
142
164
  - !ruby/object:Gem::Version
143
- version: '0.9'
165
+ version: '0.18'
144
166
  - !ruby/object:Gem::Dependency
145
- name: tty-table
167
+ name: tty-prompt
146
168
  requirement: !ruby/object:Gem::Requirement
147
169
  requirements:
148
170
  - - "~>"
149
171
  - !ruby/object:Gem::Version
150
- version: '0.12'
172
+ version: '0.23'
151
173
  type: :runtime
152
174
  prerelease: false
153
175
  version_requirements: !ruby/object:Gem::Requirement
154
176
  requirements:
155
177
  - - "~>"
156
178
  - !ruby/object:Gem::Version
157
- version: '0.12'
179
+ version: '0.23'
158
180
  - !ruby/object:Gem::Dependency
159
- name: rake
181
+ name: tty-screen
160
182
  requirement: !ruby/object:Gem::Requirement
161
183
  requirements:
162
184
  - - "~>"
163
185
  - !ruby/object:Gem::Version
164
- version: '13.0'
165
- type: :development
186
+ version: '0.8'
187
+ type: :runtime
166
188
  prerelease: false
167
189
  version_requirements: !ruby/object:Gem::Requirement
168
190
  requirements:
169
191
  - - "~>"
170
192
  - !ruby/object:Gem::Version
171
- version: '13.0'
193
+ version: '0.8'
172
194
  - !ruby/object:Gem::Dependency
173
- name: rspec
195
+ name: tty-spinner
174
196
  requirement: !ruby/object:Gem::Requirement
175
197
  requirements:
176
198
  - - "~>"
177
199
  - !ruby/object:Gem::Version
178
- version: '3.12'
179
- type: :development
200
+ version: '0.9'
201
+ type: :runtime
180
202
  prerelease: false
181
203
  version_requirements: !ruby/object:Gem::Requirement
182
204
  requirements:
183
205
  - - "~>"
184
206
  - !ruby/object:Gem::Version
185
- version: '3.12'
207
+ version: '0.9'
186
208
  - !ruby/object:Gem::Dependency
187
- name: standard
209
+ name: tty-table
188
210
  requirement: !ruby/object:Gem::Requirement
189
211
  requirements:
190
212
  - - "~>"
191
213
  - !ruby/object:Gem::Version
192
- version: '1.0'
193
- type: :development
214
+ version: '0.12'
215
+ type: :runtime
194
216
  prerelease: false
195
217
  version_requirements: !ruby/object:Gem::Requirement
196
218
  requirements:
197
219
  - - "~>"
198
220
  - !ruby/object:Gem::Version
199
- version: '1.0'
221
+ version: '0.12'
200
222
  description: The AI-Dev-Pipeline (AIDP) CLI provides a powerful, markdown-driven workflow
201
223
  for software development. It supports in-depth project analysis to understand existing
202
224
  codebases and an execution mode to systematically implement new features.
@@ -224,6 +246,7 @@ files:
224
246
  - lib/aidp/analyze/language_analysis_strategies.rb
225
247
  - lib/aidp/analyze/large_analysis_progress.rb
226
248
  - lib/aidp/analyze/memory_manager.rb
249
+ - lib/aidp/analyze/metrics_storage.rb
227
250
  - lib/aidp/analyze/parallel_processor.rb
228
251
  - lib/aidp/analyze/performance_optimizer.rb
229
252
  - lib/aidp/analyze/prioritizer.rb
@@ -239,16 +262,30 @@ files:
239
262
  - lib/aidp/analyze/tool_configuration.rb
240
263
  - lib/aidp/analyze/tool_modernization.rb
241
264
  - lib/aidp/cli.rb
265
+ - lib/aidp/cli/jobs_command.rb
266
+ - lib/aidp/cli/terminal_io.rb
242
267
  - lib/aidp/config.rb
268
+ - lib/aidp/core_ext/class_attribute.rb
269
+ - lib/aidp/database/pg_adapter.rb
270
+ - lib/aidp/database_config.rb
271
+ - lib/aidp/database_connection.rb
272
+ - lib/aidp/database_migration.rb
243
273
  - lib/aidp/execute/progress.rb
244
274
  - lib/aidp/execute/runner.rb
245
275
  - lib/aidp/execute/steps.rb
276
+ - lib/aidp/job_manager.rb
277
+ - lib/aidp/jobs/base_job.rb
278
+ - lib/aidp/jobs/provider_execution_job.rb
246
279
  - lib/aidp/project_detector.rb
280
+ - lib/aidp/provider_manager.rb
281
+ - lib/aidp/providers/agent_supervisor.rb
247
282
  - lib/aidp/providers/anthropic.rb
248
283
  - lib/aidp/providers/base.rb
249
284
  - lib/aidp/providers/cursor.rb
250
285
  - lib/aidp/providers/gemini.rb
251
286
  - lib/aidp/providers/macos_ui.rb
287
+ - lib/aidp/providers/supervised_base.rb
288
+ - lib/aidp/providers/supervised_cursor.rb
252
289
  - lib/aidp/sync.rb
253
290
  - lib/aidp/util.rb
254
291
  - lib/aidp/version.rb