aidp 0.25.0 → 0.27.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 +45 -6
- data/lib/aidp/analyze/error_handler.rb +11 -0
- data/lib/aidp/cli/checkpoint_command.rb +198 -0
- data/lib/aidp/cli/config_command.rb +71 -0
- data/lib/aidp/cli/enhanced_input.rb +2 -0
- data/lib/aidp/cli/first_run_wizard.rb +8 -7
- data/lib/aidp/cli/harness_command.rb +102 -0
- data/lib/aidp/cli/jobs_command.rb +3 -3
- data/lib/aidp/cli/mcp_dashboard.rb +4 -3
- data/lib/aidp/cli/models_command.rb +662 -0
- data/lib/aidp/cli/providers_command.rb +223 -0
- data/lib/aidp/cli.rb +35 -456
- data/lib/aidp/daemon/runner.rb +2 -2
- data/lib/aidp/debug_mixin.rb +2 -9
- data/lib/aidp/execute/async_work_loop_runner.rb +2 -1
- data/lib/aidp/execute/checkpoint_display.rb +38 -37
- data/lib/aidp/execute/interactive_repl.rb +2 -1
- data/lib/aidp/execute/prompt_manager.rb +4 -4
- data/lib/aidp/execute/work_loop_runner.rb +253 -56
- data/lib/aidp/execute/workflow_selector.rb +2 -2
- data/lib/aidp/harness/config_loader.rb +20 -11
- data/lib/aidp/harness/config_manager.rb +5 -5
- data/lib/aidp/harness/config_schema.rb +30 -8
- data/lib/aidp/harness/configuration.rb +105 -4
- data/lib/aidp/harness/enhanced_runner.rb +24 -15
- data/lib/aidp/harness/error_handler.rb +26 -5
- data/lib/aidp/harness/filter_strategy.rb +45 -0
- data/lib/aidp/harness/generic_filter_strategy.rb +63 -0
- data/lib/aidp/harness/model_cache.rb +269 -0
- data/lib/aidp/harness/model_discovery_service.rb +259 -0
- data/lib/aidp/harness/model_registry.rb +201 -0
- data/lib/aidp/harness/output_filter.rb +136 -0
- data/lib/aidp/harness/provider_manager.rb +18 -3
- data/lib/aidp/harness/rspec_filter_strategy.rb +82 -0
- data/lib/aidp/harness/runner.rb +5 -0
- data/lib/aidp/harness/test_runner.rb +165 -27
- data/lib/aidp/harness/thinking_depth_manager.rb +223 -7
- data/lib/aidp/harness/ui/enhanced_tui.rb +4 -1
- data/lib/aidp/logger.rb +35 -5
- data/lib/aidp/providers/adapter.rb +2 -4
- data/lib/aidp/providers/anthropic.rb +141 -128
- data/lib/aidp/providers/base.rb +98 -2
- data/lib/aidp/providers/capability_registry.rb +0 -1
- data/lib/aidp/providers/codex.rb +49 -67
- data/lib/aidp/providers/cursor.rb +71 -59
- data/lib/aidp/providers/gemini.rb +44 -60
- data/lib/aidp/providers/github_copilot.rb +2 -66
- data/lib/aidp/providers/kilocode.rb +24 -80
- data/lib/aidp/providers/opencode.rb +24 -80
- data/lib/aidp/safe_directory.rb +10 -3
- data/lib/aidp/setup/wizard.rb +345 -8
- data/lib/aidp/storage/csv_storage.rb +9 -3
- data/lib/aidp/storage/file_manager.rb +8 -2
- data/lib/aidp/storage/json_storage.rb +9 -3
- data/lib/aidp/version.rb +1 -1
- data/lib/aidp/watch/build_processor.rb +40 -1
- data/lib/aidp/watch/change_request_processor.rb +659 -0
- data/lib/aidp/watch/plan_generator.rb +93 -14
- data/lib/aidp/watch/plan_processor.rb +71 -8
- data/lib/aidp/watch/repository_client.rb +85 -20
- data/lib/aidp/watch/review_processor.rb +3 -3
- data/lib/aidp/watch/runner.rb +37 -0
- data/lib/aidp/watch/state_store.rb +46 -1
- data/lib/aidp/workflows/guided_agent.rb +3 -3
- data/lib/aidp/workstream_executor.rb +5 -2
- data/lib/aidp.rb +4 -0
- data/templates/aidp-development.yml.example +2 -2
- data/templates/aidp-production.yml.example +3 -3
- data/templates/aidp.yml.example +53 -0
- metadata +14 -1
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "tty-table"
|
|
4
|
+
require "tty-prompt"
|
|
5
|
+
require "tty-spinner"
|
|
6
|
+
require_relative "../harness/provider_info"
|
|
7
|
+
require_relative "../harness/capability_registry"
|
|
8
|
+
require_relative "../harness/config_manager"
|
|
9
|
+
|
|
10
|
+
module Aidp
|
|
11
|
+
class CLI
|
|
12
|
+
# Command handler for `aidp providers info` and `aidp providers refresh` subcommands
|
|
13
|
+
#
|
|
14
|
+
# Provides commands for viewing and managing provider information:
|
|
15
|
+
# - info: Show detailed information about a specific provider or models catalog
|
|
16
|
+
# - refresh: Refresh provider information cache
|
|
17
|
+
#
|
|
18
|
+
# Usage:
|
|
19
|
+
# aidp providers info <provider> [--refresh]
|
|
20
|
+
# aidp providers refresh [<provider>]
|
|
21
|
+
class ProvidersCommand
|
|
22
|
+
include Aidp::MessageDisplay
|
|
23
|
+
|
|
24
|
+
def initialize(prompt: TTY::Prompt.new, provider_info_class: nil, capability_registry_class: nil, config_manager_class: nil, project_dir: nil)
|
|
25
|
+
@prompt = prompt
|
|
26
|
+
@provider_info_class = provider_info_class || Aidp::Harness::ProviderInfo
|
|
27
|
+
@capability_registry_class = capability_registry_class || Aidp::Harness::CapabilityRegistry
|
|
28
|
+
@config_manager_class = config_manager_class || Aidp::Harness::ConfigManager
|
|
29
|
+
@project_dir = project_dir || Dir.pwd
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Main entry point for providers info/refresh subcommands
|
|
33
|
+
def run(args, subcommand:)
|
|
34
|
+
case subcommand
|
|
35
|
+
when "info"
|
|
36
|
+
run_info_command(args)
|
|
37
|
+
when "refresh"
|
|
38
|
+
run_refresh_command(args)
|
|
39
|
+
when "catalog"
|
|
40
|
+
run_models_catalog_command
|
|
41
|
+
else
|
|
42
|
+
display_message("Unknown providers subcommand: #{subcommand}", type: :error)
|
|
43
|
+
display_help
|
|
44
|
+
1
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def run_info_command(args)
|
|
51
|
+
provider_name = args.shift
|
|
52
|
+
|
|
53
|
+
# If no provider specified, show models catalog table
|
|
54
|
+
unless provider_name
|
|
55
|
+
run_models_catalog_command
|
|
56
|
+
return
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
force_refresh = args.include?("--refresh")
|
|
60
|
+
|
|
61
|
+
display_message("Provider Information: #{provider_name}", type: :highlight)
|
|
62
|
+
display_message("=" * 60, type: :muted)
|
|
63
|
+
|
|
64
|
+
provider_info = @provider_info_class.new(provider_name, @project_dir)
|
|
65
|
+
info = provider_info.info(force_refresh: force_refresh)
|
|
66
|
+
|
|
67
|
+
if info.nil?
|
|
68
|
+
display_message("No information available for provider: #{provider_name}", type: :error)
|
|
69
|
+
return
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Display basic info
|
|
73
|
+
display_message("Last Checked: #{info[:last_checked]}", type: :info)
|
|
74
|
+
display_message("CLI Available: #{info[:cli_available] ? "Yes" : "No"}", type: info[:cli_available] ? :success : :error)
|
|
75
|
+
|
|
76
|
+
# Display authentication
|
|
77
|
+
if info[:auth_method]
|
|
78
|
+
display_message("\nAuthentication Method: #{info[:auth_method]}", type: :info)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Display MCP support
|
|
82
|
+
display_message("\nMCP Support: #{info[:mcp_support] ? "Yes" : "No"}", type: info[:mcp_support] ? :success : :info)
|
|
83
|
+
|
|
84
|
+
# Display MCP servers if available
|
|
85
|
+
if info[:mcp_servers]&.any?
|
|
86
|
+
display_message("\nMCP Servers: (#{info[:mcp_servers].size} configured)", type: :highlight)
|
|
87
|
+
info[:mcp_servers].each do |server|
|
|
88
|
+
status_symbol = server[:enabled] ? "✓" : "○"
|
|
89
|
+
display_message(" #{status_symbol} #{server[:name]} (#{server[:status]})", type: server[:enabled] ? :success : :muted)
|
|
90
|
+
display_message(" #{server[:description]}", type: :muted) if server[:description]
|
|
91
|
+
end
|
|
92
|
+
elsif info[:mcp_support]
|
|
93
|
+
display_message("\nMCP Servers: None configured", type: :muted)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Display permission modes
|
|
97
|
+
if info[:permission_modes]&.any?
|
|
98
|
+
display_message("\nPermission Modes:", type: :highlight)
|
|
99
|
+
info[:permission_modes].each do |mode|
|
|
100
|
+
if mode.is_a?(Hash)
|
|
101
|
+
display_message(" • #{mode[:name]}: #{mode[:description]}", type: :info)
|
|
102
|
+
else
|
|
103
|
+
display_message(" • #{mode}", type: :info)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Display capabilities
|
|
109
|
+
if info[:capabilities]&.any?
|
|
110
|
+
display_message("\nCapabilities:", type: :highlight)
|
|
111
|
+
info[:capabilities].each do |cap_name, enabled|
|
|
112
|
+
status = enabled ? "✓" : "✗"
|
|
113
|
+
status_type = enabled ? :success : :muted
|
|
114
|
+
display_message(" #{status} #{cap_name}", type: status_type)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Display CLI flags
|
|
119
|
+
if info[:flags]&.any?
|
|
120
|
+
display_message("\nAvailable CLI Flags:", type: :highlight)
|
|
121
|
+
info[:flags].each do |flag_name, flag_data|
|
|
122
|
+
display_message(" #{flag_data[:flag]}: #{flag_data[:description]}", type: :info)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def run_models_catalog_command
|
|
128
|
+
display_message("Models Catalog - Thinking Depth Tiers", type: :highlight)
|
|
129
|
+
display_message("=" * 80, type: :muted)
|
|
130
|
+
|
|
131
|
+
registry = @capability_registry_class.new
|
|
132
|
+
unless registry.load_catalog
|
|
133
|
+
display_message("No models catalog found. Create .aidp/models_catalog.yml first.", type: :error)
|
|
134
|
+
return
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
rows = []
|
|
138
|
+
registry.provider_names.sort.each do |provider|
|
|
139
|
+
models = registry.models_for_provider(provider)
|
|
140
|
+
models.each do |model_name, model_data|
|
|
141
|
+
tier = model_data["tier"] || "-"
|
|
142
|
+
context = model_data["context_window"] ? "#{model_data["context_window"] / 1000}k" : "-"
|
|
143
|
+
tools = model_data["supports_tools"] ? "yes" : "no"
|
|
144
|
+
cost_input = model_data["cost_per_mtok_input"]
|
|
145
|
+
cost = cost_input ? "$#{cost_input}/MTok" : "-"
|
|
146
|
+
|
|
147
|
+
rows << [provider, model_name, tier, context, tools, cost]
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
if rows.empty?
|
|
152
|
+
display_message("No models found in catalog", type: :info)
|
|
153
|
+
return
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
header = ["Provider", "Model", "Tier", "Context", "Tools", "Cost"]
|
|
157
|
+
table = TTY::Table.new(header, rows)
|
|
158
|
+
display_message(table.render(:basic), type: :info)
|
|
159
|
+
|
|
160
|
+
display_message("\n" + "=" * 80, type: :muted)
|
|
161
|
+
display_message("Use '/thinking show' in REPL to see current tier configuration", type: :muted)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def run_refresh_command(args)
|
|
165
|
+
provider_name = args.shift
|
|
166
|
+
config_manager = @config_manager_class.new(@project_dir)
|
|
167
|
+
providers_to_refresh = if provider_name
|
|
168
|
+
[provider_name]
|
|
169
|
+
else
|
|
170
|
+
config_manager.provider_names
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
if providers_to_refresh.empty?
|
|
174
|
+
display_message("No providers configured", type: :error)
|
|
175
|
+
return
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
display_message("Refreshing provider information...", type: :highlight)
|
|
179
|
+
display_message("=" * 60, type: :muted)
|
|
180
|
+
|
|
181
|
+
providers_to_refresh.each do |prov_name|
|
|
182
|
+
spinner = TTY::Spinner.new("[:spinner] Refreshing #{prov_name}...", format: :dots)
|
|
183
|
+
spinner.auto_spin
|
|
184
|
+
|
|
185
|
+
begin
|
|
186
|
+
provider_info = @provider_info_class.new(prov_name, @project_dir)
|
|
187
|
+
result = provider_info.info(force_refresh: true)
|
|
188
|
+
|
|
189
|
+
spinner.stop
|
|
190
|
+
if result
|
|
191
|
+
display_message("✓ #{prov_name} refreshed successfully", type: :success)
|
|
192
|
+
else
|
|
193
|
+
display_message("✗ #{prov_name} failed to refresh", type: :error)
|
|
194
|
+
end
|
|
195
|
+
rescue => e
|
|
196
|
+
spinner.stop
|
|
197
|
+
display_message("✗ #{prov_name} error: #{e.message}", type: :error)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
display_message("\n" + "=" * 60, type: :muted)
|
|
202
|
+
display_message("Refresh complete", type: :highlight)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def display_help
|
|
206
|
+
display_message("\nUsage: aidp providers <subcommand> [options]", type: :info)
|
|
207
|
+
display_message("\nSubcommands:", type: :info)
|
|
208
|
+
display_message(" info <provider> Show detailed information about a provider", type: :info)
|
|
209
|
+
display_message(" info Show models catalog (no provider specified)", type: :info)
|
|
210
|
+
display_message(" refresh Refresh all provider information", type: :info)
|
|
211
|
+
display_message(" refresh <provider> Refresh specific provider information", type: :info)
|
|
212
|
+
display_message("\nOptions:", type: :info)
|
|
213
|
+
display_message(" --refresh Force refresh when showing info", type: :info)
|
|
214
|
+
display_message("\nExamples:", type: :info)
|
|
215
|
+
display_message(" aidp providers info anthropic", type: :info)
|
|
216
|
+
display_message(" aidp providers info anthropic --refresh", type: :info)
|
|
217
|
+
display_message(" aidp providers info", type: :info)
|
|
218
|
+
display_message(" aidp providers refresh", type: :info)
|
|
219
|
+
display_message(" aidp providers refresh anthropic", type: :info)
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|