Skip to content

Commit 52ecaaf

Browse files
author
ceki-plugin
committed
feat: add ceki contract edit — semantic sugar over propose
Added 'edit' as a contract subparser (ceki contract edit <eid> ...) that delegates to ContractClient.propose() — same args, same wire call, different name for 'edit task' intent.
1 parent 77ec99b commit 52ecaaf

1 file changed

Lines changed: 40 additions & 59 deletions

File tree

ceki_sdk/cli.py

Lines changed: 40 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,25 @@ def _cmd_contract(args: argparse.Namespace) -> int:
10421042
benefitable=args.benefitable,
10431043
settings=settings,
10441044
))
1045+
elif action == "edit":
1046+
tags = _parse_tags(args.tags) if getattr(args, "tags", None) else None
1047+
settings: dict[str, Any] | None = (
1048+
{"tags": tags} if tags else None
1049+
)
1050+
_contract_dump(cli.propose(
1051+
args.eid,
1052+
status_id=args.status,
1053+
label=args.label,
1054+
description=args.desc,
1055+
start=args.start,
1056+
end=args.end,
1057+
date=args.date,
1058+
duration=args.duration,
1059+
amount=args.amount,
1060+
currency=args.currency,
1061+
benefitable=args.benefitable,
1062+
settings=settings,
1063+
))
10451064
elif action == "progress":
10461065
_contract_dump(cli.progress(
10471066
args.eid,
@@ -1119,40 +1138,6 @@ def _cmd_timelog(args: argparse.Namespace) -> int:
11191138
return 0
11201139

11211140

1122-
def _cmd_edit(args: argparse.Namespace) -> int:
1123-
"""Semantic sugar: ``ceki edit`` ≡ ``ceki contract propose``.
1124-
1125-
Same wire call, same args, different name — lets AI agents express
1126-
"edit the task" intent instead of "propose a correction".
1127-
"""
1128-
from .contract import ContractError
1129-
1130-
try:
1131-
with _contract_client() as cli:
1132-
tags = _parse_tags(args.tags) if getattr(args, "tags", None) else None
1133-
settings: dict[str, Any] | None = (
1134-
{"tags": tags} if tags else None
1135-
)
1136-
_contract_dump(cli.propose(
1137-
args.eid,
1138-
status_id=args.status,
1139-
label=args.label,
1140-
description=args.desc,
1141-
start=args.start,
1142-
end=args.end,
1143-
date=args.date,
1144-
duration=args.duration,
1145-
amount=args.amount,
1146-
currency=args.currency,
1147-
benefitable=args.benefitable,
1148-
settings=settings,
1149-
))
1150-
except ContractError as e:
1151-
_err(str(e), "contract")
1152-
return 1
1153-
return 0
1154-
1155-
11561141
async def _cmd_cdp(args: argparse.Namespace) -> None:
11571142
# Try daemon IPC
11581143
params = json.loads(args.params) if args.params else {}
@@ -1462,6 +1447,27 @@ def build_parser() -> argparse.ArgumentParser:
14621447
),
14631448
)
14641449

1450+
p_edit = csub.add_parser("edit", help="Edit task (semantic sugar for propose)")
1451+
p_edit.add_argument("eid", type=int)
1452+
p_edit.add_argument("--status", type=int)
1453+
p_edit.add_argument("--label")
1454+
p_edit.add_argument("--desc")
1455+
p_edit.add_argument("--start")
1456+
p_edit.add_argument("--end")
1457+
p_edit.add_argument("--date")
1458+
p_edit.add_argument("--duration", type=int)
1459+
p_edit.add_argument("--amount", type=int)
1460+
p_edit.add_argument("--currency")
1461+
p_edit.add_argument("--benefitable")
1462+
p_edit.add_argument(
1463+
"--tags",
1464+
help=(
1465+
"Project tags (sugar for settings.tags[]). Comma-separated, each "
1466+
"item key[:label[:color]]. E.g. 'backend,urgent' or "
1467+
"'backend:Backend:#ff0000'."
1468+
),
1469+
)
1470+
14651471
p_cpr = csub.add_parser(
14661472
"progress",
14671473
help="Status correction + progress comment (description is not touched)",
@@ -1522,28 +1528,6 @@ def build_parser() -> argparse.ArgumentParser:
15221528
)
15231529
p_tlc.add_argument("event_id", type=int, help="Event ID")
15241530

1525-
# ── edit subcommand (semantic sugar over contract propose) ────────
1526-
p_edit = sub.add_parser("edit", help="Propose a correction (semantic sugar for ``contract propose``)")
1527-
p_edit.add_argument("eid", type=int, help="Event ID")
1528-
p_edit.add_argument("--status", type=int)
1529-
p_edit.add_argument("--label")
1530-
p_edit.add_argument("--desc")
1531-
p_edit.add_argument("--start")
1532-
p_edit.add_argument("--end")
1533-
p_edit.add_argument("--date")
1534-
p_edit.add_argument("--duration", type=int)
1535-
p_edit.add_argument("--amount", type=int)
1536-
p_edit.add_argument("--currency")
1537-
p_edit.add_argument("--benefitable")
1538-
p_edit.add_argument(
1539-
"--tags",
1540-
help=(
1541-
"Project tags (sugar for settings.tags[]). Comma-separated, each "
1542-
"item key[:label[:color]]. E.g. 'backend,urgent' or "
1543-
"'backend:Backend:#ff0000'."
1544-
),
1545-
)
1546-
15471531
# ── daemon subcommand ─────────────────────────────────────────────
15481532
p_daemon = sub.add_parser("daemon", help="Manage persistent renter daemon")
15491533
dsub = p_daemon.add_subparsers(dest="daemon_action", required=True)
@@ -1580,9 +1564,6 @@ def main() -> None:
15801564
"request-captcha": _cmd_request_captcha,
15811565
}
15821566

1583-
if args.command == "edit":
1584-
sys.exit(_cmd_edit(args))
1585-
15861567
if args.command == "contract":
15871568
sys.exit(_cmd_contract(args))
15881569

0 commit comments

Comments
 (0)