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())
|