project-updates — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited project-updates (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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-%d_git config --global user.email_gh api user -q .login 2>/dev/null_mcp__claude_ai_Linear__get_user with self_Check $ARGUMENTS:
preferences.md (keep learnings and drafts), confirm, stoplearnings.md, confirm, stoplearnings.md contents, stopParse from $ARGUMENTS:
24h, 48h, yesterday, monday). Default: from preferences, else 24h.linear,git,github,slack,notion,gmail,calendar. Default: all available.drafts/ and skip learnings capture.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].
#### Linear
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 posted#### Git (across configured repos) For each repo in config:
cd <repo> && git log --since="<since_iso>" --author="<email>" --pretty=format:'%h|%s|%ad' --date=iso 2>/dev/nullCross-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:>=<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,urlParse 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:<date> 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:<date> 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 <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>.mdThis 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.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.