Coverage for agentos/marketplace/skills/task-manager/task-manager.py: 14%

64 statements  

« prev     ^ index     » next       coverage.py v7.14.3, created at 2026-07-09 10:19 +0800

1""" 

2task-manager — Local JSON-based task manager. 

3 

4Actions: add, list, done, delete, clear_done, search 

5Data stored in ~/.agentos_tasks.json 

6""" 

7 

8import json 

9import os 

10from datetime import datetime 

11from typing import Any 

12 

13DB = os.path.expanduser("~/.agentos_tasks.json") 

14 

15 

16def _load(): 

17 if not os.path.exists(DB): 

18 return [] 

19 with open(DB) as f: 

20 return json.load(f) 

21 

22 

23def _save(tasks): 

24 with open(DB, "w") as f: 

25 json.dump(tasks, f, indent=2) 

26 

27 

28def run(action: str = "list", title: str = "", query: str = "", **kwargs: Any) -> str: 

29 tasks = _load() 

30 

31 if action == "add": 

32 if not title: 

33 return "[task-manager] Title required for add." 

34 task = { 

35 "id": len(tasks) + 1, 

36 "title": title, 

37 "done": False, 

38 "created": datetime.now().isoformat()[:19], 

39 } 

40 tasks.append(task) 

41 _save(tasks) 

42 return f"[task-manager] Added: #{task['id']} {title}" 

43 

44 if action == "list": 

45 if not tasks: 

46 return "[task-manager] No tasks." 

47 pending = [t for t in tasks if not t["done"]] 

48 done_list = [t for t in tasks if t["done"]] 

49 result = f"Tasks: {len(pending)} pending, {len(done_list)} done\n" 

50 for t in pending: 

51 result += f" [#{t['id']}] [ ] {t['title']}\n" 

52 for t in done_list[-5:]: 

53 result += f" [#{t['id']}] [x] {t['title']}\n" 

54 return result 

55 

56 if action == "done": 

57 task_id = kwargs.get("task_id", 0) or (int(title) if title.isdigit() else 0) 

58 if not task_id: 

59 return "[task-manager] task_id required." 

60 for t in tasks: 

61 if t["id"] == task_id: 

62 t["done"] = True 

63 t["completed"] = datetime.now().isoformat()[:19] 

64 _save(tasks) 

65 return f"[task-manager] Done: #{task_id} {t['title']}" 

66 return f"[task-manager] Task #{task_id} not found." 

67 

68 if action == "delete": 

69 task_id = int(title) if title.isdigit() else 0 

70 if not task_id: 

71 return "[task-manager] task_id required." 

72 tasks = [t for t in tasks if t["id"] != task_id] 

73 _save(tasks) 

74 return f"[task-manager] Deleted #{task_id}." 

75 

76 if action == "clear_done": 

77 count = sum(1 for t in tasks if t["done"]) 

78 tasks = [t for t in tasks if not t["done"]] 

79 _save(tasks) 

80 return f"[task-manager] Cleared {count} completed tasks. {len(tasks)} remaining." 

81 

82 if action == "search": 

83 q = (title or query).lower() 

84 matches = [t for t in tasks if q in t["title"].lower()] 

85 if not matches: 

86 return f"[task-manager] No tasks matching '{q}'." 

87 return "\n".join( 

88 f" [#{t['id']}] [{'x' if t['done'] else ' '}] {t['title']}" for t in matches 

89 ) 

90 

91 return f"[task-manager] Unknown action: {action}. Available: add, list, done, delete, clear_done, search" 

92 

93 

94__all__ = ["run"]