Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
187 commits
Select commit Hold shift + click to select a range
c99a062
test(ApiWrappedRoute-mouse-interactivity): verify interactive tooltip…
swarupio Jun 7, 2026
ad8e01b
Merge branch 'main' into test/api-wrapped-route-mouse-interactivity-4681
swarupio Jun 7, 2026
a6a6a1f
Merge branch 'main' into test/commitclock-mouse-interactivity-v2
Aamod-Dev Jun 7, 2026
aed2e8e
test(FeatureCard): align interactivity coverage with component behavior
star07770 Jun 7, 2026
1128ddd
test(useShareActions-accessibility): verify Accessibility Standards &…
adityapandey4621 Jun 7, 2026
a96ce89
Merge branch 'main' into test/useShareActions-accessibility
adityapandey4621 Jun 7, 2026
ffa45cd
Merge branch 'main' into test/commitclock-mouse-interactivity-v2
Snnehamaurya Jun 7, 2026
a2f63f9
Merge branch 'main' into test/api-wrapped-route-mouse-interactivity-4681
swarupio Jun 8, 2026
594d533
test(contributors): cover empty search fallback
eshaanag Jun 6, 2026
f687ab9
fix(contributors): handle missing search input
eshaanag Jun 7, 2026
2ca140b
fix(contributors): load every GitHub contributor page
eshaanag Jun 7, 2026
cf7274c
Merge remote-tracking branch 'upstream/main' into fix/contributors-pa…
eshaanag Jun 8, 2026
a933095
Merge remote-tracking branch 'upstream/main' into test/contributors-s…
eshaanag Jun 8, 2026
c3f8430
test: add PRTrendChart accessibility coverage
riddhimagupta2 Jun 8, 2026
a05f38c
Merge branch 'main' into test/prtrendchart-accessibility
riddhimagupta2 Jun 8, 2026
05614f3
Merge remote-tracking branch 'origin/main' into temp-4926
github-actions[bot] Jun 8, 2026
1dc4354
Merge remote-tracking branch 'origin/main' into temp-4844
github-actions[bot] Jun 8, 2026
0416229
Merge remote-tracking branch 'origin/main' into temp-4786
github-actions[bot] Jun 8, 2026
981b29a
Merge remote-tracking branch 'origin/main' into temp-4543
github-actions[bot] Jun 8, 2026
470c407
test: add theme contrast tests for TopMetricsRow
gamana618 Jun 11, 2026
ed13894
Merge branch 'main' into topmetricsrow-theme-contrast-test
gamana618 Jun 11, 2026
ba8a1c3
Merge branch 'main' into topmetricsrow-theme-contrast-test
gamana618 Jun 11, 2026
d676e5b
fix: improve keyboard accessibility for resume upload dropzone
krishpatel2-prog Jun 11, 2026
a6527ca
test(stats): add validation and cache behavior coverage
pari-28 Jun 12, 2026
a59e7c8
test(PRStatusDistribution-massive-scaling): verify Massive Data Sets …
aaniya22 Jun 12, 2026
b9ea4dd
test(PRInsightsClient-massive-scaling): verify Massive Data Sets and …
aaniya22 Jun 12, 2026
96d8d40
test(Highlights-massive-scaling): verify Massive Data Sets and Extrem…
aaniya22 Jun 12, 2026
da13aeb
test(Layout-massive-scaling): verify Massive Data Sets and Extreme Hi…
aaniya22 Jun 12, 2026
0f387ab
test(DashboardError-empty-fallback): verify edge cases & empty/missin…
diksha78dev Jun 12, 2026
d9e5dfa
test(ControlsPanel-massive-scaling): verify massive data sets and hig…
Nicks-19 Jun 12, 2026
3ecab88
test(ApiCompareRoute-empty-fallback): verify edge cases & empty inputs
diksha78dev Jun 12, 2026
f3265cc
test(not-found): add massive scaling test coverage
Thacker-Meet Jun 12, 2026
df9ba3b
Merge branch 'main' into test/ControlsPanel-massive-scaling
Aamod-Dev Jun 12, 2026
131ff72
test(useLocalStorage-massive-scaling): verify Massive Data Sets and E…
ShafinNigamana Jun 12, 2026
5d678e3
test(code-block): add massive scaling coverage
Thacker-Meet Jun 12, 2026
12556de
test(dashboard): add empty-fallback checks and tests for dashboard er…
diksha78dev Jun 12, 2026
f40eb69
test(EditorPanel-massive-scaling): verify massive data sets and high …
Nicks-19 Jun 12, 2026
d0a3bd2
test(stats): improve runtime coverage
pari-28 Jun 12, 2026
6ffe918
test: add massive scaling tests for heatmap utils
deepsikha-dash Jun 12, 2026
424dcd3
test: add massive scaling tests for TechnologyGraph
deepsikha-dash Jun 12, 2026
06b1669
Merge branch 'main' into test-4436-stats-route-validation
pari-28 Jun 12, 2026
c286e0a
test(ResumeUpload): verify edge cases and empty missing inputs fallba…
atharv96k Jun 12, 2026
7ae25b5
feat: add structured logger and replace server-side console usage
chavanGaneshDatta Jun 9, 2026
ca14461
feat: add structured logger and replace server-side console usage
chavanGaneshDatta Jun 9, 2026
d5ef4a3
style: format cache module
chavanGaneshDatta Jun 12, 2026
a8d579c
test(AnimatedCursor-massive-scaling): verify Massive Data Sets and Ex…
realtushartyagi Jun 12, 2026
93ba257
test(export3d-empty-fallback): verify Edge Cases and Empty Fallbacks
ShafinNigamana Jun 12, 2026
950264b
ci: Throttle failure notifications to prevent spamming maintainers
MasterJi27 Jun 12, 2026
c705b9e
Merge branch 'main' into bug-failure-notifier-5277
MasterJi27 Jun 12, 2026
9f583f5
test(section-label): add massive scaling coverage
imuniqueshiv Jun 12, 2026
0c7ab80
ci: Normalize stale assignment calculations to absolute hours
MasterJi27 Jun 12, 2026
f95ab96
Merge branch 'main' into test/AnimatedCursor-massive-scaling
JhaSourav07 Jun 12, 2026
50de559
Merge branch 'main' into bug-stale-assignments-5281
MasterJi27 Jun 12, 2026
c384529
Merge branch 'main' into bug-stale-assignments-5281
MasterJi27 Jun 12, 2026
6832584
Merge branch 'main' into bug-failure-notifier-5277
MasterJi27 Jun 12, 2026
5c92b47
ci: Integrate Stylelint to lint CSS files
MasterJi27 Jun 12, 2026
4f0e513
ci: Implement Next.js bundle size monitoring
MasterJi27 Jun 12, 2026
e99dda7
Merge branch 'main' into feat-stylelint-5278
MasterJi27 Jun 12, 2026
54df3b1
test(theme-quick-presets): add massive scaling coverage
imuniqueshiv Jun 12, 2026
41bbb3d
Merge branch 'main' into issue-4354-technologygraph-massive-scaling
JhaSourav07 Jun 12, 2026
996a017
fix(timezone): resolve fractional timezone boundary offset shifts
MasterJi27 Jun 12, 2026
d177a48
Merge branch 'main' into issue-4381-heatmaputils-massive-scaling
JhaSourav07 Jun 12, 2026
d59e9d6
Merge branch 'main' into test/resume-upload-empty-fallback-bounds
JhaSourav07 Jun 12, 2026
fb4d7ca
Merge branch 'main' into test-4436-stats-route-validation
JhaSourav07 Jun 12, 2026
d47756e
Merge branch 'main' into optimize-github-cache
JhaSourav07 Jun 12, 2026
54a2e76
Merge branch 'main' into topmetricsrow-theme-contrast-test
JhaSourav07 Jun 12, 2026
27dd0d3
Merge branch 'main' into feat/structured-logger
JhaSourav07 Jun 12, 2026
86b6849
test(urls-empty-fallback): verify Edge Cases & Empty/Missing Inputs V…
ARPANPATRA111 Jun 12, 2026
bc970d5
test(trustedProxy-empty-fallback): verify Edge Cases & Empty/Missing …
ARPANPATRA111 Jun 12, 2026
56d7a12
test(dashboardPeriod-empty-fallback): verify Edge Cases & Empty/Missi…
ARPANPATRA111 Jun 12, 2026
dc25dc3
test(student-empty-fallback): verify Edge Cases & Empty/Missing Input…
ARPANPATRA111 Jun 12, 2026
4c72df3
test(index-empty-fallback): verify Edge Cases & Empty/Missing Inputs …
ARPANPATRA111 Jun 12, 2026
f9daf78
Merge branch 'main' into test/prtrendchart-accessibility
JhaSourav07 Jun 12, 2026
f529da2
Merge branch 'main' into test/useShareActions-accessibility
JhaSourav07 Jun 12, 2026
d96d801
Merge branch 'main' into fix/contributors-pagination-4762-pr
JhaSourav07 Jun 13, 2026
921b6f7
Merge branch 'main' into test/api-wrapped-route-mouse-interactivity-4681
JhaSourav07 Jun 13, 2026
b1ac3f5
Merge branch 'main' into test/commitclock-mouse-interactivity-v2
JhaSourav07 Jun 13, 2026
cd154bc
Merge branch 'main' into test/featurecard-mouse-interactivity
JhaSourav07 Jun 13, 2026
35a41c1
Merge branch 'main' into test/contributors-search-empty-fallback
JhaSourav07 Jun 13, 2026
91401ac
test: add PNG route theme contrast tests
Jun 13, 2026
061149b
test: add masssive scaling test for footer
Jun 13, 2026
5365b5a
test: add massive scaling tests for FeatureCard
Jun 13, 2026
964071c
parser
kanishka-2007-tech Jun 13, 2026
5f82c8a
prinsights
kanishka-2007-tech Jun 13, 2026
1f8c740
test: add massive scaling tests for NameSection
deepsikha-dash Jun 13, 2026
d20b0df
wrap react
kanishka-2007-tech Jun 13, 2026
77cc814
test(preview-panel): add massive scaling coverage
Thacker-Meet Jun 13, 2026
375f560
test(proxy-massive-scaling): verify Massive Data Sets and Extreme Hig…
adityack477 Jun 13, 2026
58e89fd
test: add massive scaling tests for TechnologiesSection
deepsikha-dash Jun 13, 2026
66a5f2b
test(layoutConstants-massive-scaling): verify Massive Data Sets and E…
DivyanshSaharan Jun 13, 2026
3cf75fd
fix(burnout-analyzer): wrap JSON.parse in try/catch to prevent crash …
taniy8 Jun 13, 2026
5f10395
test(preview): add XSS sanitization coverage
sanzzzz-g Jun 13, 2026
bf8f3b9
boolean attribute
kanishka-2007-tech Jun 13, 2026
7f7956e
Merge branch 'main' into test/layoutConstants-massive-scaling
DivyanshSaharan Jun 13, 2026
783cde9
fix: protect notification preference mutations
Krishnx21 Jun 13, 2026
be015fd
chore: support colons and spaces in PR issue check regex
Krishnx21 Jun 13, 2026
fa58349
test(customize-cta): add massive scaling coverage
Thacker-Meet Jun 13, 2026
5ebe17a
fix: protect webhook endpoint against missing secrets and use timing-…
Krishnx21 Jun 13, 2026
6318dfe
feat: add README completion score and suggestions panel
Jun 13, 2026
d6b8836
merge: fix(tests): filter layout and fill props from DOM mocks to rem…
JhaSourav07 Jun 13, 2026
83d1733
test(themes-empty-fallback): verify Edge Cases & Empty/Missing Inputs…
kumar-ayan Jun 13, 2026
a479fbb
merge: fix(tests): resolve act() warnings in CommitPulseSection acces…
JhaSourav07 Jun 13, 2026
ea24ff2
merge: test: add massive scaling tests for NameSection (#5469)
JhaSourav07 Jun 13, 2026
6e00780
merge: Fix Recharts ResponsiveContainer Warnings in Tests (#5465)
JhaSourav07 Jun 13, 2026
c5849ae
merge: test: add massive scaling tests for FeatureCard (#5463)
JhaSourav07 Jun 13, 2026
56123f7
merge: test(Footer): verify Massive Data Sets and Extreme High Bounds…
JhaSourav07 Jun 13, 2026
845b496
merge: test(index-empty-fallback): verify Edge Cases & Empty/Missing …
JhaSourav07 Jun 13, 2026
0475210
merge: test(student-empty-fallback): verify Edge Cases & Empty/Missin…
JhaSourav07 Jun 13, 2026
94644fb
merge: test(dashboardPeriod-empty-fallback): verify Edge Cases & Empt…
JhaSourav07 Jun 13, 2026
33ba99e
merge: test(trustedProxy-empty-fallback): verify Edge Cases & Empty/M…
JhaSourav07 Jun 13, 2026
b287236
merge: test(urls-empty-fallback): verify Edge Cases & Empty/Missing I…
JhaSourav07 Jun 13, 2026
68a5c50
merge: fix(timezone): resolve fractional timezone boundary offset shi…
JhaSourav07 Jun 13, 2026
36c9e76
merge: test(theme-quick-presets): add massive scaling coverage (#5451)
JhaSourav07 Jun 13, 2026
8a28197
merge: ci: Implement Next.js bundle size monitoring (#5450)
JhaSourav07 Jun 13, 2026
1083f91
test(api-streak-route): add massive scaling coverage
Thacker-Meet Jun 13, 2026
b8f9f91
merge: ci: Integrate Stylelint to lint CSS files (#5449)
JhaSourav07 Jun 13, 2026
788886c
merge: ci: Normalize stale assignment calculations to absolute hours …
JhaSourav07 Jun 13, 2026
858f7f9
merge: test(section-label): add massive scaling coverage (#5447)
JhaSourav07 Jun 13, 2026
5368eca
merge: ci: Throttle failure notifications to prevent spamming maintai…
JhaSourav07 Jun 13, 2026
c78be5e
merge: test(export3d-empty-fallback): verify Edge Cases and Empty Fal…
JhaSourav07 Jun 13, 2026
fa68358
merge: test(AnimatedCursor-massive-scaling): verify Massive Data Sets…
JhaSourav07 Jun 13, 2026
aaaad9b
merge: Fix pdf-parse ESM Export Resolution for Reliable PDF Text Extr…
JhaSourav07 Jun 13, 2026
06966c3
merge: test: add massive scaling tests for TechnologyGraph (#5411)
JhaSourav07 Jun 13, 2026
3e983bc
merge: test: add massive scaling tests for heatmap utils (#5409)
JhaSourav07 Jun 13, 2026
32b1f61
merge: test(ResumeUpload): verify edge cases and empty missing inputs…
JhaSourav07 Jun 13, 2026
d5b0b0a
merge: test(EditorPanel-massive-scaling): verify massive data sets an…
JhaSourav07 Jun 13, 2026
f187f5c
merge: test(code-block): add massive scaling coverage for large code …
JhaSourav07 Jun 13, 2026
fe0158b
merge: Test(dashboard): handle empty error fallbacks safely (#5369)
JhaSourav07 Jun 13, 2026
a25a045
merge: test(not-found): add massive scaling coverage for repeated ren…
JhaSourav07 Jun 13, 2026
84a85e6
merge: Test: verify edge cases and empty inputs for compare API route…
JhaSourav07 Jun 13, 2026
cb4dad4
merge: test(ControlsPanel-massive-scaling): verify massive data sets …
JhaSourav07 Jun 13, 2026
37fd0cd
merge: test(Layout-massive-scaling): verify Massive Data Sets and Ext…
JhaSourav07 Jun 13, 2026
2054a36
merge: test(Highlights-massive-scaling): verify Massive Data Sets and…
JhaSourav07 Jun 13, 2026
463eb9e
merge: test(PRInsightsClient-massive-scaling): verify Massive Data Se…
JhaSourav07 Jun 13, 2026
c6e7c34
merge: test(PRStatusDistribution-massive-scaling): verify Massive Dat…
JhaSourav07 Jun 13, 2026
c74f709
merge: test(stats): add validation and cache behavior coverage (#5348)
JhaSourav07 Jun 13, 2026
a249327
merge: test(useLocalStorage-massive-scaling): verify Massive Data Set…
JhaSourav07 Jun 13, 2026
ddce8cf
merge: fix: improve keyboard accessibility for resume upload dropzone…
JhaSourav07 Jun 13, 2026
0ffaad7
merge: test: add theme contrast tests for TopMetricsRow (#5299)
JhaSourav07 Jun 13, 2026
81bb684
Merge branch 'main' into fix/5479-notification-ownership
Krishnx21 Jun 13, 2026
02a45eb
merge: test: add PRTrendChart accessibility coverage (#4926)
JhaSourav07 Jun 13, 2026
854348c
Merge branch 'main' into fix/5480-webhook-secret
Krishnx21 Jun 13, 2026
3599dfa
merge: test(useShareActions-accessibility): verify Accessibility Stan…
JhaSourav07 Jun 13, 2026
3c765ab
Merge branch 'main' into fix/5480-webhook-secret
Krishnx21 Jun 13, 2026
74a7836
merge: fix(contributors): load every GitHub contributor page (#4844)
JhaSourav07 Jun 13, 2026
f0be22e
merge: test(ApiWrappedRoute-mouse-interactivity): verify interactive …
JhaSourav07 Jun 13, 2026
cec44f6
merge: test: add mouse interactivity tests for CommitClock (#4726)
JhaSourav07 Jun 13, 2026
5b9edb0
merge: test(FeatureCard): add mouse interactivity coverage (#4724)
JhaSourav07 Jun 13, 2026
6c7533d
merge: fix(contributors): handle missing contributor data (#4543)
JhaSourav07 Jun 13, 2026
d58664a
Merge branch 'main' into fix/5479-notification-ownership
Krishnx21 Jun 13, 2026
332be45
test: add theme contrast tests for ContributorsClient
navyabansal21 Jun 13, 2026
b31e228
test(mongodb-empty-fallback): verify Edge Cases and Empty Fallbacks
ShafinNigamana Jun 13, 2026
d39a52a
Merge remote-tracking branch 'upstream/main' into test/api-streak-rou…
Thacker-Meet Jun 13, 2026
ca21ea9
test(ResumeUpload-empty-fallback): verify Edge Cases and Empty Fallbacks
ShafinNigamana Jun 13, 2026
53fb494
test(Footer-empty-fallback): verify Edge Cases and Empty Fallbacks
ShafinNigamana Jun 13, 2026
b51d440
Merge branch 'main' into fix/burnout-analyzer-json-parse
taniy8 Jun 13, 2026
14ca034
Merge branch 'main' into test/contributors-theme-contrast
Aamod-Dev Jun 13, 2026
e11a24d
merge: test(ResumeUpload-empty-fallback): verify Edge Cases and Empty…
JhaSourav07 Jun 13, 2026
c144b3d
merge: test(mongodb-empty-fallback): verify Edge Cases and Empty Fall…
JhaSourav07 Jun 13, 2026
883c109
merge: test(themes-empty-fallback): verify Edge Cases & Empty/Missing…
JhaSourav07 Jun 13, 2026
2ea79fb
merge: test(api-streak-route): add massive scaling coverage for large…
JhaSourav07 Jun 13, 2026
9aa8898
merge: feat: add README completion score and suggestions panel (#5488)
JhaSourav07 Jun 13, 2026
6f4a0b8
merge: fix: Fail Closed Webhook Authentication When Secret Is Missing…
JhaSourav07 Jun 13, 2026
9563165
merge: test(customize-cta): add massive scaling coverage for render s…
JhaSourav07 Jun 13, 2026
10c7e4e
merge: fix: Prevent Unauthorized Modification and Deletion of Notific…
JhaSourav07 Jun 13, 2026
608c350
merge: test(preview): add XSS sanitization coverage (#5476)
JhaSourav07 Jun 13, 2026
0c5553e
merge: test(layoutConstants-massive-scaling): verify Massive Data Set…
JhaSourav07 Jun 13, 2026
03f300b
merge: test: add massive scaling tests for TechnologiesSection (#5473)
JhaSourav07 Jun 13, 2026
c553a3e
merge: test(proxy-massive-scaling): verify Massive Data Sets and Extr…
JhaSourav07 Jun 13, 2026
7700371
merge: test(preview-panel): add massive scaling coverage for large ma…
JhaSourav07 Jun 13, 2026
4053511
Merge branch 'main' into fix/burnout-analyzer-json-parse
taniy8 Jun 13, 2026
4758ea2
Merge branch 'main' into test/contributors-theme-contrast
Aamod-Dev Jun 13, 2026
d6d5b5c
resolve ci typecheck failure
diksha78dev Jun 13, 2026
d4445e3
merge: test(Footer-empty-fallback): verify Edge Cases and Empty Fallb…
JhaSourav07 Jun 13, 2026
3749803
merge: test: add theme contrast tests for ContributorsClient (#5497)
JhaSourav07 Jun 13, 2026
961ea2e
merge: fix(burnout-analyzer): wrap JSON.parse in try/catch to prevent…
JhaSourav07 Jun 13, 2026
46fe616
Merge main and resolve conflicts
diksha78dev Jun 13, 2026
e457754
feat: implement global fetch guard in test setup and update contribut…
JhaSourav07 Jun 13, 2026
20a998f
perf: optimize stale issue check by pre-fetching PR references to avo…
JhaSourav07 Jun 13, 2026
4b50a92
test: add mocking for navigator.sendBeacon and fetch in circular refe…
JhaSourav07 Jun 13, 2026
f8fc8e6
test: allow data: URLs in fetch mock for local unit tests
JhaSourav07 Jun 13, 2026
583a62a
chore: import afterEach in contributor page test suites
JhaSourav07 Jun 13, 2026
ff10f80
merge: Test(DashboardError): add empty-fallback edge case tests (#5366)
JhaSourav07 Jun 13, 2026
8c6b1dc
feat: add structured logger and replace server-side console usage
chavanGaneshDatta Jun 9, 2026
d08828d
feat: add structured logger and replace server-side console usage
chavanGaneshDatta Jun 9, 2026
7b4180b
style: format cache module
chavanGaneshDatta Jun 12, 2026
687ce25
resolved merge conflicts
chavanGaneshDatta Jun 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 52 additions & 7 deletions .github/scripts/issue-management/stale-assignment.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,59 @@
async function handleStaleAssignments({ github, context, core }) {
const { owner, repo } = context.repo;
const TWO_DAYS_MS = 2 * 24 * 60 * 60 * 1000;
const STALE_THRESHOLD_MS = 48 * 60 * 60 * 1000; // 48 absolute hours
const now = new Date();

console.log(`Starting stale assignment check for ${owner}/${repo}`);

// Pre-fetch all open pull requests to build a Set of referenced issues.
// This avoids calling the search API in a loop for each candidate stale issue,
// which quickly exhausts search rate limits.
const referencedIssues = new Set();
let prPage = 1;

while (true) {
console.log(`Fetching page ${prPage} of open pull requests...`);
const { data: prs } = await github.rest.pulls.list({
owner,
repo,
state: 'open',
per_page: 100,
page: prPage,
});

if (prs.length === 0) break;

for (const pr of prs) {
// Find issue references like #123 in the PR title or body
const textToSearch = `${pr.title || ''} ${pr.body || ''}`;
const issueMatches = textToSearch.match(/#(\d+)\b/g);
if (issueMatches) {
for (const match of issueMatches) {
const num = parseInt(match.slice(1), 10);
if (!isNaN(num)) {
referencedIssues.add(num);
}
}
}

// Also look for branch names containing issue numbers, e.g. "issue-123", "fix-123"
if (pr.head && pr.head.ref) {
const branchMatches = pr.head.ref.match(/(?:issue|bug|feat|fix)-(\d+)\b/i);
if (branchMatches) {
const num = parseInt(branchMatches[1], 10);
if (!isNaN(num)) {
referencedIssues.add(num);
}
}
}
}

if (prs.length < 100) break;
prPage++;
}

console.log(`Found ${referencedIssues.size} unique issues referenced in open pull requests.`);

let page = 1;
let staleCount = 0;

Expand All @@ -27,16 +76,12 @@ async function handleStaleAssignments({ github, context, core }) {
const updatedAt = new Date(issue.updated_at);
const timeSinceUpdate = now.getTime() - updatedAt.getTime();

if (timeSinceUpdate > TWO_DAYS_MS) {
if (timeSinceUpdate > STALE_THRESHOLD_MS) {
const currentAssignees = issue.assignees.map((a) => a.login);
if (currentAssignees.length === 0) continue;

// Check if any open PRs reference this issue before unassigning
const { data: searchResult } = await github.rest.search.issuesAndPullRequests({
q: `"#${issue.number}" is:pr is:open repo:${owner}/${repo}`,
});

if (searchResult.total_count > 0) {
if (referencedIssues.has(issue.number)) {
console.log(
`Issue #${issue.number} has open PR(s) referencing it. Skipping stale unassignment.`
);
Expand Down
115 changes: 115 additions & 0 deletions .github/workflows/bundle-size-monitor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
name: Bundle Size Monitor

on:
workflow_run:
workflows: ['CI Pipeline']
types: [completed]

permissions:
pull-requests: write
contents: read

jobs:
compare-sizes:
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- name: Checkout Base Branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.pull_requests[0].base.ref || 'main' }}

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install Dependencies
run: npm ci

- name: Build Base Branch
run: npm run build
env:
CI: false

- name: Download PR Bundle Sizes and Scripts
uses: actions/download-artifact@v4
with:
name: bundle-sizes
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: Measure Base Bundle Size
run: node scripts/measure-bundle-size.js base-sizes.json

- name: Compare Sizes
run: node scripts/compare-bundle-sizes.js bundle-sizes.json base-sizes.json > size-report.md

- name: Comment on PR
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const fs = require('fs');
const path = require('path');
const reportPath = 'size-report.md';

if (!fs.existsSync(reportPath)) {
core.warning('No size report file found. Skipping comment.');
return;
}

const report = fs.readFileSync(reportPath, 'utf8');
const run = context.payload.workflow_run;
let prNumber = null;

if (run.pull_requests && run.pull_requests.length > 0) {
prNumber = run.pull_requests[0].number;
} else {
// Fallback: search open PRs for matching head SHA or branch
const { data: openPRs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
per_page: 100
});
const pr = openPRs.find(p => p.head.sha === run.head_sha) || openPRs.find(p => p.head.ref === run.head_branch);
if (pr) {
prNumber = pr.number;
}
}

if (!prNumber) {
core.warning('Could not resolve PR number for this run. Skipping comment.');
return;
}

const sentinel = '<!-- next-bundle-size-report -->';
const body = `${sentinel}\n${report}`;

const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber
});

const botComment = comments.find(c => c.body && c.body.includes(sentinel));

if (botComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body
});
console.log(`Updated existing PR comment on PR #${prNumber}`);
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body
});
console.log(`Created new PR comment on PR #${prNumber}`);
}
76 changes: 71 additions & 5 deletions .github/workflows/ci-failure-notifier.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,26 @@ jobs:
const author = fullPR.user.login;
const currentLabels = fullPR.labels.map(l => l.name);

// Get previous completed runs of this workflow on this branch
const { data: runs } = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: run.workflow_id,
branch: run.head_branch,
per_page: 10,
});

const completedRuns = runs.workflow_runs.filter(
r => r.id !== run.id && r.status === 'completed'
);
const previousConclusion = completedRuns.length > 0 ? completedRuns[0].conclusion : null;
core.info(`Current run conclusion: ${conclusion}, Previous completed run conclusion: ${previousConclusion}`);

if (conclusion === previousConclusion) {
core.info(`Conclusion '${conclusion}' matches previous completed run. Skipping notification/action.`);
return;
}

if (conclusion === 'failure') {
core.info(`PR #${prNumber}: CI failed. Ensuring label '${label}' and comment are present.`);
// Ensure the label exists in the repo
Expand Down Expand Up @@ -159,6 +179,28 @@ jobs:
});
core.info(`Removed '${label}' from PR #${prNumber} — CI is now passing.`);
}

// Delete any stale failure comments to keep the PR clean
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
per_page: 100,
});

const failureComment = comments.find(c =>
c.user?.login === 'github-actions[bot]' &&
c.body?.includes('CI Pipeline is failing')
);

if (failureComment) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: failureComment.id,
});
core.info(`Deleted stale failure comment ${failureComment.id} from PR #${prNumber}.`);
}
}

# ── Manual scan: runs when triggered from the Actions tab ─────────────────
Expand Down Expand Up @@ -277,14 +319,38 @@ jobs:
Once you push a fix and the CI passes, the \`status:blocked\` label will be removed automatically. 💪`,
});
}
} else if (ciRun.conclusion === 'success' && hasBlockedLabel) {
// CI is now passing — remove the stale blocked label
await github.rest.issues.removeLabel({
} else if (ciRun.conclusion === 'success') {
if (hasBlockedLabel) {
// CI is now passing — remove the stale blocked label
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
name: label,
});
core.info(`PR #${pr.number}: CI passing — removed '${label}'.`);
}

// Delete any stale failure comments to keep the PR clean
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
name: label,
per_page: 100,
});
core.info(`PR #${pr.number}: CI passing — removed '${label}'.`);

const failureComment = comments.find(c =>
c.user?.login === 'github-actions[bot]' &&
c.body?.includes('CI Pipeline is failing')
);

if (failureComment) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: failureComment.id,
});
core.info(`PR #${pr.number}: Deleted stale failure comment ${failureComment.id}.`);
}
}
}
15 changes: 15 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ jobs:
- name: Check Prettier Formatting
run: npm run format:check

