Install
$ agentstack add skill-mostafa-drz-claude-skills-project-updates ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Project Updates
Draft Linear project status updates — one per project, in the team template (Done / In Progress / Next / Blockers) — from everything I did today, across every tool I use. Show drafts, capture edits, learn patterns.
Preferences
On startup, use the Read tool on ~/.claude/skills/project-updates/preferences.md. If not found, no preferences are set.
Learnings
On startup, use the Read tool on ~/.claude/skills/project-updates/learnings.md. If not found, treat as empty. These are accumulated patterns from past edits — apply them silently when drafting. Do not mention the learnings file to the user unless adding to it.
Context
On startup, use Bash to gather (skip any that fail):
- Current date:
date +%Y-%m-%d - Git user email:
git config --global user.email - GitHub username:
gh api user -q .login 2>/dev/null - Linear user (from MCP):
mcp__claude_ai_Linear__get_userwith self
Command routing
Check $ARGUMENTS:
help→ display help, stopconfig→ interactive setup, stopreset→ deletepreferences.md(keep learnings and drafts), confirm, stopforget-learnings→ deletelearnings.md, confirm, stopshow-learnings→ printlearnings.mdcontents, stop- anything else (including empty) → run the skill
Flags
Parse from $ARGUMENTS:
--since— lookback window (e.g.,24h,48h,yesterday,monday). Default: from preferences, else24h.--projects— comma-separated Linear project slugs/names to include (overrides default set).--project— shortcut for a single project.--sources— comma-separated:linear,git,github,slack,notion,gmail,calendar. Default: all available.--dry-run— draft only; skip writing todrafts/and skip learnings capture.--no-feedback— skip the per-draft feedback prompt.--format—template(default: Done/In Progress/Next/Blockers) ornarrative(paragraph style).
Help
Project Updates — Draft Linear project status updates from all your signals
Usage:
/project-updates All projects I lead, last 24h
/project-updates --since 48h Last 48 hours
/project-updates --project fast-signals One specific project
/project-updates --sources linear,git Only these sources
/project-updates --dry-run Draft only, don't save
/project-updates show-learnings Print accumulated learnings
/project-updates forget-learnings Wipe learnings.md
/project-updates config Set preferences
/project-updates reset Clear preferences
/project-updates help This help
Template (Done / In Progress / Next / Blockers):
Done:
In Progress:
Next:
Blockers:
Sources (auto-detected, graceful skip):
linear Assigned issues, project activity, comments, status updates
git Commits across configured repos (see `repos-root` + `default-repos` in preferences) touching project branches
github PRs opened, merged, reviewed; linked to Linear IDs
slack Mentions, threads where I participated
notion Pages I edited or that reference project IDs
gmail Threads I replied to
calendar Meetings attended (supplementary)
Current preferences:
(read from preferences.md)
Config
Use AskUserQuestion for these:
Q1 — Default lookback window? Options: 24h (default), 48h, since last run, custom
Q2 — Which Linear projects do you lead or contribute to regularly? Free-text or multiSelect populated from list_projects (member == me). These become the default project set.
Q3a — Where do your local repos live? (repos-root) Free-text path. Default: ~/Dev/. The skill expects each configured repo to be a direct subdirectory of this root (e.g., /).
Q3b — Which local repos to scan for git history? (default-repos) Free-text comma-separated list of repo directory names under repos-root. No defaults — this is per-user. Example input: acme-frontend, acme-api, design-system.
Q4 — Which sources to include by default? (multiSelect)
- Linear (required)
- Git (local commits)
- GitHub (PRs)
- Slack (mentions)
- Notion (page edits)
- Gmail (thread replies)
- Calendar (meetings)
Q5 — Default output format? Options: template (Done/In Progress/Next/Blockers) (default) or narrative (paragraph)
Q6 — Auto-copy first draft to clipboard? Yes / No (default: No)
Q7 — Confirm: this skill NEVER auto-posts to Linear, right? Options: Correct — always show me first (expected), Actually, allow auto-post with confirmation (switches behavior)
Save to ~/.claude/skills/project-updates/preferences.md.
Reset
Delete ~/.claude/skills/project-updates/preferences.md. Confirm: "Preferences cleared. Learnings and drafts preserved."
Forget-learnings
Delete ~/.claude/skills/project-updates/learnings.md. Confirm: "Learnings wiped. Future drafts will start fresh."
Show-learnings
Read ~/.claude/skills/project-updates/learnings.md and print its contents verbatim. Then stop.
First-time detection
If no preferences.md exists, show: "First time using /project-updates? Run /project-updates config to set defaults, or continue — I'll auto-detect projects from Linear (assignee == you) and use sensible defaults."
Then proceed.
Workflow
1. Resolve time window
Priority:
--sinceflaglast-run-timestampin preferences (ifsince last runmode)- Default from preferences, else
24h
Compute absolute ISO timestamps (since_iso, until_iso=now).
2. Resolve project set
Priority:
--project— one project--projects a,b,c— explicit listdefault-projectsfrom preferences- Fallback: query
mcp__claude_ai_Linear__list_projectswithmember: "me", filter to active projects (state != completed/cancelled)
For each project, collect: id, name, slug, url, and the most recent existing status update (via get_status_updates filtered to that project, limit 3) — used as anchor ("progress since last update").
3. Detect available sources
Apply --sources override if given, else use configured set intersected with runtime availability:
git— verify at least one configured repo exists under/(from preferences). Ifrepos-rootis unset, skip git source with a one-line note.github—gh auth statusmust succeedlinear,notion,slack,gmail,calendar— ping the MCP (try one cheap read; skip on failure)
Report once at top of output:
Sources: linear, git, github, slack | Skipped: notion (not configured), gmail (no matches today)
4. Gather signals per project (parallel)
For each project, run collectors in parallel. All collectors must be scoped to [since_iso, until_iso].
Linear
list_issueswithproject:,updatedAt: -P, order byupdatedAt- For each issue updated in window:
list_commentsto extract comments by me or tagged @me - Filter to: status transitions, my comments, my assignments/reassignments, completed issues
- Also query
get_status_updates(type: project, project: id) to see what the last posted update already covered — DO NOT re-report work already posted
Git (across configured repos)
For each repo in config:
cd && git log --since="" --author="" --pretty=format:'%h|%s|%ad' --date=iso 2>/dev/null
Cross-reference commit messages / branch names for Linear issue IDs (regex [A-Z]{2,4}-\d+). Bucket each commit to a project by the issue ID → project mapping from Linear.
Also check uncommitted WIP: git status --short per repo (surface as "in progress").
GitHub
gh pr list --author @me --state all --search "updated:>=" --json number,title,state,url,mergedAt,headRefName,body
gh pr list --search "review-requested:@me updated:>=" --state all --json number,title,state,url
Parse PR body/branch for Linear IDs → bucket to project. Distinguish: opened, merged, in review (mine), reviewed-by-me (someone else's).
Slack
Use slack_search_public_and_private with query from:@me after: and secondary queries per project (project name, Linear ID prefix). Keep to threads with substantive messages (>= 20 chars, not just reactions).
Notion
Use notion-search with project name as query, filter to pages edited in window. Fetch each to extract the change.
Gmail (optional)
search_threads with after: from:me. Bucket by recipient/project only if the project name or Linear ID appears.
Calendar (optional)
list_events for meetings in window where user attended. Supplementary context for "In Progress" (e.g., "Aligned with on ").
5. Synthesize drafts
For each project, feed all collected signals + the last posted status update + the learnings file into the draft model. Produce one draft per project using the user's preferred format.
Template format (default):
## {Project Name} ({slug})
**Done:**
-
**In Progress:**
-
**Next:**
-
**Blockers:**
-
Drafting rules (hard):
- Every bullet ≤ 1 line. If it needs two, split or simplify.
- Always include Linear IDs and PR numbers when available (link markdown).
- Never claim work someone else led. Co-ownership → name the other person.
- Don't repeat content from the last posted status update — start from "since ".
- Omit empty sections silently (e.g., no "Blockers: none" unless the user's learnings say to keep it).
- Apply every rule currently in
learnings.md.
Narrative format (if selected): 2-4 sentence paragraph per project, same rules.
6. Present drafts
Show drafts one project at a time with source-count footer:
Project:
Since:
Signals:
Done:
- # merged —
- # opened, in review ()
In Progress:
-
Next:
-
Blockers:
-
[Linear: https://linear.app//project/]
7. Feedback capture per draft
For each draft, prompt via AskUserQuestion unless --no-feedback:
Accept— copy to clipboard, move onEdit— user provides corrected text; skill diffs original vs edit and extracts patternsSkip— no copy, move onOpen Linear— print the project activity URL for pasting
On Edit:
- Accept the user's rewritten draft
- Compare original vs edited line-by-line
- For each meaningful delta (phrasing change, added detail, removed content, reordering), ask:
> "Detected pattern: ``. Save as learning? (y / n / reword)"
- If
yorreword, append tolearnings.mdunder the right section (Style / Phrasing / Per-project / Per-source). Include date. - Skip trivial deltas (typos, whitespace).
Copy the edited draft to clipboard with pbcopy if preference says auto-copy, or after "Accept".
8. Save daily draft history
Unless --dry-run, write all drafts (original + edited) for the day to:
~/.claude/skills/project-updates/drafts/.md
This is the audit trail — useful for debugging bad learnings later. Append mode if the file exists (multiple runs per day).
9. Update preferences
- Set
last-run-timestampto now (forsince last runmode) - If user consistently skipped a source, nudge: "You've skipped Notion 5 runs in a row — remove from default sources? [y/n]"
- If user always edits in the same direction, confirm the pattern is captured in
learnings.md
10. Summary
End with a one-line tally:
Drafted 3 projects · 2 accepted, 1 edited · 2 new learnings saved · Run again tomorrow to continue.
Learnings file format
~/.claude/skills/project-updates/learnings.md:
# /project-updates Learnings
Last updated: YYYY-MM-DD
## Style
- — saved
## Phrasing
- — saved
## Per-project
###
- — saved
## Per-source
### git
-
### linear
-
## Corrections log
- :
When the file exceeds ~200 lines, consolidate duplicates and archive the rest to learnings.archive.md (do this silently, mention once).
Principles
- Never auto-post. Show the draft. User pastes. Non-negotiable — violates the user's stated constraint.
- Template is law. Done / In Progress / Next / Blockers in that order, every time, unless
--format narrative. The four-section template is the default; configure via preferences if your team uses a different ordering. - Anchor to last update. Every draft starts from "what changed since the last posted status update" — no duplicate work credited twice.
- Graceful degradation. If Slack/Notion/Gmail are unavailable, skip them. The draft can be made from Linear + git alone.
- Learnings are earned, not assumed. Only add to
learnings.mdwhen the user explicitly confirms a pattern, or when a correction is repeated across runs. Avoid cluttering the file with one-off edits. - Claim only your work. If a PR was reviewed by me but authored by someone else, it's "reviewed X's PR", not "shipped X". Co-ownership always named.
- Terse beats complete. One-line bullets win. Detail belongs in the linked PR or ticket.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: mostafa-drz
- Source: mostafa-drz/claude-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.