feat: Standardize agent bead naming to prefix-rig-role-name (gt-zvte2)

Implements canonical naming convention for agent bead IDs:
- Town-level: gt-mayor, gt-deacon (unchanged)
- Rig-level: gt-<rig>-witness, gt-<rig>-refinery (was gt-witness-<rig>)
- Named: gt-<rig>-crew-<name>, gt-<rig>-polecat-<name> (was gt-crew-<rig>-<name>)

Changes:
- Added AgentBeadID helper functions to internal/beads/beads.go
- Updated all ID generation call sites to use helpers
- Fixed session parsing in theme.go, statusline.go, agents.go
- Updated doctor check and fix to use canonical format
- Updated tests for new format

🤖 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-29 14:54:30 -08:00
parent 1b20e1bd2c
commit c92b11d1bd
17 changed files with 230 additions and 139 deletions

View File

@@ -1137,31 +1137,32 @@ func getAgentFields(ctx RoleContext, state string) *beads.AgentFields {
}
// getAgentBeadID returns the agent bead ID for the current role.
// Uses canonical naming: prefix-rig-role-name
// Returns empty string for unknown roles.
func getAgentBeadID(ctx RoleContext) string {
switch ctx.Role {
case RoleMayor:
return "gt-mayor"
return beads.MayorBeadID()
case RoleDeacon:
return "gt-deacon"
return beads.DeaconBeadID()
case RoleWitness:
if ctx.Rig != "" {
return fmt.Sprintf("gt-witness-%s", ctx.Rig)
return beads.WitnessBeadID(ctx.Rig)
}
return ""
case RoleRefinery:
if ctx.Rig != "" {
return fmt.Sprintf("gt-refinery-%s", ctx.Rig)
return beads.RefineryBeadID(ctx.Rig)
}
return ""
case RolePolecat:
if ctx.Rig != "" && ctx.Polecat != "" {
return fmt.Sprintf("gt-polecat-%s-%s", ctx.Rig, ctx.Polecat)
return beads.PolecatBeadID(ctx.Rig, ctx.Polecat)
}
return ""
case RoleCrew:
if ctx.Rig != "" && ctx.Polecat != "" {
return fmt.Sprintf("gt-crew-%s-%s", ctx.Rig, ctx.Polecat)
return beads.CrewBeadID(ctx.Rig, ctx.Polecat)
}
return ""
default: