@@ -2,124 +2,52 @@ package cmd
22
33import (
44 "fmt"
5- "os"
65 "os/exec"
6+ "strings"
7+
8+ "github.com/spf13/cobra"
9+
710 "smartcommit/config"
811 "smartcommit/diff"
912 "smartcommit/llm"
10- "smartcommit/prompt"
11- "time"
12-
13- promptui "github.com/manifoldco/promptui"
14- "github.com/spf13/cobra"
1513)
1614
17- var yesFlag bool
18-
19- var GenerateCmd = & cobra.Command {
20- Use : "generate" ,
21- Short : "Generate a commit message using AI" ,
22- Long : `Generate a commit message from staged Git changes using a local or remote LLM.
23-
24- By default, it launches an interactive flow.
25- Use --yes or -y to skip the prompt and commit directly.` ,
26- Run : func (cmd * cobra.Command , args []string ) {
27- cfg := config .LoadOrDefault ()
28-
29- diffText , err := diff .GetStagedDiff ()
30- if err != nil || len (diffText ) == 0 {
31- fmt .Println ("❌ No staged changes found." )
32- return
33- }
34-
35- promptText := prompt .Build (diffText , cfg .SystemPrompt )
36-
37- provider , err := llm .GetProvider (cfg )
38- if err != nil {
39- fmt .Println ("❌" , err )
40- return
41- }
42-
43- message , err := provider .Generate (promptText )
44- if err != nil {
45- fmt .Println ("❌ Generation failed:" , err )
46- return
47- }
48-
49- if yesFlag {
50- fmt .Println ("💡 Generated Commit Message:" )
51- fmt .Println ("----------------------------------" )
52- fmt .Println (message )
53- fmt .Println ("----------------------------------" )
54- runGitCommit (message )
55- return
56- }
57-
58- for {
59- fmt .Println ("\n 💡 Generated Commit Message:" )
60- fmt .Println ("----------------------------------" )
61- fmt .Println (message )
62- fmt .Println ("----------------------------------" )
63- fmt .Print ("Choose [c]ommit, [e]dit message, [r]egenerate, [q]uit: " )
64-
65- var choice string
66- fmt .Scanln (& choice )
67-
68- switch choice {
69- case "c" :
70- runGitCommit (message )
71- return
72- case "e" :
73- message = editMessage (message )
74- case "r" :
75- fmt .Print ("\n 🔄 Regenerating" )
76- for i := 0 ; i < 3 ; i ++ {
77- fmt .Print ("." )
78- time .Sleep (200 * time .Millisecond )
79- }
80- message , err = provider .Generate (promptText )
81- if err != nil {
82- fmt .Println ("❌ Regeneration failed:" , err )
83- continue
84- }
85- case "q" :
86- return
87- default :
88- fmt .Println ("❓ Invalid choice." )
89- }
90- }
91- },
15+ var generateCmd = & cobra.Command {
16+ Use : "generate" ,
17+ Short : "Generate & commit a message from your diff" ,
18+ Run : func (cmd * cobra.Command , args []string ) {
19+ cfg := config .LoadOrDefault ()
20+
21+ d , err := diff .GetStagedDiff ()
22+ if err != nil || d == "" {
23+ fmt .Println ("❌ No staged changes." )
24+ return
25+ }
26+
27+ provider , err := llm .GetProvider (cfg )
28+ if err != nil {
29+ fmt .Println ("❌" , err )
30+ return
31+ }
32+
33+ prompt := cfg .SystemPrompt + "\n \n Diff:\n " + d
34+ msg , err := provider .Generate (prompt )
35+ if err != nil {
36+ fmt .Println ("❌ Generation failed:" , err )
37+ return
38+ }
39+ msg = strings .TrimSpace (msg )
40+
41+ fmt .Println ("\n 💡 Commit message:\n \n " , msg , "\n " )
42+ git := exec .Command ("git" , "commit" , "-m" , msg )
43+ git .Stdout = cmd .OutOrStdout ()
44+ git .Stderr = cmd .OutOrStderr ()
45+ if err := git .Run (); err != nil {
46+ fmt .Println ("❌ Git commit failed:" , err )
47+ }
48+ },
9249}
9350
9451func init () {
95- GenerateCmd .Flags ().BoolVarP (& yesFlag , "yes" , "y" , false , "Autogenerate and commit without prompting" )
96- }
97-
98- func runGitCommit (msg string ) {
99- fmt .Println ("✅ Committing with:" )
100- fmt .Println (msg )
101- _ = os .WriteFile (".git/COMMIT_EDITMSG" , []byte (msg ), 0644 )
102- _ = executeCommand ("git" , "commit" , "-F" , ".git/COMMIT_EDITMSG" )
103- }
104-
105- func executeCommand (name string , args ... string ) error {
106- c := exec .Command (name , args ... )
107- c .Stdin = os .Stdin
108- c .Stdout = os .Stdout
109- c .Stderr = os .Stderr
110- return c .Run ()
111- }
112-
113- func editMessage (current string ) string {
114- prompt := promptui.Prompt {
115- Label : "Edit Commit Message" ,
116- Default : current ,
117- AllowEdit : true ,
118- }
119- result , err := prompt .Run ()
120- if err != nil {
121- fmt .Println ("⚠️ Edit cancelled." )
122- return current
123- }
124- return result
52+ rootCmd .AddCommand (generateCmd )
12553}
0 commit comments