aidp 0.8.2 ā 0.8.3
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/lib/aidp/harness/runner.rb +2 -2
- data/lib/aidp/harness/simple_user_interface.rb +125 -0
- data/lib/aidp/version.rb +1 -1
- data/lib/aidp.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60b61133b8f3b07ef7fbdd76bce1485bd89b75f78c4130f195c786331f383ded
|
4
|
+
data.tar.gz: e81f6387d6c6941da8b2ae1ff2b3153a3911fd2bb0405c4982f52b166681fc64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42b8c458bd6dcbfce249d12bb7a1e7eab1d09a61259ea231b935fd4d28c39170baf57d099bb3a5fd3037a3501a4d5daa9abc3696e3c7b91e07137ffce24b22a6
|
7
|
+
data.tar.gz: e2f038cc38c7b32f9bda535ac6bfb8a0bc39c54ef252dc9d7f333f66c71de41dc8e88a6479e8319bad64e5e9dc8adffb2d4dd03febddb82081df2ddf91e8efe0
|
data/lib/aidp/harness/runner.rb
CHANGED
@@ -6,7 +6,7 @@ require_relative "configuration"
|
|
6
6
|
require_relative "state_manager"
|
7
7
|
require_relative "condition_detector"
|
8
8
|
require_relative "provider_manager"
|
9
|
-
require_relative "
|
9
|
+
require_relative "simple_user_interface"
|
10
10
|
require_relative "error_handler"
|
11
11
|
require_relative "status_display"
|
12
12
|
require_relative "completion_checker"
|
@@ -47,7 +47,7 @@ module Aidp
|
|
47
47
|
@state_manager = StateManager.new(project_dir, @mode)
|
48
48
|
@condition_detector = ConditionDetector.new
|
49
49
|
@provider_manager = ProviderManager.new(@configuration)
|
50
|
-
@user_interface =
|
50
|
+
@user_interface = SimpleUserInterface.new
|
51
51
|
@error_handler = ErrorHandler.new(@provider_manager, @configuration)
|
52
52
|
@status_display = StatusDisplay.new
|
53
53
|
@completion_checker = CompletionChecker.new(@project_dir, @workflow_type)
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "tty-prompt"
|
4
|
+
|
5
|
+
module Aidp
|
6
|
+
module Harness
|
7
|
+
# Simple, focused user interface for collecting feedback
|
8
|
+
# Replaces the bloated UserInterface with minimal, clean code
|
9
|
+
class SimpleUserInterface
|
10
|
+
def initialize
|
11
|
+
@prompt = TTY::Prompt.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# Main method - collect responses for questions
|
15
|
+
def collect_feedback(questions, context = nil)
|
16
|
+
show_context(context) if context
|
17
|
+
|
18
|
+
responses = {}
|
19
|
+
questions.each_with_index do |question_data, index|
|
20
|
+
key = "question_#{question_data[:number] || index + 1}"
|
21
|
+
responses[key] = ask_question(question_data)
|
22
|
+
end
|
23
|
+
|
24
|
+
responses
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def show_context(context)
|
30
|
+
puts "\nš¤ Agent needs feedback"
|
31
|
+
puts "Context: #{context[:description]}" if context[:description]
|
32
|
+
puts ""
|
33
|
+
end
|
34
|
+
|
35
|
+
def ask_question(question_data)
|
36
|
+
question = question_data[:question]
|
37
|
+
type = question_data[:type] || "text"
|
38
|
+
default = question_data[:default]
|
39
|
+
required = question_data[:required] != false
|
40
|
+
options = question_data[:options]
|
41
|
+
|
42
|
+
puts "\n#{question}"
|
43
|
+
|
44
|
+
case type
|
45
|
+
when "text"
|
46
|
+
ask_text(question, default, required)
|
47
|
+
when "choice"
|
48
|
+
@prompt.select("Choose:", options, default: default)
|
49
|
+
when "confirmation"
|
50
|
+
@prompt.yes?("#{question}?", default: default)
|
51
|
+
when "file"
|
52
|
+
ask_file(question, default, required)
|
53
|
+
when "number"
|
54
|
+
ask_number(question, default, required)
|
55
|
+
when "email"
|
56
|
+
ask_email(question, default, required)
|
57
|
+
when "url"
|
58
|
+
ask_url(question, default, required)
|
59
|
+
else
|
60
|
+
ask_text(question, default, required)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def ask_text(question, default, required)
|
65
|
+
options = {}
|
66
|
+
options[:default] = default if default
|
67
|
+
options[:required] = required
|
68
|
+
|
69
|
+
@prompt.ask("Response:", **options)
|
70
|
+
end
|
71
|
+
|
72
|
+
def ask_file(question, default, required)
|
73
|
+
input = @prompt.ask("File path:", default: default, required: required)
|
74
|
+
|
75
|
+
# Handle @ file selection
|
76
|
+
if input&.start_with?("@")
|
77
|
+
search_term = input[1..].strip
|
78
|
+
files = find_files(search_term)
|
79
|
+
|
80
|
+
return nil if files.empty?
|
81
|
+
|
82
|
+
@prompt.select("Select file:", files, per_page: 15)
|
83
|
+
else
|
84
|
+
input
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def ask_number(question, default, required)
|
89
|
+
@prompt.ask("Number:", default: default, required: required) do |q|
|
90
|
+
q.convert :int
|
91
|
+
q.validate(/^\d+$/, "Please enter a valid number")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def ask_email(question, default, required)
|
96
|
+
@prompt.ask("Email:", default: default, required: required) do |q|
|
97
|
+
q.validate(/\A[\w+\-.]+@[a-z\d-]+(\.[a-z\d-]+)*\.[a-z]+\z/i, "Please enter a valid email")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def ask_url(question, default, required)
|
102
|
+
@prompt.ask("URL:", default: default, required: required) do |q|
|
103
|
+
q.validate(/\Ahttps?:\/\/.+/i, "Please enter a valid URL (http:// or https://)")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def find_files(search_term)
|
108
|
+
if search_term.empty?
|
109
|
+
# Show common files
|
110
|
+
Dir.glob("**/*").select { |f| File.file?(f) }.first(20)
|
111
|
+
elsif search_term.start_with?(".")
|
112
|
+
# Extension search (e.g., .rb)
|
113
|
+
Dir.glob("**/*#{search_term}").select { |f| File.file?(f) }
|
114
|
+
elsif search_term.end_with?("/")
|
115
|
+
# Directory search (e.g., lib/)
|
116
|
+
dir = search_term.chomp("/")
|
117
|
+
Dir.glob("#{dir}/**/*").select { |f| File.file?(f) }
|
118
|
+
else
|
119
|
+
# Name search
|
120
|
+
Dir.glob("**/*#{search_term}*").select { |f| File.file?(f) }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/lib/aidp/version.rb
CHANGED
data/lib/aidp.rb
CHANGED
@@ -51,6 +51,7 @@ require_relative "aidp/harness/config_loader"
|
|
51
51
|
require_relative "aidp/harness/config_manager"
|
52
52
|
require_relative "aidp/harness/condition_detector"
|
53
53
|
require_relative "aidp/harness/user_interface"
|
54
|
+
require_relative "aidp/harness/simple_user_interface"
|
54
55
|
require_relative "aidp/harness/provider_manager"
|
55
56
|
require_relative "aidp/harness/provider_config"
|
56
57
|
require_relative "aidp/harness/provider_factory"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aidp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bart Agapinan
|
@@ -272,6 +272,7 @@ files:
|
|
272
272
|
- lib/aidp/harness/provider_manager.rb
|
273
273
|
- lib/aidp/harness/provider_type_checker.rb
|
274
274
|
- lib/aidp/harness/runner.rb
|
275
|
+
- lib/aidp/harness/simple_user_interface.rb
|
275
276
|
- lib/aidp/harness/state/errors.rb
|
276
277
|
- lib/aidp/harness/state/metrics.rb
|
277
278
|
- lib/aidp/harness/state/persistence.rb
|