aidp 0.32.0 → 0.33.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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aidp/analyze/feature_analyzer.rb +322 -320
  3. data/lib/aidp/auto_update/coordinator.rb +97 -7
  4. data/lib/aidp/auto_update.rb +0 -12
  5. data/lib/aidp/cli/devcontainer_commands.rb +0 -5
  6. data/lib/aidp/cli.rb +2 -1
  7. data/lib/aidp/comment_consolidator.rb +78 -0
  8. data/lib/aidp/concurrency.rb +0 -3
  9. data/lib/aidp/config.rb +0 -1
  10. data/lib/aidp/config_paths.rb +71 -0
  11. data/lib/aidp/execute/work_loop_runner.rb +324 -15
  12. data/lib/aidp/harness/ai_filter_factory.rb +285 -0
  13. data/lib/aidp/harness/config_schema.rb +97 -1
  14. data/lib/aidp/harness/config_validator.rb +1 -1
  15. data/lib/aidp/harness/configuration.rb +61 -5
  16. data/lib/aidp/harness/filter_definition.rb +212 -0
  17. data/lib/aidp/harness/generated_filter_strategy.rb +197 -0
  18. data/lib/aidp/harness/output_filter.rb +50 -25
  19. data/lib/aidp/harness/output_filter_config.rb +129 -0
  20. data/lib/aidp/harness/provider_manager.rb +90 -2
  21. data/lib/aidp/harness/runner.rb +0 -11
  22. data/lib/aidp/harness/test_runner.rb +179 -41
  23. data/lib/aidp/harness/thinking_depth_manager.rb +16 -0
  24. data/lib/aidp/harness/ui/navigation/submenu.rb +0 -2
  25. data/lib/aidp/loader.rb +195 -0
  26. data/lib/aidp/metadata/compiler.rb +29 -17
  27. data/lib/aidp/metadata/query.rb +1 -1
  28. data/lib/aidp/metadata/scanner.rb +8 -1
  29. data/lib/aidp/metadata/tool_metadata.rb +13 -13
  30. data/lib/aidp/metadata/validator.rb +10 -0
  31. data/lib/aidp/metadata.rb +16 -0
  32. data/lib/aidp/pr_worktree_manager.rb +2 -2
  33. data/lib/aidp/provider_manager.rb +1 -7
  34. data/lib/aidp/setup/wizard.rb +279 -9
  35. data/lib/aidp/skills.rb +0 -5
  36. data/lib/aidp/storage/csv_storage.rb +3 -0
  37. data/lib/aidp/style_guide/selector.rb +360 -0
  38. data/lib/aidp/tooling_detector.rb +283 -16
  39. data/lib/aidp/version.rb +1 -1
  40. data/lib/aidp/watch/change_request_processor.rb +152 -14
  41. data/lib/aidp/watch/repository_client.rb +41 -0
  42. data/lib/aidp/watch/runner.rb +29 -18
  43. data/lib/aidp/watch.rb +5 -7
  44. data/lib/aidp/workstream_cleanup.rb +0 -2
  45. data/lib/aidp/workstream_executor.rb +0 -4
  46. data/lib/aidp/worktree.rb +0 -1
  47. data/lib/aidp.rb +21 -106
  48. metadata +72 -36
  49. data/lib/aidp/config/paths.rb +0 -131
@@ -2,21 +2,6 @@
2
2
 
3
3
  require "tty-prompt"
4
4
 
5
- require_relative "../message_display"
6
- require_relative "repository_client"
7
- require_relative "repository_safety_checker"
8
- require_relative "state_store"
9
- require_relative "github_state_extractor"
10
- require_relative "plan_generator"
11
- require_relative "plan_processor"
12
- require_relative "build_processor"
13
- require_relative "../auto_update"
14
- require_relative "review_processor"
15
- require_relative "ci_fix_processor"
16
- require_relative "change_request_processor"
17
- require_relative "auto_processor"
18
- require_relative "auto_pr_processor"
19
-
20
5
  module Aidp
21
6
  module Watch
22
7
  # Coordinates the watch mode loop: monitors issues, handles plan/build
