Add clickup_task_id param to write_press_releases for chat-triggered sync

When a press release is triggered via chat with a ClickUp task ID, the
tool now uploads .docx attachments, posts a result comment, and updates
task status — matching what the scheduler does automatically. ClickUp
sync is wrapped in try/except so failures don't lose PR results.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cora-start
PeninsulaInd 2026-02-16 21:42:41 -06:00
parent 46bc38106e
commit a7171673fc
1 changed files with 61 additions and 0 deletions

View File

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