At risk: launch holds if copy is approved by Tuesday
12 tasks done, 9 due next week, 2 at risk. The Nov 3 launch holds if the pricing page copy is approved by Tuesday.
Fridays: what got done in your Asana project this week, what is due next week and what is at risk, written as an update stakeholders can read.
Reads
You get
The card on the right is a sample. Yours shows your own numbers and updates in place every run.
What lands on your board
12 tasks done, 9 due next week, 2 at risk. The Nov 3 launch holds if the pricing page copy is approved by Tuesday.
Writing the Friday status update means scrolling the project, remembering what closed, guessing what is at risk and turning it into prose a stakeholder will read. It takes long enough that it gets skipped in exactly the weeks it matters.
The agent reads the project's tasks and milestones, sorts the week into done, next and at risk, and drafts the update with owners and dates. You check it, change a word and post it, or let the agent post it as an Asana status update once you have read it.
Call GET /tasks?project={project_gid}&completed_since={7 days ago}&opt_fields=name,completed,completed_at,assignee.name,due_on,modified_at,resource_subtype,custom_fields. With completed_since, Asana returns open tasks plus those completed since that time.
Done: completed in the last 7 days. Next: open and due in the coming 7 days. At risk: overdue, or due within 3 days with no change in a week (modified_at), or flagged in a status custom field.
Tasks with resource_subtype: milestone are the dates stakeholders care about. Note each one's due date and whether the open tasks ahead of it are on time.
An overall status (on track, at risk, off track), then what was done, what is next with owners, and each risk with what would fix it.
Only after the person approves, create it with POST /status_updates: parent set to the project gid, status_type of on_track, at_risk or off_track, a title and the text.
With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.
shellcurl -fsSL https://briefkin.dev/skills/asana-weekly-project-status/install | shAsk Claude Code:
promptRun the asana-weekly-project-status skillOr paste the prompt instead of installing:
promptDraft this week's status update for my Asana project (read only unless I approve posting). List the project's tasks with completed_since set to 7 days ago. Sort them into done (completed in the last 7 days), next (open and due in the next 7 days, with owners) and at risk (overdue, or due within 3 days and unchanged for a week, or flagged at risk). Check the milestones and whether their dates hold. Write a short update for stakeholders: an overall status of on track, at risk or off track with one line of why, then done, next, risks with what would fix each, and milestones. Ask me before posting it as an Asana status update.Fridays at 14:00, from cron on any machine where Claude Code is signed in:
crontab0 14 * * 5 claude -p "Run the asana-weekly-project-status skill"Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.
Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works
SKILL.md---
name: asana-weekly-project-status
description: "Fridays: what got done in your Asana project this week, what is due next week and what is at risk, written as an update stakeholders can read. Use when the user asks for this, or when it runs on a schedule."
---
# Asana weekly project status update
Fridays: what got done in your Asana project this week, what is due next week and what is at risk, written as an update stakeholders can read.
Writing the Friday status update means scrolling the project, remembering what closed, guessing what is at risk and turning it into prose a stakeholder will read. It takes long enough that it gets skipped in exactly the weeks it matters.
The agent reads the project's tasks and milestones, sorts the week into done, next and at risk, and drafts the update with owners and dates. You check it, change a word and post it, or let the agent post it as an Asana status update once you have read it.
## Two ways to get the data
Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.
## Route A: API or MCP server
### What you need
- Access to the Asana project through the Asana MCP server or connector, or a personal access token in `ASANA_ACCESS_TOKEN`.
- Permission to post status updates on the project, only if you want the agent to publish the update you approve.
If something is missing, say what and stop; do not invent numbers.
### Steps
1. **Pull the week's tasks** (Asana): Call `GET /tasks?project={project_gid}&completed_since={7 days ago}&opt_fields=name,completed,completed_at,assignee.name,due_on,modified_at,resource_subtype,custom_fields`. With `completed_since`, Asana returns open tasks plus those completed since that time.
2. **Sort into done, next and at risk**: Done: completed in the last 7 days. Next: open and due in the coming 7 days. At risk: overdue, or due within 3 days with no change in a week (`modified_at`), or flagged in a status custom field.
3. **Check the milestones** (Asana): Tasks with `resource_subtype: milestone` are the dates stakeholders care about. Note each one's due date and whether the open tasks ahead of it are on time.
4. **Draft the update**: An overall status (on track, at risk, off track), then what was done, what is next with owners, and each risk with what would fix it.
5. **Post it if asked** (Asana): Only after the person approves, create it with `POST /status_updates`: `parent` set to the project gid, `status_type` of `on_track`, `at_risk` or `off_track`, a `title` and the `text`.
## Route B: the browser
### What you need
- Signed in to Asana as a project member; posting a status update needs membership of the project, and comment-only members can read but not post.
If something is missing, say what and stop; do not invent numbers.
### Steps
Start at https://app.asana.com/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.
1. **Read what closed this week**: Open the project and its **List** tab. Click **Filter** and set it to **Completed tasks**, then sort by **Completion date** (or show the **Completed on** column) and read every task completed in the last 7 days with its assignee.
2. **Read what is due next**: Change the filter to **Incomplete tasks**, sort by **Due date**, and read tasks due in the coming 7 days with owners, plus anything already overdue. Show the **Last modified** column (the **+** at the right of the header) to spot tasks due within 3 days that have not changed in a week, and read your status custom field column if the project has one.
3. **Check milestones and the current status**: Open the **Overview** tab: the **Milestones** section lists each milestone's date, and the status log shows the last update and its color. Note whether the open tasks ahead of each milestone are on time.
4. **Draft, then post only if asked**: Write the update: overall status, done, next with owners, risks with what would fix each, milestones. If the person approves, click **Update status** on the Overview tab, pick **On track**, **At risk** or **Off track**, paste the text and click **Post**.
Note: Column names in the List view depend on the project; add Completed on and Last modified through the + button at the right of the header if they are hidden. The Overview tab also shows the status history, which is a quick way to see what last week's update promised.
## The report
- **Overall status**: on track, at risk or off track, and why in one line.
- **Done this week**: the tasks that closed.
- **Next week**: what is due, with owners.
- **At risk**: each task with the reason and what would unblock it.
- **Milestones** and whether their dates hold.
## Post it to Briefkin
When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.
```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
-H "authorization: Bearer $BRIEFKIN_TOKEN" \
-H "content-type: application/json" \
-d @- <<'JSON'
{
"v": 1,
"event_id": "asana-weekly-project-status/<date of this run, e.g. 2026-10-16>",
"item_key": "asana-weekly-project-status",
"project": "acme-web",
"source": "Asana weekly project status update skill",
"kind": "update",
"title": "At risk: launch holds if copy is approved by Tuesday",
"summary": "**12** tasks done, **9** due next week, **2** at risk. The Nov 3 launch holds if the pricing page copy is approved by Tuesday.",
"widget": [
{
"type": "Badges",
"props": {
"items": [
{
"label": "At risk",
"tone": "warn"
},
{
"label": "12 done this week",
"tone": "ok"
},
{
"label": "9 due next week",
"tone": "info"
}
]
}
},
{
"type": "Steps",
"props": {
"items": [
{
"label": "Design approved",
"state": "done",
"note": "Oct 2"
},
{
"label": "Build pages",
"state": "done",
"note": "Oct 14"
},
{
"label": "Copy review",
"state": "active",
"note": "Due Oct 20; 3 of 7 pages approved"
},
{
"label": "QA and redirects",
"state": "pending",
"note": "Starts Oct 22"
},
{
"label": "Launch",
"state": "pending",
"note": "Nov 3"
}
]
}
},
{
"type": "Table",
"props": {
"columns": [
"At risk",
"Owner",
"Due",
"Why"
],
"rows": [
[
"Pricing page copy",
"Priya",
"Oct 20",
"No update for 8 days"
],
[
"301 redirect map",
"Sam",
"Oct 15",
"1 day overdue, waiting on the URL list"
]
]
}
}
]
}
JSON
```
Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.
## Run it on a schedule
Suggested: Fridays at 14:00 (`0 14 * * 5`). From cron, with the agent signed in on that machine:
```bash
0 14 * * 5 claude -p "Run the asana-weekly-project-status skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```
Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/asana-weekly-project-status#schedule
Source: https://briefkin.dev/skills/asana-weekly-project-status
Access to the Asana project through the Asana MCP server or connector, or a personal access token in ASANA_ACCESS_TOKEN.
Permission to post status updates on the project, only if you want the agent to publish the update you approve.
https://mcp.asana.com/v2/mcp, signed in with OAuth. Asana also offers an Asana app for Claude; the older beta endpoint (/sse) is deprecated (docs).ASANA_ACCESS_TOKEN with ASANA_WORKSPACE_GID, and send it as a Bearer token.tasks:read and projects:read.A personal access token carries all of your Asana permissions, so for scheduled runs use read-scoped OAuth or a separate account with comment-only access to the projects in the report.
Yes, once you have read it. It creates a status update on the project with POST /status_updates, so it shows on the project's Overview and notifies members the way a manual update does. Without your go-ahead it only drafts.
Three signals: the task is overdue, it is due within three days with no change for a week, or your team set a status custom field to at risk. Tell the agent your field name and values if they differ, and it reads them through custom_fields.
No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.
Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.
Yes. Switch the data source to "Your browser" and the steps change to the Asana pages themselves: the agent opens app.asana.com in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.
Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.
Free during the open beta. No card.