grokkit/cmd/commit.go

80 lines
1.9 KiB
Go
Raw Normal View History

2026-02-28 18:03:12 +00:00
package cmd
2026-02-28 18:28:27 +00:00
2026-02-28 19:56:23 +00:00
import (
"fmt"
"os"
"os/exec"
"strings"
"github.com/fatih/color"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"gmgauthier.com/grokkit/internal/git"
"gmgauthier.com/grokkit/internal/grok"
)
2026-02-28 18:28:27 +00:00
var commitCmd = &cobra.Command{
Use: "commit",
Short: "Generate message and commit staged changes",
Run: func(cmd *cobra.Command, args []string) {
2026-02-28 19:56:23 +00:00
model := viper.GetString("model")
client := grok.NewClient()
if !git.IsRepo() {
color.Red("Error: Not inside a git repository")
os.Exit(1)
}
diffOutput := git.Run([]string{"diff", "--cached"})
if diffOutput == "" {
color.Yellow("No staged changes. Stage files with `git add` first.")
return
}
systemPrompt := `You are an expert at writing conventional commit messages.
Analyze the code diff below and generate a concise commit message:
- Prefix: feat|fix|docs|style|refactor|perf|test|ci|chore
- Imperative mood (e.g., 'Add', 'Fix'), capitalize first letter
- Max 72 chars for subject line
- Optional body lines wrapped at 72 chars
- No trailing period on subject`
messages := []map[string]string{
{"role": "system", "content": systemPrompt},
{"role": "user", "content": diffOutput},
}
commitMsg := client.Stream(messages, model)
fmt.Println(color.YellowString("Suggested commit message:"))
fmt.Println()
fmt.Print(color.CyanString(commitMsg))
fmt.Println()
fmt.Print(color.YellowString("Commit now? (y/N): "))
var confirm string
fmt.Scanln(&confirm)
if strings.ToLower(strings.TrimSpace(confirm)) != "y" {
color.Yellow("Aborted.")
return
}
cmdOut, err := exec.Command("git", "commit", "-m", commitMsg).CombinedOutput()
if err != nil {
color.Red("Commit failed: %%v\\nOutput: %%s", err, cmdOut)
os.Exit(1)
}
outputStr := strings.TrimSpace(string(cmdOut))
if len(outputStr) > 0 {
fmt.Println(color.GreenString("Commit output: ") + outputStr)
} else {
color.Green("Committed successfully!")
}
2026-02-28 18:28:27 +00:00
},
}