live1,247 agents deployed
← All skillsSign up to install

Repo Pulse

General↓ 0 installsUpdated 80d ago
Curatedaaronjmars

Report on new stars, forks, and releases for watched repos - with profile enrichment (name, location, company, bio, follower count) for every new stargazer and forker, plus a one-line growth verdict.

SKILL.md preview

---
type: Skill
name: Repo Pulse
category: dev
description: Report on new stars, forks, and releases for watched repos - with profile enrichment (name, location, company, bio, follower count) for every new stargazer and forker, plus a one-line growth verdict.
var: ""
tags: [dev, meta, github]
commits: false
permissions: []
---
<!-- autoresearch: variation B — sharper output: /events primary input + notable-stargazer enrichment + QUIET/STEADY/ACTIVE/SURGE verdict -->
> **${var}** — Repo (`owner/repo`) to check. If empty, checks all watched repos.

## Config

Reads repos from `memory/watched-repos.md`. Skip any repo whose name ends with `-aeon` or contains `aeon-agent` — those are agent repos, not project repos.

If `${var}` is set and matches `owner/repo`, check only that repo.

## Context

Read `memory/MEMORY.md` and the last **7 days** of `memory/logs/` for previous `stargazers_count` / `forks_count` per repo. Parse lines matching `**owner/repo**: stargazers_count=N, forks_count=M` to reconstruct a per-day series — you'll need it for the rolling-average baseline used in step 5.

## Steps

### 1. Compute the 24h cutoff FIRST

```bash
CUTOFF=$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)
export CUTOFF
```
All time filtering uses exactly this timestamp — never "today's date" or "since midnight".

### 2. Fetch current counts (1 call per repo)

```bash
gh api repos/owner/repo --jq '{stargazers_count, forks_count, subscribers_count}'
```
If this call returns non-2xx (404, 403, rate limit), record `source=fail` with the reason and continue to the next repo. Do **not** abort the batch.

### 3. Fetch recent events — primary input

One call per repo covers stargazers, forks, **and releases** for the last ~90 days, newest-first:

```bash
gh api "repos/owner/repo/events?per_page=100" \
  --jq '[.[] | select(.created_at >= env.CUTOFF) | {type, actor: .actor.login, created_at, tag: (.payload.release.tag_name // null), action: (.payload.action // null)}]'
```

Parse the filtered events:
- `WatchEvent` → new stargazer (`actor`). Deduplicate by actor (GitHub only fires one per user).
- `ForkEvent` → new fork. Fork URL = `github.com/{actor}/{repo}`.
- `ReleaseEvent` with `action == "published"` → new release (`tag`).

Record `source=events` for this repo.

**Why `/events` over paginated stargazers?** One call instead of two, and it captures forks + releases in the same response. Events API returns 300 events over 10 pages for up to 90 days — more than enough for a 24h window on typical repos.

### 4. Fallback (rate limit or error)

If step 3 returns non-2xx, fall back to the stargazers two-last-pages technique (events emptiness is NOT a fallback trigger — empty genuinely means no activity):

```bash
STARS=$(gh api repos/owner/repo --jq '.stargazers_count')
LAST_PAGE=$(( (STARS + 99) / 100 ))
PREV_PAGE=$(( LAST_PAGE > 1 ? LAST_PAGE - 1 : 1 ))
gh api "repos/owner/repo/stargazers?per_page=100&page=$PREV_PAGE" \
  -H "Accept: application/vnd.github.star+json" \
  --jq '.[] | select(.starred_at >= env.CUTOFF) | {user: .user.login, starred_at}'
gh api "repos/owner/repo/stargazers?per_page=100&page=$LAST_PAGE" \
  -H "Accept: application/vnd.github.star+json" \
  --jq '.[] | select(.starred_at >= env.CUTOFF) | {user: .user.login, starred_at}'
```
Deduplicate by user. Forks in the fallback path come from:
```bash
gh api "repos/owner/repo/forks?sort=newest&per_page=10" \
  --jq '.[] | select(.created_at >= env.CUTOFF) | {owner: .owner.login, full_name, created_at}'
```
Record `source=stargazers-fallback` for this repo. Releases are skipped in fallback (not critical).

### 5. Profile new stargazers and forkers, then compute the verdict

**Profile lookup** — build a who's-behind-the-activity picture for every new actor in the 24h window. Look up each new **stargazer** AND each new **fork author** (cap **10** of each per repo, newest-first, so the freshest actors are always enriched even when a repo gets

…