Coverage for little_loops / cli / issues / next_issues.py: 100%

22 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2026-04-11 23:20 -0500

1"""ll-issues next-issues: Print all active issues in ranked order.""" 

2 

3from __future__ import annotations 

4 

5import argparse 

6from typing import TYPE_CHECKING 

7 

8if TYPE_CHECKING: 

9 from little_loops.config import BRConfig 

10 

11 

12def cmd_next_issues(config: BRConfig, args: argparse.Namespace) -> int: 

13 """Print all active issues sorted by outcome confidence and readiness. 

14 

15 Sort key: (-(outcome_confidence or -1), -(confidence_score or -1), priority_int) 

16 

17 Args: 

18 config: Project configuration 

19 args: Parsed arguments with optional .json, .path flags and .count 

20 

21 Returns: 

22 Exit code (0 = at least one found, 1 = no issues) 

23 """ 

24 from little_loops.cli.output import print_json 

25 from little_loops.issue_parser import find_issues 

26 

27 issues = find_issues(config) 

28 if not issues: 

29 return 1 

30 

31 issues.sort( 

32 key=lambda i: ( 

33 -(i.outcome_confidence if i.outcome_confidence is not None else -1), 

34 -(i.confidence_score if i.confidence_score is not None else -1), 

35 i.priority_int, 

36 ) 

37 ) 

38 

39 count = getattr(args, "count", None) 

40 ranked = issues[:count] if count else issues 

41 

42 if getattr(args, "json", False): 

43 print_json( 

44 [ 

45 { 

46 "id": i.issue_id, 

47 "path": str(i.path), 

48 "outcome_confidence": i.outcome_confidence, 

49 "confidence_score": i.confidence_score, 

50 "priority": i.priority, 

51 } 

52 for i in ranked 

53 ] 

54 ) 

55 return 0 

56 

57 if getattr(args, "path", False): 

58 for i in ranked: 

59 print(str(i.path)) 

60 return 0 

61 

62 for i in ranked: 

63 print(i.issue_id) 

64 return 0