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"
"path/filepath"
2026-02-28 22:59:16 +00:00
"strings"
2026-02-28 19:56:23 +00:00
"github.com/fatih/color"
"github.com/spf13/cobra"
2026-02-28 20:52:03 +00:00
"gmgauthier.com/grokkit/config"
2026-02-28 19:56:23 +00:00
"gmgauthier.com/grokkit/internal/grok"
)
2026-02-28 18:28:27 +00:00
var editCmd = & cobra . Command {
Use : "edit FILE INSTRUCTION" ,
2026-02-28 20:17:12 +00:00
Short : "Edit a file in-place with Grok (safe preview + backup)" ,
Args : cobra . ExactArgs ( 2 ) ,
2026-02-28 18:28:27 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2026-02-28 19:56:23 +00:00
filePath := args [ 0 ]
2026-02-28 20:17:12 +00:00
instruction := args [ 1 ]
2026-02-28 19:56:23 +00:00
2026-02-28 20:52:03 +00:00
modelFlag , _ := cmd . Flags ( ) . GetString ( "model" )
model := config . GetModel ( modelFlag )
2026-02-28 20:17:12 +00:00
if _ , err := os . Stat ( filePath ) ; os . IsNotExist ( err ) {
color . Red ( "File not found: %s" , filePath )
2026-02-28 19:56:23 +00:00
os . Exit ( 1 )
}
2026-03-01 12:08:49 +00:00
original , err := os . ReadFile ( filePath )
if err != nil {
color . Red ( "Failed to read file: %v" , err )
os . Exit ( 1 )
}
2026-02-28 22:59:16 +00:00
cleanedOriginal := removeLastModifiedComments ( string ( original ) )
2026-02-28 19:56:23 +00:00
backupPath := filePath + ".bak"
2026-03-01 12:08:49 +00:00
if err := os . WriteFile ( backupPath , original , 0644 ) ; err != nil {
color . Red ( "Failed to create backup: %v" , err )
os . Exit ( 1 )
}
2026-02-28 19:56:23 +00:00
client := grok . NewClient ( )
messages := [ ] map [ string ] string {
2026-02-28 22:59:16 +00:00
{ "role" : "system" , "content" : "You are an expert programmer. Remove all unnecessary comments including last modified timestamps and ownership comments. Return only the cleaned code with no explanations, no markdown, no extra text." } ,
{ "role" : "user" , "content" : fmt . Sprintf ( "File: %s\n\nOriginal content:\n%s\n\nTask: %s" , filepath . Base ( filePath ) , cleanedOriginal , instruction ) } ,
2026-02-28 19:56:23 +00:00
}
2026-02-28 20:17:12 +00:00
color . Yellow ( "Asking Grok to %s..." , instruction )
2026-02-28 20:52:03 +00:00
raw := client . Stream ( messages , model )
2026-02-28 20:31:02 +00:00
newContent := grok . CleanCodeResponse ( raw )
2026-02-28 19:56:23 +00:00
2026-02-28 20:31:02 +00:00
color . Cyan ( "\nProposed changes:" )
fmt . Println ( "--- a/" + filepath . Base ( filePath ) )
fmt . Println ( "+++ b/" + filepath . Base ( filePath ) )
fmt . Print ( newContent )
2026-02-28 19:56:23 +00:00
2026-02-28 20:31:02 +00:00
fmt . Print ( "\n\nApply these changes? (y/n): " )
2026-02-28 19:56:23 +00:00
var confirm string
fmt . Scanln ( & confirm )
2026-02-28 20:17:12 +00:00
if confirm != "y" && confirm != "Y" {
color . Yellow ( "Changes discarded. Backup saved as %s" , backupPath )
2026-02-28 19:56:23 +00:00
return
}
2026-03-01 12:08:49 +00:00
if err := os . WriteFile ( filePath , [ ] byte ( newContent ) , 0644 ) ; err != nil {
color . Red ( "Failed to write file: %v" , err )
os . Exit ( 1 )
}
2026-02-28 20:17:12 +00:00
color . Green ( "✅ Applied successfully! Backup: %s" , backupPath )
2026-02-28 18:28:27 +00:00
} ,
2026-02-28 22:59:16 +00:00
}
func removeLastModifiedComments ( content string ) string {
lines := strings . Split ( content , "\n" )
var cleanedLines [ ] string
for _ , line := range lines {
if strings . Contains ( line , "Last modified" ) {
continue
}
cleanedLines = append ( cleanedLines , line )
}
return strings . Join ( cleanedLines , "\n" )
}