← All Skills

snappy-update

v1.0.0
9 files, 59.7 KB ~2,935 words · 12 min read Updated 2026-09-09

snappy-update skill

40 of 47 checks pass
What it can do
commits repo? days?read
notify channel-id textsend
What does not pass yet
reached bysnappy-slack
Architecture 2 endpoints
🔑 Bearer token auth
api.telegram.org2 endpoints
POST/bot${BOT_TOKEN}/sendMessage
GET/bot${TELEGRAM_BOT_TOKEN}/sendMessage
- Pull the week's git history- Summarize into categories- Draft using the standup template- Route via preferred channel- Confirm + log- Gather milestone details- Draft using milestone template- Send to client + post in client Slack channel- Update project status- Get fix details- Draft bug fix update- Send immediately- Review the pipeline- Draft sprint plan- Send via preferred channel- Look up client preference- Send via the right channel- Multi-channel by default for weekly updates
$ npx snappy-skills install snappy-update
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── TEMPLATES.md ├── api.ts ├── doors.test.ts ├── evidence.test.ts ├── read-limit.test.ts ├── refusals.test.ts └── scripts/ └── dev-update.sh
Documents
AGENTS.md

snappy-update#

Formats and delivers structured project updates to consulting clients. Pulls raw git

history from client repos, condenses into client-readable language per snappy-content

voice rules, and routes via each client's preferred channel. Five workflow types: weekly

standup (Friday), sprint planning (Monday), milestone shipped, bug fix notification,

and smart channel routing.

Key capabilities#

  • Weekly standup -- git log --since="last monday", group into Features/Fixes/

Improvements/Infra, format per template, dual-send Slack + Email.

  • Sprint planning -- review open branches + recent momentum, draft priorities.
  • Milestone shipped -- commits since last tag, include demo link / staging URL.
  • Bug fix notification -- git show --stat HEAD, severity + impact, send ASAP.
  • Smart channel routing -- read preferred_channel from snappy-clients, route via

matching channel skill. Fallback: slack > email > whatsapp > telegram > imessage.

  • Touchpoint logging -- POST to /contacts/CONTACT_ID/touchpoints + PATCH last_contact

after every send.

Rules#

  • Always show draft to Robert before sending. No auto-sends.
  • Always cd into the client repo first. Verify with git remote -v.
  • Tailor per project -- different repo, different audience, different tone.
  • Specific outcomes ("shipped auth flow with 200ms p95 improvement"), never vague.
  • Weekly standups go Slack + Email regardless of preference.
  • Bug fixes: ASAP, do not wait for weekly standup. Critical = dual-channel.
  • Pull TELEGRAM_BOT_TOKEN via env("TELEGRAM_BOT_TOKEN") from snappy-settings/.env.cache after sourcing load-env.sh. Never embed tokens in scripts.

API endpoints#

Channel Endpoint
Slack POST $XANO/api:hZB4Dj0c/slack/bot-message
Email POST $XANO/api:PB9UH7b9/emails/send (always dry_run: true first)
WhatsApp POST $XANO/api:hZB4Dj0c/whatsapp-send-message
Telegram POST https://api.telegram.org/bot${BOT_TOKEN}/sendMessage

Directory contents#

File Purpose
SKILL.md Full workflow reference + channel routing
TEMPLATES.md Standup, milestone, bug fix, sprint plan templates
scripts/dev-update.sh CLI script: pulls git history, categorizes commits, outputs formatted markdown update

CLI script -- dev-update.sh#

bash# Basic usage -- pull commits since yesterday
~/.claude/skills/snappy-update/scripts/dev-update.sh --project /path/to/repo

# Custom date range + client name in header
~/.claude/skills/snappy-update/scripts/dev-update.sh --project /path/to/repo --since "last monday" --client "Orbiter"

# Args:
#   --project  Path to git repo or ~/repo-name (required)
#   --since    Date for git log --since (default: yesterday)
#   --client   Client name for the update header (default: repo dirname)

