aidp 0.1.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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +210 -0
  4. data/bin/aidp +5 -0
  5. data/lib/aidp/analyze/agent_personas.rb +71 -0
  6. data/lib/aidp/analyze/agent_tool_executor.rb +445 -0
  7. data/lib/aidp/analyze/data_retention_manager.rb +426 -0
  8. data/lib/aidp/analyze/database.rb +243 -0
  9. data/lib/aidp/analyze/dependencies.rb +335 -0
  10. data/lib/aidp/analyze/error_handler.rb +486 -0
  11. data/lib/aidp/analyze/export_manager.rb +425 -0
  12. data/lib/aidp/analyze/feature_analyzer.rb +397 -0
  13. data/lib/aidp/analyze/focus_guidance.rb +517 -0
  14. data/lib/aidp/analyze/incremental_analyzer.rb +543 -0
  15. data/lib/aidp/analyze/language_analysis_strategies.rb +897 -0
  16. data/lib/aidp/analyze/large_analysis_progress.rb +504 -0
  17. data/lib/aidp/analyze/memory_manager.rb +365 -0
  18. data/lib/aidp/analyze/parallel_processor.rb +460 -0
  19. data/lib/aidp/analyze/performance_optimizer.rb +694 -0
  20. data/lib/aidp/analyze/prioritizer.rb +402 -0
  21. data/lib/aidp/analyze/progress.rb +75 -0
  22. data/lib/aidp/analyze/progress_visualizer.rb +320 -0
  23. data/lib/aidp/analyze/report_generator.rb +582 -0
  24. data/lib/aidp/analyze/repository_chunker.rb +702 -0
  25. data/lib/aidp/analyze/ruby_maat_integration.rb +572 -0
  26. data/lib/aidp/analyze/runner.rb +245 -0
  27. data/lib/aidp/analyze/static_analysis_detector.rb +577 -0
  28. data/lib/aidp/analyze/steps.rb +53 -0
  29. data/lib/aidp/analyze/storage.rb +600 -0
  30. data/lib/aidp/analyze/tool_configuration.rb +456 -0
  31. data/lib/aidp/analyze/tool_modernization.rb +750 -0
  32. data/lib/aidp/execute/progress.rb +76 -0
  33. data/lib/aidp/execute/runner.rb +135 -0
  34. data/lib/aidp/execute/steps.rb +113 -0
  35. data/lib/aidp/shared/cli.rb +117 -0
  36. data/lib/aidp/shared/config.rb +35 -0
  37. data/lib/aidp/shared/project_detector.rb +119 -0
  38. data/lib/aidp/shared/providers/anthropic.rb +26 -0
  39. data/lib/aidp/shared/providers/base.rb +17 -0
  40. data/lib/aidp/shared/providers/cursor.rb +102 -0
  41. data/lib/aidp/shared/providers/gemini.rb +26 -0
  42. data/lib/aidp/shared/providers/macos_ui.rb +26 -0
  43. data/lib/aidp/shared/sync.rb +15 -0
  44. data/lib/aidp/shared/util.rb +41 -0
  45. data/lib/aidp/shared/version.rb +7 -0
  46. data/lib/aidp/shared/workspace.rb +21 -0
  47. data/lib/aidp.rb +53 -0
  48. data/templates/ANALYZE/01_REPOSITORY_ANALYSIS.md +100 -0
  49. data/templates/ANALYZE/02_ARCHITECTURE_ANALYSIS.md +151 -0
  50. data/templates/ANALYZE/03_TEST_ANALYSIS.md +182 -0
  51. data/templates/ANALYZE/04_FUNCTIONALITY_ANALYSIS.md +200 -0
  52. data/templates/ANALYZE/05_DOCUMENTATION_ANALYSIS.md +202 -0
  53. data/templates/ANALYZE/06_STATIC_ANALYSIS.md +233 -0
  54. data/templates/ANALYZE/07_REFACTORING_RECOMMENDATIONS.md +316 -0
  55. data/templates/COMMON/AGENT_BASE.md +129 -0
  56. data/templates/COMMON/CONVENTIONS.md +19 -0
  57. data/templates/COMMON/TEMPLATES/ADR_TEMPLATE.md +21 -0
  58. data/templates/COMMON/TEMPLATES/DOMAIN_CHARTER.md +27 -0
  59. data/templates/COMMON/TEMPLATES/EVENT_EXAMPLE.yaml +16 -0
  60. data/templates/COMMON/TEMPLATES/MERMAID_C4.md +46 -0
  61. data/templates/COMMON/TEMPLATES/OPENAPI_STUB.yaml +11 -0
  62. data/templates/EXECUTE/00_PRD.md +36 -0
  63. data/templates/EXECUTE/01_NFRS.md +27 -0
  64. data/templates/EXECUTE/02A_ARCH_GATE_QUESTIONS.md +13 -0
  65. data/templates/EXECUTE/02_ARCHITECTURE.md +42 -0
  66. data/templates/EXECUTE/03_ADR_FACTORY.md +22 -0
  67. data/templates/EXECUTE/04_DOMAIN_DECOMPOSITION.md +24 -0
  68. data/templates/EXECUTE/05_CONTRACTS.md +27 -0
  69. data/templates/EXECUTE/06_THREAT_MODEL.md +23 -0
  70. data/templates/EXECUTE/07_TEST_PLAN.md +24 -0
  71. data/templates/EXECUTE/08_TASKS.md +29 -0
  72. data/templates/EXECUTE/09_SCAFFOLDING_DEVEX.md +25 -0
  73. data/templates/EXECUTE/10_IMPLEMENTATION_AGENT.md +30 -0
  74. data/templates/EXECUTE/11_STATIC_ANALYSIS.md +22 -0
  75. data/templates/EXECUTE/12_OBSERVABILITY_SLOS.md +21 -0
  76. data/templates/EXECUTE/13_DELIVERY_ROLLOUT.md +21 -0
  77. data/templates/EXECUTE/14_DOCS_PORTAL.md +23 -0
  78. data/templates/EXECUTE/15_POST_RELEASE.md +25 -0
  79. metadata +301 -0
