aidp 0.10.0 → 0.12.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +194 -25
  3. data/lib/aidp/analyze/kb_inspector.rb +2 -15
  4. data/lib/aidp/analyze/progress.rb +2 -1
  5. data/lib/aidp/analyze/ruby_maat_integration.rb +2 -15
  6. data/lib/aidp/analyze/runner.rb +64 -20
  7. data/lib/aidp/analyze/steps.rb +10 -8
  8. data/lib/aidp/analyze/tree_sitter_grammar_loader.rb +2 -13
  9. data/lib/aidp/analyze/tree_sitter_scan.rb +2 -13
  10. data/lib/aidp/cli/checkpoint_command.rb +98 -0
  11. data/lib/aidp/cli/first_run_wizard.rb +65 -94
  12. data/lib/aidp/cli/jobs_command.rb +249 -34
  13. data/lib/aidp/cli/mcp_dashboard.rb +205 -0
  14. data/lib/aidp/cli.rb +517 -43
  15. data/lib/aidp/config.rb +5 -8
  16. data/lib/aidp/debug_logger.rb +4 -4
  17. data/lib/aidp/debug_mixin.rb +11 -4
  18. data/lib/aidp/execute/checkpoint.rb +282 -0
  19. data/lib/aidp/execute/checkpoint_display.rb +221 -0
  20. data/lib/aidp/execute/progress.rb +2 -1
  21. data/lib/aidp/execute/prompt_manager.rb +62 -0
  22. data/lib/aidp/execute/runner.rb +53 -24
  23. data/lib/aidp/execute/steps.rb +36 -27
  24. data/lib/aidp/execute/work_loop_runner.rb +308 -0
  25. data/lib/aidp/execute/workflow_selector.rb +26 -17
  26. data/lib/aidp/harness/condition_detector.rb +4 -4
  27. data/lib/aidp/harness/config_schema.rb +40 -0
  28. data/lib/aidp/harness/config_validator.rb +3 -6
  29. data/lib/aidp/harness/configuration.rb +35 -1
  30. data/lib/aidp/harness/enhanced_runner.rb +22 -1
  31. data/lib/aidp/harness/error_handler.rb +103 -28
  32. data/lib/aidp/harness/provider_factory.rb +4 -1
  33. data/lib/aidp/harness/provider_info.rb +366 -0
  34. data/lib/aidp/harness/provider_manager.rb +250 -15
  35. data/lib/aidp/harness/runner.rb +3 -14
  36. data/lib/aidp/harness/simple_user_interface.rb +2 -15
  37. data/lib/aidp/harness/status_display.rb +12 -17
  38. data/lib/aidp/harness/test_runner.rb +83 -0
  39. data/lib/aidp/harness/ui/enhanced_tui.rb +2 -0
  40. data/lib/aidp/harness/ui/enhanced_workflow_selector.rb +44 -5
  41. data/lib/aidp/harness/ui/error_handler.rb +4 -0
  42. data/lib/aidp/harness/ui/frame_manager.rb +10 -8
  43. data/lib/aidp/harness/ui/job_monitor.rb +2 -0
  44. data/lib/aidp/harness/ui/navigation/main_menu.rb +4 -2
  45. data/lib/aidp/harness/ui/navigation/menu_item.rb +1 -0
  46. data/lib/aidp/harness/ui/navigation/menu_state.rb +1 -0
  47. data/lib/aidp/harness/ui/navigation/submenu.rb +1 -0
  48. data/lib/aidp/harness/ui/navigation/workflow_selector.rb +2 -0
  49. data/lib/aidp/harness/ui/progress_display.rb +8 -12
  50. data/lib/aidp/harness/ui/question_collector.rb +2 -0
  51. data/lib/aidp/harness/ui/spinner_group.rb +2 -0
  52. data/lib/aidp/harness/ui/spinner_helper.rb +1 -1
  53. data/lib/aidp/harness/ui/status_manager.rb +4 -2
  54. data/lib/aidp/harness/ui/status_widget.rb +3 -1
  55. data/lib/aidp/harness/ui/workflow_controller.rb +2 -0
  56. data/lib/aidp/harness/user_interface.rb +12 -17
  57. data/lib/aidp/jobs/background_runner.rb +278 -0
  58. data/lib/aidp/message_display.rb +48 -0
  59. data/lib/aidp/provider_manager.rb +3 -1
  60. data/lib/aidp/providers/anthropic.rb +100 -17
  61. data/lib/aidp/providers/base.rb +42 -11
  62. data/lib/aidp/providers/codex.rb +248 -0
  63. data/lib/aidp/providers/cursor.rb +35 -42
  64. data/lib/aidp/providers/gemini.rb +25 -15
  65. data/lib/aidp/providers/github_copilot.rb +41 -42
  66. data/lib/aidp/providers/opencode.rb +34 -41
  67. data/lib/aidp/version.rb +1 -1
  68. data/lib/aidp/workflows/definitions.rb +357 -0
  69. data/lib/aidp/workflows/guided_agent.rb +400 -0
  70. data/lib/aidp/workflows/selector.rb +171 -0
  71. data/lib/aidp.rb +12 -0
  72. data/templates/planning/generate_llm_style_guide.md +119 -0
  73. metadata +41 -26
  74. /data/templates/{ANALYZE/02_ARCHITECTURE_ANALYSIS.md → analysis/analyze_architecture.md} +0 -0
  75. /data/templates/{ANALYZE/05_DOCUMENTATION_ANALYSIS.md → analysis/analyze_documentation.md} +0 -0
  76. /data/templates/{ANALYZE/04_FUNCTIONALITY_ANALYSIS.md → analysis/analyze_functionality.md} +0 -0
  77. /data/templates/{ANALYZE/01_REPOSITORY_ANALYSIS.md → analysis/analyze_repository.md} +0 -0
  78. /data/templates/{ANALYZE/06_STATIC_ANALYSIS.md → analysis/analyze_static_code.md} +0 -0
  79. /data/templates/{ANALYZE/03_TEST_ANALYSIS.md → analysis/analyze_tests.md} +0 -0
  80. /data/templates/{ANALYZE/07_REFACTORING_RECOMMENDATIONS.md → analysis/recommend_refactoring.md} +0 -0
  81. /data/templates/{ANALYZE/06a_tree_sitter_scan.md → analysis/scan_with_tree_sitter.md} +0 -0
  82. /data/templates/{EXECUTE/11_STATIC_ANALYSIS.md → implementation/configure_static_analysis.md} +0 -0
  83. /data/templates/{EXECUTE/14_DOCS_PORTAL.md → implementation/create_documentation_portal.md} +0 -0
  84. /data/templates/{EXECUTE/10_IMPLEMENTATION_AGENT.md → implementation/implement_features.md} +0 -0
  85. /data/templates/{EXECUTE/13_DELIVERY_ROLLOUT.md → implementation/plan_delivery.md} +0 -0
  86. /data/templates/{EXECUTE/15_POST_RELEASE.md → implementation/review_post_release.md} +0 -0
  87. /data/templates/{EXECUTE/09_SCAFFOLDING_DEVEX.md → implementation/setup_scaffolding.md} +0 -0
  88. /data/templates/{EXECUTE/02A_ARCH_GATE_QUESTIONS.md → planning/ask_architecture_questions.md} +0 -0
  89. /data/templates/{EXECUTE/00_PRD.md → planning/create_prd.md} +0 -0
  90. /data/templates/{EXECUTE/08_TASKS.md → planning/create_tasks.md} +0 -0
  91. /data/templates/{EXECUTE/04_DOMAIN_DECOMPOSITION.md → planning/decompose_domain.md} +0 -0
  92. /data/templates/{EXECUTE/01_NFRS.md → planning/define_nfrs.md} +0 -0
  93. /data/templates/{EXECUTE/05_CONTRACTS.md → planning/design_apis.md} +0 -0
  94. /data/templates/{EXECUTE/02_ARCHITECTURE.md → planning/design_architecture.md} +0 -0
  95. /data/templates/{EXECUTE/06_THREAT_MODEL.md → planning/design_data_model.md} +0 -0
  96. /data/templates/{EXECUTE/03_ADR_FACTORY.md → planning/generate_adrs.md} +0 -0
  97. /data/templates/{EXECUTE/12_OBSERVABILITY_SLOS.md → planning/plan_observability.md} +0 -0
  98. /data/templates/{EXECUTE/07_TEST_PLAN.md → planning/plan_testing.md} +0 -0