@@ -522,14 +507,21 @@ module Aidp
522
507
  return unless @auto_update_coordinator.policy.enabled
523
508
  return unless time_for_update_check?
524
509
 
510
+ @last_update_check = Time.now
525
511
  update_check = @auto_update_coordinator.check_for_update
526
512
 
527
513
  if update_check.should_update?
528
514
  display_message("🔄 Update available: #{update_check.current_version} → #{update_check.available_version}", type: :highlight)
529
- display_message(" Saving checkpoint and initiating update...", type: :muted)
530
515
 
531
- initiate_update(update_check)
532
- # Never returns - exits with code 75
516
+ # Prefer hot reloading if available (Zeitwerk enabled with reloading)
517
+ if @auto_update_coordinator.hot_reload_available?
518
+ perform_hot_reload(update_check)
519
+ else
520
+ # Fall back to checkpoint + exit approach
521
+ display_message(" Saving checkpoint and initiating update...", type: :muted)
522
+ initiate_update(update_check)
523
+ # Never returns - exits with code 75
524
+ end
533
525
  end
534
526
  rescue Aidp::AutoUpdate::UpdateLoopError => e
535
527
  # Restart loop detected - disable auto-update
@@ -540,6 +532,25 @@ module Aidp
540
532
  Aidp.log_error("watch_runner", "update_check_failed", error: e.message)
541
533
  end
542
534
 
535
+ # Perform hot code reload without restarting
536
+ # @param update_check [Aidp::AutoUpdate::UpdateCheck] Update check result
537
+ def perform_hot_reload(update_check)
538
+ display_message(" Performing hot code reload (no restart needed)...", type: :muted)
539
+
540
+ if @auto_update_coordinator.hot_reload_update(update_check)
541
+ display_message("✨ Hot reload complete! Now running #{Aidp::VERSION}", type: :success)
542
+ Aidp.log_info("watch_runner", "hot_reload_success",
543
+ version: Aidp::VERSION)
544
+ else
545
+ display_message("⚠️ Hot reload skipped (no update needed)", type: :muted)
546
+ end
547
+ rescue Aidp::AutoUpdate::UpdateError => e
548
+ display_message("⚠️ Hot reload failed: #{e.message}", type: :warning)
549
+ display_message(" Falling back to checkpoint + restart...", type: :muted)
550
+ # Fall back to cold restart
551
+ initiate_update(update_check)
552
+ end
553
+
543
554
  # Determine if it's time to check for updates
544
555
  # @return [Boolean]
545
556
  def time_for_update_check?
data/lib/aidp/watch.rb CHANGED
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "message_display"
4
- require_relative "watch/repository_client"
5
- require_relative "watch/state_store"
6
- require_relative "watch/plan_generator"
7
- require_relative "watch/plan_processor"
8
- require_relative "watch/build_processor"
9
- require_relative "watch/runner"
3
+ module Aidp
4
+ # Watch mode functionality for monitoring GitHub issues and PRs
5
+ module Watch
6
+ end
7
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "worktree"
4
- require_relative "workstream_state"
5
3
  require "open3"
6
4
  require "tty-prompt"
7
5
 
@@ -2,10 +2,6 @@
2
2
 
3
3
  require "concurrent-ruby"
4
4
  require "time"
5
- require_relative "worktree"
6
- require_relative "workstream_state"
7
- require_relative "harness/runner"
8
- require_relative "message_display"
9
5
 
10
6
  module Aidp
11
7
  # Executes multiple workstreams in parallel using concurrent-ruby.
data/lib/aidp/worktree.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  require "fileutils"
4
4
  require "json"
5
5
  require "open3"
6
- require_relative "workstream_state"
7
6
 
8
7
  module Aidp
9
8
  # Manages git worktree operations for parallel workstreams.
data/lib/aidp.rb CHANGED
@@ -1,115 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Core extensions
4
- require_relative "aidp/core_ext/class_attribute"
3
+ # Bootstrap: Load essential files before Zeitwerk
4
+ # These files must be loaded first and are excluded from autoloading:
5
+ # - version.rb: Needed for version checks during load
6
+ # - core_ext: Ruby core extensions that need to be available globally
7
+ # - logger.rb: Logging infrastructure used throughout loading
5
8
 
