From aee86dfae23b40fc0c8c2a92b30f4d47a1b79506 Mon Sep 17 00:00:00 2001 From: gastown/crew/george Date: Fri, 16 Jan 2026 16:02:43 -0800 Subject: [PATCH] fix(types): consolidate enhancement alias and fix update command - Add "enhancement" to util.issueTypeAliases for consistency - Make types.IssueType.Normalize() case-insensitive and include all aliases - Fix update.go to normalize type before validation - Remove duplicate type validation block in update.go Co-Authored-By: Claude Opus 4.5 --- cmd/bd/update.go | 12 +++--------- internal/types/types.go | 11 ++++++++--- internal/util/strings.go | 7 ++++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cmd/bd/update.go b/cmd/bd/update.go index 758ef968..117ddbc4 100644 --- a/cmd/bd/update.go +++ b/cmd/bd/update.go @@ -12,6 +12,7 @@ import ( "github.com/steveyegge/beads/internal/timeparsing" "github.com/steveyegge/beads/internal/types" "github.com/steveyegge/beads/internal/ui" + "github.com/steveyegge/beads/internal/util" "github.com/steveyegge/beads/internal/validation" ) @@ -103,7 +104,8 @@ create, update, show, or close operation).`, } if cmd.Flags().Changed("type") { issueType, _ := cmd.Flags().GetString("type") - // Validate issue type + // Normalize aliases (e.g., "enhancement" -> "feature") before validating + issueType = util.NormalizeIssueType(issueType) if !types.IssueType(issueType).IsValid() { FatalErrorRespectJSON("invalid issue type %q. Valid types: bug, feature, task, epic, chore, merge-request, molecule, gate, agent, role, rig, convoy, event, slot", issueType) } @@ -125,14 +127,6 @@ create, update, show, or close operation).`, parent, _ := cmd.Flags().GetString("parent") updates["parent"] = parent } - if cmd.Flags().Changed("type") { - issueType, _ := cmd.Flags().GetString("type") - // Validate issue type - if _, err := validation.ParseIssueType(issueType); err != nil { - FatalErrorRespectJSON("%v", err) - } - updates["issue_type"] = issueType - } // Gate fields (bd-z6kw) if cmd.Flags().Changed("await-id") { awaitID, _ := cmd.Flags().GetString("await-id") diff --git a/internal/types/types.go b/internal/types/types.go index 9efdbad0..979e73e1 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -529,11 +529,16 @@ func (t IssueType) IsValidWithCustom(customTypes []string) bool { } // Normalize maps issue type aliases to their canonical form. -// For example, "enhancement" -> "feature". +// For example, "enhancement" -> "feature", "mr" -> "merge-request". +// Case-insensitive to match util.NormalizeIssueType behavior. func (t IssueType) Normalize() IssueType { - switch t { - case "enhancement": + switch strings.ToLower(string(t)) { + case "enhancement", "feat": return TypeFeature + case "mr": + return TypeMergeRequest + case "mol": + return TypeMolecule default: return t } diff --git a/internal/util/strings.go b/internal/util/strings.go index a75def98..c1de80d5 100644 --- a/internal/util/strings.go +++ b/internal/util/strings.go @@ -4,9 +4,10 @@ import "strings" // issueTypeAliases maps shorthand type names to canonical types var issueTypeAliases = map[string]string{ - "mr": "merge-request", - "feat": "feature", - "mol": "molecule", + "mr": "merge-request", + "feat": "feature", + "mol": "molecule", + "enhancement": "feature", } // NormalizeIssueType expands type aliases to their canonical forms.