From 9188de32ff4ff62902d17a6f80af5c4453b2b3b4 Mon Sep 17 00:00:00 2001 From: ysyneu Date: Fri, 12 Jun 2026 10:27:10 +0800 Subject: [PATCH 1/2] fix(member): add --limit flag to member list and enforce page/limit pairing member list registered --page but not --limit even though the SDK's MemberListRequest embeds ListOptions with a Limit field, so agents that learned --limit on other list commands got 'unknown flag: --limit'. Add the flag (same wording/default as team list) and a cobra-tree test asserting any command with --page also exposes --limit. --- internal/cli/flag_consistency_test.go | 25 +++++++++++++++++++++++++ internal/cli/member.go | 3 +++ 2 files changed, 28 insertions(+) create mode 100644 internal/cli/flag_consistency_test.go diff --git a/internal/cli/flag_consistency_test.go b/internal/cli/flag_consistency_test.go new file mode 100644 index 0000000..452e7ab --- /dev/null +++ b/internal/cli/flag_consistency_test.go @@ -0,0 +1,25 @@ +package cli + +import ( + "testing" + + "github.com/spf13/cobra" +) + +// TestPageImpliesLimit walks the full command tree and asserts that any +// command exposing a --page flag also exposes --limit. Agents transfer flag +// knowledge across command groups; a paginated list without --limit forces +// trial-and-error round-trips (seen in prod: `member list --limit` failing +// with "unknown flag"). +func TestPageImpliesLimit(t *testing.T) { + var walk func(cmd *cobra.Command) + walk = func(cmd *cobra.Command) { + if cmd.Flags().Lookup("page") != nil && cmd.Flags().Lookup("limit") == nil { + t.Errorf("%s registers --page but not --limit", cmd.CommandPath()) + } + for _, sub := range cmd.Commands() { + walk(sub) + } + } + walk(rootCmd) +} diff --git a/internal/cli/member.go b/internal/cli/member.go index 1498f28..6ee2174 100644 --- a/internal/cli/member.go +++ b/internal/cli/member.go @@ -22,6 +22,7 @@ func newMemberCmd() *cobra.Command { func newMemberListCmd() *cobra.Command { var name, email string var page int + var limit int var roleID int64 cmd := &cobra.Command{ @@ -42,6 +43,7 @@ func newMemberListCmd() *cobra.Command { Query: query, } req.Page = page + req.Limit = limit if roleID != 0 { req.RoleID = uint64(roleID) } @@ -83,6 +85,7 @@ func newMemberListCmd() *cobra.Command { cmd.Flags().StringVar(&name, "name", "", "Search by name") cmd.Flags().StringVar(&email, "email", "", "Search by email") cmd.Flags().IntVar(&page, "page", 1, "Page number") + cmd.Flags().IntVar(&limit, "limit", 20, "Page size, max 100 (default 20)") cmd.Flags().Int64Var(&roleID, "role-id", 0, "Filter to members holding this role ID") return cmd From 49a1ec1168598da840699bdf3f9b8e5239b3ecd1 Mon Sep 17 00:00:00 2001 From: ysyneu Date: Fri, 12 Jun 2026 11:04:04 +0800 Subject: [PATCH 2/2] fix(member): add --orderby and --asc flags to member list MemberListRequest already exposes Orderby and Asc fields (generated from the OpenAPI schema); team list has both flags with identical wording and defaults. Wire them to close the sibling-parameter gap found during the audit-2026-06-11b param consistency review. --- internal/cli/member.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/cli/member.go b/internal/cli/member.go index 6ee2174..ce8a983 100644 --- a/internal/cli/member.go +++ b/internal/cli/member.go @@ -24,6 +24,8 @@ func newMemberListCmd() *cobra.Command { var page int var limit int var roleID int64 + var orderBy string + var asc bool cmd := &cobra.Command{ Use: "list", @@ -40,7 +42,9 @@ func newMemberListCmd() *cobra.Command { query = email } req := &flashduty.MemberListRequest{ - Query: query, + Query: query, + Orderby: orderBy, + Asc: asc, } req.Page = page req.Limit = limit @@ -86,6 +90,8 @@ func newMemberListCmd() *cobra.Command { cmd.Flags().StringVar(&email, "email", "", "Search by email") cmd.Flags().IntVar(&page, "page", 1, "Page number") cmd.Flags().IntVar(&limit, "limit", 20, "Page size, max 100 (default 20)") + cmd.Flags().StringVar(&orderBy, "orderby", "", "Sort field: created_at, updated_at, member_name") + cmd.Flags().BoolVar(&asc, "asc", false, "Sort in ascending order") cmd.Flags().Int64Var(&roleID, "role-id", 0, "Filter to members holding this role ID") return cmd