feat(ready): add --type flag for filtering by issue type (gt-ktf3)
Enables bd ready --type=merge-request for MQ integration. The Engineer can now query for ready merge-requests. Files changed: - cmd/bd/ready.go: Add -t/--type flag - internal/types/types.go: Add Type field to WorkFilter - internal/rpc/protocol.go: Add Type to ReadyArgs - internal/storage/sqlite/ready.go: Filter by issue_type column
This commit is contained in:
@@ -20,6 +20,7 @@ var readyCmd = &cobra.Command{
|
|||||||
sortPolicy, _ := cmd.Flags().GetString("sort")
|
sortPolicy, _ := cmd.Flags().GetString("sort")
|
||||||
labels, _ := cmd.Flags().GetStringSlice("label")
|
labels, _ := cmd.Flags().GetStringSlice("label")
|
||||||
labelsAny, _ := cmd.Flags().GetStringSlice("label-any")
|
labelsAny, _ := cmd.Flags().GetStringSlice("label-any")
|
||||||
|
issueType, _ := cmd.Flags().GetString("type")
|
||||||
// Use global jsonOutput set by PersistentPreRun (respects config.yaml + env vars)
|
// Use global jsonOutput set by PersistentPreRun (respects config.yaml + env vars)
|
||||||
|
|
||||||
// Normalize labels: trim, dedupe, remove empty
|
// Normalize labels: trim, dedupe, remove empty
|
||||||
@@ -28,6 +29,7 @@ var readyCmd = &cobra.Command{
|
|||||||
|
|
||||||
filter := types.WorkFilter{
|
filter := types.WorkFilter{
|
||||||
// Leave Status empty to get both 'open' and 'in_progress' (bd-165)
|
// Leave Status empty to get both 'open' and 'in_progress' (bd-165)
|
||||||
|
Type: issueType,
|
||||||
Limit: limit,
|
Limit: limit,
|
||||||
Unassigned: unassigned,
|
Unassigned: unassigned,
|
||||||
SortPolicy: types.SortPolicy(sortPolicy),
|
SortPolicy: types.SortPolicy(sortPolicy),
|
||||||
@@ -52,6 +54,7 @@ var readyCmd = &cobra.Command{
|
|||||||
readyArgs := &rpc.ReadyArgs{
|
readyArgs := &rpc.ReadyArgs{
|
||||||
Assignee: assignee,
|
Assignee: assignee,
|
||||||
Unassigned: unassigned,
|
Unassigned: unassigned,
|
||||||
|
Type: issueType,
|
||||||
Limit: limit,
|
Limit: limit,
|
||||||
SortPolicy: sortPolicy,
|
SortPolicy: sortPolicy,
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
@@ -336,6 +339,7 @@ func init() {
|
|||||||
readyCmd.Flags().StringP("sort", "s", "hybrid", "Sort policy: hybrid (default), priority, oldest")
|
readyCmd.Flags().StringP("sort", "s", "hybrid", "Sort policy: hybrid (default), priority, oldest")
|
||||||
readyCmd.Flags().StringSliceP("label", "l", []string{}, "Filter by labels (AND: must have ALL). Can combine with --label-any")
|
readyCmd.Flags().StringSliceP("label", "l", []string{}, "Filter by labels (AND: must have ALL). Can combine with --label-any")
|
||||||
readyCmd.Flags().StringSlice("label-any", []string{}, "Filter by labels (OR: must have AT LEAST ONE). Can combine with --label")
|
readyCmd.Flags().StringSlice("label-any", []string{}, "Filter by labels (OR: must have AT LEAST ONE). Can combine with --label")
|
||||||
|
readyCmd.Flags().StringP("type", "t", "", "Filter by issue type (task, bug, feature, epic, merge-request)")
|
||||||
rootCmd.AddCommand(readyCmd)
|
rootCmd.AddCommand(readyCmd)
|
||||||
rootCmd.AddCommand(blockedCmd)
|
rootCmd.AddCommand(blockedCmd)
|
||||||
rootCmd.AddCommand(statsCmd)
|
rootCmd.AddCommand(statsCmd)
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ type ReadyArgs struct {
|
|||||||
Assignee string `json:"assignee,omitempty"`
|
Assignee string `json:"assignee,omitempty"`
|
||||||
Unassigned bool `json:"unassigned,omitempty"`
|
Unassigned bool `json:"unassigned,omitempty"`
|
||||||
Priority *int `json:"priority,omitempty"`
|
Priority *int `json:"priority,omitempty"`
|
||||||
|
Type string `json:"type,omitempty"`
|
||||||
Limit int `json:"limit,omitempty"`
|
Limit int `json:"limit,omitempty"`
|
||||||
SortPolicy string `json:"sort_policy,omitempty"`
|
SortPolicy string `json:"sort_policy,omitempty"`
|
||||||
Labels []string `json:"labels,omitempty"`
|
Labels []string `json:"labels,omitempty"`
|
||||||
|
|||||||
@@ -27,6 +27,12 @@ func (s *SQLiteStorage) GetReadyWork(ctx context.Context, filter types.WorkFilte
|
|||||||
args = append(args, filter.Status)
|
args = append(args, filter.Status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filter by issue type (gt-ktf3: MQ integration)
|
||||||
|
if filter.Type != "" {
|
||||||
|
whereClauses = append(whereClauses, "i.issue_type = ?")
|
||||||
|
args = append(args, filter.Type)
|
||||||
|
}
|
||||||
|
|
||||||
if filter.Priority != nil {
|
if filter.Priority != nil {
|
||||||
whereClauses = append(whereClauses, "i.priority = ?")
|
whereClauses = append(whereClauses, "i.priority = ?")
|
||||||
args = append(args, *filter.Priority)
|
args = append(args, *filter.Priority)
|
||||||
|
|||||||
@@ -478,6 +478,7 @@ func (s SortPolicy) IsValid() bool {
|
|||||||
// WorkFilter is used to filter ready work queries
|
// WorkFilter is used to filter ready work queries
|
||||||
type WorkFilter struct {
|
type WorkFilter struct {
|
||||||
Status Status
|
Status Status
|
||||||
|
Type string // Filter by issue type (task, bug, feature, epic, merge-request, etc.)
|
||||||
Priority *int
|
Priority *int
|
||||||
Assignee *string
|
Assignee *string
|
||||||
Unassigned bool // Filter for issues with no assignee
|
Unassigned bool // Filter for issues with no assignee
|
||||||
|
|||||||
Reference in New Issue
Block a user