# Project Updates

> >-

- **Type:** Skill
- **Install:** `agentstack add skill-mostafa-drz-claude-skills-project-updates`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [mostafa-drz](https://agentstack.voostack.com/s/mostafa-drz)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [mostafa-drz](https://github.com/mostafa-drz)
- **Source:** https://github.com/mostafa-drz/claude-skills/tree/main/code/project-updates

## Install

```sh
agentstack add skill-mostafa-drz-claude-skills-project-updates
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## 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_user` with self_

## Command routing

Check `$ARGUMENTS`:

- **`help`** → display help, stop
- **`config`** → interactive setup, stop
- **`reset`** → delete `preferences.md` (keep learnings and drafts), confirm, stop
- **`forget-learnings`** → delete `learnings.md`, confirm, stop
- **`show-learnings`** → print `learnings.md` contents, stop
- **anything else** (including empty) → run the skill

### Flags

Parse from `$ARGUMENTS`:
- **`--since `** — lookback window (e.g., `24h`, `48h`, `yesterday`, `monday`). Default: from preferences, else `24h`.
- **`--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 to `drafts/` and skip learnings capture.
- **`--no-feedback`** — skip the per-draft feedback prompt.
- **`--format `** — `template` (default: Done/In Progress/Next/Blockers) or `narrative` (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:
1. `--since` flag
2. `last-run-timestamp` in preferences (if `since last run` mode)
3. Default from preferences, else `24h`

Compute absolute ISO timestamps (`since_iso`, `until_iso=now`).

### 2. Resolve project set

Priority:
1. `--project ` — one project
2. `--projects a,b,c` — explicit list
3. `default-projects` from preferences
4. Fallback: query `mcp__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").

### 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). If `repos-root` is unset, skip git source with a one-line note.
- `github` — `gh auth status` must succeed
- `linear`, `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_issues` with `project: `, `updatedAt: -P`, order by `updatedAt`
- For each issue updated in window: `list_comments` to 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:
```bash
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
```bash
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 on
- `Edit` — user provides corrected text; skill diffs original vs edit and extracts patterns
- `Skip` — no copy, move on
- `Open Linear` — print the project activity URL for pasting

On **Edit**:
1. Accept the user's rewritten draft
2. Compare original vs edited line-by-line
3. For each meaningful delta (phrasing change, added detail, removed content, reordering), ask:
   > "Detected pattern: ``. Save as learning? (y / n / reword)"
4. If `y` or `reword`, append to `learnings.md` under the right section (Style / Phrasing / Per-project / Per-source). Include date.
5. 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-timestamp` to now (for `since last run` mode)
- 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`:

```markdown
# /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.md` when 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](https://github.com/mostafa-drz)
- **Source:** [mostafa-drz/claude-skills](https://github.com/mostafa-drz/claude-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-mostafa-drz-claude-skills-project-updates
- Seller: https://agentstack.voostack.com/s/mostafa-drz
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
