55import sys
66import time
77import logging
8+ import subprocess
9+ from typing import List , Optional
810
911from blueprint .commit_generator import (
1012 get_git_diff ,
1113 generate_commit_messages ,
12- select_message_with_fzf ,
1314 create_commit ,
1415)
1516
1617DEFAULT_OLLAMA_MODEL = "llama3.1"
17- DEFAULT_JAN_MODEL = "llama3.1-8b -instruct"
18+ DEFAULT_JAN_MODEL = "llama3.2-3b -instruct"
1819
1920
2021def setup_logging (debug_mode ):
@@ -27,6 +28,80 @@ def setup_logging(debug_mode):
2728 )
2829
2930
31+ def select_message_with_fzf (
32+ messages : List [str ],
33+ use_vim : bool = False ,
34+ use_num : bool = False ,
35+ ) -> Optional [str ]:
36+ """Use fzf to select a commit message, with option to regenerate.
37+
38+ Args:
39+ messages: List of commit messages to select from
40+ use_vim: Whether to use vim-style navigation
41+ use_num: Whether to display numbers for selection
42+
43+ Returns:
44+ Selected message, "regenerate" to regenerate messages, or None if cancelled
45+ """
46+ logger = logging .getLogger (__name__ )
47+ logger .debug ("Displaying fzf selector for commit messages" )
48+
49+ try :
50+ messages .append ("Regenerate messages" )
51+ fzf_args = [
52+ "fzf" ,
53+ "--height=10" ,
54+ "--layout=reverse" ,
55+ "--prompt=Select a commit message (ESC to cancel): " ,
56+ "--no-info" ,
57+ "--margin=1,2" ,
58+ "--border" ,
59+ "--color=prompt:#D73BC9,pointer:#D73BC9" ,
60+ ]
61+
62+ if use_vim :
63+ fzf_args .extend (["--bind" , "j:down,k:up" ])
64+ logger .debug ("Using vim-style navigation in fzf" )
65+
66+ if use_num :
67+ for i , msg in enumerate (messages ):
68+ messages [i ] = f"{ i + 1 } . { msg } "
69+ fzf_args .extend (
70+ [
71+ "--bind" ,
72+ "1:accept-non-empty,2:accept-non-empty,3:accept-non-empty,4:accept-non-empty" ,
73+ ]
74+ )
75+ logger .debug ("Using number selection in fzf" )
76+
77+ logger .debug (f"Displaying { len (messages )} options in fzf" )
78+ result = subprocess .run (
79+ fzf_args ,
80+ input = "\n " .join (messages ),
81+ capture_output = True ,
82+ text = True ,
83+ )
84+ if result .returncode == 130 : # User pressed ESC
85+ logger .debug ("User cancelled selection with ESC" )
86+ return None
87+ selected = result .stdout .strip ()
88+ logger .debug (f"User selected: '{ selected } '" )
89+
90+ if selected == "Regenerate messages" or selected == "4. Regenerate messages" :
91+ logger .debug ("User chose to regenerate messages" )
92+ return "regenerate"
93+
94+ final_selection = (
95+ selected .split (". " , 1 )[1 ] if use_num and selected else selected
96+ )
97+ logger .debug (f"Final selection: '{ final_selection } '" )
98+ return final_selection
99+ except subprocess .CalledProcessError as e :
100+ logger .error (f"fzf selection failed: { e } " )
101+ print ("Error: fzf selection failed." )
102+ return None
103+
104+
30105def main ():
31106 """Main entry point for the CLI application."""
32107 OLLAMA_MODEL = os .getenv ("OLLAMA_MODEL" , DEFAULT_OLLAMA_MODEL )
@@ -108,7 +183,7 @@ def main():
108183 # Select message or regenerate
109184 while True :
110185 selected_message = select_message_with_fzf (
111- commit_messages , use_vim = args .vim , use_num = args .num , debug = args . debug
186+ commit_messages , use_vim = args .vim , use_num = args .num
112187 )
113188
114189 if selected_message == "regenerate" :
0 commit comments