6
- # Shared modules
7
9
  require_relative "aidp/version"
8
- require_relative "aidp/config"
9
- require_relative "aidp/util"
10
- require_relative "aidp/rescue_logging"
11
- require_relative "aidp/message_display"
12
- require_relative "aidp/concurrency"
13
- require_relative "aidp/setup/wizard"
14
- require_relative "aidp/init"
15
- require_relative "aidp/watch"
16
- require_relative "aidp/cli"
17
-
18
- # Jobs and background execution
19
- require_relative "aidp/jobs/background_runner"
20
-
21
- # CLI commands
22
- require_relative "aidp/cli/jobs_command"
23
-
24
- # Providers
25
- require_relative "aidp/providers/base"
26
- require_relative "aidp/providers/cursor"
27
- require_relative "aidp/providers/anthropic"
28
- require_relative "aidp/providers/gemini"
29
- require_relative "aidp/providers/kilocode"
30
- # Supervised providers removed - using direct execution model
31
- require_relative "aidp/provider_manager"
32
-
33
- # Simple file-based storage
34
- require_relative "aidp/storage/json_storage"
35
- require_relative "aidp/storage/csv_storage"
36
- require_relative "aidp/storage/file_manager"
37
-
38
- # Analyze mode (simplified - file-based storage only)
39
- require_relative "aidp/analyze/json_file_storage"
40
- require_relative "aidp/analyze/error_handler"
41
- require_relative "aidp/analyze/ruby_maat_integration"
42
- require_relative "aidp/analyze/runner"
43
- require_relative "aidp/analyze/steps"
44
- require_relative "aidp/analyze/progress"
45
-
46
- # Tree-sitter analysis
47
- require_relative "aidp/analyze/tree_sitter_grammar_loader"
48
- require_relative "aidp/analyze/seams"
49
- require_relative "aidp/analyze/tree_sitter_scan"
50
- require_relative "aidp/analyze/kb_inspector"
51
-
52
- # Metadata system
53
- require_relative "aidp/metadata/tool_metadata"
54
- require_relative "aidp/metadata/validator"
55
- require_relative "aidp/metadata/parser"
56
- require_relative "aidp/metadata/scanner"
57
- require_relative "aidp/metadata/compiler"
58
- require_relative "aidp/metadata/query"
59
- require_relative "aidp/metadata/cache"
60
-
61
- # Workflows
62
- require_relative "aidp/workflows/definitions"
63
- require_relative "aidp/workflows/selector"
64
-
65
- # Execute mode
66
- require_relative "aidp/execute/steps"
67
- require_relative "aidp/execute/runner"
68
- require_relative "aidp/execute/progress"
69
- require_relative "aidp/execute/checkpoint"
70
- require_relative "aidp/execute/checkpoint_display"
71
- require_relative "aidp/execute/work_loop_state"
72
- require_relative "aidp/execute/instruction_queue"
73
- require_relative "aidp/execute/persistent_tasklist"
74
- require_relative "aidp/execute/async_work_loop_runner"
75
- require_relative "aidp/execute/interactive_repl"
76
-
77
- # Logging
10
+ require_relative "aidp/core_ext/class_attribute"
78
11
  require_relative "aidp/logger"
79
12
 
80
- # Daemon mode
81
- require_relative "aidp/daemon/process_manager"
82
- require_relative "aidp/daemon/runner"
83
-
84
- # Workstream/worktree management
85
- require_relative "aidp/worktree"
86
- require_relative "aidp/workstream_state"
87
- require_relative "aidp/workstream_executor"
13
+ # Now set up Zeitwerk autoloader for the rest of the codebase
14
+ require_relative "aidp/loader"
88
15
 