Output is markdown to stdout matching the Weekly Standup template (What changed / What's next / Blockers). Commits are auto-categorized into Features / Fixes / Improvements / Infra / Other based on commit message prefixes.

Feeds / fed by#

  • Fed by: snappy-clients (roster + channels), snappy-knowledge (contact context),

snappy-content (voice rules), per-client skills (repo paths, sprint context), git repos

  • Feeds: snappy-clients (touchpoint logs), snappy-knowledge (touchpoint records),

snappy-testimonials (positive reply mining), snappy-docs (Notion tracker updates)

API module#

typescriptimport { getRecentCommits, slackPost, telegramPost } from "../snappy-update/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-update/api.ts commits owner/repo 7
npx tsx ~/.claude/skills/snappy-update/api.ts commits owner/repo 7 --json  # { repo, days, commits, evidence } -- the vendor text declared as data
npx tsx ~/.claude/skills/snappy-update/api.ts notify <channel_id> "text"

API functions#

Function Purpose
getRecentCommits(repo, days?, limit?) Fetch recent commits from a GitHub repo via API. Returns the bare array -- unchanged
commitsAnswer(repo, days, commits) The --json machine answer: the same rows plus the evidence envelope
commitsSince(days, now?) The ONE road that builds GitHub's since param, so request and envelope cannot drift
slackPost(channelId, text) Post update to Slack channel (re-export from snappy-slack)
telegramPost(text) Send update via Telegram (re-export from snappy-telegram)

If this loader doesn't cover your case:

bashecho "[$(date -u +%FT%TZ)] snappy-update: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-update Index]|root: ~/.claude/skills/snappy-update|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,TEMPLATES.md}

<!-- SKILL-INDEX-END -->

Used by#

  • snappy-slack

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
commits repo?, days? read npx tsx ~/.claude/skills/snappy-update/api.ts commits
notify channel-id, text send npx tsx ~/.claude/skills/snappy-update/api.ts notify <channel-id> "<text>"

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-update
role: Dev updates to consulting clients. Weekly standups, sprint plans, milestone shipped, bug fix, and deployment notices.
loaded-by: PreToolUse hook (auto-injected when "snappy-update" is mentioned)
---

# snappy-update

Formats and delivers structured project updates to consulting clients. Pulls raw git
history from client repos, condenses into client-readable language per `snappy-content`
voice rules, and routes via each client's preferred channel. Five workflow types: weekly
standup (Friday), sprint planning (Monday), milestone shipped, bug fix notification,
and smart channel routing.

## Key capabilities

- **Weekly standup** -- `git log --since="last monday"`, group into Features/Fixes/
  Improvements/Infra, format per template, dual-send Slack + Email.
- **Sprint planning** -- review open branches + recent momentum, draft priorities.
- **Milestone shipped** -- commits since last tag, include demo link / staging URL.
- **Bug fix notification** -- `git show --stat HEAD`, severity + impact, send ASAP.
- **Smart channel routing** -- read `preferred_channel` from `snappy-clients`, route via
  matching channel skill. Fallback: slack > email > whatsapp > telegram > imessage.
- **Touchpoint logging** -- POST to `/contacts/CONTACT_ID/touchpoints` + PATCH `last_contact`
  after every send.

## Rules

- Always show draft to Robert before sending. No auto-sends.
- Always `cd` into the client repo first. Verify with `git remote -v`.
- Tailor per project -- different repo, different audience, different tone.
- Specific outcomes ("shipped auth flow with 200ms p95 improvement"), never vague.
- Weekly standups go Slack + Email regardless of preference.
- Bug fixes: ASAP, do not wait for weekly standup. Critical = dual-channel.
- Pull `TELEGRAM_BOT_TOKEN` via `env("TELEGRAM_BOT_TOKEN")` from `snappy-settings/.env.cache` after sourcing `load-env.sh`. Never embed tokens in scripts.

## API endpoints

| Channel | Endpoint |
|---|---|
| Slack | `POST $XANO/api:hZB4Dj0c/slack/bot-message` |
| Email | `POST $XANO/api:PB9UH7b9/emails/send` (always `dry_run: true` first) |
| WhatsApp | `POST $XANO/api:hZB4Dj0c/whatsapp-send-message` |
| Telegram | `POST https://api.telegram.org/bot${BOT_TOKEN}/sendMessage` |

## Directory contents

| File | Purpose |
|---|---|
| `SKILL.md` | Full workflow reference + channel routing |
| `TEMPLATES.md` | Standup, milestone, bug fix, sprint plan templates |
| `scripts/dev-update.sh` | CLI script: pulls git history, categorizes commits, outputs formatted markdown update |

## CLI script -- dev-update.sh

```bash
# Basic usage -- pull commits since yesterday
~/.claude/skills/snappy-update/scripts/dev-update.sh --project /path/to/repo

# Custom date range + client name in header
~/.claude/skills/snappy-update/scripts/dev-update.sh --project /path/to/repo --since "last monday" --client "Orbiter"

# Args:
#   --project  Path to git repo or ~/repo-name (required)
#   --since    Date for git log --since (default: yesterday)
#   --client   Client name for the update header (default: repo dirname)
```

Output is markdown to stdout matching the Weekly Standup template (What changed / What's next / Blockers). Commits are auto-categorized into Features / Fixes / Improvements / Infra / Other based on commit message prefixes.

## Feeds / fed by

- **Fed by**: `snappy-clients` (roster + channels), `snappy-knowledge` (contact context),
  `snappy-content` (voice rules), per-client skills (repo paths, sprint context), git repos
- **Feeds**: `snappy-clients` (touchpoint logs), `snappy-knowledge` (touchpoint records),
  `snappy-testimonials` (positive reply mining), `snappy-docs` (Notion tracker updates)

## API module

```typescript
import { getRecentCommits, slackPost, telegramPost } from "../snappy-update/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-update/api.ts commits owner/repo 7
npx tsx ~/.claude/skills/snappy-update/api.ts commits owner/repo 7 --json  # { repo, days, commits, evidence } -- the vendor text declared as data
npx tsx ~/.claude/skills/snappy-update/api.ts notify <channel_id> "text"
```

## API functions

| Function | Purpose |
|----------|---------|
| `getRecentCommits(repo, days?, limit?)` | Fetch recent commits from a GitHub repo via API. Returns the bare array -- unchanged |
| `commitsAnswer(repo, days, commits)` | The `--json` machine answer: the same rows plus the `evidence` envelope |
| `commitsSince(days, now?)` | The ONE road that builds GitHub's `since` param, so request and envelope cannot drift |
| `slackPost(channelId, text)` | Post update to Slack channel (re-export from snappy-slack) |
| `telegramPost(text)` | Send update via Telegram (re-export from snappy-telegram) |

---

If this loader doesn't cover your case:
```bash
echo "[$(date -u +%FT%TZ)] snappy-update: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log
```


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-update Index]|root: ~/.claude/skills/snappy-update|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,TEMPLATES.md}
<!-- SKILL-INDEX-END -->

## Used by

- `snappy-slack`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `commits` | `repo?`, `days?` | `read` | `npx tsx ~/.claude/skills/snappy-update/api.ts commits` |
| `notify` | `channel-id`, `text` | `send` | `npx tsx ~/.claude/skills/snappy-update/api.ts notify <channel-id> "<text>"` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?