Skip to content

Commit ea0c845

Browse files
committed
feat: add links to releases and PRs
1 parent ca596c5 commit ea0c845

File tree

7 files changed

+63
-8
lines changed

7 files changed

+63
-8
lines changed

netlify/functions/process-new-releases.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export default async function handler() {
2929
analysis.summary,
3030
analysis.score,
3131
analysis.relevance,
32+
latestRelease.url,
33+
analysis.relevantPRs,
3234
);
3335

3436
if (analysis.score > 60) {

src/lib/db.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,39 @@ interface Release {
1111
score: number;
1212
relevance: string;
1313
analyzed_at: string;
14+
releaseLink: string;
15+
relevantPRs: string[];
1416
}
1517

1618
export async function getAnalyzedReleases(): Promise<Release[]> {
1719
const result = await client.execute(
1820
"SELECT * FROM releases ORDER BY analyzed_at DESC",
1921
);
2022
// TODO(serhalp) Verify the right turso typing pattern
21-
return result.rows as unknown[] as Release[];
23+
return result.rows.map(row => ({
24+
...row,
25+
relevantPRs: JSON.parse(row.relevantPRs as string)
26+
})) as unknown[] as Release[];
2227
}
2328

2429
export async function insertAnalyzedRelease(
2530
version: string,
2631
summary: string,
2732
score: number,
2833
relevance: string,
34+
releaseLink: string,
35+
relevantPRs: string[],
2936
): Promise<void> {
3037
await client.execute({
31-
sql: "INSERT INTO releases (version, summary, score, relevance, analyzed_at) VALUES (?, ?, ?, ?, ?)",
32-
args: [version, summary, score, relevance, new Date().toISOString()],
38+
sql: "INSERT INTO releases (version, summary, score, relevance, releaseLink, relevantPRs, analyzed_at) VALUES (?, ?, ?, ?, ?, ?, ?)",
39+
args: [
40+
version,
41+
summary,
42+
score,
43+
relevance,
44+
releaseLink,
45+
JSON.stringify(relevantPRs),
46+
new Date().toISOString()
47+
],
3348
});
3449
}

src/lib/github.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
interface GitHubRelease {
22
tag_name: string;
33
body: string;
4+
html_url: string;
45
}
56

67
export async function getLatestNextjsReleases(
78
count: number,
8-
): Promise<Array<{ version: string; body: string }>> {
9+
): Promise<Array<{ version: string; body: string; url: string }>> {
910
const response = await fetch(
1011
`https://api.github.com/repos/vercel/next.js/releases?per_page=${count}`,
1112
);
@@ -16,5 +17,6 @@ export async function getLatestNextjsReleases(
1617
return data.map((release) => ({
1718
version: release.tag_name,
1819
body: release.body,
20+
url: release.html_url,
1921
}));
2022
}

src/lib/openai.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ interface AnalysisResult {
66
summary: string;
77
score: number;
88
relevance: string;
9+
releaseLink: string;
10+
relevantPRs: string[];
911
}
1012

1113
export async function analyzeReleaseNotes(
@@ -25,7 +27,9 @@ export async function analyzeReleaseNotes(
2527
{
2628
"summary": "Concise summary of key changes",
2729
"score": 0-100,
28-
"relevance": "Explanation of what contributed to the score, focusing on aspects relevant to Netlify"
30+
"relevance": "Explanation of what contributed to the score, focusing on aspects relevant to Netlify. Keep it brief but technical, and only focus on what *does* make it relevant; ignore what does not.",
31+
"releaseLink": "Link to the GitHub release page",
32+
"relevantPRs": ["Array of links to relevant PRs"]
2933
}
3034
3135
The score should reflect how likely it is that this release contains changes that matter to Netlify's engineering team.

src/lib/slack.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export async function sendSlackNotification(
1515
type: "section",
1616
text: {
1717
type: "mrkdwn",
18-
text: `*New high-impact Next.js release detected!*\n\nVersion: ${version}\nImpact Score: ${score}\n\nSummary:\n${summary}`,
18+
text: `*New high-impact Next.js release detected!*\n\nVersion: ${version}\nImpact Score: ${score}\n\nSummary:\n${summary}\n\n<https://nextjs-sentinel.netlify.app/|View details on Next.js Sentinel>`,
1919
},
2020
},
2121
],

src/pages/index.astro

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,16 @@ const releases = await getAnalyzedReleases();
2020
}`}
2121
>
2222
<div class="card-body">
23-
<h2 class="card-title text-2xl">{release.version}</h2>
23+
<h2 class="card-title text-2xl">
24+
<a
25+
href={release.releaseLink}
26+
target="_blank"
27+
rel="noopener noreferrer"
28+
class="hover:underline cursor-pointer"
29+
>
30+
{release.version}
31+
</a>
32+
</h2>
2433
<div class="flex justify-between items-center">
2534
<div
2635
class="badge badge-lg"
@@ -39,6 +48,25 @@ const releases = await getAnalyzedReleases();
3948
</h3>
4049
<p class="text-base-content">{release.relevance}</p>
4150
</div>
51+
{release.relevantPRs.length > 0 && (
52+
<div class="mt-4">
53+
<h3 class="font-semibold text-lg mb-2">Relevant PRs:</h3>
54+
<ul class="list-disc list-inside">
55+
{release.relevantPRs.map((pr) => (
56+
<li>
57+
<a
58+
href={pr}
59+
target="_blank"
60+
rel="noopener noreferrer"
61+
class="hover:underline"
62+
>
63+
{pr.split("/").pop()}
64+
</a>
65+
</li>
66+
))}
67+
</ul>
68+
</div>
69+
)}
4270
</div>
4371
</div>
4472
))

src/scripts/migrate.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ async function migrate() {
2020
summary TEXT NOT NULL,
2121
score INTEGER NOT NULL,
2222
relevance TEXT NOT NULL,
23+
releaseLink TEXT NOT NULL,
24+
relevantPRs TEXT NOT NULL,
2325
analyzed_at TEXT NOT NULL
2426
)
2527
`);
@@ -33,12 +35,14 @@ async function migrate() {
3335
for (const release of releases) {
3436
const analysis = await analyzeReleaseNotes(release.version, release.body);
3537
await client.execute({
36-
sql: "INSERT INTO releases (version, summary, score, relevance, analyzed_at) VALUES (?, ?, ?, ?, ?)",
38+
sql: "INSERT INTO releases (version, summary, score, relevance, releaseLink, relevantPRs, analyzed_at) VALUES (?, ?, ?, ?, ?, ?, ?)",
3739
args: [
3840
release.version,
3941
analysis.summary,
4042
analysis.score,
4143
analysis.relevance,
44+
release.url,
45+
JSON.stringify(analysis.relevantPRs ?? []),
4246
new Date().toISOString(),
4347
],
4448
});

0 commit comments

Comments
 (0)