Mirror of
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: models permissions gh action + add quotas script

+74 -6
+2 -1
.github/workflows/generate-post.yml
··· 9 9 10 10 permissions: 11 11 contents: write 12 + models: read 12 13 13 14 jobs: 14 15 generate-post: ··· 32 33 33 34 - name: Generate post 34 35 env: 35 - MODELS_TOKEN: ${{ secrets.MODELS_TOKEN }} 36 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 37 run: pnpm run generate 37 38 38 39 - name: Commit and push new post
+2 -1
package.json
··· 12 12 "generate": "tsx scripts/generate-digest.ts", 13 13 "local:generate": "tsx --env-file=.env scripts/generate-digest.ts", 14 14 "backfill": "tsx scripts/backfill.ts", 15 - "local:backfill": "tsx --env-file=.env scripts/backfill.ts" 15 + "local:backfill": "tsx --env-file=.env scripts/backfill.ts", 16 + "local:quota": "tsx --env-file=.env scripts/quota.ts" 16 17 }, 17 18 "dependencies": { 18 19 "@astrojs/check": "^0.9.6",
+1 -1
scripts/backfill.ts
··· 58 58 ): Promise<Event[]> { 59 59 const owner = "npmx-dev"; 60 60 const repo = "npmx.dev"; 61 - const token = getRequiredEnv("MODELS_TOKEN"); 61 + const token = getRequiredEnv("GITHUB_TOKEN"); 62 62 const events: Event[] = []; 63 63 64 64 const startIso = start.toISOString().split(".")[0] + "Z";
+66
scripts/quota.ts
··· 1 + interface RateLimitInfo { 2 + limit: number; 3 + remaining: number; 4 + reset: number; 5 + used: number; 6 + } 7 + 8 + function getRequiredEnv(key: string): string { 9 + const value = process.env[key]; 10 + if (!value) throw new Error(`Environment variable ${key} is missing.`); 11 + return value; 12 + } 13 + 14 + async function checkQuota() { 15 + const token = getRequiredEnv("GITHUB_TOKEN"); 16 + 17 + if (!token) { 18 + console.log( 19 + "\x1b[31mError: GITHUB_TOKEN is not set in your environment\x1b[0m", 20 + ); 21 + return; 22 + } 23 + 24 + try { 25 + const response = await fetch("https://api.github.com/rate_limit", { 26 + headers: { 27 + Authorization: `Bearer ${token}`, 28 + "X-GitHub-Api-Version": "2022-11-28", 29 + Accept: "application/vnd.github+json", 30 + }, 31 + }); 32 + 33 + const data = await response.json(); 34 + const resources = data.resources; 35 + 36 + console.log("\x1b[1m\x1b[34m📊 GitHub API Resource Map\x1b[0m"); 37 + 38 + const targetResource = resources.models || resources.marketplace; 39 + 40 + if (targetResource) { 41 + const resetDate = new Date(targetResource.reset * 1000); 42 + const waitMins = Math.round((resetDate.getTime() - Date.now()) / 60000); 43 + 44 + console.log("\n\x1b[32m[MATCH FOUND]\x1b[0m"); 45 + console.log(`Resource: ${resources.models ? "Models" : "Marketplace"}`); 46 + console.log( 47 + `Remaining: ${targetResource.remaining} / ${targetResource.limit}`, 48 + ); 49 + console.log( 50 + `Resets: ${resetDate.toLocaleTimeString()} (${waitMins}m)`, 51 + ); 52 + } else { 53 + console.log( 54 + "\n\x1b[33m[DEBUG] Available resources found on this token:\x1b[0m", 55 + ); 56 + Object.keys(resources).forEach((key) => console.log(` - ${key}`)); 57 + console.log( 58 + "\n\x1b[31mAction Required:\x1b[0m Enable 'Models' or 'Copilot' scopes in your PAT settings.", 59 + ); 60 + } 61 + } catch (error) { 62 + console.error("\x1b[31mNetwork Failure:\x1b[0m", error); 63 + } 64 + } 65 + 66 + checkQuota();
+3 -3
src/lib/events.ts
··· 34 34 export async function fetchGitHubEvents(since: Date): Promise<Event[]> { 35 35 const owner = "npmx-dev"; 36 36 const repo = "npmx.dev"; 37 - const token = getRequiredEnv("MODELS_TOKEN"); 37 + const token = getRequiredEnv("GITHUB_TOKEN"); 38 38 const events: Event[] = []; 39 39 40 40 const startIso = since.toISOString().split(".")[0] + "Z"; ··· 131 131 } 132 132 133 133 export async function generateSmartDigest(events: Event[]): Promise<Topic[]> { 134 - const token = getRequiredEnv("MODELS_TOKEN"); 134 + const token = getRequiredEnv("GITHUB_TOKEN"); 135 135 if (!token || events.length === 0) return []; 136 136 137 137 LOG.ai( ··· 208 208 } 209 209 210 210 export async function generateCatchyTitle(topic: Topic): Promise<string> { 211 - const token = getRequiredEnv("MODELS_TOKEN"); 211 + const token = getRequiredEnv("GITHUB_TOKEN"); 212 212 if (!token) return "New Update"; 213 213 214 214 const prompt = `You are a tech journalist for npmx. Create a very short (max 5-7 words), catchy headline for this topic.