From wa-tasks-plugin
Draft a weekly Novo readout and post it as a draft message on the Readouts Basecamp message board for review. Use this skill whenever the user asks for a "Novo weekly readout," "weekly readout," "Novo update," "weekly update for Novo," "Novo status post," or anything that sounds like compiling the week's Novo progress into a Basecamp post. Trigger even if the user only says "write the readout" or "let's do this week's readout" — the Novo readout is the default reading for those phrases.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wa-tasks-plugin:novo-weekly-readoutThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Compile a weekly Novo readout, post it to the Readouts Basecamp message board, and return the link to the posted message so the user can review and edit it in Basecamp.
Compile a weekly Novo readout, post it to the Readouts Basecamp message board, and return the link to the posted message so the user can review and edit it in Basecamp.
380886747950419793 — if calls against this ID fail, also try 7546621971 (the ID returned by get_message_board for the same project)westarete-cwslEngineering (key ENG)Run the steps in order. Do not skip ahead; each step's output feeds the next.
The readout covers last Friday through right now.
since_date (ISO 8601, e.g. 2026-05-15T00:00:00).Goal: extract the template structure (section headings, ordering, tone, length, formatting conventions like bold/links/checklists).
Use whichever Basecamp MCP server is connected — tool names vary between servers, so match by capability (the Basecamp tools are usually prefixed basecamp). If no Basecamp tool is connected, stop and tell the user no Basecamp connector is available.
Try these in order, stopping at the first one that works:
list_messages / get_messages) with project_id=38088674, message_board_id=7950419793. If "Tool result too large," retry with message_board_id=7546621971. If still too large, fall through.get_message) for each.From the 3 posts, derive a template: subject line pattern (e.g. "2026-05-16 Novo Weekly Readout"), section headers in order, what kind of content goes in each section, and any standard sign-off.
Use Linear:list_issues with:
statusType: "completed"includeArchived: truecompletedAt >= since_date.For each kept issue, capture: identifier (e.g. ENG-1738), title, description.
If the list is empty after filtering, ask the user before continuing — they may want to widen the filter or check a different team.
Goal: capture Novo-related accomplishments, decisions, customer signals, and news from the rest of the user's tools during the same window (since_date → now). Run each source that has a connector available; skip silently (do not error) if a connector is missing.
Filter every result to Novo-relevant content. Heuristics: mentions of "Novo," any ENG ticket identifier, Novo customer/stakeholder names, Novo project channels, or Novo Basecamp project mentions. When in doubt, include with a (?) marker so the user can confirm when reviewing the posted draft in Basecamp.
Run these in parallel where possible:
fathom:list_meetings (or fathom:search_meetings) for meetings with start_time >= since_date. Keep meetings whose title, attendees, or summary reference Novo. For each kept meeting, call fathom:get_meeting_summary and extract: decisions, action items, customer feedback, and anything that reads as an accomplishment or news item. Record meeting title, date, and a one-line takeaway with the Fathom URL.slack:slack_search_public_and_private (fall back to slack_search_public if the private search isn't available) with queries like Novo after:<since_date>, ENG- after:<since_date>, and any known Novo channel names. Also slack_read_channel on dedicated Novo channels if known. Capture announcements, shipped-it messages, customer reports, and decisions. Record channel, date, author, permalink, and a one-line summary.gmail:search_threads with queries like Novo after:<since_date>, plus searches for known Novo stakeholder domains/addresses. Keep threads that contain product news, customer feedback, contract/legal updates, or release coordination. Record subject, date, sender, and a one-line summary with the thread link.zoom:search_meetings / zoom:recordings_list for recordings in the window. Keep meetings whose topic or participants reference Novo. For each, pull the summary or transcript snippet and extract Novo-relevant takeaways. Record meeting topic, date, and a one-line summary with the recording link.Collate the findings into a single working list grouped by source, deduplicated against the Linear issues from Step 3 (don't list a ticket twice if Slack/Teams just announced it shipping — merge them, keeping the ticket as the primary entry and the chat link as supporting context).
If a source returns nothing relevant, record "no Novo items found in
Before asking, show the user a brief summary of what Step 3 and Step 3.5 already gathered (counts per source, e.g. "Linear: 7 tickets · Fathom: 2 meetings · Slack: 4 threads · Gmail: 1 thread · Teams: 0 · Zoom: 1 recording"), so they can fill only the gaps.
Use the ask_user_input_v0 tool. Ask all of these in one call so the user answers once:
After they respond, if they uploaded files, note the filenames/paths so you can reference them in the draft (Basecamp accepts inline images via paste; in the draft, place a placeholder line like [INSERT: mixpanel-usage-2026-05-20.png] exactly where the image should go).
Mirror the template from Step 2 as closely as possible: same section order, same heading style, comparable length per section.
<h1>, <h2>, <ul>, <li>, <a href>, <strong>, <em>, <div>, line breaks. Do not invent sections that weren't in the past 3 readouts; do not drop sections that were consistent across them.(?) for the user to verify when they open the posted draft in Basecamp.Call the connected Basecamp server's "create message" tool (e.g. create_message) with:
project_id: 38088674message_board_id: 7546621971 (the Readouts board)subject: the subject line composed in Step 5content: the HTML body composed in Step 5status: draftCapture the app_url (or url) returned by the create call — that is the link the user will follow to review and edit the draft in Basecamp.
If the create call fails, do not retry against a different board. Report the error to the user, include the composed subject and HTML body in the response so nothing is lost, and stop.
Image placeholders (e.g. [INSERT: mixpanel-usage-2026-05-20.png]) remain inline in the posted HTML — the user will replace them with pasted images when editing in Basecamp.
Present the result as:
app_url from Step 6), labeled clearly (e.g. Draft posted: <url>).Do not paste the full HTML body or plain-text rendering into the chat response — the user will review and edit it directly in Basecamp via the link.
The skill's final response to the user must contain, in this order:
app_url), labeled clearly.Nothing else. Do not paste the HTML body or plain-text rendering into chat — the user reviews and edits the draft in Basecamp via the link.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub rvnash/plugins --plugin wa-tasks-plugin