@@ -8,12 +8,13 @@ import (
88 "strings"
99 "time"
1010
11+ "github.com/eiannone/keyboard"
12+ "github.com/manifoldco/promptui"
13+ "github.com/spf13/cobra"
14+
1115 "smartcommit/config"
1216 "smartcommit/diff"
1317 "smartcommit/llm"
14-
15- "github.com/manifoldco/promptui"
16- "github.com/spf13/cobra"
1718)
1819
1920var yesFlag bool
@@ -28,21 +29,21 @@ Use --yes or -y to skip the prompt and commit directly.`,
2829 Run : func (cmd * cobra.Command , args []string ) {
2930 cfg := config .LoadOrDefault ()
3031
31- d , err := diff .GetStagedDiff ()
32- if err != nil || strings . TrimSpace ( d ) == "" {
32+ diffText , err := diff .GetStagedDiff ()
33+ if err != nil || diffText == "" {
3334 fmt .Println ("❌ No staged changes found." )
3435 return
3536 }
3637
37- prompt := cfg .SystemPrompt + "\n \n Diff:\n " + d
38+ promptText := cfg .SystemPrompt + "\n \n Diff:\n " + diffText
3839
3940 provider , err := llm .GetProvider (cfg )
4041 if err != nil {
4142 fmt .Println ("❌" , err )
4243 return
4344 }
4445
45- message , err := provider .Generate (prompt )
46+ message , err := provider .Generate (promptText )
4647 if err != nil {
4748 fmt .Println ("❌ Generation failed:" , err )
4849 return
@@ -54,39 +55,46 @@ Use --yes or -y to skip the prompt and commit directly.`,
5455 fmt .Println ("----------------------------------" )
5556 fmt .Println (message )
5657 fmt .Println ("----------------------------------" )
57- commit (message )
58+ runGitCommit (message )
5859 return
5960 }
6061
61- // Interactive loop
6262 for {
6363 fmt .Println ("\n 💡 Generated Commit Message:" )
6464 fmt .Println ("----------------------------------" )
6565 fmt .Println (message )
6666 fmt .Println ("----------------------------------" )
67- fmt .Print ("Choose [c]ommit, [e]dit, [r]egenerate , [q]uit: " )
67+ fmt .Print ("Choose [c]ommit, [e]dit, [r]egen , [q]uit: " )
6868
69- var choice string
70- fmt .Scanln (& choice )
69+ if err := keyboard .Open (); err != nil {
70+ fmt .Println ("❌ Keyboard input error:" , err )
71+ return
72+ }
73+ char , _ , err := keyboard .GetSingleKey ()
74+ keyboard .Close ()
75+ if err != nil {
76+ fmt .Println ("❌ Failed to read key:" , err )
77+ return
78+ }
7179
72- switch choice {
80+ switch strings . ToLower ( string ( char )) {
7381 case "c" :
74- commit (message )
82+ runGitCommit (message )
7583 return
7684 case "e" :
77- message = edit (message )
85+ message = editMessage (message )
7886 case "r" :
7987 fmt .Print ("\n 🔄 Regenerating" )
8088 for i := 0 ; i < 3 ; i ++ {
8189 fmt .Print ("." )
8290 time .Sleep (200 * time .Millisecond )
8391 }
84- msg , err : = provider .Generate (prompt )
92+ message , err = provider .Generate (promptText )
8593 if err != nil {
86- fmt .Println ("\n ❌ Regeneration failed:" , err )
87- } else {
88- message = strings .TrimSpace (msg )
94+ fmt .Println ("❌ Regeneration failed:" , err )
95+ continue
8996 }
97+ message = strings .TrimSpace (message )
9098 case "q" :
9199 fmt .Println ("👋 Aborted." )
92100 return
@@ -102,20 +110,19 @@ func init() {
102110 rootCmd .AddCommand (generateCmd )
103111}
104112
105- func commit (msg string ) {
113+ func runGitCommit (msg string ) {
106114 fmt .Println ("✅ Committing with:" )
107115 fmt .Println (msg )
108116 cmd := exec .Command ("git" , "commit" , "-m" , msg )
109117 cmd .Stdin = os .Stdin
110118 cmd .Stdout = os .Stdout
111119 cmd .Stderr = os .Stderr
112- err := cmd .Run ()
113- if err != nil {
120+ if err := cmd .Run (); err != nil {
114121 fmt .Println ("❌ Git commit failed:" , err )
115122 }
116123}
117124
118- func edit (current string ) string {
125+ func editMessage (current string ) string {
119126 prompt := promptui.Prompt {
120127 Label : "Edit Commit Message" ,
121128 Default : current ,
@@ -126,5 +133,5 @@ func edit(current string) string {
126133 fmt .Println ("⚠️ Edit cancelled." )
127134 return current
128135 }
129- return result
136+ return strings . TrimSpace ( result )
130137}
0 commit comments