@@ -73,7 +73,9 @@ Examples:
7373 return err
7474 }
7575
76- applyStatusFilter (filters , statusFilter , client )
76+ if err := applyStatusFilter (filters , statusFilter , client ); err != nil {
77+ return err
78+ }
7779
7880 // Add date filters
7981 if err := applyDateFilters (filters , createdFilter , updatedFilter ); err != nil {
@@ -130,7 +132,11 @@ var taskListCmd = &cobra.Command{
130132 Long : `List tasks with optional filtering.
131133
132134Examples:
133- ws task ls # List all accessible tasks
135+ ws task ls # First page of accessible tasks
136+ ws task ls --all # Load all matching pages
137+ ws task ls --page 2 --limit 25 # Select a page
138+ ws task ls -w PROJ -s "In Progress" # Workspace status name
139+ ws task ls -w PROJ --milestone "Q4" # Exact milestone name or ID
134140 ws task ls -s 1 # Filter by status ID
135141 ws task ls -s ~done # Exclude done status (negation)
136142 ws task ls --assignee 5 # Filter by assignee ID
@@ -148,7 +154,23 @@ Examples:
148154 return err
149155 }
150156
151- applyStatusFilter (filters , statusFilter , client )
157+ if err := applyStatusFilter (filters , statusFilter , client ); err != nil {
158+ return err
159+ }
160+ if taskListMilestone != "" {
161+ workspaceID , err := resolveOptionalWorkspace (client )
162+ if err != nil {
163+ return err
164+ }
165+ id , err := resolveTaskMilestone (client , taskListMilestone , workspaceID )
166+ if err != nil {
167+ return err
168+ }
169+ if id <= 0 {
170+ return fmt .Errorf ("milestone ID must be positive" )
171+ }
172+ filters ["milestone_id" ] = strconv .Itoa (id )
173+ }
152174
153175 if assigneeFilter != "" {
154176 filters ["assignee_id" ] = assigneeFilter
@@ -165,7 +187,7 @@ Examples:
165187 return err
166188 }
167189
168- items , err := client . ListItems ( filters )
190+ items , err := listTaskPage ( client , filters , taskListPage , taskListLimit , taskListAll )
169191 if err != nil {
170192 return fmt .Errorf ("failed to list items: %w" , err )
171193 }
@@ -308,8 +330,14 @@ Examples:
308330 if createAssigneeID > 0 {
309331 req .AssigneeID = & createAssigneeID
310332 }
311- if createParentID > 0 {
312- req .ParentID = & createParentID
333+ if cmd .Flags ().Changed ("parent" ) {
334+ parentID , err := resolveParentID (client , createParent )
335+ if err != nil {
336+ return err
337+ }
338+ if parentID > 0 {
339+ req .ParentID = & parentID
340+ }
313341 }
314342 if createDueDate != "" {
315343 d , err := parseDateFlag ("due-date" , createDueDate )
@@ -646,7 +674,9 @@ Examples:
646674 return err
647675 }
648676
649- applyStatusFilter (filters , childStatusFilter , client )
677+ if err := applyStatusFilter (filters , childStatusFilter , client ); err != nil {
678+ return err
679+ }
650680 if childTypeFilter != "" {
651681 filters ["item_type_id" ] = childTypeFilter
652682 }
@@ -766,7 +796,15 @@ Examples:
766796 hasChanges = true
767797 }
768798 if cmd .Flags ().Changed ("parent" ) {
769- req .ParentID = & editParentID
799+ parentID , err := resolveParentID (client , editParent )
800+ if err != nil {
801+ return err
802+ }
803+ var parent * int
804+ if parentID > 0 {
805+ parent = & parentID
806+ }
807+ req .ParentID = & parent
770808 hasChanges = true
771809 }
772810 if cmd .Flags ().Changed ("due-date" ) {
@@ -1054,7 +1092,7 @@ var (
10541092 createPriorityID int
10551093 createStatusID int
10561094 createAssigneeID int
1057- createParentID int
1095+ createParent string
10581096 createDueDate string
10591097 createStartDate string
10601098 createEndDate string
@@ -1068,7 +1106,7 @@ var (
10681106 editTypeStatusID int
10691107 editPriorityID int
10701108 editAssigneeID int
1071- editParentID int
1109+ editParent string
10721110 editDueDate string
10731111 editStartDate string
10741112 editEndDate string
@@ -1093,6 +1131,11 @@ func init() {
10931131 taskCmd .AddCommand (taskHistoryCmd )
10941132
10951133 // List filters
1134+ taskListCmd .Flags ().IntVar (& taskListPage , "page" , 1 , "result page (starts at 1)" )
1135+ taskListCmd .Flags ().IntVar (& taskListLimit , "limit" , 50 , "results per page (1-100)" )
1136+ taskListCmd .Flags ().BoolVar (& taskListAll , "all" , false , "fetch every result page" )
1137+ taskListCmd .Flags ().StringVar (& taskListMilestone , "milestone" , "" , "filter by milestone name or ID" )
1138+ taskListCmd .MarkFlagsMutuallyExclusive ("all" , "page" )
10961139 taskMineCmd .Flags ().StringVarP (& statusFilter , "status" , "s" , "" , "filter by status (use ~status to exclude)" )
10971140 taskMineCmd .Flags ().StringVar (& createdFilter , "created" , "" , "filter by creation date (today, week, month, year, or -Nd)" )
10981141 taskMineCmd .Flags ().StringVar (& updatedFilter , "updated" , "" , "filter by update date (today, week, month, year, or -Nd)" )
@@ -1128,7 +1171,7 @@ func init() {
11281171 taskEditCmd .Flags ().IntVar (& editTypeStatusID , "type-status" , 0 , "target status ID when changing to a type with a different workflow" )
11291172 taskEditCmd .Flags ().IntVar (& editPriorityID , "priority" , 0 , "priority ID" )
11301173 taskEditCmd .Flags ().IntVar (& editAssigneeID , "assignee" , 0 , "assignee user ID" )
1131- taskEditCmd .Flags ().IntVar ( & editParentID , "parent" , 0 , "parent item ID " )
1174+ taskEditCmd .Flags ().StringVar ( & editParent , "parent" , "" , "parent item key or ID (0 clears parent) " )
11321175 taskEditCmd .Flags ().StringVar (& editDueDate , "due-date" , "" , "due date (YYYY-MM-DD)" )
11331176 taskEditCmd .Flags ().StringVar (& editStartDate , "start-date" , "" , "start date (YYYY-MM-DD)" )
11341177 taskEditCmd .Flags ().StringVar (& editEndDate , "end-date" , "" , "end date (YYYY-MM-DD)" )
@@ -1144,7 +1187,7 @@ func init() {
11441187 taskCreateCmd .Flags ().IntVar (& createPriorityID , "priority" , 0 , "priority ID" )
11451188 taskCreateCmd .Flags ().IntVar (& createStatusID , "status" , 0 , "status ID" )
11461189 taskCreateCmd .Flags ().IntVar (& createAssigneeID , "assignee" , 0 , "assignee user ID" )
1147- taskCreateCmd .Flags ().IntVar ( & createParentID , "parent" , 0 , "parent item ID" )
1190+ taskCreateCmd .Flags ().StringVar ( & createParent , "parent" , "" , "parent item key or ID" )
11481191 taskCreateCmd .Flags ().StringVar (& createDueDate , "due-date" , "" , "due date (YYYY-MM-DD)" )
11491192 taskCreateCmd .Flags ().StringVar (& createStartDate , "start-date" , "" , "start date (YYYY-MM-DD)" )
11501193 taskCreateCmd .Flags ().StringVar (& createEndDate , "end-date" , "" , "end date (YYYY-MM-DD)" )
0 commit comments