From d34e9b006cbb142d6527dd9aecc38183fad5d5a6 Mon Sep 17 00:00:00 2001 From: joe Date: Mon, 5 Jan 2026 16:32:22 -0800 Subject: [PATCH] fix(crew): default to --all when only rig name provided (gt-s8mpt) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gt crew start beads and gt crew stop beads now default to --all behavior when no crew names are specified, matching user expectations. - crew start: accepts 0-1 args (rig only) and starts all crew - crew stop: detects if single arg is a rig name vs crew name - Updated help text with new examples 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- internal/cmd/crew.go | 36 ++++++++++++++++------------------ internal/cmd/crew_lifecycle.go | 27 ++++++++++++++++++++----- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/internal/cmd/crew.go b/internal/cmd/crew.go index c7abdf78..a1a218cd 100644 --- a/internal/cmd/crew.go +++ b/internal/cmd/crew.go @@ -246,25 +246,23 @@ var crewStartCmd = &cobra.Command{ Long: `Start crew workers in a rig, creating workspaces if they don't exist. The rig name can be provided as the first argument, or inferred from the -current directory. Optionally specify crew member names to start specific -workers, or use --all to start all crew members in the rig. +current directory. If no crew names are specified, starts all crew in the rig. The crew session starts in the background with Claude running and ready. Examples: - gt crew start gastown joe # Start joe in gastown rig - gt crew start gastown --all # Start all crew in gastown rig - gt crew start --all # Start all crew (rig inferred from cwd) - gt crew start beads grip fang # Start grip and fang in beads rig`, + gt crew start beads # Start all crew in beads rig + gt crew start # Start all crew (rig inferred from cwd) + gt crew start beads grip fang # Start specific crew in beads rig + gt crew start gastown joe # Start joe in gastown rig`, Args: func(cmd *cobra.Command, args []string) error { // With --all, we can have 0 args (infer rig) or 1+ args (rig specified) if crewAll { return nil } - // Without --all, need at least rig and one crew name - if len(args) < 2 { - return fmt.Errorf("requires rig and crew name, or use --all") - } + // Allow: 0 args (infer rig, default to --all) + // 1 arg (rig specified, default to --all) + // 2+ args (rig + specific crew names) return nil }, RunE: runCrewStart, @@ -275,8 +273,8 @@ var crewStopCmd = &cobra.Command{ Short: "Stop crew workspace session(s)", Long: `Stop one or more running crew workspace sessions. -Kills the tmux session(s) for the specified crew member(s). Use --all to -stop all running crew sessions across all rigs. +If a rig name is given alone, stops all crew in that rig. Otherwise stops +the specified crew member(s). The name can include the rig in slash format (e.g., beads/emma). If not specified, the rig is inferred from the current directory. @@ -285,11 +283,11 @@ Output is captured before stopping for debugging purposes (use --force to skip capture for faster shutdown). Examples: - gt crew stop dave # Stop dave's session - gt crew stop beads/emma beads/grip # Stop multiple from specific rig + gt crew stop beads # Stop all crew in beads rig + gt crew stop # Stop all crew (rig inferred from cwd) + gt crew stop beads/emma # Stop specific crew member + gt crew stop dave # Stop dave in current rig gt crew stop --all # Stop all running crew sessions - gt crew stop --all --rig beads # Stop all crew in beads rig - gt crew stop --all --dry-run # Preview what would be stopped gt crew stop dave --force # Stop without capturing output`, Args: func(cmd *cobra.Command, args []string) error { if crewAll { @@ -298,9 +296,9 @@ Examples: } return nil } - if len(args) < 1 { - return fmt.Errorf("requires at least 1 argument (or --all)") - } + // Allow: 0 args (infer rig, default to --all) + // 1 arg (rig name → all in that rig, or crew name → specific crew) + // 1+ args (specific crew names) return nil }, RunE: runCrewStop, diff --git a/internal/cmd/crew_lifecycle.go b/internal/cmd/crew_lifecycle.go index 4424e0f2..0bfb2cc6 100644 --- a/internal/cmd/crew_lifecycle.go +++ b/internal/cmd/crew_lifecycle.go @@ -220,13 +220,13 @@ func runCrewRefresh(cmd *cobra.Command, args []string) error { // runCrewStart starts crew workers in a rig. // args[0] is the rig name (optional if inferrable from cwd) -// args[1:] are crew member names (optional, or use --all flag) +// args[1:] are crew member names (optional - defaults to all if not specified) func runCrewStart(cmd *cobra.Command, args []string) error { var rigName string var crewNames []string if len(args) == 0 { - // No args - infer rig from cwd (only valid with --all) + // No args - infer rig from cwd rigName = "" // getCrewManager will infer from cwd } else { rigName = args[0] @@ -241,8 +241,8 @@ func runCrewStart(cmd *cobra.Command, args []string) error { // Update rigName in case it was inferred rigName = r.Name - // If --all flag, get all crew members - if crewAll { + // If --all flag OR no crew names specified, get all crew members + if crewAll || len(crewNames) == 0 { workers, err := crewMgr.List() if err != nil { return fmt.Errorf("listing crew: %w", err) @@ -543,13 +543,30 @@ func restartCrewSession(rigName, crewName, clonePath string) error { } // runCrewStop stops one or more crew workers. -// Supports: "name", "rig/name" formats, or --all to stop all. +// Supports: "name", "rig/name" formats, "rig" (to stop all in rig), or --all. func runCrewStop(cmd *cobra.Command, args []string) error { // Handle --all flag if crewAll { return runCrewStopAll() } + // Handle 0 args: default to all in inferred rig + if len(args) == 0 { + return runCrewStopAll() + } + + // Handle 1 arg without "/": check if it's a rig name + // If so, stop all crew in that rig + if len(args) == 1 && !strings.Contains(args[0], "/") { + // Try to interpret as rig name + if _, _, err := getRig(args[0]); err == nil { + // It's a valid rig name - stop all crew in that rig + crewRig = args[0] + return runCrewStopAll() + } + // Not a rig name - fall through to treat as crew name + } + var lastErr error t := tmux.NewTmux()