diff --git a/cheddahbot/tools/press_release.py b/cheddahbot/tools/press_release.py index c48d40f..d7268f5 100644 --- a/cheddahbot/tools/press_release.py +++ b/cheddahbot/tools/press_release.py @@ -370,6 +370,7 @@ def write_press_releases( url: str = "", lsi_terms: str = "", required_phrase: str = "", + clickup_task_id: str = "", ctx: dict = None, ) -> str: """Run the full press-release pipeline and return results + cost summary.""" @@ -585,6 +586,66 @@ def write_press_releases( output_parts.append(f"| {c['step']} | {c['model']} | {c['elapsed_s']} |") output_parts.append(f"| **Total** | | **{round(total_elapsed, 1)}** |") + # ── ClickUp sync (when triggered from chat with a task ID) ─────────── + if clickup_task_id and ctx and ctx.get("config") and ctx["config"].clickup.enabled: + try: + from ..clickup import ClickUpClient + + config = ctx["config"] + client = ClickUpClient( + api_token=config.clickup.api_token, + workspace_id=config.clickup.workspace_id, + task_type_field_name=config.clickup.task_type_field_name, + ) + + # Upload each .docx as an attachment + uploaded_count = 0 + for path in docx_files: + if client.upload_attachment(clickup_task_id, path): + uploaded_count += 1 + else: + log.warning("ClickUp: failed to upload %s for task %s", path, clickup_task_id) + + # Post a result comment + attach_note = f"\n📎 {uploaded_count} file(s) attached." if uploaded_count else "" + comment = ( + f"✅ CheddahBot completed this task (via chat).\n\n" + f"Skill: write_press_releases\n" + f"Result:\n{'\n'.join(output_parts)[:3000]}{attach_note}" + ) + client.add_comment(clickup_task_id, comment) + + # Update task status to review + client.update_task_status(clickup_task_id, config.clickup.review_status) + + # Update kv_store state if one exists + db = ctx.get("db") + if db: + import json as _json + kv_key = f"clickup:task:{clickup_task_id}:state" + existing = db.kv_get(kv_key) + if existing: + from datetime import timezone + state = _json.loads(existing) + state["state"] = "completed" + state["completed_at"] = datetime.now(timezone.utc).isoformat() + state["deliverable_paths"] = docx_files + db.kv_set(kv_key, _json.dumps(state)) + + client.close() + + output_parts.append(f"\n## ClickUp Sync\n") + output_parts.append(f"- Task `{clickup_task_id}` updated") + output_parts.append(f"- {uploaded_count} file(s) uploaded") + output_parts.append(f"- Status set to '{config.clickup.review_status}'") + + log.info("ClickUp sync complete for task %s", clickup_task_id) + except Exception as e: + log.error("ClickUp sync failed for task %s: %s", clickup_task_id, e) + output_parts.append(f"\n## ClickUp Sync\n") + output_parts.append(f"- **Sync failed:** {e}") + output_parts.append("- Press release results are still valid above") + return "\n".join(output_parts)