- name: Run Stylelint
run: npm run lint:css

- name: Run ESLint
run: npm run lint

Expand Down Expand Up @@ -61,3 +64,15 @@ jobs:
run: npm run build
env:
CI: false

- name: Measure Bundle Size
run: node scripts/measure-bundle-size.js bundle-sizes.json

- name: Upload Bundle Sizes
uses: actions/upload-artifact@v4
with:
name: bundle-sizes
path: |
bundle-sizes.json
scripts/measure-bundle-size.js
scripts/compare-bundle-sizes.js
4 changes: 2 additions & 2 deletions .github/workflows/pr-issue-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,10 @@ jobs:

// ----------------------------------------------------------------
// 1. Parse a linked issue number from the PR body.
// Matches: closes/fixes/resolves #123 (case-insensitive)
// Matches: closes/fixes/resolves #123, fixes: #123, fixes : #123 (case-insensitive)
// ----------------------------------------------------------------
const LINK_REGEX =
/(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+#(\d+)/gi;
/\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\b[\s:]*#(\d+)/gi;

const issueNumbers = [];
let match;
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/stale-assignments.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Stale Assignment Expiry

on:
schedule:
- cron: '0 0 * * *' # Runs daily at midnight UTC
- cron: '0 * * * *' # Runs hourly
workflow_dispatch: # Allows manual triggering from the Actions tab

permissions:
Expand Down
23 changes: 23 additions & 0 deletions .stylelintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"extends": "stylelint-config-standard",
"rules": {
"at-rule-no-unknown": [
true,
{
"ignoreAtRules": [
"theme",
"import",
"custom-variant",
"layer",
"utility",
"mixin",
"define-mixin"
]
}
],
"no-descending-specificity": null,
"import-notation": null,
"selector-class-pattern": null,
"no-empty-source": null
}
}
6 changes: 5 additions & 1 deletion app/(root)/dashboard/[username]/wrapped/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { notFound } from 'next/navigation';
import { logger } from '@/lib/logger';
import type { Metadata } from 'next';
import GithubWrapped from '@/components/dashboard/GithubWrapped';
import { getFullDashboardData, getWrappedData } from '@/lib/github';
Expand Down Expand Up @@ -37,7 +38,10 @@ export default async function WrappedPage({
getWrappedData(username, targetYear),
]);
} catch (error) {
console.error('[Wrapped] Failed to load wrapped data:', error);
logger.error('Failed to load wrapped data', {
source: 'Wrapped',
error,
});
// If the user doesn't exist or API fails, trigger the 404 page
return notFound();
}
Expand Down
Loading
Loading