aidp 0.9.5 → 0.10.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aidp/analyze/error_handler.rb +4 -2
  3. data/lib/aidp/{analysis → analyze}/kb_inspector.rb +106 -89
  4. data/lib/aidp/analyze/prioritizer.rb +3 -2
  5. data/lib/aidp/analyze/ruby_maat_integration.rb +20 -3
  6. data/lib/aidp/analyze/runner.rb +27 -9
  7. data/lib/aidp/{analysis → analyze}/seams.rb +1 -1
  8. data/lib/aidp/analyze/steps.rb +7 -7
  9. data/lib/aidp/{analysis → analyze}/tree_sitter_grammar_loader.rb +22 -5
  10. data/lib/aidp/{analysis → analyze}/tree_sitter_scan.rb +32 -15
  11. data/lib/aidp/cli/first_run_wizard.rb +37 -28
  12. data/lib/aidp/cli/jobs_command.rb +37 -18
  13. data/lib/aidp/cli/terminal_io.rb +3 -3
  14. data/lib/aidp/cli.rb +131 -63
  15. data/lib/aidp/execute/runner.rb +27 -9
  16. data/lib/aidp/execute/steps.rb +18 -18
  17. data/lib/aidp/execute/workflow_selector.rb +36 -21
  18. data/lib/aidp/harness/enhanced_runner.rb +3 -3
  19. data/lib/aidp/harness/provider_factory.rb +3 -1
  20. data/lib/aidp/harness/provider_manager.rb +34 -15
  21. data/lib/aidp/harness/runner.rb +24 -5
  22. data/lib/aidp/harness/simple_user_interface.rb +19 -4
  23. data/lib/aidp/harness/status_display.rb +121 -104
  24. data/lib/aidp/harness/ui/enhanced_tui.rb +33 -5
  25. data/lib/aidp/harness/ui/error_handler.rb +3 -2
  26. data/lib/aidp/harness/ui/frame_manager.rb +52 -32
  27. data/lib/aidp/harness/ui/navigation/main_menu.rb +23 -14
  28. data/lib/aidp/harness/ui/progress_display.rb +28 -5
  29. data/lib/aidp/harness/ui/status_widget.rb +17 -8
  30. data/lib/aidp/harness/ui/workflow_controller.rb +25 -9
  31. data/lib/aidp/harness/user_interface.rb +341 -328
  32. data/lib/aidp/provider_manager.rb +10 -6
  33. data/lib/aidp/providers/anthropic.rb +3 -3
  34. data/lib/aidp/providers/base.rb +20 -1
  35. data/lib/aidp/providers/cursor.rb +6 -8
  36. data/lib/aidp/providers/gemini.rb +3 -3
  37. data/lib/aidp/providers/github_copilot.rb +264 -0
  38. data/lib/aidp/providers/opencode.rb +6 -8
  39. data/lib/aidp/version.rb +1 -1
  40. data/lib/aidp.rb +4 -4
  41. metadata +6 -6
  42. data/lib/aidp/analyze/progress_visualizer.rb +0 -314
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "tty-prompt"
3
4
  require_relative "harness/provider_factory"
4
5
 
5
6
  module Aidp
@@ -13,7 +14,8 @@ module Aidp
13
14
  end
14
15
 
15
16
  # Fallback to legacy method
16
- create_legacy_provider(provider_type)
17
+ prompt = options[:prompt] || TTY::Prompt.new
18
+ create_legacy_provider(provider_type, prompt: prompt)
17
19
  end
18
20
 
19
21
  def load_from_config(config = {}, options = {})
@@ -132,16 +134,18 @@ module Aidp
132
134
 
133
135
  private
134
136
 
135
- def create_legacy_provider(provider_type)
137
+ def create_legacy_provider(provider_type, prompt: TTY::Prompt.new)
136
138
  case provider_type
137
139
  when "cursor"
138
- Aidp::Providers::Cursor.new
140
+ Aidp::Providers::Cursor.new(prompt: prompt)
139
141
  when "anthropic"
140
- Aidp::Providers::Anthropic.new
142
+ Aidp::Providers::Anthropic.new(prompt: prompt)
141
143
  when "gemini"
142
- Aidp::Providers::Gemini.new
144
+ Aidp::Providers::Gemini.new(prompt: prompt)
143
145
  when "macos_ui"