89
- # Harness mode
90
- require_relative "aidp/harness/configuration"
91
- require_relative "aidp/harness/config_schema"
92
- require_relative "aidp/harness/config_validator"
93
- require_relative "aidp/harness/config_loader"
94
- require_relative "aidp/harness/config_manager"
95
- require_relative "aidp/harness/ruby_llm_registry"
96
- require_relative "aidp/harness/model_registry"
97
- require_relative "aidp/harness/condition_detector"
98
- require_relative "aidp/harness/user_interface"
99
- require_relative "aidp/harness/simple_user_interface"
100
- require_relative "aidp/harness/provider_manager"
101
- require_relative "aidp/harness/provider_config"
102
- require_relative "aidp/harness/provider_factory"
103
- require_relative "aidp/harness/state_manager"
104
- require_relative "aidp/harness/error_handler"
105
- require_relative "aidp/harness/status_display"
106
- require_relative "aidp/harness/runner"
107
- require_relative "aidp/harness/filter_strategy"
108
- require_relative "aidp/harness/generic_filter_strategy"
109
- require_relative "aidp/harness/rspec_filter_strategy"
110
- require_relative "aidp/harness/output_filter"
16
+ # Configure Zeitwerk based on environment
17
+ # In watch mode or development, enable reloading for hot code updates
18
+ # In production, disable reloading and eager load for performance
19
+ reloading_enabled = ENV["AIDP_ENABLE_RELOADING"] == "1" ||
20
+ ENV["AIDP_WATCH_MODE"] == "1"
111
21
 
112
- # UI components
113
- require_relative "aidp/harness/ui/spinner_helper"
22
+ Aidp::Loader.setup(
23
+ enable_reloading: reloading_enabled,
24
+ eager_load: !reloading_enabled && ENV["AIDP_EAGER_LOAD"] == "1"
25
+ )
114
26
 
115
- # CLI commands
27
+ # Manually require files that contain multiple constants (not autoloadable by Zeitwerk)
28
+ require_relative "aidp/errors"
29
+ require_relative "aidp/auto_update/errors"
30
+ require_relative "aidp/harness/state/errors"
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.32.0
4
+ version: 0.33.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bart Agapinan
@@ -52,61 +52,89 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: '1.5'
54
54
  - !ruby/object:Gem::Dependency
55
- name: thor
55
+ name: ostruct
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.3'
60
+ version: '0.6'
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.3'
67
+ version: '0.6'
68
68
  - !ruby/object:Gem::Dependency
69
- name: tty-cursor
69
+ name: pastel
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0.7'
74
+ version: '0.8'
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '0.7'
81
+ version: '0.8'
82
82
  - !ruby/object:Gem::Dependency
83
- name: tty-screen
83
+ name: ruby_llm
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '0.8'
88
+ version: '1.9'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '0.8'
95
+ version: '1.9'
96
96
  - !ruby/object:Gem::Dependency
97
- name: tty-reader
97
+ name: ruby_tree_sitter
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '0.9'
102
+ version: '2.0'
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: '0.9'
109
+ version: '2.0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: thor
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.3'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.3'
124
+ - !ruby/object:Gem::Dependency
125
+ name: zeitwerk
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '2.7'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.7'
110
138
  - !ruby/object:Gem::Dependency
111
139
  name: tty-box
112
140
  requirement: !ruby/object:Gem::Requirement
@@ -122,47 +150,47 @@ dependencies:
122
150
  - !ruby/object:Gem::Version
123
151
  version: '0.7'
124
152
  - !ruby/object:Gem::Dependency
125
- name: tty-table
153
+ name: tty-command
126
154
  requirement: !ruby/object:Gem::Requirement
127
155
  requirements:
128
156
  - - "~>"
129
157
  - !ruby/object:Gem::Version
130
- version: '0.12'
158
+ version: '0.10'
131
159
  type: :runtime
132
160
  prerelease: false
133
161
  version_requirements: !ruby/object:Gem::Requirement
134
162
  requirements:
135
163
  - - "~>"
136
164
  - !ruby/object:Gem::Version
137
- version: '0.12'
165
+ version: '0.10'
138
166
  - !ruby/object:Gem::Dependency
139
- name: tty-progressbar
167
+ name: tty-cursor
140
168
  requirement: !ruby/object:Gem::Requirement
141
169
  requirements:
142
170
  - - "~>"
