feat: add --agent override for sling

This commit is contained in:
jv
2026-01-07 12:19:12 +13:00
committed by Steve Yegge
parent 93b19a7e72
commit 3b9ca71fc4
4 changed files with 305 additions and 3 deletions

View File

@@ -39,6 +39,7 @@ type SlingSpawnOptions struct {
Account string // Claude Code account handle to use
Create bool // Create polecat if it doesn't exist (currently always true for sling)
HookBead string // Bead ID to set as hook_bead at spawn time (atomic assignment)
Agent string // Agent override for this spawn (e.g., "gemini", "codex", "claude-haiku")
}
// SpawnPolecatForSling creates a fresh polecat and optionally starts its session.
@@ -122,8 +123,11 @@ func SpawnPolecatForSling(rigName string, opts SlingSpawnOptions) (*SpawnedPolec
fmt.Printf("Polecat created. Agent must be started manually.\n\n")
fmt.Printf("To start the agent:\n")
fmt.Printf(" cd %s\n", polecatObj.ClonePath)
// Use rig's configured agent command
agentCmd := config.ResolveAgentConfig(townRoot, r.Path).BuildCommand()
// Use rig's configured agent command, unless overridden.
agentCmd, err := config.GetRuntimeCommandWithAgentOverride(r.Path, opts.Agent)
if err != nil {
return nil, err
}
fmt.Printf(" %s\n\n", agentCmd)
fmt.Printf("Agent will discover work via gt prime on startup.\n")
@@ -157,6 +161,13 @@ func SpawnPolecatForSling(rigName string, opts SlingSpawnOptions) (*SpawnedPolec
startOpts := session.StartOptions{
ClaudeConfigDir: claudeConfigDir,
}
if opts.Agent != "" {
cmd, err := config.BuildPolecatStartupCommandWithAgentOverride(rigName, polecatName, r.Path, "", opts.Agent)
if err != nil {
return nil, err
}
startOpts.Command = cmd
}
if err := sessMgr.Start(polecatName, startOpts); err != nil {
return nil, fmt.Errorf("starting session: %w", err)
}

View File

@@ -104,6 +104,7 @@ var (
slingCreate bool // --create: create polecat if it doesn't exist
slingForce bool // --force: force spawn even if polecat has unread mail
slingAccount string // --account: Claude Code account handle to use
slingAgent string // --agent: override runtime agent for this sling/spawn
slingNoConvoy bool // --no-convoy: skip auto-convoy creation
)
@@ -120,6 +121,7 @@ func init() {
slingCmd.Flags().BoolVar(&slingCreate, "create", false, "Create polecat if it doesn't exist")
slingCmd.Flags().BoolVar(&slingForce, "force", false, "Force spawn even if polecat has unread mail")
slingCmd.Flags().StringVar(&slingAccount, "account", "", "Claude Code account handle to use")
slingCmd.Flags().StringVar(&slingAgent, "agent", "", "Override agent/runtime for this sling (e.g., claude, gemini, codex, or custom alias)")
slingCmd.Flags().BoolVar(&slingNoConvoy, "no-convoy", false, "Skip auto-convoy creation for single-issue sling")
rootCmd.AddCommand(slingCmd)
@@ -243,6 +245,7 @@ func runSling(cmd *cobra.Command, args []string) error {
Account: slingAccount,
Create: slingCreate,
HookBead: beadID, // Set atomically at spawn time
Agent: slingAgent,
}
spawnInfo, spawnErr := SpawnPolecatForSling(rigName, spawnOpts)
if spawnErr != nil {
@@ -849,6 +852,7 @@ func runSlingFormula(args []string) error {
Naked: slingNaked,
Account: slingAccount,
Create: slingCreate,
Agent: slingAgent,
}
spawnInfo, spawnErr := SpawnPolecatForSling(rigName, spawnOpts)
if spawnErr != nil {
@@ -1101,7 +1105,6 @@ func agentIDToBeadID(agentID, townRoot string) string {
}
}
// IsDogTarget checks if target is a dog target pattern.
// Returns the dog name (or empty for pool dispatch) and true if it's a dog target.
// Patterns:
@@ -1395,6 +1398,7 @@ func runBatchSling(beadIDs []string, rigName string, townBeadsDir string) error
Account: slingAccount,
Create: slingCreate,
HookBead: beadID, // Set atomically at spawn time
Agent: slingAgent,
}
spawnInfo, err := SpawnPolecatForSling(rigName, spawnOpts)
if err != nil {