package cmd import ( "encoding/json" "fmt" "os" "github.com/spf13/cobra" "github.com/steveyegge/gastown/internal/crew" "github.com/steveyegge/gastown/internal/style" "github.com/steveyegge/gastown/internal/tmux" ) func runCrewRename(cmd *cobra.Command, args []string) error { oldName := args[0] newName := args[1] // Parse rig/name format for oldName (e.g., "beads/emma" -> rig=beads, name=emma) if rig, crewName, ok := parseRigSlashName(oldName); ok { if crewRig == "" { crewRig = rig } oldName = crewName } // Note: newName is just the new name, no rig prefix expected crewMgr, r, err := getCrewManager(crewRig) if err != nil { return err } // Kill any running session for the old name t := tmux.NewTmux() oldSessionID := crewSessionName(r.Name, oldName) if hasSession, _ := t.HasSession(oldSessionID); hasSession { if err := t.KillSession(oldSessionID); err != nil { return fmt.Errorf("killing old session: %w", err) } fmt.Printf("Killed session %s\n", oldSessionID) } // Perform the rename if err := crewMgr.Rename(oldName, newName); err != nil { if err == crew.ErrCrewNotFound { return fmt.Errorf("crew workspace '%s' not found", oldName) } if err == crew.ErrCrewExists { return fmt.Errorf("crew workspace '%s' already exists", newName) } return fmt.Errorf("renaming crew workspace: %w", err) } fmt.Printf("%s Renamed crew workspace: %s/%s → %s/%s\n", style.Bold.Render("✓"), r.Name, oldName, r.Name, newName) fmt.Printf("New session will be: %s\n", style.Dim.Render(crewSessionName(r.Name, newName))) return nil } func runCrewPristine(cmd *cobra.Command, args []string) error { crewMgr, r, err := getCrewManager(crewRig) if err != nil { return err } var workers []*crew.CrewWorker if len(args) > 0 { // Specific worker name := args[0] // Parse rig/name format (e.g., "beads/emma" -> rig=beads, name=emma) if _, crewName, ok := parseRigSlashName(name); ok { name = crewName } worker, err := crewMgr.Get(name) if err != nil { if err == crew.ErrCrewNotFound { return fmt.Errorf("crew workspace '%s' not found", name) } return fmt.Errorf("getting crew worker: %w", err) } workers = []*crew.CrewWorker{worker} } else { // All workers workers, err = crewMgr.List() if err != nil { return fmt.Errorf("listing crew workers: %w", err) } } if len(workers) == 0 { fmt.Println("No crew workspaces found.") return nil } var results []*crew.PristineResult for _, w := range workers { result, err := crewMgr.Pristine(w.Name) if err != nil { return fmt.Errorf("pristine %s: %w", w.Name, err) } results = append(results, result) } if crewJSON { enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") return enc.Encode(results) } // Text output for _, result := range results { fmt.Printf("%s %s/%s\n", style.Bold.Render("→"), r.Name, result.Name) if result.HadChanges { fmt.Printf(" %s\n", style.Bold.Render("⚠ Has uncommitted changes")) } if result.Pulled { fmt.Printf(" %s git pull\n", style.Dim.Render("✓")) } else if result.PullError != "" { fmt.Printf(" %s git pull: %s\n", style.Bold.Render("✗"), result.PullError) } if result.Synced { fmt.Printf(" %s bd sync\n", style.Dim.Render("✓")) } else if result.SyncError != "" { fmt.Printf(" %s bd sync: %s\n", style.Bold.Render("✗"), result.SyncError) } } return nil }