143
171
  - !ruby/object:Gem::Version
144
- version: '0.18'
172
+ version: '0.7'
145
173
  type: :runtime
146
174
  prerelease: false
147
175
  version_requirements: !ruby/object:Gem::Requirement
148
176
  requirements:
149
177
  - - "~>"
150
178
  - !ruby/object:Gem::Version
151
- version: '0.18'
179
+ version: '0.7'
152
180
  - !ruby/object:Gem::Dependency
153
- name: tty-spinner
181
+ name: tty-progressbar
154
182
  requirement: !ruby/object:Gem::Requirement
155
183
  requirements:
156
184
  - - "~>"
157
185
  - !ruby/object:Gem::Version
158
- version: '0.9'
186
+ version: '0.18'
159
187
  type: :runtime
160
188
  prerelease: false
161
189
  version_requirements: !ruby/object:Gem::Requirement
162
190
  requirements:
163
191
  - - "~>"
164
192
  - !ruby/object:Gem::Version
165
- version: '0.9'
193
+ version: '0.18'
166
194
  - !ruby/object:Gem::Dependency
167
195
  name: tty-prompt
168
196
  requirement: !ruby/object:Gem::Requirement
@@ -178,66 +206,66 @@ dependencies:
178
206
  - !ruby/object:Gem::Version
179
207
  version: '0.23'
180
208
  - !ruby/object:Gem::Dependency
181
- name: pastel
209
+ name: tty-reader
182
210
  requirement: !ruby/object:Gem::Requirement
183
211
  requirements:
184
212
  - - "~>"
185
213
  - !ruby/object:Gem::Version
186
- version: '0.8'
214
+ version: '0.9'
187
215
  type: :runtime
188
216
  prerelease: false
189
217
  version_requirements: !ruby/object:Gem::Requirement
190
218
  requirements:
191
219
  - - "~>"
192
220
  - !ruby/object:Gem::Version
193
- version: '0.8'
221
+ version: '0.9'
194
222
  - !ruby/object:Gem::Dependency
195
- name: ruby_tree_sitter
223
+ name: tty-screen
196
224
  requirement: !ruby/object:Gem::Requirement
197
225
  requirements:
198
226
  - - "~>"
199
227
  - !ruby/object:Gem::Version
200
- version: '2.0'
228
+ version: '0.8'
201
229
  type: :runtime
202
230
  prerelease: false
203
231
  version_requirements: !ruby/object:Gem::Requirement
204
232
  requirements:
205
233
  - - "~>"
206
234
  - !ruby/object:Gem::Version
207
- version: '2.0'
235
+ version: '0.8'
208
236
  - !ruby/object:Gem::Dependency
209
- name: tty-command
237
+ name: tty-spinner
210
238
  requirement: !ruby/object:Gem::Requirement
211
239
  requirements:
212
240
  - - "~>"
213
241
  - !ruby/object:Gem::Version
214
- version: '0.10'
242
+ version: '0.9'
215
243
  type: :runtime
216
244
  prerelease: false
217
245
  version_requirements: !ruby/object:Gem::Requirement
218
246
  requirements:
219
247
  - - "~>"
220
248
  - !ruby/object:Gem::Version
221
- version: '0.10'
249
+ version: '0.9'
222
250
  - !ruby/object:Gem::Dependency
223
- name: ruby_llm
251
+ name: tty-table
224
252
  requirement: !ruby/object:Gem::Requirement
225
253
  requirements:
226
254
  - - "~>"
227
255
  - !ruby/object:Gem::Version
228
- version: '1.9'
256
+ version: '0.12'
229
257
  type: :runtime
230
258
  prerelease: false
231
259
  version_requirements: !ruby/object:Gem::Requirement
232
260
  requirements:
233
261
  - - "~>"
234
262
  - !ruby/object:Gem::Version
235
- version: '1.9'
263
+ version: '0.12'
236
264
  description: The AI-Dev-Pipeline (AIDP) CLI provides a powerful, markdown-driven workflow
237
265
  for software development. It supports in-depth project analysis to understand existing
238
266
  codebases and an execution mode to systematically implement new features.
