Files
Anthropic-Cybersecurity-Skills/.github/workflows/star.yml
T
2026-04-15 22:43:16 +02:00

189 lines
7.1 KiB
YAML

# .github/workflows/star-milestones.yml
name: ⭐ Star Milestone Tracker
on:
schedule:
- cron: '0 * * * *'
workflow_dispatch:
inputs:
force_check:
description: 'Force milestone check regardless of current state'
required: false
default: 'false'
permissions:
actions: write
concurrency:
group: star-milestone-check
cancel-in-progress: false
env:
REPO: mukul975/Anthropic-Cybersecurity-Skills
MILESTONE_INTERVAL: 500
VAR_NAME: LAST_STAR_MILESTONE
jobs:
check-stars:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Fetch star count
id: stars
run: |
RESPONSE=$(curl -s -o /tmp/repo.json -w "%{http_code}" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/$REPO")
if [ "$RESPONSE" != "200" ]; then
echo "❌ GitHub API error: $RESPONSE"
exit 1
fi
STARS=$(jq .stargazers_count /tmp/repo.json)
FORKS=$(jq .forks_count /tmp/repo.json)
echo "stars=$STARS" >> $GITHUB_OUTPUT
echo "forks=$FORKS" >> $GITHUB_OUTPUT
echo "✅ Stars: $STARS | Forks: $FORKS"
- name: Fetch last milestone
id: last
run: |
RESPONSE=$(curl -s -o /tmp/var.json -w "%{http_code}" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/$REPO/actions/variables/$VAR_NAME")
echo "status=$RESPONSE" >> $GITHUB_OUTPUT
if [ "$RESPONSE" = "200" ]; then
LAST=$(jq -r '.value' /tmp/var.json)
else
LAST="INIT"
fi
echo "value=$LAST" >> $GITHUB_OUTPUT
echo "📌 Last milestone: $LAST"
- name: Evaluate milestone
id: milestone
run: |
STARS=${{ steps.stars.outputs.stars }}
LAST="${{ steps.last.outputs.value }}"
CURRENT=$(( (STARS / MILESTONE_INTERVAL) * MILESTONE_INTERVAL ))
NEXT=$(( CURRENT + MILESTONE_INTERVAL ))
REMAINING=$(( NEXT - STARS ))
PROGRESS=$(( (STARS % MILESTONE_INTERVAL) * 100 / MILESTONE_INTERVAL ))
echo "current=$CURRENT" >> $GITHUB_OUTPUT
echo "next=$NEXT" >> $GITHUB_OUTPUT
echo "remaining=$REMAINING" >> $GITHUB_OUTPUT
echo "progress=$PROGRESS" >> $GITHUB_OUTPUT
if [ "$LAST" = "INIT" ]; then
echo "notify=false" >> $GITHUB_OUTPUT
echo "init=true" >> $GITHUB_OUTPUT
echo "🚀 First run — initializing baseline at $CURRENT, no notification sent"
elif [ "$CURRENT" -gt "$LAST" ] && [ "$CURRENT" -gt 0 ]; then
echo "notify=true" >> $GITHUB_OUTPUT
echo "init=false" >> $GITHUB_OUTPUT
echo "🎉 NEW MILESTONE: $CURRENT (was $LAST)"
else
echo "notify=false" >> $GITHUB_OUTPUT
echo "init=false" >> $GITHUB_OUTPUT
echo "💤 No new milestone. Next: $NEXT in $REMAINING stars ($PROGRESS% there)"
fi
- name: Send Slack notification
if: steps.milestone.outputs.notify == 'true'
run: |
STARS=${{ steps.stars.outputs.stars }}
FORKS=${{ steps.stars.outputs.forks }}
MILESTONE=${{ steps.milestone.outputs.current }}
NEXT=${{ steps.milestone.outputs.next }}
REMAINING=${{ steps.milestone.outputs.remaining }}
PROGRESS=${{ steps.milestone.outputs.progress }}
if [ "$MILESTONE" -ge 10000 ]; then BADGE="🏆"
elif [ "$MILESTONE" -ge 5000 ]; then BADGE="🔥"
elif [ "$MILESTONE" -ge 2500 ]; then BADGE="🚀"
elif [ "$MILESTONE" -ge 1000 ]; then BADGE="💫"
else BADGE="⭐"
fi
curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \
-H 'Content-type: application/json' \
-d "{
\"text\": \"$BADGE *$MILESTONE Star Milestone Reached!*\",
\"attachments\": [{
\"color\": \"#FFD700\",
\"blocks\": [
{
\"type\": \"section\",
\"fields\": [
{\"type\": \"mrkdwn\", \"text\": \"*🎯 Milestone*\n$MILESTONE stars\"},
{\"type\": \"mrkdwn\", \"text\": \"*⭐ Total Stars*\n$STARS\"},
{\"type\": \"mrkdwn\", \"text\": \"*🍴 Forks*\n$FORKS\"},
{\"type\": \"mrkdwn\", \"text\": \"*🔜 Next Milestone*\n$NEXT ($REMAINING to go — $PROGRESS% there)\"}
]
},
{
\"type\": \"actions\",
\"elements\": [{
\"type\": \"button\",
\"text\": {\"type\": \"plain_text\", \"text\": \"View Repo ↗\"},
\"url\": \"https://github.com/$REPO\",
\"style\": \"primary\"
}]
}
]
}]
}"
echo "✅ Slack notified"
- name: Save milestone
if: steps.milestone.outputs.notify == 'true' || steps.milestone.outputs.init == 'true'
run: |
MILESTONE=${{ steps.milestone.outputs.current }}
STATUS=${{ steps.last.outputs.status }}
if [ "$STATUS" = "200" ]; then
METHOD="PATCH"
URL="https://api.github.com/repos/$REPO/actions/variables/$VAR_NAME"
else
METHOD="POST"
URL="https://api.github.com/repos/$REPO/actions/variables"
fi
HTTP=$(curl -s -o /dev/null -w "%{http_code}" \
-X "$METHOD" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
-H "Content-type: application/json" \
"$URL" \
-d "{\"name\":\"$VAR_NAME\",\"value\":\"$MILESTONE\"}")
if [ "$HTTP" = "200" ] || [ "$HTTP" = "201" ] || [ "$HTTP" = "204" ]; then
echo "✅ Saved $VAR_NAME = $MILESTONE"
else
echo "❌ Failed to save variable (HTTP $HTTP)"
exit 1
fi
- name: Summary
run: |
echo "## ⭐ Star Tracker Run" >> $GITHUB_STEP_SUMMARY
echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY
echo "|---|---|" >> $GITHUB_STEP_SUMMARY
echo "| Current Stars | ${{ steps.stars.outputs.stars }} |" >> $GITHUB_STEP_SUMMARY
echo "| Current Forks | ${{ steps.stars.outputs.forks }} |" >> $GITHUB_STEP_SUMMARY
echo "| Last Milestone | ${{ steps.last.outputs.value }} |" >> $GITHUB_STEP_SUMMARY
echo "| Next Milestone | ${{ steps.milestone.outputs.next }} |" >> $GITHUB_STEP_SUMMARY
echo "| Stars to Next | ${{ steps.milestone.outputs.remaining }} |" >> $GITHUB_STEP_SUMMARY
echo "| Progress | ${{ steps.milestone.outputs.progress }}% |" >> $GITHUB_STEP_SUMMARY
echo "| Notified | ${{ steps.milestone.outputs.notify }} |" >> $GITHUB_STEP_SUMMARY