144
- Aidp::Providers::MacOSUI.new
146
+ Aidp::Providers::MacOSUI.new(prompt: prompt)
147
+ when "github_copilot"
148
+ Aidp::Providers::GithubCopilot.new(prompt: prompt)
145
149
  end
146
150
  end
147
151
  end
@@ -58,7 +58,7 @@ module Aidp
58
58
  # 4. Default timeout
59
59
 
60
60
  if ENV["AIDP_QUICK_MODE"]
61
- puts "⚡ Quick mode enabled - 2 minute timeout"
61
+ display_message("⚡ Quick mode enabled - 2 minute timeout", type: :highlight)
62
62
  return 120
63
63
  end
64
64
 
@@ -69,12 +69,12 @@ module Aidp
69
69
  # Adaptive timeout based on step type
70
70
  step_timeout = get_adaptive_timeout
71
71
  if step_timeout
72
- puts "🧠 Using adaptive timeout: #{step_timeout} seconds"
72
+ display_message("🧠 Using adaptive timeout: #{step_timeout} seconds", type: :info)
73
73
  return step_timeout
74
74
  end
75
75
 
76
76
  # Default timeout (5 minutes for interactive use)
77
- puts "📋 Using default timeout: 5 minutes"
77
+ display_message("📋 Using default timeout: 5 minutes", type: :info)
78
78
  300
79
79
  end
80
80
 
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "tty-prompt"
4
+
3
5
  module Aidp
4
6
  module Providers
5
7
  class Base
@@ -17,7 +19,7 @@ module Aidp
17
19
 
18
20
  attr_reader :activity_state, :last_activity_time, :start_time, :step_name
19
21
 
20
- def initialize
22
+ def initialize(output: nil, prompt: TTY::Prompt.new)
21
23
  @activity_state = :idle
22
24
  @last_activity_time = Time.now
23
25
  @start_time = nil
@@ -28,6 +30,8 @@ module Aidp
28
30
  @last_output_time = Time.now
29
31
  @job_context = nil
30
32
  @harness_context = nil
