118 lines
3.8 KiB
Python
118 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
最小验证脚本:基于官方 /open/v1 端点,跑通创建→更新→完成→删除 闭环。
|
||
|
||
前置:已完成 OAuth 认证,存在 oauth_config.json。
|
||
|
||
步骤:
|
||
1) 创建临时项目
|
||
2) 在项目下创建任务(含 desc、reminders、items、timeZone/日期)
|
||
3) 更新任务(修改 desc/priority/reminders)
|
||
4) 完成任务
|
||
5) 删除任务
|
||
6) 删除临时项目
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
import time
|
||
from datetime import datetime, timedelta
|
||
|
||
from tools.official_api import init_api, APIError
|
||
from tools.adapter import adapter
|
||
|
||
|
||
def ts() -> str:
|
||
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
|
||
|
||
def main() -> int:
|
||
print(f"[{ts()}] 初始化 OAuth 客户端…")
|
||
try:
|
||
init_api(config_path="oauth_config.json")
|
||
except Exception as e:
|
||
print("初始化失败:请先运行 `python scripts/oauth_authenticate.py --port 38000` 完成认证。")
|
||
print(f"详情: {e}")
|
||
return 1
|
||
|
||
# 1) 创建临时项目
|
||
demo_name = f"MCP Demo {int(time.time())}"
|
||
print(f"[{ts()}] 创建演示项目: {demo_name}")
|
||
project = adapter.create_project(name=demo_name, color="#F18181")
|
||
project_id = project.get("id")
|
||
if not project_id:
|
||
print("创建项目失败:未返回 id")
|
||
return 1
|
||
print(f"[{ts()}] 项目ID: {project_id}")
|
||
|
||
try:
|
||
# 2) 创建任务
|
||
start_local = (datetime.now() + timedelta(minutes=5)).strftime("%Y-%m-%d %H:%M:%S")
|
||
due_local = (datetime.now() + timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S")
|
||
print(f"[{ts()}] 创建任务…")
|
||
task = adapter.create_task({
|
||
"title": "Demo Task",
|
||
"projectId": project_id,
|
||
"content": "Demo content",
|
||
"desc": "Checklist description",
|
||
"isAllDay": False,
|
||
"startDate": start_local,
|
||
"dueDate": due_local,
|
||
"timeZone": "Asia/Shanghai",
|
||
"reminders": ["TRIGGER:PT0S"],
|
||
"repeatFlag": "RRULE:FREQ=DAILY;INTERVAL=1",
|
||
"priority": 1,
|
||
"sortOrder": 12345,
|
||
"items": [
|
||
{
|
||
"title": "Subtask A",
|
||
"isAllDay": False,
|
||
"startDate": start_local,
|
||
"sortOrder": 1
|
||
}
|
||
]
|
||
})
|
||
task_id = task.get("id")
|
||
if not task_id:
|
||
print("创建任务失败:未返回 id")
|
||
return 1
|
||
print(f"[{ts()}] 任务ID: {task_id}")
|
||
|
||
# 3) 更新任务
|
||
print(f"[{ts()}] 更新任务…")
|
||
task = adapter.update_task(task_id, {
|
||
"projectId": project_id,
|
||
"desc": "Checklist description (updated)",
|
||
"priority": 3,
|
||
"reminders": ["TRIGGER:P0DT9H0M0S"],
|
||
})
|
||
print(f"[{ts()}] 更新后 priority={task.get('priority')} reminders={task.get('reminders')}")
|
||
|
||
# 4) 完成任务
|
||
print(f"[{ts()}] 完成任务…")
|
||
adapter.complete_task(project_id, task_id)
|
||
tasks_after = adapter.list_tasks(project_id=project_id, completed=True)
|
||
done = next((t for t in tasks_after if t.get('id') == task_id), None)
|
||
print(f"[{ts()}] 完成校验 isCompleted={done.get('isCompleted') if done else None}")
|
||
|
||
# 5) 删除任务
|
||
print(f"[{ts()}] 删除任务…")
|
||
adapter.delete_task(project_id, task_id)
|
||
print(f"[{ts()}] 任务已删除")
|
||
finally:
|
||
# 6) 清理项目
|
||
print(f"[{ts()}] 删除项目…")
|
||
try:
|
||
adapter.delete_project(project_id)
|
||
print(f"[{ts()}] 项目已删除")
|
||
except APIError as e:
|
||
print(f"删除项目失败(可忽略):{e}")
|
||
|
||
print(f"[{ts()}] 演示完毕 ✅")
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|