@@ -36,6 +36,7 @@ use crate::slash_command::SlashCommand;
3636use crate :: style:: user_message_style;
3737use crate :: terminal_palette;
3838use codex_protocol:: custom_prompts:: CustomPrompt ;
39+ use codex_protocol:: custom_prompts:: PROMPTS_CMD_PREFIX ;
3940
4041use crate :: app_event:: AppEvent ;
4142use crate :: app_event_sender:: AppEventSender ;
@@ -438,9 +439,11 @@ impl ChatComposer {
438439 let name = prompt. name . clone ( ) ;
439440 let starts_with_cmd = first_line
440441 . trim_start ( )
441- . starts_with ( format ! ( "/{name}" ) . as_str ( ) ) ;
442+ . starts_with ( format ! ( "/{PROMPTS_CMD_PREFIX}:{ name}" ) . as_str ( ) ) ;
442443 if !starts_with_cmd {
443- self . textarea . set_text ( format ! ( "/{name} " ) . as_str ( ) ) ;
444+ self . textarea . set_text (
445+ format ! ( "/{PROMPTS_CMD_PREFIX}:{name} " ) . as_str ( ) ,
446+ ) ;
444447 }
445448 if !self . textarea . text ( ) . is_empty ( ) {
446449 cursor_target = Some ( self . textarea . text ( ) . len ( ) ) ;
@@ -464,7 +467,8 @@ impl ChatComposer {
464467 // immediately regardless of the popup selection.
465468 let first_line = self . textarea . text ( ) . lines ( ) . next ( ) . unwrap_or ( "" ) ;
466469 if let Some ( ( name, _rest) ) = parse_slash_name ( first_line)
467- && let Some ( prompt) = self . custom_prompts . iter ( ) . find ( |p| p. name == name)
470+ && let Some ( prompt_name) = name. strip_prefix ( & format ! ( "{PROMPTS_CMD_PREFIX}:" ) )
471+ && let Some ( prompt) = self . custom_prompts . iter ( ) . find ( |p| p. name == prompt_name)
468472 && let Some ( expanded) =
469473 expand_if_numeric_with_positional_args ( prompt, first_line)
470474 {
@@ -498,7 +502,8 @@ impl ChatComposer {
498502 self . textarea . set_text ( "" ) ;
499503 return ( InputResult :: Submitted ( expanded) , true ) ;
500504 } else {
501- let text = format ! ( "/{} " , prompt. name) ;
505+ let name = prompt. name . clone ( ) ;
506+ let text = format ! ( "/{PROMPTS_CMD_PREFIX}:{name} " ) ;
502507 self . textarea . set_text ( & text) ;
503508 self . textarea . set_cursor ( self . textarea . text ( ) . len ( ) ) ;
504509 }
@@ -2122,13 +2127,17 @@ mod tests {
21222127
21232128 #[ test]
21242129 fn extract_args_supports_quoted_paths_single_arg ( ) {
2125- let args = extract_positional_args_for_prompt_line ( "/review \" docs/My File.md\" " , "review" ) ;
2130+ let args = extract_positional_args_for_prompt_line (
2131+ "/prompts:review \" docs/My File.md\" " ,
2132+ "review" ,
2133+ ) ;
21262134 assert_eq ! ( args, vec![ "docs/My File.md" . to_string( ) ] ) ;
21272135 }
21282136
21292137 #[ test]
21302138 fn extract_args_supports_mixed_quoted_and_unquoted ( ) {
2131- let args = extract_positional_args_for_prompt_line ( "/cmd \" with spaces\" simple" , "cmd" ) ;
2139+ let args =
2140+ extract_positional_args_for_prompt_line ( "/prompts:cmd \" with spaces\" simple" , "cmd" ) ;
21322141 assert_eq ! ( args, vec![ "with spaces" . to_string( ) , "simple" . to_string( ) ] ) ;
21332142 }
21342143
@@ -2603,7 +2612,10 @@ mod tests {
26032612
26042613 type_chars_humanlike (
26052614 & mut composer,
2606- & [ '/' , 'm' , 'y' , '-' , 'p' , 'r' , 'o' , 'm' , 'p' , 't' ] ,
2615+ & [
2616+ '/' , 'p' , 'r' , 'o' , 'm' , 'p' , 't' , 's' , ':' , 'm' , 'y' , '-' , 'p' , 'r' , 'o' , 'm' ,
2617+ 'p' , 't' ,
2618+ ] ,
26072619 ) ;
26082620
26092621 let ( result, _needs_redraw) =
@@ -2640,8 +2652,8 @@ mod tests {
26402652 type_chars_humanlike (
26412653 & mut composer,
26422654 & [
2643- '/' , 'm ' , 'y ' , '- ' , 'p ' , 'r ' , 'o ' , 'm ' , 'p ' , 't ' , ' ' , 'f ' , 'o ' , 'o ' , ' ' , 'b ' ,
2644- 'a' , 'r' ,
2655+ '/' , 'p ' , 'r ' , 'o ' , 'm ' , 'p ' , 't ' , 's ' , ': ' , 'm ' , 'y ' , '- ' , 'p ' , 'r ' , 'o ' , 'm ' ,
2656+ 'p' , 't' , ' ' , 'f' , 'o' , 'o' , ' ' , 'b' , ' a', 'r' ,
26452657 ] ,
26462658 ) ;
26472659 let ( result, _needs_redraw) =
@@ -2673,14 +2685,17 @@ mod tests {
26732685 argument_hint: None ,
26742686 } ] ) ;
26752687
2676- type_chars_humanlike ( & mut composer, & [ '/' , 'p' ] ) ;
2688+ type_chars_humanlike (
2689+ & mut composer,
2690+ & [ '/' , 'p' , 'r' , 'o' , 'm' , 'p' , 't' , 's' , ':' , 'p' ] ,
2691+ ) ;
26772692 let ( result, _needs_redraw) =
26782693 composer. handle_key_event ( KeyEvent :: new ( KeyCode :: Enter , KeyModifiers :: NONE ) ) ;
26792694
26802695 // With no args typed, selecting the prompt inserts the command template
26812696 // and does not submit immediately.
26822697 assert_eq ! ( InputResult :: None , result) ;
2683- assert_eq ! ( "/p " , composer. textarea. text( ) ) ;
2698+ assert_eq ! ( "/prompts: p " , composer. textarea. text( ) ) ;
26842699 }
26852700
26862701 #[ test]
@@ -2706,7 +2721,12 @@ mod tests {
27062721 argument_hint: None ,
27072722 } ] ) ;
27082723
2709- type_chars_humanlike ( & mut composer, & [ '/' , 'p' , 'r' , 'i' , 'c' , 'e' , ' ' , 'x' ] ) ;
2724+ type_chars_humanlike (
2725+ & mut composer,
2726+ & [
2727+ '/' , 'p' , 'r' , 'o' , 'm' , 'p' , 't' , 's' , ':' , 'p' , 'r' , 'i' , 'c' , 'e' , ' ' , 'x' ,
2728+ ] ,
2729+ ) ;
27102730 let ( result, _needs_redraw) =
27112731 composer. handle_key_event ( KeyEvent :: new ( KeyCode :: Enter , KeyModifiers :: NONE ) ) ;
27122732
@@ -2741,7 +2761,8 @@ mod tests {
27412761 type_chars_humanlike (
27422762 & mut composer,
27432763 & [
2744- '/' , 'r' , 'e' , 'p' , 'e' , 'a' , 't' , ' ' , 'o' , 'n' , 'e' , ' ' , 't' , 'w' , 'o' ,
2764+ '/' , 'p' , 'r' , 'o' , 'm' , 'p' , 't' , 's' , ':' , 'r' , 'e' , 'p' , 'e' , 'a' , 't' , ' ' ,
2765+ 'o' , 'n' , 'e' , ' ' , 't' , 'w' , 'o' ,
27452766 ] ,
27462767 ) ;
27472768 let ( result, _needs_redraw) =
0 commit comments