@@ -0,0 +1,320 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tty-progressbar"
4
+ require "tty-spinner"
5
+ require "tty-table"
6
+ require "colorize"
7
+
8
+ module Aidp
9
+ class ProgressVisualizer
10
+ # Progress bar styles
11
+ PROGRESS_STYLES = {
12
+ default: {complete: "█", incomplete: "░", head: "█"},
13
+ dots: {complete: "●", incomplete: "○", head: "●"},
14
+ blocks: {complete: "▓", incomplete: "░", head: "▓"},
15
+ arrows: {complete: "▶", incomplete: "▷", head: "▶"}
16
+ }.freeze
17
+
18
+ def initialize(config = {})
19
+ @config = config
20
+ @quiet = config[:quiet] || false
21
+ @style = config[:style] || :default
22
+ @show_details = config[:show_details] || true
23
+ end
24
+
25
+ # Display analysis progress
26
+ def show_analysis_progress(analysis_data, options = {})
27
+ return if @quiet
28
+
29
+ total_steps = analysis_data[:total_steps] || 1
30
+ current_step = analysis_data[:current_step] || 0
31
+ step_name = analysis_data[:current_step_name] || "Analyzing"
32
+
33
+ progress_bar = create_progress_bar(total_steps, step_name, options)
34
+
35
+ # Update progress
36
+ progress_bar.advance(current_step)
37
+
38
+ # Show step details if enabled
39
+ show_step_details(analysis_data[:step_details]) if @show_details && analysis_data[:step_details]
40
+
41
+ progress_bar
42
+ end
43
+
44
+ # Display step progress
45
+ def show_step_progress(step_name, progress_data, options = {})
46
+ return if @quiet
47
+
48
+ total_items = progress_data[:total_items] || 1
49
+ processed_items = progress_data[:processed_items] || 0
50
+ current_item = progress_data[:current_item] || ""
51
+
52
+ progress_bar = create_progress_bar(total_items, "#{step_name}: #{current_item}", options)
53
+ progress_bar.advance(processed_items)
54
+
55
+ progress_bar
56
+ end
57
+
58
+ # Display spinner for long-running operations
59
+ def show_spinner(message, options = {})
60
+ return if @quiet
61
+
62
+ spinner = TTY::Spinner.new(
63
+ "[:spinner] #{message}",
64
+ format: :dots,
65
+ success_mark: "✓",
66
+ error_mark: "✗",
67
+ hide_cursor: true
68
+ )
69
+
70
+ spinner.auto_spin
71
+ spinner
72
+ end
73
+
74
+ # Display analysis status table
75
+ def show_analysis_status(status_data, options = {})
76
+ return if @quiet
77
+
78
+ table = create_status_table(status_data)
79
+ puts table.render(:ascii)
80
+ end
81
+
82
+ # Display analysis summary
83
+ def show_analysis_summary(summary_data, options = {})
84
+ return if @quiet
85
+
86
+ puts "\n" + "=" * 60
87
+ puts "ANALYSIS SUMMARY".center(60)
88
+ puts "=" * 60
89
+
90
+ # Overall statistics
91
+ puts "📊 Overall Statistics:"
92
+ puts " • Total Steps: #{summary_data[:total_steps]}"
93
+ puts " • Completed Steps: #{summary_data[:completed_steps]}"
94
+ puts " • Failed Steps: #{summary_data[:failed_steps]}"
95
+ puts " • Duration: #{format_duration(summary_data[:duration])}"
96
+
97
+ # Step details
98
+ if summary_data[:step_details]
99
+ puts "\n📋 Step Details:"
100
+ summary_data[:step_details].each do |step|
101
+ status_icon = if step[:status] == "completed"
102
+ "✅"
103
+ else
104
+ (step[:status] == "failed") ? "❌" : "⏳"
105
+ end
106
+ puts " #{status_icon} #{step[:name]}: #{format_duration(step[:duration])}"
107
+ end
108
+ end
109
+
110
+ # Metrics summary
111
+ if summary_data[:metrics]
112
+ puts "\n📈 Metrics Summary:"
113
+ summary_data[:metrics].each do |metric, value|
114
+ puts " • #{metric}: #{value}"
115
+ end
116
+ end
117
+
118
+ puts "=" * 60
119
+ end
120
+
121
+ # Display incremental analysis status
122
+ def show_incremental_status(status_data, options = {})
123
+ return if @quiet
124
+
125
+ puts "\n🔄 Incremental Analysis Status"
126
+ puts "-" * 40
127
+
128
+ coverage = status_data[:analysis_coverage] || 0
129
+ coverage_color = if coverage >= 0.8
130
+ :green
131
+ else
132
+ (coverage >= 0.6) ? :yellow : :red
133
+ end
134
+
135
+ puts "📁 Total Components: #{status_data[:total_components]}"
136
+ puts "✅ Analyzed Components: #{status_data[:analyzed_components]}"
137
+ puts "⏳ Pending Components: #{status_data[:pending_components]}"
138
+ puts "📊 Coverage: #{coverage_colorize(coverage * 100, coverage_color)}%"
139
+
140
+ return unless status_data[:last_analysis]
141
+
142
+ puts "🕒 Last Analysis: #{status_data[:last_analysis].strftime("%Y-%m-%d %H:%M:%S")}"
143
+ end
144
+
145
+ # Display recommendations
146
+ def show_recommendations(recommendations, options = {})
147
+ return if @quiet
148
+
149
+ puts "\n💡 Recommendations"
150
+ puts "-" * 30
151
+
152
+ recommendations.each_with_index do |rec, index|
153
+ priority_color = case rec[:priority]
154
+ when "high"
155
+ :red
156
+ when "medium"
157
+ :yellow
158
+ when "low"
159
+ :green
160
+ else
161
+ :white
162
+ end
163
+
164
+ puts "#{index + 1}. #{priority_colorize(rec[:message], priority_color)}"
165
+ puts " Action: #{rec[:action]}"
166
+ puts
167
+ end
168
+ end
169
+
170
+ # Display error summary
171
+ def show_error_summary(errors, options = {})
172
+ return if @quiet
173
+
174
+ puts "\n❌ Error Summary"
175
+ puts "-" * 20
176
+
177
+ errors.each_with_index do |error, index|
178
+ puts "#{index + 1}. #{error[:step] || "Unknown step"}: #{error[:message]}"
179
+ puts " Details: #{error[:details]}" if error[:details]
180
+ puts
181
+ end
182
+ end
183
+
184
+ # Display real-time progress
185
+ def show_realtime_progress(progress_data, options = {})
186
+ return if @quiet
187
+
188
+ # Clear previous line
189
+ print "\r\e[K"
190
+
191
+ # Show current progress
192
+ percentage = progress_data[:percentage] || 0
193
+ message = progress_data[:message] || "Processing"
194
+
195
+ progress_bar = create_simple_progress_bar(percentage, message)
196
+ print progress_bar
197
+
198
+ # Flush output
199
+ $stdout.flush
200
+ end
201
+
202
+ # Display completion message
203
+ def show_completion_message(message, options = {})
204
+ return if @quiet
205
+
206
+ success = options[:success] || true
207
+ icon = success ? "✅" : "❌"
208
+ color = success ? :green : :red
209
+
210
+ puts "\n#{icon} #{colorize(message, color)}"
211
+ end
212
+
213
+ # Display warning message
214
+ def show_warning_message(message, options = {})
215
+ return if @quiet
216
+
217
+ puts "\n⚠️ #{colorize(message, :yellow)}"
218
+ end
219
+
220
+ # Display info message
221
+ def show_info_message(message, options = {})
222
+ return if @quiet
223
+
224
+ puts "\nℹ️ #{colorize(message, :blue)}"
225
+ end
226
+
227
+ private
228
+
229
+ def create_progress_bar(total, title, options = {})
230
+ style = options[:style] || @style
231
+ progress_style = PROGRESS_STYLES[style] || PROGRESS_STYLES[:default]
232
+
233
+ TTY::ProgressBar.new(
234
+ "#{title} [:bar] :percent :current/:total",
235
+ total: total,
236
+ width: 50,
237
+ complete: progress_style[:complete],
238
+ incomplete: progress_style[:incomplete],
239
+ head: progress_style[:head]
240
+ )
241
+ end
242
+
243
+ def create_simple_progress_bar(percentage, message)
244
+ width = 30
245
+ filled = (percentage * width / 100).to_i
246
+ empty = width - filled
247
+
248
+ bar = "█" * filled + "░" * empty
249
+ "#{message}: [#{bar}] #{percentage.round(1)}%"
250
+ end
251
+
252
+ def create_status_table(status_data)
253
+ headers = %w[Step Status Duration Progress]
254
+ rows = []
255
+
256
+ status_data[:steps]&.each do |step|
257
+ status_icon = case step[:status]
258
+ when "completed"
259
+ "✅"
260
+ when "failed"
261
+ "❌"
262
+ when "running"
263
+ "⏳"
264
+ else
265
+ "⏸️"
266
+ end
267
+
268
+ rows << [
269
+ step[:name],
270
+ "#{status_icon} #{step[:status]}",
271
+ format_duration(step[:duration]),
272
+ step[:progress] ? "#{step[:progress]}%" : "N/A"
273
+ ]
274
+ end
275
+
276
+ TTY::Table.new(headers, rows)
277
+ end
278
+
279
+ def show_step_details(step_details)
280
+ puts "\n📝 Current Step Details:"
281
+ step_details.each do |key, value|
282
+ puts " • #{key}: #{value}"
283
+ end
284
+ end
285
+
286
+ def format_duration(seconds)
287
+ return "N/A" unless seconds
288
+
289
+ if seconds < 60
290
+ "#{seconds.round(1)}s"
291
+ elsif seconds < 3600
292
+ minutes = (seconds / 60).to_i
293
+ remaining_seconds = (seconds % 60).round(1)
294
+ "#{minutes}m #{remaining_seconds}s"
295
+ else
296
+ hours = (seconds / 3600).to_i
297
+ remaining_minutes = ((seconds % 3600) / 60).to_i
298
+ "#{hours}h #{remaining_minutes}m"
299
+ end
300
+ end
301
+
302
+ def colorize(text, color)
303
+ return text unless defined?((+"").colorize)
304
+
305
+ text.to_s.colorize(color)
306
+ end
307
+
308
+ def coverage_colorize(percentage, color)
309
+ return percentage unless defined?((+"").colorize)
310
+
311
+ percentage.to_s.colorize(color)
312
+ end
313
+
314
+ def priority_colorize(text, color)
315
+ return text unless defined?((+"").colorize)
316
+
317
+ text.to_s.colorize(color)
318
+ end
319
+ end
320
+ end