@@ -0,0 +1,205 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tty-table"
4
+ require_relative "../harness/provider_info"
5
+ require_relative "../harness/configuration"
6
+
7
+ module Aidp
8
+ class CLI
9
+ # Dashboard for viewing MCP servers across all providers
10
+ class McpDashboard
11
+ include Aidp::MessageDisplay
12
+
13
+ def initialize(root_dir = nil)
14
+ @root_dir = root_dir || Dir.pwd
15
+ @configuration = Aidp::Harness::Configuration.new(@root_dir)
16
+ end
17
+
18
+ # Display MCP dashboard showing all servers across all providers
19
+ def display_dashboard(options = {})
20
+ no_color = options[:no_color] || false
21
+
22
+ # Gather MCP server information from all providers
23
+ server_matrix = build_server_matrix
24
+
25
+ # Display summary
26
+ display_message("MCP Server Dashboard", type: :highlight)
27
+ display_message("=" * 80, type: :muted)
28
+ display_message("", type: :info)
29
+
30
+ # Check if there are any MCP-capable providers
31
+ if server_matrix[:providers].empty?
32
+ display_message("No providers with MCP support configured.", type: :info)
33
+ display_message("MCP is supported by providers like: claude", type: :muted)
34
+ display_message("\n" + "=" * 80, type: :muted)
35
+ return
36
+ end
37
+
38
+ # Check if there are any MCP servers configured
39
+ if server_matrix[:servers].empty?
40
+ display_message("No MCP servers configured across any providers.", type: :info)
41
+ display_message("Add MCP servers with: claude mcp add <name> -- <command>", type: :muted)
42
+ display_message("\n" + "=" * 80, type: :muted)
43
+ return
44
+ end
45
+
46
+ # Display the main table
47
+ display_server_table(server_matrix, no_color)
48
+
49
+ # Display eligibility warnings
50
+ display_eligibility_warnings(server_matrix)
51
+
52
+ display_message("\n" + "=" * 80, type: :muted)
53
+ end
54
+
55
+ # Get MCP server availability for a specific task requirement
56
+ def check_task_eligibility(required_servers)
57
+ server_matrix = build_server_matrix
58
+ eligible_providers = []
59
+
60
+ @configuration.configured_providers.each do |provider|
61
+ provider_servers = server_matrix[:provider_servers][provider] || []
62
+ enabled_servers = provider_servers.select { |s| s[:enabled] }.map { |s| s[:name] }
63
+
64
+ # Check if provider has all required servers
65
+ if required_servers.all? { |req| enabled_servers.include?(req) }
66
+ eligible_providers << provider
67
+ end
68
+ end
69
+
70
+ {
71
+ required_servers: required_servers,
72
+ eligible_providers: eligible_providers,
73
+ total_providers: @configuration.configured_providers.size
74
+ }
75
+ end
76
+
77
+ # Display eligibility check for specific servers
78
+ def display_task_eligibility(required_servers)
79
+ result = check_task_eligibility(required_servers)
80
+
81
+ display_message("\nTask Eligibility Check", type: :highlight)
82
+ display_message("Required MCP Servers: #{required_servers.join(", ")}", type: :info)
83
+ display_message("", type: :info)
84
+
85
+ if result[:eligible_providers].any?
86
+ display_message("✓ Eligible Providers (#{result[:eligible_providers].size}/#{result[:total_providers]}):", type: :success)
87
+ result[:eligible_providers].each do |provider|
88
+ display_message(" • #{provider}", type: :success)
89
+ end
90
+ else
91
+ display_message("✗ No providers have all required MCP servers", type: :error)
92
+ display_message(" Consider configuring MCP servers for at least one provider", type: :warning)
93
+ end
94
+ end
95
+
96
+ private
97
+
98
+ def build_server_matrix
99
+ providers = @configuration.configured_providers
100
+ all_servers = {} # server_name => {providers: {provider_name => server_info}}
101
+ provider_servers = {} # provider_name => [server_info]
102
+
103
+ providers.each do |provider|
104
+ provider_info = Aidp::Harness::ProviderInfo.new(provider, @root_dir)
105
+ info = provider_info.get_info
106
+
107
+ next unless info[:mcp_support]
108
+
109
+ servers = info[:mcp_servers] || []
110
+ provider_servers[provider] = servers
111
+
112
+ servers.each do |server|
113
+ server_name = server[:name]
114
+ all_servers[server_name] ||= {providers: {}}
115
+ all_servers[server_name][:providers][provider] = server
116
+ end
117
+ end
118
+
119
+ {
120
+ servers: all_servers,
121
+ provider_servers: provider_servers,
122
+ providers: providers.select { |p| provider_servers.key?(p) }
123
+ }
124
+ end
125
+
126
+ def display_server_table(matrix, no_color)
127
+ # Check if we have any providers with MCP support
128
+ if matrix[:providers].empty?
129
+ display_message("No providers with MCP support configured.", type: :info)
130
+ return
131
+ end
132
+
133
+ # Build table rows
134
+ headers = ["MCP Server"] + matrix[:providers].map { |p| normalize_provider_name(p) }
135
+ rows = []
136
+
137
+ matrix[:servers].keys.sort.each do |server_name|
138
+ row = [server_name]
139
+
140
+ matrix[:providers].each do |provider|
141
+ server = matrix[:servers][server_name][:providers][provider]
142
+ cell = if server
143
+ format_server_status(server, no_color)
144
+ else
145
+ (no_color || !$stdout.tty?) ? "-" : "\e[90m-\e[0m"
146
+ end
147
+ row << cell
148
+ end
149
+
150
+ rows << row
151
+ end
152
+
153
+ # Create and display table
154
+ table = TTY::Table.new(headers, rows)
155
+ display_message(table.render(:basic), type: :info)
156
+ display_message("", type: :info)
157
+
158
+ # Legend
159
+ display_legend(no_color)
160
+ end
161
+
162
+ def format_server_status(server, no_color)
163
+ if no_color || !$stdout.tty?
164
+ server[:enabled] ? "✓" : "✗"
165
+ elsif server[:enabled]
166
+ "\e[32m✓\e[0m" # Green checkmark
167
+ else
168
+ "\e[31m✗\e[0m" # Red X
169
+ end
170
+ end
171
+
172
+ def display_legend(no_color)
173
+ if no_color || !$stdout.tty?
174
+ display_message("Legend: ✓ = Enabled ✗ = Error/Disabled - = Not configured", type: :muted)
175
+ else
176
+ display_message("Legend: \e[32m✓\e[0m = Enabled \e[31m✗\e[0m = Error/Disabled \e[90m-\e[0m = Not configured", type: :muted)
177
+ end
178
+ end
179
+
180
+ def display_eligibility_warnings(matrix)
181
+ # Find servers that are only configured on some providers
182
+ partially_configured = matrix[:servers].select do |_name, info|
183
+ configured_count = info[:providers].size
184
+ configured_count > 0 && configured_count < matrix[:providers].size
185
+ end
186
+
187
+ return if partially_configured.empty?
188
+
189
+ display_message("\n⚠ Eligibility Warnings:", type: :warning)
190
+ partially_configured.each do |server_name, info|
191
+ missing_providers = matrix[:providers] - info[:providers].keys
192
+ if missing_providers.any?
193
+ display_message(" • '#{server_name}' not configured on: #{missing_providers.join(", ")}", type: :warning)
194
+ display_message(" These providers won't be eligible for tasks requiring this MCP server", type: :muted)
195
+ end
196
+ end
197
+ end
198
+
199
+ def normalize_provider_name(name)
200
+ return "claude" if name == "anthropic"
201
+ name
202
+ end
203
+ end
204
+ end
205
+ end