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-06 19:15 +0800
« prev ^ index » next coverage.py v7.14.3, created at 2026-07-06 19:15 +0800
1"""
2task-manager — Local JSON-based task manager.
4Actions: add, list, done, delete, clear_done, search
5Data stored in ~/.agentos_tasks.json
6"""
8import json
9import os
10from datetime import datetime
11from typing import Any
13DB = os.path.expanduser("~/.agentos_tasks.json")
16def _load():
17 if not os.path.exists(DB):
18 return []
19 with open(DB) as f:
20 return json.load(f)
23def _save(tasks):
24 with open(DB, "w") as f:
25 json.dump(tasks, f, indent=2)
28def run(action: str = "list", title: str = "", query: str = "", **kwargs: Any) -> str:
29 tasks = _load()
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}"
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
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."
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}."
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."
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 )
91 return f"[task-manager] Unknown action: {action}. Available: add, list, done, delete, clear_done, search"
94__all__ = ["run"]