239
267
  email:
240
- - bart@sonic.next
268
+ - bart@sonic.net
241
269
  executables:
242
270
  - aidp
243
271
  extensions: []
@@ -284,12 +312,13 @@ files:
284
312
  - lib/aidp/cli/providers_command.rb
285
313
  - lib/aidp/cli/terminal_io.rb
286
314
  - lib/aidp/cli/tools_command.rb
315
+ - lib/aidp/comment_consolidator.rb
287
316
  - lib/aidp/concurrency.rb
288
317
  - lib/aidp/concurrency/backoff.rb
289
318
  - lib/aidp/concurrency/exec.rb
290
319
  - lib/aidp/concurrency/wait.rb
291
320
  - lib/aidp/config.rb
292
- - lib/aidp/config/paths.rb
321
+ - lib/aidp/config_paths.rb
293
322
  - lib/aidp/core_ext/class_attribute.rb
294
323
  - lib/aidp/daemon/process_manager.rb
295
324
  - lib/aidp/daemon/runner.rb
@@ -316,6 +345,7 @@ files:
316
345
  - lib/aidp/execute/workflow_selector.rb
317
346
  - lib/aidp/firewall/provider_requirements_collector.rb
318
347
  - lib/aidp/harness/ai_decision_engine.rb
348
+ - lib/aidp/harness/ai_filter_factory.rb
319
349
  - lib/aidp/harness/capability_registry.rb
320
350
  - lib/aidp/harness/completion_checker.rb
321
351
  - lib/aidp/harness/condition_detector.rb
@@ -327,11 +357,14 @@ files:
327
357
  - lib/aidp/harness/deprecation_cache.rb
328
358
  - lib/aidp/harness/enhanced_runner.rb
329
359
  - lib/aidp/harness/error_handler.rb
360
+ - lib/aidp/harness/filter_definition.rb
330
361
  - lib/aidp/harness/filter_strategy.rb
362
+ - lib/aidp/harness/generated_filter_strategy.rb
331
363
  - lib/aidp/harness/generic_filter_strategy.rb
332
364
  - lib/aidp/harness/model_cache.rb
333
365
  - lib/aidp/harness/model_registry.rb
334
366
  - lib/aidp/harness/output_filter.rb
367
+ - lib/aidp/harness/output_filter_config.rb
335
368
  - lib/aidp/harness/provider_config.rb
336
369
  - lib/aidp/harness/provider_factory.rb
337
370
  - lib/aidp/harness/provider_info.rb
@@ -379,8 +412,10 @@ files:
379
412
  - lib/aidp/init/project_analyzer.rb
380
413
  - lib/aidp/init/runner.rb
381
414
  - lib/aidp/jobs/background_runner.rb
415
+ - lib/aidp/loader.rb
382
416
  - lib/aidp/logger.rb
383
417
  - lib/aidp/message_display.rb
418
+ - lib/aidp/metadata.rb
384
419
  - lib/aidp/metadata/cache.rb
385
420
  - lib/aidp/metadata/compiler.rb
386
421
  - lib/aidp/metadata/parser.rb
@@ -445,6 +480,7 @@ files:
445
480
  - lib/aidp/storage/csv_storage.rb
446
481
  - lib/aidp/storage/file_manager.rb
447
482
  - lib/aidp/storage/json_storage.rb
483
+ - lib/aidp/style_guide/selector.rb
448
484
  - lib/aidp/tooling_detector.rb
449
485
  - lib/aidp/util.rb
450
486
  - lib/aidp/utils/devcontainer_detector.rb
