aidp 0.26.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aidp/cli/checkpoint_command.rb +198 -0
  3. data/lib/aidp/cli/config_command.rb +71 -0
  4. data/lib/aidp/cli/enhanced_input.rb +2 -0
  5. data/lib/aidp/cli/first_run_wizard.rb +8 -7
  6. data/lib/aidp/cli/harness_command.rb +102 -0
  7. data/lib/aidp/cli/jobs_command.rb +3 -3
  8. data/lib/aidp/cli/mcp_dashboard.rb +4 -3
  9. data/lib/aidp/cli/models_command.rb +662 -0
  10. data/lib/aidp/cli/providers_command.rb +223 -0
  11. data/lib/aidp/cli.rb +35 -456
  12. data/lib/aidp/daemon/runner.rb +2 -2
  13. data/lib/aidp/debug_mixin.rb +2 -9
  14. data/lib/aidp/execute/async_work_loop_runner.rb +2 -1
  15. data/lib/aidp/execute/checkpoint_display.rb +38 -37
  16. data/lib/aidp/execute/interactive_repl.rb +2 -1
  17. data/lib/aidp/execute/prompt_manager.rb +4 -4
  18. data/lib/aidp/execute/work_loop_runner.rb +29 -2
  19. data/lib/aidp/execute/workflow_selector.rb +2 -2
  20. data/lib/aidp/harness/config_manager.rb +5 -5
  21. data/lib/aidp/harness/configuration.rb +32 -2
  22. data/lib/aidp/harness/enhanced_runner.rb +24 -15
  23. data/lib/aidp/harness/error_handler.rb +26 -5
  24. data/lib/aidp/harness/model_cache.rb +269 -0
  25. data/lib/aidp/harness/model_discovery_service.rb +259 -0
  26. data/lib/aidp/harness/model_registry.rb +201 -0
  27. data/lib/aidp/harness/runner.rb +5 -0
  28. data/lib/aidp/harness/thinking_depth_manager.rb +223 -7
  29. data/lib/aidp/message_display.rb +0 -46
  30. data/lib/aidp/providers/adapter.rb +2 -4
  31. data/lib/aidp/providers/anthropic.rb +141 -128
  32. data/lib/aidp/providers/base.rb +98 -2
  33. data/lib/aidp/providers/capability_registry.rb +0 -1
  34. data/lib/aidp/providers/codex.rb +49 -67
  35. data/lib/aidp/providers/cursor.rb +71 -59
  36. data/lib/aidp/providers/gemini.rb +44 -60
  37. data/lib/aidp/providers/github_copilot.rb +2 -66
  38. data/lib/aidp/providers/kilocode.rb +24 -80
  39. data/lib/aidp/providers/opencode.rb +24 -80
  40. data/lib/aidp/setup/wizard.rb +345 -8
  41. data/lib/aidp/version.rb +1 -1
  42. data/lib/aidp/watch/plan_generator.rb +93 -14
  43. data/lib/aidp/watch/review_processor.rb +3 -3
  44. data/lib/aidp/workflows/guided_agent.rb +3 -3
  45. data/templates/aidp-development.yml.example +2 -2
  46. data/templates/aidp-production.yml.example +3 -3
  47. metadata +9 -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