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.
- checksums.yaml +4 -4
- data/README.md +194 -25
- data/lib/aidp/analyze/kb_inspector.rb +2 -15
- data/lib/aidp/analyze/progress.rb +2 -1
- data/lib/aidp/analyze/ruby_maat_integration.rb +2 -15
- data/lib/aidp/analyze/runner.rb +64 -20
- data/lib/aidp/analyze/steps.rb +10 -8
- data/lib/aidp/analyze/tree_sitter_grammar_loader.rb +2 -13
- data/lib/aidp/analyze/tree_sitter_scan.rb +2 -13
- data/lib/aidp/cli/checkpoint_command.rb +98 -0
- data/lib/aidp/cli/first_run_wizard.rb +65 -94
- data/lib/aidp/cli/jobs_command.rb +249 -34
- data/lib/aidp/cli/mcp_dashboard.rb +205 -0
- data/lib/aidp/cli.rb +517 -43
- data/lib/aidp/config.rb +5 -8
- data/lib/aidp/debug_logger.rb +4 -4
- data/lib/aidp/debug_mixin.rb +11 -4
- data/lib/aidp/execute/checkpoint.rb +282 -0
- data/lib/aidp/execute/checkpoint_display.rb +221 -0
- data/lib/aidp/execute/progress.rb +2 -1
- data/lib/aidp/execute/prompt_manager.rb +62 -0
- data/lib/aidp/execute/runner.rb +53 -24
- data/lib/aidp/execute/steps.rb +36 -27
- data/lib/aidp/execute/work_loop_runner.rb +308 -0
- data/lib/aidp/execute/workflow_selector.rb +26 -17
- data/lib/aidp/harness/condition_detector.rb +4 -4
- data/lib/aidp/harness/config_schema.rb +40 -0
- data/lib/aidp/harness/config_validator.rb +3 -6
- data/lib/aidp/harness/configuration.rb +35 -1
- data/lib/aidp/harness/enhanced_runner.rb +22 -1
- data/lib/aidp/harness/error_handler.rb +103 -28
- data/lib/aidp/harness/provider_factory.rb +4 -1
- data/lib/aidp/harness/provider_info.rb +366 -0
- data/lib/aidp/harness/provider_manager.rb +250 -15
- data/lib/aidp/harness/runner.rb +3 -14
- data/lib/aidp/harness/simple_user_interface.rb +2 -15
- data/lib/aidp/harness/status_display.rb +12 -17
- data/lib/aidp/harness/test_runner.rb +83 -0
- data/lib/aidp/harness/ui/enhanced_tui.rb +2 -0
- data/lib/aidp/harness/ui/enhanced_workflow_selector.rb +44 -5
- data/lib/aidp/harness/ui/error_handler.rb +4 -0
- data/lib/aidp/harness/ui/frame_manager.rb +10 -8
- data/lib/aidp/harness/ui/job_monitor.rb +2 -0
- data/lib/aidp/harness/ui/navigation/main_menu.rb +4 -2
- data/lib/aidp/harness/ui/navigation/menu_item.rb +1 -0
- data/lib/aidp/harness/ui/navigation/menu_state.rb +1 -0
- data/lib/aidp/harness/ui/navigation/submenu.rb +1 -0
- data/lib/aidp/harness/ui/navigation/workflow_selector.rb +2 -0
- data/lib/aidp/harness/ui/progress_display.rb +8 -12
- data/lib/aidp/harness/ui/question_collector.rb +2 -0
- data/lib/aidp/harness/ui/spinner_group.rb +2 -0
- data/lib/aidp/harness/ui/spinner_helper.rb +1 -1
- data/lib/aidp/harness/ui/status_manager.rb +4 -2
- data/lib/aidp/harness/ui/status_widget.rb +3 -1
- data/lib/aidp/harness/ui/workflow_controller.rb +2 -0
- data/lib/aidp/harness/user_interface.rb +12 -17
- data/lib/aidp/jobs/background_runner.rb +278 -0
- data/lib/aidp/message_display.rb +48 -0
- data/lib/aidp/provider_manager.rb +3 -1
- data/lib/aidp/providers/anthropic.rb +100 -17
- data/lib/aidp/providers/base.rb +42 -11
- data/lib/aidp/providers/codex.rb +248 -0
- data/lib/aidp/providers/cursor.rb +35 -42
- data/lib/aidp/providers/gemini.rb +25 -15
- data/lib/aidp/providers/github_copilot.rb +41 -42
- data/lib/aidp/providers/opencode.rb +34 -41
- data/lib/aidp/version.rb +1 -1
- data/lib/aidp/workflows/definitions.rb +357 -0
- data/lib/aidp/workflows/guided_agent.rb +400 -0
- data/lib/aidp/workflows/selector.rb +171 -0
- data/lib/aidp.rb +12 -0
- data/templates/planning/generate_llm_style_guide.md +119 -0
- metadata +41 -26
- /data/templates/{ANALYZE/02_ARCHITECTURE_ANALYSIS.md → analysis/analyze_architecture.md} +0 -0
- /data/templates/{ANALYZE/05_DOCUMENTATION_ANALYSIS.md → analysis/analyze_documentation.md} +0 -0
- /data/templates/{ANALYZE/04_FUNCTIONALITY_ANALYSIS.md → analysis/analyze_functionality.md} +0 -0
- /data/templates/{ANALYZE/01_REPOSITORY_ANALYSIS.md → analysis/analyze_repository.md} +0 -0
- /data/templates/{ANALYZE/06_STATIC_ANALYSIS.md → analysis/analyze_static_code.md} +0 -0
- /data/templates/{ANALYZE/03_TEST_ANALYSIS.md → analysis/analyze_tests.md} +0 -0
- /data/templates/{ANALYZE/07_REFACTORING_RECOMMENDATIONS.md → analysis/recommend_refactoring.md} +0 -0
- /data/templates/{ANALYZE/06a_tree_sitter_scan.md → analysis/scan_with_tree_sitter.md} +0 -0
- /data/templates/{EXECUTE/11_STATIC_ANALYSIS.md → implementation/configure_static_analysis.md} +0 -0
- /data/templates/{EXECUTE/14_DOCS_PORTAL.md → implementation/create_documentation_portal.md} +0 -0
- /data/templates/{EXECUTE/10_IMPLEMENTATION_AGENT.md → implementation/implement_features.md} +0 -0
- /data/templates/{EXECUTE/13_DELIVERY_ROLLOUT.md → implementation/plan_delivery.md} +0 -0
- /data/templates/{EXECUTE/15_POST_RELEASE.md → implementation/review_post_release.md} +0 -0
- /data/templates/{EXECUTE/09_SCAFFOLDING_DEVEX.md → implementation/setup_scaffolding.md} +0 -0
- /data/templates/{EXECUTE/02A_ARCH_GATE_QUESTIONS.md → planning/ask_architecture_questions.md} +0 -0
- /data/templates/{EXECUTE/00_PRD.md → planning/create_prd.md} +0 -0
- /data/templates/{EXECUTE/08_TASKS.md → planning/create_tasks.md} +0 -0
- /data/templates/{EXECUTE/04_DOMAIN_DECOMPOSITION.md → planning/decompose_domain.md} +0 -0
- /data/templates/{EXECUTE/01_NFRS.md → planning/define_nfrs.md} +0 -0
- /data/templates/{EXECUTE/05_CONTRACTS.md → planning/design_apis.md} +0 -0
- /data/templates/{EXECUTE/02_ARCHITECTURE.md → planning/design_architecture.md} +0 -0
- /data/templates/{EXECUTE/06_THREAT_MODEL.md → planning/design_data_model.md} +0 -0
- /data/templates/{EXECUTE/03_ADR_FACTORY.md → planning/generate_adrs.md} +0 -0
- /data/templates/{EXECUTE/12_OBSERVABILITY_SLOS.md → planning/plan_observability.md} +0 -0
- /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
|