文件预览

cwork-create-task.py

查看 工作协同官方skill 技能包中的文件内容。

文件内容

scripts/cwork-create-task.py

#!/usr/bin/env python3
"""
CWork Create Task - Agent-First

Usage:
  python3 scripts/cwork-create-task.py --task-main "name" --content "desc" --assignee "person" --deadline 2026-04-10
"""

import sys
import os
import json
import argparse

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from cwork_client import make_client, CWorkError, parse_deadline, resolve_names_to_empids, apply_params_file_pre_parse

_DEFAULT_MS = int(__import__("datetime").datetime.now().timestamp() * 1000) + 7 * 86400000


def parse_args(argv=None):
    p = argparse.ArgumentParser(description="CWork create task (Agent-First)")
    p.add_argument("--task-main", required=True, help="Task name")
    p.add_argument("--deadline", help="Deadline YYYY-MM-DD or ms timestamp (default 7d)")
    p.add_argument("--content", required=True, help="Task description")
    p.add_argument("--target", help="Target description")
    p.add_argument("--assignee", help="Owner name")
    p.add_argument("--assistant", help="Assistant names (comma-separated)")
    p.add_argument("--supervisor", help="Supervisor name")
    p.add_argument("--copy", help="CC names (comma-separated)")
    p.add_argument("--observer", help="Observer names (comma-separated)")
    p.add_argument("--report-to", help="Report-to name")
    p.add_argument("--virtual-emp-id", help="虚拟员工 ID(可选)")
    p.add_argument("--push-now", type=lambda x: x.lower() == "true", default=True)
    p.add_argument("--dry-run", action="store_true")
    p.add_argument("--params-file", dest="params_file", default=None,
                   help="UTF-8 JSON 文件路径,从文件读取参数")
    return p.parse_args(argv)


def _comma(val):
    if not val:
        return None
    import re
    # 按英文逗号、中文逗号、顿号、分号拆分姓名列表
    parts = re.split(r"[,,、;;]", val)
    return [p.strip() for p in parts if p.strip()]


def _die(msg):
    print(json.dumps({"success": False, "error": msg}, ensure_ascii=False), file=sys.stderr)
    sys.exit(1)


def main():
    apply_params_file_pre_parse()
    args = parse_args()
    try:
        client = make_client()
    except CWorkError as e:
        _die(str(e))

    def _resolve(name_or_list):
        names = _comma(name_or_list) if isinstance(name_or_list, str) else name_or_list
        if not names:
            return None
        return resolve_names_to_empids(client, names)

    dl = parse_deadline(args.deadline) if args.deadline else _DEFAULT_MS
    report_to = args.report_to or args.assignee
    if not report_to:
        _die("--report-to 或 --assignee 至少需要提供一个(API 要求 reportEmpIdList 必填)")
    info = dict(assignee=args.assignee, assistant=args.assistant, supervisor=args.supervisor,
                copy=args.copy, observer=args.observer, reportTo=report_to, deadlineMs=dl)

    if args.dry_run:
        print(json.dumps({"success": True, "dryRun": True,
            "task": dict(
                main=args.task_main,
                content=args.content,
                target=args.target or args.content,
                deadline=args.deadline,
                deadlineMs=dl,
                pushNow=args.push_now,
            ),
            "resolved": info}, ensure_ascii=False, indent=2))
        return

    try:
        pid = client.create_plan(
            main=args.task_main,
            needful=args.content,
            target=args.target or args.content,
            end_time=dl,
            owner_emp_id_list=_resolve(args.assignee), assist_emp_id_list=_resolve(args.assistant),
            supervisor_emp_id_list=_resolve(args.supervisor), copy_emp_id_list=_resolve(args.copy),
            observer_emp_id_list=_resolve(args.observer), report_emp_id_list=_resolve(report_to),
            push_now=args.push_now,
            virtual_emp_id=args.virtual_emp_id,
        )
        print(json.dumps({"success": True, "planId": pid,
            "task": dict(main=args.task_main, deadline=args.deadline, deadlineMs=dl),
            "resolved": info}, ensure_ascii=False, indent=2))
    except CWorkError as e:
        _die(str(e))


if __name__ == "__main__":
    main()