33
+ @output = output
34
+ @prompt = prompt
31
35
  @harness_metrics = {
32
36
  total_requests: 0,
33
37
  successful_requests: 0,
@@ -327,6 +331,21 @@ module Aidp
327
331
  # Weighted health score
328
332
  (success_rate * 50) + ((1 - rate_limit_ratio) * 30) + (response_time_score * 0.2)
329
333
  end
334
+
335
+ private
336
+
337
+ def display_message(message, type: :info)
338
+ color = case type
339
+ when :error then :red
340
+ when :success then :green
341
+ when :warning then :yellow
342
+ when :info then :blue
343
+ when :highlight then :cyan
344
+ when :muted then :bright_black
345
+ else :white
346
+ end
347
+ @prompt.say(message, color: color)
348
+ end
330
349
  end
331
350
  end
332
351
  end
@@ -95,13 +95,11 @@ module Aidp
95
95
  else
96
96
  print "\r🔄 cursor-agent is running... (#{seconds}s)"
97
97
  end
98
- $stdout.flush
99
98
  end
100
99
 
101
100
  def clear_activity_status
102
101
  # Clear the activity status line
103
102
  print "\r" + " " * 50 + "\r"
104
- $stdout.flush
105
103
  end
106
104
 
107
105
  def calculate_timeout
@@ -112,7 +110,7 @@ module Aidp
112
110
  # 4. Default timeout
113
111
 
114
112
  if ENV["AIDP_QUICK_MODE"]
115
- puts "⚡ Quick mode enabled - 2 minute timeout"
113
+ display_message("⚡ Quick mode enabled - 2 minute timeout", type: :highlight)
116
114
  return 120
117
115
  end
118
116
 
@@ -123,12 +121,12 @@ module Aidp
123
121
  # Adaptive timeout based on step type
124
122
  step_timeout = get_adaptive_timeout
125
123
  if step_timeout
126
- puts "🧠 Using adaptive timeout: #{step_timeout} seconds"
124
+ display_message("🧠 Using adaptive timeout: #{step_timeout} seconds", type: :info)
127
125
  return step_timeout
128
126
  end
129
127
 
130
128
  # Default timeout (5 minutes for interactive use)
131
- puts "📋 Using default timeout: 5 minutes"
129
+ display_message("📋 Using default timeout: 5 minutes", type: :info)
132
130
  300
133
131
  end
134
132
 
@@ -161,11 +159,11 @@ module Aidp
161
159
  # Only print static messages for state changes
162
160
  case state
163
161
  when :stuck
164
- puts "\n⚠️ cursor appears stuck: #{message}"
162
+ display_message("\n⚠️ cursor appears stuck: #{message}", type: :warning)
165
163
  when :completed
166
- puts "\n✅ cursor completed: #{message}"
164
+ display_message("\n✅ cursor completed: #{message}", type: :success)
167
165
  when :failed
168
- puts "\n❌ cursor failed: #{message}"
166
+ display_message("\n❌ cursor failed: #{message}", type: :error)
169
167
  end
170
168
  end
171
169
  end
@@ -54,7 +54,7 @@ module Aidp
54
54
  # 4. Default timeout
55
55
 
56
56
  if ENV["AIDP_QUICK_MODE"]
57
- puts "⚡ Quick mode enabled - 2 minute timeout"
57
+ display_message("⚡ Quick mode enabled - 2 minute timeout", type: :highlight)
58
58
  return 120
59
59
  end
60
60
 
@@ -65,12 +65,12 @@ module Aidp
65
65
  # Adaptive timeout based on step type
66
66
  step_timeout = get_adaptive_timeout
67
67
  if step_timeout
68
- puts "🧠 Using adaptive timeout: #{step_timeout} seconds"
68
+ display_message("🧠 Using adaptive timeout: #{step_timeout} seconds", type: :info)
69
69
  return step_timeout
70
70
  end
71
71
 
72
72
  # Default timeout (5 minutes for interactive use)
73
- puts "📋 Using default timeout: 5 minutes"
73
+ display_message("📋 Using default timeout: 5 minutes", type: :info)
74
74
  300
75
75
  end
76
76
 
@@ -0,0 +1,264 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "timeout"
4
+ require_relative "base"
5
+ require_relative "../util"
6
+ require_relative "../debug_mixin"
7
+
8
+ module Aidp
9
+ module Providers
10
+ class GithubCopilot < Base
11
+ include Aidp::DebugMixin
12
+
13
+ def self.available?
14
+ !!Aidp::Util.which("copilot")
15
+ end
16
+
17
+ def name
18
+ "github_copilot"
19
+ end
20
+
21
+ def available?
22
+ return false unless self.class.available?
23
+
24
+ # Additional check to ensure the CLI is properly configured
25
+ begin
26
+ result = Aidp::Util.execute_command("copilot", ["--version"], timeout: 10)
27
+ result.exit_status == 0
28
+ rescue
29
+ false
30
+ end
31
+ end
32
+
33
+ def send(prompt:, session: nil)
34
+ raise "copilot CLI not available" unless self.class.available?
35
+
36
+ # Smart timeout calculation
37
+ timeout_seconds = calculate_timeout
38
+
39
+ debug_provider("copilot", "Starting execution", {timeout: timeout_seconds})
40
+ debug_log("📝 Sending prompt to copilot (length: #{prompt.length})", level: :info)
41
+
42
+ # Set up activity monitoring
43
+ setup_activity_monitoring("copilot", method(:activity_callback))
44
+ record_activity("Starting copilot execution")
45
+
46
+ # Start activity display thread with timeout
47
+ activity_display_thread = Thread.new do
48
+ start_time = Time.now
49
+ loop do
50
+ sleep 0.5 # Update every 500ms to reduce spam
51
+ elapsed = Time.now - start_time
52
+
53
+ # Break if we've been running too long or state changed
54
+ break if elapsed > timeout_seconds || @activity_state == :completed || @activity_state == :failed
55
+
56
+ print_activity_status(elapsed)
57
+ end
58
+ end
59
+
60
+ begin
61
+ # Use non-interactive mode for automation
62
+ args = ["-p", prompt, "--allow-all-tools"]
63
+
64
+ # Add session support if provided
65
+ if session && !session.empty?
66
+ args += ["--resume", session]
67
+ end
68
+
69
+ # Use debug_execute_command for better debugging (no input since prompt is in args)
70
+ result = debug_execute_command("copilot", args: args, timeout: timeout_seconds)
71
+
72
+ # Log the results
73
+ debug_command("copilot", args: args, input: prompt, output: result.out, error: result.err, exit_code: result.exit_status)
74
+
75
+ # Stop activity display
76
+ activity_display_thread.kill if activity_display_thread.alive?
77
+ activity_display_thread.join(0.1) # Give it 100ms to finish
78
+ clear_activity_status
79
+
80
+ if result.exit_status == 0
81
+ mark_completed
82
+ result.out
83
+ else
84
+ mark_failed("copilot failed with exit code #{result.exit_status}")
85
+ debug_error(StandardError.new("copilot failed"), {exit_code: result.exit_status, stderr: result.err})
86
+ raise "copilot failed with exit code #{result.exit_status}: #{result.err}"
87
+ end
88
+ rescue => e
89
+ # Stop activity display
90
+ activity_display_thread.kill if activity_display_thread.alive?
91
+ activity_display_thread.join(0.1) # Give it 100ms to finish
92
+ clear_activity_status
93
+ mark_failed("copilot execution failed: #{e.message}")
94
+ debug_error(e, {provider: "github_copilot", prompt_length: prompt.length})
95
+ raise
96
+ end
97
+ end
98
+
99
+ # Enhanced send method with additional options
100
+ def send_with_options(prompt:, session: nil, tools: nil, log_level: nil, config_file: nil, directories: nil)
101
+ args = ["-p", prompt]
102
+
103
+ # Add session support
104
+ if session && !session.empty?
105
+ args += ["--resume", session]
106
+ end
107
+
108
+ # Add tool permissions
109
+ if tools && !tools.empty?
110
+ if tools.include?("all")
111
+ args += ["--allow-all-tools"]
112
+ else
113
+ tools.each do |tool|
114
+ args += ["--allow-tool", tool]
115
+ end
116
+ end
117
+ else
118
+ # Default to allowing all tools for automation
119
+ args += ["--allow-all-tools"]
120
+ end
121
+
122
+ # Add logging level
123
+ if log_level
124
+ args += ["--log-level", log_level]
125
+ end
126
+
127
+ # Add allowed directories
128
+ if directories && !directories.empty?
129
+ directories.each do |dir|
130
+ args += ["--add-dir", dir]
131
+ end
132
+ end
133
+
134
+ # Use the enhanced version of send
135
+ send_with_custom_args(prompt: prompt, args: args)
136
+ end
137
+
138
+ # Override health check for GitHub Copilot specific considerations
139
+ def harness_healthy?
140
+ return false unless super
141
+
142
+ # Additional health checks specific to GitHub Copilot CLI
143
+ # Check if we can access GitHub (basic connectivity test)
144
+ begin
145
+ result = Aidp::Util.execute_command("copilot", ["--help"], timeout: 5)
146
+ result.exit_status == 0
147
+ rescue
148
+ false
149
+ end
150
+ end
151
+
152
+ private
153
+
154
+ def send_with_custom_args(prompt:, args:)
155
+ timeout_seconds = calculate_timeout
156
+
157
+ debug_provider("copilot", "Starting execution", {timeout: timeout_seconds, args: args})
158
+ debug_log("📝 Sending prompt to copilot with custom args", level: :info)
159
+
160
+ setup_activity_monitoring("copilot", method(:activity_callback))
161
+ record_activity("Starting copilot execution with custom args")
162
+
163
+ begin
164
+ result = debug_execute_command("copilot", args: args, timeout: timeout_seconds)
165
+ debug_command("copilot", args: args, output: result.out, error: result.err, exit_code: result.exit_status)
166
+
167
+ if result.exit_status == 0
168
+ mark_completed
169
+ result.out
170
+ else
171
+ mark_failed("copilot failed with exit code #{result.exit_status}")
172
+ debug_error(StandardError.new("copilot failed"), {exit_code: result.exit_status, stderr: result.err})
173
+ raise "copilot failed with exit code #{result.exit_status}: #{result.err}"
174
+ end
175
+ rescue => e
176
+ mark_failed("copilot execution failed: #{e.message}")
177
+ debug_error(e, {provider: "github_copilot", prompt_length: prompt.length})
178
+ raise
179
+ end
180
+ end
181
+
182
+ def print_activity_status(elapsed)
183
+ # Print activity status during execution with elapsed time
184
+ minutes = (elapsed / 60).to_i
185
+ seconds = (elapsed % 60).to_i
186
+
187
+ if minutes > 0
188
+ print "\r🤖 GitHub Copilot CLI is running... (#{minutes}m #{seconds}s)"
189
+ else
190
+ print "\r🤖 GitHub Copilot CLI is running... (#{seconds}s)"
191
+ end
192
+ end
193
+
194
+ def clear_activity_status
195
+ # Clear the activity status line
196
+ print "\r" + " " * 60 + "\r"
197
+ end
198
+
199
+ def calculate_timeout
200
+ # Priority order for timeout calculation:
201
+ # 1. Quick mode (for testing)
202
+ # 2. Environment variable override
203
+ # 3. Adaptive timeout based on step type
204
+ # 4. Default timeout
205
+
206
+ if ENV["AIDP_QUICK_MODE"]
207
+ display_message("⚡ Quick mode enabled - 2 minute timeout", type: :highlight)
208
+ return 120
209
+ end
210
+
211
+ if ENV["AIDP_GITHUB_COPILOT_TIMEOUT"]
212
+ return ENV["AIDP_GITHUB_COPILOT_TIMEOUT"].to_i
213
+ end
214
+
215
+ # Adaptive timeout based on step type
216
+ step_timeout = get_adaptive_timeout
217
+ if step_timeout
218
+ display_message("🧠 Using adaptive timeout: #{step_timeout} seconds", type: :info)
219
+ return step_timeout
220
+ end
221
+
222
+ # Default timeout (5 minutes for interactive use)
223
+ display_message("📋 Using default timeout: 5 minutes", type: :info)
224
+ 300
225
+ end
226
+
227
+ def get_adaptive_timeout
228
+ # Timeout recommendations based on step type patterns
229
+ step_name = ENV["AIDP_CURRENT_STEP"] || ""
230
+
231
+ case step_name
232
+ when /REPOSITORY_ANALYSIS/
233
+ 180 # 3 minutes - repository analysis can be quick
234
+ when /ARCHITECTURE_ANALYSIS/
235
+ 600 # 10 minutes - architecture analysis needs more time
236
+ when /TEST_ANALYSIS/
237
+ 300 # 5 minutes - test analysis is moderate
238
+ when /FUNCTIONALITY_ANALYSIS/
239
+ 600 # 10 minutes - functionality analysis is complex
240
+ when /DOCUMENTATION_ANALYSIS/
241
+ 300 # 5 minutes - documentation analysis is moderate
242
+ when /STATIC_ANALYSIS/
243
+ 450 # 7.5 minutes - static analysis can be intensive
244
+ when /REFACTORING_RECOMMENDATIONS/
245
+ 600 # 10 minutes - refactoring recommendations are complex
246
+ else
247
+ nil # Use default
248
+ end
249
+ end
250
+
251
+ def activity_callback(state, message, provider)
252
+ # Handle activity state changes
253
+ case state
254
+ when :stuck
255
+ display_message("\n⚠️ GitHub Copilot CLI appears stuck: #{message}", type: :warning)
256
+ when :completed
257
+ display_message("\n✅ GitHub Copilot CLI completed: #{message}", type: :success)
258
+ when :failed
259
+ display_message("\n❌ GitHub Copilot CLI failed: #{message}", type: :error)
260
+ end
261
+ end
262
+ end
263
+ end
264
+ end
@@ -95,13 +95,11 @@ module Aidp
95
95
  else
96
96
  print "\r🔄 opencode is running... (#{seconds}s)"
97
97
  end
98
- $stdout.flush
99
98
  end
100
99
 
101
100
  def clear_activity_status
102
101
  # Clear the activity status line
103
102
  print "\r" + " " * 50 + "\r"
104
- $stdout.flush
105
103
  end
106
104
 
107
105
  def calculate_timeout
@@ -112,7 +110,7 @@ module Aidp
112
110
  # 4. Default timeout
113
111
 
114
112
  if ENV["AIDP_QUICK_MODE"]
115
- puts "⚡ Quick mode enabled - 2 minute timeout"
113
+ display_message("⚡ Quick mode enabled - 2 minute timeout", type: :highlight)
116
114
  return 120
117
115
  end
118
116
 
@@ -123,12 +121,12 @@ module Aidp
123
121
  # Adaptive timeout based on step type
124
122
  step_timeout = get_adaptive_timeout
125
123
  if step_timeout
126
- puts "🧠 Using adaptive timeout: #{step_timeout} seconds"
124
+ display_message("🧠 Using adaptive timeout: #{step_timeout} seconds", type: :info)
127
125
  return step_timeout
128
126
  end
129
127
 
130
128
  # Default timeout (5 minutes for interactive use)
131
- puts "📋 Using default timeout: 5 minutes"
129
+ display_message("📋 Using default timeout: 5 minutes", type: :info)
132
130
  300
133
131
  end
134
132
 
@@ -161,11 +159,11 @@ module Aidp
161
159
  # Only print static messages for state changes
162
160
  case state
163
161
  when :starting
164
- puts "🚀 Starting opencode execution..."
162
+ display_message("🚀 Starting opencode execution...", type: :info)
165
163
  when :completed
166
- puts "✅ opencode execution completed"
164
+ display_message("✅ opencode execution completed", type: :success)
167
165
  when :failed
168
- puts "❌ opencode execution failed: #{message}"
166
+ display_message("❌ opencode execution failed: #{message}", type: :error)
169
167
  end
170
168
  end
171
169
 
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.9.5"
4
+ VERSION = "0.10.0"
5
5
  end
data/lib/aidp.rb CHANGED
@@ -33,10 +33,10 @@ require_relative "aidp/analyze/steps"
33
33
  require_relative "aidp/analyze/progress"
34
34
 
35
35
  # Tree-sitter analysis
36
- require_relative "aidp/analysis/tree_sitter_grammar_loader"
37
- require_relative "aidp/analysis/seams"
38
- require_relative "aidp/analysis/tree_sitter_scan"
39
- require_relative "aidp/analysis/kb_inspector"
36
+ require_relative "aidp/analyze/tree_sitter_grammar_loader"
37
+ require_relative "aidp/analyze/seams"
38
+ require_relative "aidp/analyze/tree_sitter_scan"
39
+ require_relative "aidp/analyze/kb_inspector"
40
40
 
41
41
  # Execute mode
42
42
  require_relative "aidp/execute/steps"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aidp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bart Agapinan
@@ -233,20 +233,19 @@ files:
233
233
  - README.md
234
234
  - bin/aidp
235
235
  - lib/aidp.rb
236
- - lib/aidp/analysis/kb_inspector.rb
237
- - lib/aidp/analysis/seams.rb
238
- - lib/aidp/analysis/tree_sitter_grammar_loader.rb
239
- - lib/aidp/analysis/tree_sitter_scan.rb
240
236
  - lib/aidp/analyze/error_handler.rb
241
237
  - lib/aidp/analyze/feature_analyzer.rb
242
238
  - lib/aidp/analyze/json_file_storage.rb
239
+ - lib/aidp/analyze/kb_inspector.rb
243
240
  - lib/aidp/analyze/prioritizer.rb
244
241
  - lib/aidp/analyze/progress.rb
245
- - lib/aidp/analyze/progress_visualizer.rb
246
242
  - lib/aidp/analyze/report_generator.rb
247
243
  - lib/aidp/analyze/ruby_maat_integration.rb
248
244
  - lib/aidp/analyze/runner.rb
245
+ - lib/aidp/analyze/seams.rb
249
246
  - lib/aidp/analyze/steps.rb
247
+ - lib/aidp/analyze/tree_sitter_grammar_loader.rb
248
+ - lib/aidp/analyze/tree_sitter_scan.rb
250
249
  - lib/aidp/cli.rb
251
250
  - lib/aidp/cli/first_run_wizard.rb
252
251
  - lib/aidp/cli/jobs_command.rb
@@ -307,6 +306,7 @@ files:
307
306
  - lib/aidp/providers/base.rb
308
307
  - lib/aidp/providers/cursor.rb
309
308
  - lib/aidp/providers/gemini.rb
309
+ - lib/aidp/providers/github_copilot.rb
310
310
  - lib/aidp/providers/macos_ui.rb
311
311
  - lib/aidp/providers/opencode.rb
312
312
  - lib/aidp/storage/csv_storage.rb