code/project-updates/SKILL.md
--- name: project-updates description: >- Drafts Linear project status updates for each project the user leads, following the Done / In Progress / Next / Blockers template. Gathers context from Linear issues and comments, git history across configured repos, GitHub PRs, Slack mentions, Notion edits, and Gmail/Calendar. Never auto-posts — always shows the draft so the user can paste it into Linear. Learns from edits over time. Use when preparing daily or end-of-day Linear project upda
npx skillsauth add mostafa-drz/claude-skills code/project-updatesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
On startup, use the Read tool on ~/.claude/skills/project-updates/preferences.md. If not found, no preferences are set.
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.
On startup, use Bash to gather (skip any that fail):
date +%Y-%m-%dgit config --global user.emailgh api user -q .login 2>/dev/nullmcp__claude_ai_Linear__get_user with selfCheck $ARGUMENTS:
help → display help, stopconfig → interactive setup, stopreset → delete preferences.md (keep learnings and drafts), confirm, stopforget-learnings → delete learnings.md, confirm, stopshow-learnings → print learnings.md contents, stopParse from $ARGUMENTS:
--since <time> — lookback window (e.g., 24h, 48h, yesterday, monday). Default: from preferences, else 24h.--projects <list> — comma-separated Linear project slugs/names to include (overrides default set).--project <slug> — shortcut for a single project.--sources <list> — comma-separated: linear,git,github,slack,notion,gmail,calendar. Default: all available.--dry-run — draft only; skip writing to drafts/ and skip learnings capture.--no-feedback — skip the per-draft feedback prompt.--format <style> — template (default: Done/In Progress/Next/Blockers) or narrative (paragraph style).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)
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., <repos-root>/<repo-name>).
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)
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.
Delete ~/.claude/skills/project-updates/preferences.md. Confirm: "Preferences cleared. Learnings and drafts preserved."
Delete ~/.claude/skills/project-updates/learnings.md. Confirm: "Learnings wiped. Future drafts will start fresh."
Read ~/.claude/skills/project-updates/learnings.md and print its contents verbatim. Then stop.
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.
Priority:
--since flaglast-run-timestamp in preferences (if since last run mode)24hCompute absolute ISO timestamps (since_iso, until_iso=now).
Priority:
--project <slug> — one project--projects a,b,c — explicit listdefault-projects from preferencesmcp__claude_ai_Linear__list_projects with member: "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").
Apply --sources override if given, else use configured set intersected with runtime availability:
git — verify at least one configured repo exists under <repos-root>/ (from preferences). If repos-root is unset, skip git source with a one-line note.github — gh auth status must 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)
For each project, run collectors in parallel. All collectors must be scoped to [since_iso, until_iso].
list_issues with project: <id>, updatedAt: -P<window>, order by updatedAtlist_comments to extract comments by me or tagged @meget_status_updates (type: project, project: id) to see what the last posted update already covered — DO NOT re-report work already postedFor each repo in config:
cd <repo> && git log --since="<since_iso>" --author="<email>" --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").
gh pr list --author @me --state all --search "updated:>=<since_iso>" --json number,title,state,url,mergedAt,headRefName,body
gh pr list --search "review-requested:@me updated:>=<since_iso>" --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).
Use slack_search_public_and_private with query from:@me after:<date> and secondary queries per project (project name, Linear ID prefix). Keep to threads with substantive messages (>= 20 chars, not just reactions).
Use notion-search with project name as query, filter to pages edited in window. Fetch each to extract the change.
search_threads with after:<date> from:me. Bucket by recipient/project only if the project name or Linear ID appears.
list_events for meetings in window where user attended. Supplementary context for "In Progress" (e.g., "Aligned with <reviewer> on <topic>").
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:**
- <concrete thing shipped, with PR# or Linear ID>
**In Progress:**
- <current work, with ownership if shared>
**Next:**
- <next concrete step, not vague>
**Blockers:**
- <blocker with who/what needed to unblock, or "none">
Drafting rules (hard):
learnings.md.Narrative format (if selected): 2-4 sentence paragraph per project, same rules.
Show drafts one project at a time with source-count footer:
Project: <Project Name from Linear>
Since: <ISO timestamp of your last update>
Signals: <N Linear comments, M PRs merged, K PR in review, J Slack threads>
Done:
- <repo> #<PR> merged — <one-line user-visible summary from the PR body>
- <repo> #<PR> opened, in review (<one-line summary>)
In Progress:
- <currently-open work item, anchored to a Linear issue or PR>
Next:
- <upcoming work, scoped from `next` Linear column or open PRs>
Blockers:
- <blocker, with the responsible reviewer/owner if known>
[Linear: https://linear.app/<linear-org>/project/<slug>]
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 pastingOn Edit:
"Detected pattern:
<concise description>. Save as learning? (y / n / reword)"
y or reword, append to learnings.md under the right section (Style / Phrasing / Per-project / Per-source). Include date.Copy the edited draft to clipboard with pbcopy if preference says auto-copy, or after "Accept".
Unless --dry-run, write all drafts (original + edited) for the day to:
~/.claude/skills/project-updates/drafts/<YYYY-MM-DD>.md
This is the audit trail — useful for debugging bad learnings later. Append mode if the file exists (multiple runs per day).
last-run-timestamp to now (for since last run mode)learnings.mdEnd with a one-line tally:
Drafted 3 projects · 2 accepted, 1 edited · 2 new learnings saved · Run again tomorrow to continue.
~/.claude/skills/project-updates/learnings.md:
# /project-updates Learnings
Last updated: YYYY-MM-DD
## Style
- <rule> — saved <date>
## Phrasing
- <rule> — saved <date>
## Per-project
### <project slug>
- <rule> — saved <date>
## Per-source
### git
- <rule>
### linear
- <rule>
## Corrections log
- <date>: <what was corrected and what pattern was learned>
When the file exceeds ~200 lines, consolidate duplicates and archive the rest to learnings.archive.md (do this silently, mention once).
--format narrative. The four-section template is the default; configure via preferences if your team uses a different ordering.learnings.md when the user explicitly confirms a pattern, or when a correction is repeated across runs. Avoid cluttering the file with one-off edits.development
--- name: triage-board description: >- Generates a structured triage artifact from the current conversation's findings — a self-contained Desktop folder with a JSON Schema, schema-conformant report.json, prose markdown, and a single-file HTML viewer. Viewer ships with MD / CSV / JSON download buttons in the header and a per-finding "Copy as Markdown" action that produces a GitHub/Linear/Notion-ready ticket block. Stateless — triage state lives in the user's ticket system, not in the
development
Runs a beginner-mind end-to-end UI audit of any running app — local dev server, staging, production, or a specific URL. Drives Chrome through every interactive element on the target surface, collects structured findings (severity, category, where, symptom, impact, repro, triage), and hands the result off to `/triage-board` which produces the Desktop folder (schema + JSON + Markdown + single-file HTML viewer with MD/CSV/JSON exports and a per-finding Copy as Markdown button). Use when you want fresh-eyes verification of a feature, page, modal, flow, branch, or whole app — before shipping, before review, before a demo, or any time the UI deserves a careful poke.
development
Reviews the user's past Claude Code conversations from a wellbeing perspective — sentiment, tone, emotional arc, recurring patterns — and generates a supportive, science-grounded report in both Markdown and HTML. Default lookback is 48 hours across all projects. Uses recognised emotion frameworks (Plutchik, Ekman, Russell's circumplex, Pennebaker linguistic markers) and cites the science behind every observation. Learns the user's baseline tone over time so future reports flag genuine shifts, not noise. Use when the user asks for an emotional/wellbeing recap, mood check, sentiment review, or wants to understand their own ups and downs across recent work sessions.
development
--- name: workflow-advisor description: >- Analyzes recent Claude Code conversations and local Claude state (skills, settings, memory files, CLAUDE.md), researches the latest Claude Code features and best practices online, and suggests one workflow improvement at a time with reasoning and a concrete action item. Can save accepted suggestions to memory for tracking. Use when you want to discover underused Claude Code features, improve your development workflow, stay current with the lat