refactor: Extract helpers from runStart in start.go (gt-tkbd5)

Reduced runStart from 126 lines to 48 lines by extracting:
- startCoreAgents: Mayor and Deacon session startup (28 lines)
- startRigAgents: Witness/Refinery startup for --all flag (37 lines)
- startConfiguredCrew: Auto-start configured crew members (29 lines)

No behavior change - all existing tests pass.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-28 16:35:45 -08:00
parent b68cbf582f
commit d953aa19e3
+45 -24
View File
@@ -148,6 +148,35 @@ func runStart(cmd *cobra.Command, args []string) error {
fmt.Printf("Starting Gas Town from %s\n\n", style.Dim.Render(townRoot)) fmt.Printf("Starting Gas Town from %s\n\n", style.Dim.Render(townRoot))
// Start core agents (Mayor and Deacon)
if err := startCoreAgents(t); err != nil {
return err
}
// If --all, start witnesses and refineries for all rigs
if startAll {
fmt.Println()
fmt.Println("Starting rig agents...")
startRigAgents(t, townRoot)
}
// Auto-start configured crew for each rig
fmt.Println()
fmt.Println("Starting configured crew...")
startConfiguredCrew(t, townRoot)
fmt.Println()
fmt.Printf("%s Gas Town is running\n", style.Bold.Render("✓"))
fmt.Println()
fmt.Printf(" Attach to Mayor: %s\n", style.Dim.Render("gt mayor attach"))
fmt.Printf(" Attach to Deacon: %s\n", style.Dim.Render("gt deacon attach"))
fmt.Printf(" Check status: %s\n", style.Dim.Render("gt status"))
return nil
}
// startCoreAgents starts Mayor and Deacon sessions.
func startCoreAgents(t *tmux.Tmux) error {
// Start Mayor first (so Deacon sees it as up) // Start Mayor first (so Deacon sees it as up)
mayorRunning, _ := t.HasSession(MayorSessionName) mayorRunning, _ := t.HasSession(MayorSessionName)
if mayorRunning { if mayorRunning {
@@ -172,15 +201,18 @@ func runStart(cmd *cobra.Command, args []string) error {
fmt.Printf(" %s Deacon started\n", style.Bold.Render("✓")) fmt.Printf(" %s Deacon started\n", style.Bold.Render("✓"))
} }
// If --all, start witnesses and refineries for all rigs return nil
if startAll { }
fmt.Println()
fmt.Println("Starting rig agents...")
// startRigAgents starts witness and refinery for all rigs.
// Called when --all flag is passed to gt start.
func startRigAgents(t *tmux.Tmux, townRoot string) {
rigs, err := discoverAllRigs(townRoot) rigs, err := discoverAllRigs(townRoot)
if err != nil { if err != nil {
fmt.Printf(" %s Could not discover rigs: %v\n", style.Dim.Render("○"), err) fmt.Printf(" %s Could not discover rigs: %v\n", style.Dim.Render("○"), err)
} else { return
}
for _, r := range rigs { for _, r := range rigs {
// Start Witness // Start Witness
witnessSession := fmt.Sprintf("gt-%s-witness", r.Name) witnessSession := fmt.Sprintf("gt-%s-witness", r.Name)
@@ -211,16 +243,15 @@ func runStart(cmd *cobra.Command, args []string) error {
} }
} }
} }
}
// Auto-start configured crew for each rig
fmt.Println()
fmt.Println("Starting configured crew...")
// startConfiguredCrew starts crew members configured in rig settings.
func startConfiguredCrew(t *tmux.Tmux, townRoot string) {
rigs, err := discoverAllRigs(townRoot) rigs, err := discoverAllRigs(townRoot)
if err != nil { if err != nil {
fmt.Printf(" %s Could not discover rigs: %v\n", style.Dim.Render("○"), err) fmt.Printf(" %s Could not discover rigs: %v\n", style.Dim.Render("○"), err)
} else { return
}
startedAny := false startedAny := false
for _, r := range rigs { for _, r := range rigs {
crewToStart := getCrewToStart(r) crewToStart := getCrewToStart(r)
@@ -229,7 +260,6 @@ func runStart(cmd *cobra.Command, args []string) error {
if running, _ := t.HasSession(sessionID); running { if running, _ := t.HasSession(sessionID); running {
fmt.Printf(" %s %s/%s already running\n", style.Dim.Render("○"), r.Name, crewName) fmt.Printf(" %s %s/%s already running\n", style.Dim.Render("○"), r.Name, crewName)
} else { } else {
// Start the crew member using the existing runStartCrew logic
if err := startCrewMember(r.Name, crewName, townRoot); err != nil { if err := startCrewMember(r.Name, crewName, townRoot); err != nil {
fmt.Printf(" %s %s/%s failed: %v\n", style.Dim.Render("○"), r.Name, crewName, err) fmt.Printf(" %s %s/%s failed: %v\n", style.Dim.Render("○"), r.Name, crewName, err)
} else { } else {
@@ -239,21 +269,12 @@ func runStart(cmd *cobra.Command, args []string) error {
} }
} }
} }
if !startedAny { if !startedAny {
fmt.Printf(" %s No crew configured or all already running\n", style.Dim.Render("○")) fmt.Printf(" %s No crew configured or all already running\n", style.Dim.Render("○"))
} }
} }
fmt.Println()
fmt.Printf("%s Gas Town is running\n", style.Bold.Render("✓"))
fmt.Println()
fmt.Printf(" Attach to Mayor: %s\n", style.Dim.Render("gt mayor attach"))
fmt.Printf(" Attach to Deacon: %s\n", style.Dim.Render("gt deacon attach"))
fmt.Printf(" Check status: %s\n", style.Dim.Render("gt status"))
return nil
}
// discoverAllRigs finds all rigs in the workspace. // discoverAllRigs finds all rigs in the workspace.
func discoverAllRigs(townRoot string) ([]*rig.Rig, error) { func discoverAllRigs(townRoot string) ([]*rig.Rig, error) {
rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json") rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json")
@@ -728,7 +749,7 @@ func runStartCrew(cmd *cobra.Command, args []string) error {
// Wait for Claude to start, then prime // Wait for Claude to start, then prime
shells := []string{"bash", "zsh", "sh", "fish", "tcsh", "ksh"} shells := []string{"bash", "zsh", "sh", "fish", "tcsh", "ksh"}
if err := t.WaitForCommand(sessionID, shells, 15*time.Second); err != nil { if err := t.WaitForCommand(sessionID, shells, 15*time.Second); err != nil {
fmt.Printf("Warning: Timeout waiting for Claude to start: %v\n", err) style.PrintWarning("Timeout waiting for Claude to start: %v", err)
} }
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
if err := t.SendKeys(sessionID, "gt prime"); err != nil { if err := t.SendKeys(sessionID, "gt prime"); err != nil {
@@ -772,7 +793,7 @@ func runStartCrew(cmd *cobra.Command, args []string) error {
// Wait for Claude to start // Wait for Claude to start
shells := []string{"bash", "zsh", "sh", "fish", "tcsh", "ksh"} shells := []string{"bash", "zsh", "sh", "fish", "tcsh", "ksh"}
if err := t.WaitForCommand(sessionID, shells, 15*time.Second); err != nil { if err := t.WaitForCommand(sessionID, shells, 15*time.Second); err != nil {
fmt.Printf("Warning: Timeout waiting for Claude to start: %v\n", err) style.PrintWarning("Timeout waiting for Claude to start: %v", err)
} }
// Give Claude time to initialize after process starts // Give Claude time to initialize after process starts