/feedback opens the Kigi GitHub issues page

Feedback about an unofficial community build belongs on its own issue
tracker, not Moonshot's feedback endpoint — and this mirrors the
official kimi-cli, whose /feedback opens its repo's issues page
(ISSUE_URL in ui/shell/slash.py). /feedback now returns
Action::OpenUrl(https://github.com/ZacharyZhang-NY/Kigi-CLI/issues),
the same battle-tested browser path /docs web uses.

The now-dead TUI text-feedback pipeline is excised: PromptInputMode::
Feedback (~ prefix composer mode), Action::{EnterFeedbackMode,
SendFeedback}, Effect::SendFeedback (the kigi/feedback ACP POST),
TaskResult::{FeedbackComplete,FeedbackFailed}, and their dispatchers.
The shell-side kigi/feedback ACP extension stays: it is protocol
surface for editor embeddings, OAuth-gated, and shared with kigi/btw.

Gates: workspace check/clippy --all-targets 0/0, fmt, kigi-tui lib
6621 passed / 0 failed.
This commit is contained in:
ZacharyZhang-NY committed 2026-07-18 11:51:13 -04:00
1 parent 0692198719
commit 0dc98a34a6
11 files changed
+74 -221

No files matched your search

@@ -287,8 +287,6 @@ pub enum PromptInputMode {
Normal,
/// Bash mode (`!` prefix): Enter sends `Action::SendBashCommand`.
Bash,
/// Feedback mode (`~` prefix, teal accent): Enter sends `Action::SendFeedback`.
Feedback,
/// Remember mode (`#` prefix, green accent): Enter sends `Action::SendRememberNote`.
Remember,
}
@@ -297,7 +295,6 @@ impl PromptInputMode {
match self {
PromptInputMode::Normal => None,
PromptInputMode::Bash => Some(theme.command),
PromptInputMode::Feedback => Some(theme.accent_feedback),
PromptInputMode::Remember => Some(theme.accent_remember),
}
}
@@ -305,14 +302,12 @@ impl PromptInputMode {
match self {
PromptInputMode::Normal => None,
PromptInputMode::Bash => Some(("! ", theme.command)),
PromptInputMode::Feedback => Some(("~ ", theme.accent_feedback)),
PromptInputMode::Remember => Some(("# ", theme.accent_remember)),
}
}
pub fn placeholder_override(self, multiline: bool) -> Option<&'static str> {
match self {
PromptInputMode::Normal | PromptInputMode::Bash => None,
PromptInputMode::Feedback => Some("Type your feedback..."),
PromptInputMode::Remember => {
if multiline {
Some("Save a memory note... (Enter for newline, Shift+Enter to save)")
@@ -326,7 +321,6 @@ impl PromptInputMode {
match self {
PromptInputMode::Normal => None,
PromptInputMode::Bash => Some("Run shell command"),
PromptInputMode::Feedback => Some("Send feedback"),
PromptInputMode::Remember => Some("Save memory note"),
}
}
@@ -334,7 +328,6 @@ impl PromptInputMode {
match self {
PromptInputMode::Normal => Action::SendPrompt(text),
PromptInputMode::Bash => Action::SendBashCommand(text),
PromptInputMode::Feedback => Action::SendFeedback(text),
PromptInputMode::Remember => Action::SendRememberNote(text),
}
}
@@ -351,7 +344,6 @@ impl PromptInputMode {
|| ctrl_u
|| ctrl_c
}
PromptInputMode::Feedback => key.code == KeyCode::Backspace || key.code == KeyCode::Esc,
}
}
}
@@ -3078,10 +3070,6 @@ mod prompt_input_mode_tests {
PromptInputMode::Bash.accent_color(&theme),
Some(theme.command)
);
assert_eq!(
PromptInputMode::Feedback.accent_color(&theme),
Some(theme.accent_feedback)
);
assert_eq!(
PromptInputMode::Remember.accent_color(&theme),
Some(theme.accent_remember)
@@ -3095,10 +3083,6 @@ mod prompt_input_mode_tests {
PromptInputMode::Bash.prefix_override(&theme),
Some(("! ", theme.command))
);
assert_eq!(
PromptInputMode::Feedback.prefix_override(&theme),
Some(("~ ", theme.accent_feedback))
);
assert_eq!(
PromptInputMode::Remember.prefix_override(&theme),
Some(("# ", theme.accent_remember))
@@ -3110,14 +3094,6 @@ mod prompt_input_mode_tests {
assert_eq!(PromptInputMode::Normal.placeholder_override(true), None);
assert_eq!(PromptInputMode::Bash.placeholder_override(false), None);
assert_eq!(PromptInputMode::Bash.placeholder_override(true), None);
assert_eq!(
PromptInputMode::Feedback.placeholder_override(false),
Some("Type your feedback...")
);
assert_eq!(
PromptInputMode::Feedback.placeholder_override(true),
Some("Type your feedback...")
);
assert_eq!(
PromptInputMode::Remember.placeholder_override(false),
Some("Save a memory note... (Shift+Enter for multiline)")
@@ -3134,10 +3110,6 @@ mod prompt_input_mode_tests {
PromptInputMode::Bash.prompt_info_override(),
Some("Run shell command")
);
assert_eq!(
PromptInputMode::Feedback.prompt_info_override(),
Some("Send feedback")
);
assert_eq!(
PromptInputMode::Remember.prompt_info_override(),
Some("Save memory note")
@@ -3151,9 +3123,6 @@ mod prompt_input_mode_tests {
let t2 = "ls -l".to_string();
assert!(matches!(PromptInputMode::Bash.send_action(t2.clone()),
Action::SendBashCommand(t) if t == t2));
let t3 = "this is feedback".to_string();
assert!(matches!(PromptInputMode::Feedback.send_action(t3.clone()),
Action::SendFeedback(t) if t == t3));
let t4 = "remember this".to_string();
assert!(matches!(PromptInputMode::Remember.send_action(t4.clone()),
Action::SendRememberNote(t) if t == t4));
@@ -3182,15 +3151,4 @@ mod prompt_input_mode_tests {
assert!(!mode.is_exit_key(&KeyEvent::new(KeyCode::Char('a'), KeyModifiers::NONE)));
}
}
#[test]
fn is_exit_key_feedback_uses_stricter_set() {
let mode = PromptInputMode::Feedback;
assert!(mode.is_exit_key(&KeyEvent::new(KeyCode::Backspace, KeyModifiers::NONE)));
assert!(mode.is_exit_key(&KeyEvent::new(KeyCode::Esc, KeyModifiers::NONE)));
assert!(!mode.is_exit_key(&KeyEvent::new(KeyCode::Char('w'), KeyModifiers::CONTROL)));
assert!(!mode.is_exit_key(&KeyEvent::new(KeyCode::Char('u'), KeyModifiers::CONTROL)));
assert!(!mode.is_exit_key(&KeyEvent::new(KeyCode::Char('c'), KeyModifiers::CONTROL)));
assert!(!mode.is_exit_key(&KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)));
assert!(!mode.is_exit_key(&KeyEvent::new(KeyCode::Char('?'), KeyModifiers::NONE)));
}
}
@@ -868,10 +868,9 @@ impl AgentView {
{
self.prompt.history_search.deactivate();
// Detect `! ` prefix to restore bash mode. Refined: only reset to Normal
// if currently in Bash (preserve Feedback/Remember if active). The ! prefix
// restore only applies when not in Feedback/Remember.
if self.prompt_input_mode != PromptInputMode::Feedback
&& self.prompt_input_mode != PromptInputMode::Remember
// if currently in Bash (preserve Remember if active). The ! prefix
// restore only applies when not in Remember.
if self.prompt_input_mode != PromptInputMode::Remember
&& let Some(cmd) = text.strip_prefix("! ")
{
self.prompt_input_mode = PromptInputMode::Bash;