diff --git a/ceki_sdk/cli.py b/ceki_sdk/cli.py index aa72519..33a7abc 100644 --- a/ceki_sdk/cli.py +++ b/ceki_sdk/cli.py @@ -480,6 +480,8 @@ def _cmd_contract(args: argparse.Namespace) -> int: description=args.desc, data=data_obj, benefitable=args.benefitable, + reviewer=args.reviewer, + qa=args.qa, )) elif action == "comment": _contract_dump(cli.comment( @@ -779,6 +781,8 @@ def build_parser() -> argparse.ArgumentParser: p_cc.add_argument("--amount", type=int) p_cc.add_argument("--currency") p_cc.add_argument("--benefitable", help="agent:8 or user:61") + p_cc.add_argument("--reviewer", help="agent:8 or user:61") + p_cc.add_argument("--qa", help="agent:8 or user:61") p_cc.add_argument("--desc") p_cc.add_argument("--data", help="Extra JSON object passed through as `data`") diff --git a/ceki_sdk/contract.py b/ceki_sdk/contract.py index c3bdde5..f30121b 100644 --- a/ceki_sdk/contract.py +++ b/ceki_sdk/contract.py @@ -206,6 +206,8 @@ def create( description: str | None = None, data: dict[str, Any] | None = None, benefitable: str | None = None, + reviewer: str | None = None, + qa: str | None = None, ) -> Any: args = _clean({ "contract_id": int(contract_id), @@ -223,6 +225,8 @@ def create( "description": description, "data": data, "benefitable": _benefitable(benefitable), + "reviewer": _benefitable(reviewer), + "qa": _benefitable(qa), }) return self.call(_TOOL_MAP["create"], args) diff --git a/tests/test_contract.py b/tests/test_contract.py index 961df8b..20d233f 100644 --- a/tests/test_contract.py +++ b/tests/test_contract.py @@ -379,3 +379,45 @@ def test_parser_propose_start_end_date(): "--start", "s", "--end", "e", "--date", "d", ]) assert a.start == "s" and a.end == "e" and a.date == "d" + + +# ── reviewer / qa on create (task 2465) ─────────────────────────── + + +def test_create_reviewer_only(): + http, _ = _http_mock(_mcp_text({"id": 1})) + c = ContractClient(client=http, endpoint="http://x/mcp/agent", token="t") + c.create(14, label="L", reviewer="agent:9") + args = _captured_body(http)["params"]["arguments"] + assert args["reviewer"] == {"type": "agent", "value": 9} + assert "qa" not in args + + +def test_create_qa_only(): + http, _ = _http_mock(_mcp_text({"id": 1})) + c = ContractClient(client=http, endpoint="http://x/mcp/agent", token="t") + c.create(14, label="L", qa="user:42") + args = _captured_body(http)["params"]["arguments"] + assert args["qa"] == {"type": "user", "value": 42} + assert "reviewer" not in args + + +def test_create_reviewer_and_qa(): + http, _ = _http_mock(_mcp_text({"id": 1})) + c = ContractClient(client=http, endpoint="http://x/mcp/agent", token="t") + c.create(14, label="L", reviewer="agent:9", qa="agent:12") + args = _captured_body(http)["params"]["arguments"] + assert args["reviewer"] == {"type": "agent", "value": 9} + assert args["qa"] == {"type": "agent", "value": 12} + + +def test_parser_create_reviewer_and_qa(): + a = build_parser().parse_args([ + "contract", "create", "14", "--label", "X", + "--benefitable", "agent:8", + "--reviewer", "agent:9", + "--qa", "agent:12", + ]) + assert a.benefitable == "agent:8" + assert a.reviewer == "agent:9" + assert a.qa == "agent:12"