@@ -1,131 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "fileutils"
4
-
5
- module Aidp
6
- # Centralized path management for all AIDP internal files
7
- # Ensures consistent file locations and prevents path-related bugs
8
- module ConfigPaths
9
- # Get the main AIDP directory for a project
10
- def self.aidp_dir(project_dir = Dir.pwd)
11
- File.join(project_dir, ".aidp")
12
- end
13
-
14
- # Get the main configuration file path
15
- def self.config_file(project_dir = Dir.pwd)
16
- File.join(aidp_dir(project_dir), "aidp.yml")
17
- end
18
-
19
- # Get the configuration directory path
20
- def self.config_dir(project_dir = Dir.pwd)
21
- aidp_dir(project_dir)
22
- end
23
-
24
- # Get the progress directory path
25
- def self.progress_dir(project_dir = Dir.pwd)
26
- File.join(aidp_dir(project_dir), "progress")
27
- end
28
-
29
- # Get the execute progress file path
30
- def self.execute_progress_file(project_dir = Dir.pwd)
31
- File.join(progress_dir(project_dir), "execute.yml")
32
- end
33
-
34
- # Get the analyze progress file path
35
- def self.analyze_progress_file(project_dir = Dir.pwd)
36
- File.join(progress_dir(project_dir), "analyze.yml")
37
- end
38
-
39
- # Get the harness state directory path
40
- def self.harness_state_dir(project_dir = Dir.pwd)
41
- File.join(aidp_dir(project_dir), "harness")
42
- end
43
-
44
- # Get the harness state file path for a specific mode
45
- def self.harness_state_file(mode, project_dir = Dir.pwd)
46
- File.join(harness_state_dir(project_dir), "#{mode}_state.json")
47
- end
48
-
49
- # Get the providers directory path
50
- def self.providers_dir(project_dir = Dir.pwd)
51
- File.join(aidp_dir(project_dir), "providers")
52
- end
53
-
54
- # Get the provider info file path
55
- def self.provider_info_file(provider_name, project_dir = Dir.pwd)
56
- File.join(providers_dir(project_dir), "#{provider_name}_info.yml")
57
- end
58
-
59
- # Get the jobs directory path
60
- def self.jobs_dir(project_dir = Dir.pwd)
61
- File.join(aidp_dir(project_dir), "jobs")
62
- end
63
-
64
- # Get the checkpoint file path
65
- def self.checkpoint_file(project_dir = Dir.pwd)
66
- File.join(aidp_dir(project_dir), "checkpoint.yml")
67
- end
68
-
69
- # Get the checkpoint history file path
70
- def self.checkpoint_history_file(project_dir = Dir.pwd)
71
- File.join(aidp_dir(project_dir), "checkpoint_history.jsonl")
72
- end
73
-
74
- # Get the JSON storage directory path
75
- def self.json_storage_dir(project_dir = Dir.pwd)
76
- File.join(aidp_dir(project_dir), "json")
77
- end
78
-
79
- # Check if the main configuration file exists
80
- def self.config_exists?(project_dir = Dir.pwd)
81
- File.exist?(config_file(project_dir))
82
- end
83
-
84
- # Ensure the main AIDP directory exists
85
- def self.ensure_aidp_dir(project_dir = Dir.pwd)
86
- dir = aidp_dir(project_dir)
87
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
88
- dir
89
- end
90
-
91
- # Ensure the configuration directory exists
92
- def self.ensure_config_dir(project_dir = Dir.pwd)
93
- ensure_aidp_dir(project_dir)
94
- end
95
-
96
- # Ensure the progress directory exists
97
- def self.ensure_progress_dir(project_dir = Dir.pwd)
98
- dir = progress_dir(project_dir)
99
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
100
- dir
101
- end
102
-
103
- # Ensure the harness state directory exists
104
- def self.ensure_harness_state_dir(project_dir = Dir.pwd)
105
- dir = harness_state_dir(project_dir)
106
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
107
- dir
108
- end
109
-
110
- # Ensure the providers directory exists
111
- def self.ensure_providers_dir(project_dir = Dir.pwd)
112
- dir = providers_dir(project_dir)
113
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
114
- dir
115
- end
116
-
117
- # Ensure the jobs directory exists
118
- def self.ensure_jobs_dir(project_dir = Dir.pwd)
119
- dir = jobs_dir(project_dir)
120
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
121
- dir
122
- end
123
-
124
- # Ensure the JSON storage directory exists
125
- def self.ensure_json_storage_dir(project_dir = Dir.pwd)
126
- dir = json_storage_dir(project_dir)
127
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
128
- dir
129
- end
130
- end
131
- end