Introduce new `agent` command that scans .go files in the project, generates an AI-driven plan for changes based on user instruction, and applies edits with previews and backups. Includes integration with Grok client for planning and content generation. Update existing files with timestamp comments as part of the agent's editing demonstration. Add agentCmd to root command.
64 lines
1.9 KiB
Go
64 lines
1.9 KiB
Go
// Current time: 2024-08-18 15:00:00
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/fatih/color"
|
|
"github.com/spf13/cobra"
|
|
"gmgauthier.com/grokkit/config"
|
|
"gmgauthier.com/grokkit/internal/grok"
|
|
)
|
|
|
|
var editCmd = &cobra.Command{
|
|
Use: "edit FILE INSTRUCTION",
|
|
Short: "Edit a file in-place with Grok (safe preview + backup)",
|
|
Args: cobra.ExactArgs(2),
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
filePath := args[0]
|
|
instruction := args[1]
|
|
|
|
modelFlag, _ := cmd.Flags().GetString("model")
|
|
model := config.GetModel(modelFlag)
|
|
|
|
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
|
color.Red("File not found: %s", filePath)
|
|
os.Exit(1)
|
|
}
|
|
|
|
original, _ := os.ReadFile(filePath)
|
|
backupPath := filePath + ".bak"
|
|
_ = os.WriteFile(backupPath, original, 0644)
|
|
|
|
client := grok.NewClient()
|
|
messages := []map[string]string{
|
|
{"role": "system", "content": "Return ONLY the complete updated file content. No explanations, no markdown fences, no diffs, no extra text whatsoever."},
|
|
{"role": "user", "content": fmt.Sprintf("File: %s\n\nOriginal content:\n%s\n\nTask: %s", filepath.Base(filePath), original, instruction)},
|
|
}
|
|
|
|
color.Yellow("Asking Grok to %s...", instruction)
|
|
raw := client.Stream(messages, model)
|
|
newContent := grok.CleanCodeResponse(raw)
|
|
|
|
// Nice unified diff preview
|
|
color.Cyan("\nProposed changes:")
|
|
fmt.Println("--- a/" + filepath.Base(filePath))
|
|
fmt.Println("+++ b/" + filepath.Base(filePath))
|
|
// simple diff output (you can make it fancier later)
|
|
fmt.Print(newContent)
|
|
|
|
fmt.Print("\n\nApply these changes? (y/n): ")
|
|
var confirm string
|
|
fmt.Scanln(&confirm)
|
|
if confirm != "y" && confirm != "Y" {
|
|
color.Yellow("Changes discarded. Backup saved as %s", backupPath)
|
|
return
|
|
}
|
|
|
|
_ = os.WriteFile(filePath, []byte(newContent), 0644)
|
|
color.Green("✅ Applied successfully! Backup: %s", backupPath)
|
|
},
|
|
} |