mit einem Klick
mit einem Klick
Allocate $10/day worth of $MIROSHARK to top tweeters about the project โ rewards organic engagement
Audit every enabled skill's upstream file dependencies for staleness โ flags chained skills about to consume yesterday's article or a long-dead topic file
Write an article about the project through a surprising lens โ connecting it to current events, trends, philosophy, or comparable projects
Weekly recognition post for one fork operator โ converts fork-cohort cohort data into a named human moment (POWER fork callout with their work, stars, and skills enabled)
Build a feature for the watched repo โ picks from yesterday's repo-actions ideas first
Promote important recent log entries into MEMORY.md
| name | repo-pulse |
| description | Daily report on new stars, forks, and traffic for watched repos |
| var | |
| tags | ["dev"] |
${var} โ Repo (owner/repo) to check. If empty, checks all watched repos.
This skill reads repos from memory/watched-repos.md but skips agent/monitoring repos (repos that contain "aeon-agent" or "miroshark-aeon" in their name). Only track the actual project repos โ not the agent repos that run the skills.
Read memory/MEMORY.md and the last 3 days of memory/logs/ for previous star/fork counts to calculate deltas. Read memory/watched-repos.md for the list of repos to track. Skip any repo whose name ends with "-aeon" or contains "aeon-agent" โ those are agent repos, not project repos.
Fetch repo stats for each watched repo:
gh api repos/owner/repo --jq '{stargazers_count, forks_count, watchers_count, open_issues_count, subscribers_count}'
Idempotency check: After fetching, scan memory/logs/${today}.md for any prior ## Repo Pulse section. If a prior section for this same repo already recorded identical stargazers_count AND identical forks_count, log REPO_PULSE_DUPLICATE โ same counts (stars=X, forks=Y) already reported earlier today and skip this repo (do NOT send a notification). This prevents duplicate notifications when repo-pulse is re-triggered (by heartbeat, manual dispatch, or workflow retry) within the same UTC day with no new activity. If counts differ from any prior run today, continue normally โ the delta from the true 24h cutoff is still the right thing to report.
Compute the 24h cutoff timestamp FIRST โ this is critical:
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)
Use this $CUTOFF for ALL time filtering below. Do NOT use "today's date" โ use exactly 24 hours ago from now.
Fetch the most recent stargazers โ efficiently, without downloading all pages:
# Calculate the last page (100 per page) to avoid fetching all stargazers
STARS=$(gh api repos/owner/repo --jq '.stargazers_count')
LAST_PAGE=$(( (STARS + 99) / 100 ))
# Fetch only the last 2 pages (covers up to 200 most recent stars)
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 '.[] | {user: .user.login, starred_at: .starred_at}'
gh api "repos/owner/repo/stargazers?per_page=100&page=$LAST_PAGE" -H "Accept: application/vnd.github.star+json" --jq '.[] | {user: .user.login, starred_at: .starred_at}'
Combine the results from both pages, deduplicate by user, and keep only entries where starred_at >= $CUTOFF (24 hours ago). NOT "since midnight today" โ since exactly 24 hours ago.
Why not --paginate? The stargazers API returns oldest-first. Using --paginate fetches ALL pages (O(N) API calls as stars grow). Fetching only the last 2 pages is O(1) and covers up to 200 recent stars โ more than enough for 24h changes.
Fetch recent forks (sorted by newest):
gh api "repos/owner/repo/forks?sort=newest&per_page=10" --jq '.[] | {owner: .owner.login, created_at: .created_at, full_name: .full_name}'
Keep only forks where created_at >= $CUTOFF.
Determine if there's activity to report. Check BOTH:
starred_at >= the 24h cutoffcreated_at >= the 24h cutoffSend a notification if ANY of these are true:
Only log "REPO_PULSE_QUIET" and skip notification if ZERO new stargazers AND ZERO new forks since the 24h cutoff.
Send notification via ./notify:
*Repo Pulse โ ${today}*
[owner/repo]
Stars: X total (+N new)
Forks: Y total (+N new)
New stargazers:
github.com/user1 | github.com/user2 | github.com/user3
New forks:
github.com/user1/repo | github.com/user2/repo
Format rules:
| (not one per line)Write the article to articles/repo-pulse-${today}.md โ this is the canonical structured artifact that downstream consumers (operator-scorecard, thread-formatter, star-momentum-alert, show-hn-draft, skill-freshness) read. Always write the file when at least one repo was fetched in this run, even when there are zero new stars and zero new forks โ consumers need the counts row to verify "no activity" vs "no run". Overwrite on same-day reruns so the file always reflects the latest counts.
Format (one ## block per non-skipped repo, in the order they were processed):
# Repo Pulse โ ${today}
## aaronjmars/repo
- **stargazers_count:** X
- **forks_count:** Y
- **New stars (24h):** N
- **New forks (24h):** M
- **Notification sent:** yes/no
**New stargazers:**
- github.com/user1
- github.com/user2
**New forks:**
- github.com/user1/repo
Format rules:
stargazers_count and forks_count MUST use the exact **stargazers_count:** N / **forks_count:** N markup (matches operator-scorecard step 3a parser).New stars (24h) and New forks (24h) MUST use the exact **New stars (24h):** N / **New forks (24h):** N markup (same parser).**New stargazers:** block entirely if N == 0. Same for forks.## block per repo in fetch order; do not interleave fields across repos.REPO_PULSE_DUPLICATE) appear in the article as a single-line - **Status:** REPO_PULSE_DUPLICATE row under the repo header โ keep the counts on the same row as a courtesy for the parser, but omit the New stargazers / New forks lists (the earlier same-day run already covered them).REPO_PULSE_DUPLICATE rows.Log to memory/logs/${today}.md โ ALWAYS include the exact current counts so the next run can calculate deltas:
## Repo Pulse
- **aaronjmars/repo**: stargazers_count=X, forks_count=Y
- **New stars (24h):** N
- **New forks (24h):** N
- **Article:** articles/repo-pulse-${today}.md
- **Notification sent:** yes/no
If step 1's idempotency check skipped the repo, still log a short entry so the skip is visible in the record:
## Repo Pulse
- **aaronjmars/repo**: stargazers_count=X, forks_count=Y
- **Status:** REPO_PULSE_DUPLICATE (same counts as earlier run today โ skipped notification)