Remove all bd sync references and SQLite-specific code from gastown: **Formulas (agent priming):** - mol-polecat-work: Remove bd sync step from prepare-for-review - mol-sync-workspace: Replace sync-beads step with verify-beads (Dolt check) - mol-polecat-conflict-resolve: Remove bd sync from close-beads - mol-polecat-code-review: Remove bd sync from summarize-review and complete-and-exit - mol-polecat-review-pr: Remove bd sync from complete-and-exit - mol-convoy-cleanup: Remove bd sync from archive-convoy - mol-digest-generate: Remove bd sync from send-digest - mol-town-shutdown: Replace sync-state step with verify-state - beads-release: Replace restart-daemons with verify-install (no daemons with Dolt) **Templates (role priming):** - mayor.md.tmpl: Update session end checklist to remove bd sync steps - crew.md.tmpl: Remove bd sync references from workflow and checklist - polecat.md.tmpl: Update self-cleaning model and session close docs - spawn.md.tmpl: Remove bd sync from completion steps - nudge.md.tmpl: Remove bd sync from completion steps **Go code:** - session_manager.go: Remove syncBeads function and call - rig_dock.go: Remove bd sync calls from dock/undock - crew/manager.go: Remove runBdSync, update Pristine function - crew_maintenance.go: Remove bd sync status output - crew.go: Update pristine command help text - polecat.go: Make sync command a no-op with deprecation message - daemon/lifecycle.go: Remove bd sync from startup sequence - doctor/beads_check.go: Update fix hints and Fix to use bd import not bd sync - doctor/rig_check.go: Remove sync status check, simplify BeadsConfigValidCheck - beads/beads.go: Update primeContent to remove bd sync references With Dolt backend, beads changes are persisted immediately to the sql-server. There is no separate sync step needed. Part of epic: hq-e4eefc (SQLite removal) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
129 lines
3.3 KiB
Go
129 lines
3.3 KiB
Go
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.
|
|
// Use KillSessionWithProcesses to ensure all descendant processes are killed.
|
|
t := tmux.NewTmux()
|
|
oldSessionID := crewSessionName(r.Name, oldName)
|
|
if hasSession, _ := t.HasSession(oldSessionID); hasSession {
|
|
if err := t.KillSessionWithProcesses(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)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|