Skip to main content

/daily-summary

Turn the state that state-sync keeps mirrored across both trackers into a summary you can paste into a discussion โ€” the daily standup, or a progress review on one task. Because every task carries a current "AI Context" block (GitHub Issue) mirrored to ClickUp, the summary needs no extra digging.

Three modesโ€‹

Default โ€” daily standup digest (/daily-summary)โ€‹

Aggregate the current actor's open work and produce a short standup note. Pull from both trackers and correlate by CU-id so one work item is one line, not two:

  1. ClickUp โ€” the actor's product tasks + their R&D child tasks (clickup_filter_tasks); read the ai_context mirror field for the gist.
  2. GitHub โ€” the actor's open Issues (their "AI Context" block) and open/recently-merged PRs.
  3. Correlate ClickUp โ†” GitHub by CU-id; prefer the GitHub Issue "AI Context" as the detailed source, the ClickUp task for product framing/priority.

Output (tight โ€” a few lines per bucket, link each item):

**Daily โ€” <actor>, <date>**
๐Ÿšข Shipped: <merged PRs / closed tasks since yesterday>
๐Ÿ‘€ In review: <PRs awaiting review> โ€” who's waiting on whom
๐Ÿ”จ In progress: <task โ€” current phase + next step, from AI Context>
โ›” Stuck: <blockers, with the specific ask>
๐Ÿ™‹ Need help: <where input/review is needed>

Single-task โ€” progress summary (/daily-summary <task | cu-id | issue>)โ€‹

For a progress discussion on one task: resolve the task, then produce a fuller summary from its AI Context block + every linked GitHub Issue + PR:

  • What's done โ€” completed plan steps + merged PRs.
  • Current phase + next step โ€” from the AI Context block.
  • Key decisions โ€” the load-bearing choices recorded along the way.
  • Blockers / risks โ€” open items and the ask.
  • Links โ€” ClickUp parent + child tasks, GitHub Issues, PRs.

Period โ€” accomplishments digest (/daily-summary --since 30d | --month | --year)โ€‹

For a 1:1 / monthly / yearly review: "what did I get done this month/year?". Aggregate the actor's completed work over the window โ€” merged PRs, closed Issues, closed ClickUp tasks โ€” into an accomplishments digest grouped by theme.

Code before model: the windowing, grouping, counting, and time-bucketing are done by scripts/period-summary.mjs, not tallied in prose. The model only fetches and narrates. Same inputs โ†’ same totals.

  1. Fetch the window (resolve the actor first):

    • Merged PRs โ€” search_issues is:pr is:merged author:@me merged:>=<since>.
    • Closed Issues โ€” is:issue is:closed assignee:@me closed:>=<since>.
    • Closed ClickUp tasks โ€” clickup_filter_tasks with a closed/done status and a date in range.
    • For --month/--year derive <since> from the calendar; for --since 30d it's relative.
  2. Normalize each to the script's input shape โ€” set date to the merge/close date and theme from the item's domain:* label (GitHub) or ClickUp list/tag (uncategorized if none); repo for GitHub items.

  3. Aggregate in the script โ€” write the array to a temp file and run it:

    node scripts/period-summary.mjs --month --file /tmp/period-items.json
    node scripts/period-summary.mjs --year --file /tmp/period-items.json
    node scripts/period-summary.mjs --since 30d --file /tmp/period-items.json

    It returns { window, totals, byTheme[], byPeriod[], skipped[] } โ€” --year buckets by month, shorter windows by week.

  4. Narrate for the review:

    **<window.label> โ€” <actor>** (<totals.prs> PRs ยท <totals.issuesClosed> issues ยท <totals.tasksClosed> tasks)
    <per theme, highest-count first>
    โ€ข <theme> (<count>): <a few headline items, linked>
    Cadence: <byPeriod sparkline โ€” e.g. May 4 ยท Jun 7>

    If skipped[] is non-empty (items with no close/merge date), say how many were dropped โ€” don't silently undercount.

Boundariesโ€‹

  • Read-only. Produces text; never changes a status, merges, or writes to a tracker. To persist state, that's state-sync; to act on an item, /continue / /pr-review / /done.
  • Reports reality. If a task has no AI Context block (state-sync never ran), say so โ€” don't invent progress. If a tracker is unreachable, summarize what was reachable and name what was skipped.
  • For "what's on my plate right now, grouped by urgency" rather than a postable summary, use /status.