Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
238 commits
Select commit Hold shift + click to select a range
d21382e
integrated ai powered project roadmap
PrishaJain64 Aug 2, 2026
923c6b8
fixed dashboard
PrishaJain64 Aug 2, 2026
d528d15
Merge branch 'main' into feat/ProjectRoadmap
PrishaJain64 Aug 2, 2026
bf89381
fix: code quality and safety improvements
Aug 2, 2026
fed679d
fix: code quality and safety improvements
Aug 2, 2026
2cf0a9e
resolved issues
PrishaJain64 Aug 2, 2026
7bdc7f1
updated branch
PrishaJain64 Aug 2, 2026
f08f0c8
updated branch
PrishaJain64 Aug 2, 2026
d6357d0
routes resolved
PrishaJain64 Aug 2, 2026
7b7cb9c
feat: enhance AI Resume Analyzer with ATS compatibility insights
jainiksha Aug 2, 2026
2676a71
feat: add AI Behavioral Interview Coach with STAR framework analysis
jainiksha Aug 2, 2026
1dac353
Merge branch 'main' into feature/ai-behavioral-interview-coach
jainiksha Aug 2, 2026
b01002e
feat: add personalized interview preparation calendar
jainiksha Aug 2, 2026
dc37cf2
feat: add interview question bookmark collections page
jainiksha Aug 2, 2026
939ad60
feat: add interview question bookmark
jainiksha Aug 2, 2026
0339d42
feat: add interview preparation achievement certificates page
jainiksha Aug 2, 2026
f821e6a
Merge pull request #788 from PrishaJain64/feat/ProjectRoadmap
KaranUnique Aug 2, 2026
e78fe80
Merge pull request #806 from saurabhhhcodes/fix/PrepPilot-64423
KaranUnique Aug 2, 2026
4f6a0d2
Merge pull request #807 from saurabhhhcodes/fix/PrepPilot-37396
KaranUnique Aug 2, 2026
dcc8113
Merge pull request #828 from jainiksha/feature/ai-resume-ats-checker
KaranUnique Aug 2, 2026
1e8a7a6
Merge pull request #830 from jainiksha/feature/ai-behavioral-intervie…
KaranUnique Aug 2, 2026
960aea7
Merge pull request #831 from jainiksha/feature/preparation-calendar
KaranUnique Aug 2, 2026
c32cf59
Merge pull request #832 from jainiksha/feature/bookmark-question-coll…
KaranUnique Aug 2, 2026
4525c6b
Merge pull request #833 from jainiksha/feature/interview-preparation-…
KaranUnique Aug 2, 2026
6d317cc
fix: code quality and safety improvements
Aug 2, 2026
5832af7
fix: code quality and safety improvements
Aug 2, 2026
53b8aa5
feat: add interview readiness score predictor dashboard
jainiksha Aug 2, 2026
dcd036c
feat: add AI study session timer with focus analytics
jainiksha Aug 2, 2026
5165528
feat: add interview preparation goal tracker
jainiksha Aug 2, 2026
21b4616
feat: add AI interview question difficulty estimator
jainiksha Aug 2, 2026
4dc80f7
Fix #849 - process is undefined in Vite configuration
sahare77 Aug 2, 2026
95d829a
feat: add AI interview preparation milestone timeline
jainiksha Aug 2, 2026
5de54e0
feat: add interview notes organizer with rich text support
jainiksha Aug 2, 2026
11c5409
Fix #850 - React Fast Refresh broken in context files
sahare77 Aug 2, 2026
92a7832
Fix #851 - Missing useEffect dependencies in auth and state files
sahare77 Aug 2, 2026
87b15a1
feat: add AI weekly preparation summary
jainiksha Aug 2, 2026
4d04585
feat: add interview deadline countdown widget
jainiksha Aug 2, 2026
1c30a45
feat: add interview resource recommendation engine
jainiksha Aug 2, 2026
b7e0789
feat: add preparation achievement badges showcase
jainiksha Aug 2, 2026
87e7839
Merge pull request #847 from saurabhhhcodes/fix/PrepPilot-53839
KaranUnique Aug 2, 2026
703ae71
Merge pull request #848 from saurabhhhcodes/fix/PrepPilot-15942
KaranUnique Aug 2, 2026
bca9747
Merge pull request #855 from jainiksha/feature/interview-readiness-sc…
KaranUnique Aug 2, 2026
85c8ba2
Merge pull request #859 from jainiksha/feature/ai-study-session-timer
KaranUnique Aug 2, 2026
97acd2d
Merge pull request #871 from jainiksha/feature/interview-goal-tracker
KaranUnique Aug 2, 2026
34c4743
Merge pull request #872 from jainiksha/feature/ai-question-difficulty…
KaranUnique Aug 2, 2026
7bab573
Merge pull request #873 from sahare77/fix-issue-849
KaranUnique Aug 2, 2026
abc3d3e
Merge pull request #874 from jainiksha/feature/interview-milestone-ti…
KaranUnique Aug 2, 2026
4a81e85
Merge pull request #875 from jainiksha/feature/interview-notes-organizer
KaranUnique Aug 2, 2026
749daac
Merge pull request #876 from sahare77/fix-issue-850
KaranUnique Aug 2, 2026
5c10656
Merge pull request #877 from sahare77/fix-issue-851
KaranUnique Aug 2, 2026
82083bd
Merge pull request #878 from jainiksha/feature/ai-weekly-preparation-…
KaranUnique Aug 2, 2026
217d53a
Merge pull request #879 from jainiksha/feature/interview-deadline-cou…
KaranUnique Aug 2, 2026
9dd0881
Merge pull request #880 from jainiksha/feature/interview-resource-rec…
KaranUnique Aug 2, 2026
4f67755
Merge pull request #881 from jainiksha/feature/preparation-achievemen…
KaranUnique Aug 2, 2026
73a926d
Fix #855 #859 #863 - Missing dependency in userContext
sahare77 Aug 2, 2026
ce56045
Fix #854 - Empty catch blocks swallowing errors silently
sahare77 Aug 2, 2026
5b49fc2
Fix #863 - Error states defined but not utilized in Dashboard and Int…
sahare77 Aug 2, 2026
87db50b
Fix: JSX syntax error in BehavioralCoach.jsx causing build failure
sahare77 Aug 2, 2026
446941e
Fix: Parsing error in DifficultyEstimator and unused vars in ProjectR…
sahare77 Aug 2, 2026
82850f8
fix: handle extra whitespace in getInitials
SujalMahapatra Aug 2, 2026
dbfa7ba
Fix: Handle extra whitespace correctly in getInitials() utility
sahare77 Aug 2, 2026
3626115
Fix: Add missing database indexes on foreign keys
sahare77 Aug 2, 2026
209326f
Fix: Remove console.log leaking email configuration in sendEmail.js
sahare77 Aug 2, 2026
26e8d62
Test: Add unit tests for passwordStrength utility
sahare77 Aug 2, 2026
5855c88
Fix: Add limit(50) to unbounded DB queries
sahare77 Aug 2, 2026
9e58ec4
UX: Add loading and disabled states to Roadmap deletion
sahare77 Aug 2, 2026
1f610b5
Security: Fix potential XSS vulnerability in ResumeEditor
sahare77 Aug 2, 2026
1f4b7d1
Security: Fix missing rate limiters on standard auth routes
sahare77 Aug 2, 2026
ee0c1b9
UX: Add ErrorBoundary to MainLayout to prevent white screen crashes o…
sahare77 Aug 2, 2026
8bbd0e9
fix: validate profile images by magic bytes and harden /uploads serving
ionfwsrijan Aug 3, 2026
1ba5d68
fix: replace onrender.com CORS wildcard with exact-origin allowlist
ionfwsrijan Aug 3, 2026
ae65654
fix: wire loginLimiter to POST /api/auth/login
ionfwsrijan Aug 3, 2026
4977a9f
fix: strip secrets from serialized user profile responses
ionfwsrijan Aug 3, 2026
0354d4d
fix: make system instruction server-owned and cap chat history
ionfwsrijan Aug 3, 2026
52c709d
fix: stop revealing account existence on register
ionfwsrijan Aug 3, 2026
78c656d
Merge pull request #895 from sahare77/fix-behavioralcoach-build
KaranUnique Aug 3, 2026
3c6e34c
Merge pull request #894 from sahare77/fix-unused-error-863
KaranUnique Aug 3, 2026
9260fb9
Merge pull request #897 from sahare77/fix-new-lint-errors
KaranUnique Aug 3, 2026
5f28ba8
Merge pull request #893 from sahare77/fix-error-handling-854
KaranUnique Aug 3, 2026
ce70ec8
Merge pull request #891 from sahare77/fix-hooks-855
KaranUnique Aug 3, 2026
9d1facb
Merge pull request #907 from SujalMahapatra/fix/getinitials-whitespace
KaranUnique Aug 3, 2026
d628931
Merge pull request #908 from sahare77/fix-getinitials-whitespace
KaranUnique Aug 3, 2026
991a9de
Merge pull request #909 from sahare77/fix-db-indexes
KaranUnique Aug 3, 2026
07b5b47
Merge pull request #910 from sahare77/fix-email-config-leak
KaranUnique Aug 3, 2026
d44f339
Merge pull request #911 from sahare77/add-password-tests
KaranUnique Aug 3, 2026
11bac37
Merge pull request #912 from sahare77/fix-unbounded-queries
KaranUnique Aug 3, 2026
5ab716c
Merge pull request #914 from sahare77/fix-destructive-loading-states
KaranUnique Aug 3, 2026
6a1c8de
Merge pull request #917 from sahare77/fix-xss-resume-editor
KaranUnique Aug 3, 2026
6424ff5
Merge pull request #918 from sahare77/fix-rate-limiting
KaranUnique Aug 3, 2026
84f9448
Merge pull request #919 from sahare77/fix-error-boundaries
KaranUnique Aug 3, 2026
5f78196
feat: add personalized weak topics dashboard
jainiksha Aug 3, 2026
962af4e
feat: add interview preparation heatmap
jainiksha Aug 3, 2026
ef84517
feat: add resume version history
jainiksha Aug 3, 2026
25c5ec8
feat: add AI project recommendation page
jainiksha Aug 3, 2026
b66b954
feat: add bookmark interview experiences page
jainiksha Aug 3, 2026
fc3cd9a
feat: add AI skill gap analyzer
jainiksha Aug 3, 2026
48f3935
feat: add interview preparation milestone notifications
jainiksha Aug 3, 2026
e01d48d
feat: add AI interview difficulty progression
jainiksha Aug 3, 2026
bc64ac0
feat: add preparation statistics export
jainiksha Aug 3, 2026
0aee268
fix: resolve 2 bugs in PrepPilot
Aug 3, 2026
d5d4ad2
fix: resolve 2 bugs in PrepPilot
Aug 3, 2026
3ef4ce6
[squash] PR #1112: fix : removed duplicate setLoading call in userCon…
tmdeveloper007 Aug 3, 2026
8809540
[squash] PR #1110: fix : added case-insensitive Bearer token check in…
tmdeveloper007 Aug 3, 2026
645b00e
[squash] PR #1108: fix : added correct email validation logic in Sign…
tmdeveloper007 Aug 3, 2026
568ea43
[squash] PR #1106: fix : added add email input type on Login page
tmdeveloper007 Aug 3, 2026
5a6c912
[squash] PR #1100: fix: handle resume title blur event
kumud-05 Aug 3, 2026
c11b4e7
[squash] PR #1099: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
652ee33
[squash] PR #1098: fix(auth): implement cascade deletion for user acc…
saidai-bhuvanesh Aug 3, 2026
6bfb9cf
[squash] PR #1096: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
5e82e6e
[squash] PR #1095: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
0b55ff5
[squash] PR #1094: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
d215dae
[squash] PR #1093: [Robustness]: Add API Quota and Error Handling to …
sahare77 Aug 3, 2026
cb5b3d5
[squash] PR #1092: [Performance]: Implement Pagination for Unbounded …
sahare77 Aug 3, 2026
cd58a31
[squash] PR #1090: test: configure Vitest for frontend utility tests
SujalMahapatra Aug 3, 2026
d1f9289
[squash] PR #1088: [Performance]: Fix Unnecessary Dependency in usePa…
sahare77 Aug 3, 2026
4babcf8
[squash] PR #1085: [Robustness]: Fix Unhandled Error Variables in Pro…
sahare77 Aug 3, 2026
221c7a6
[squash] PR #1078: feat: AI Problem Solver — structured approach/comp…
ashroxy Aug 3, 2026
30eedca
[squash] PR #1077: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
3c81a4b
[squash] PR #1076: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
354c4f9
[squash] PR #1074: feat: DSA sheet CRUD with shared JSON validation h…
ashroxy Aug 3, 2026
80f0bed
[squash] PR #1073: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
7d9f3b2
[squash] PR #1072: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
5d325a8
[squash] PR #1070: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
5c30a36
[squash] PR #1069: feat: add unified Question Bank (session questions…
ashroxy Aug 3, 2026
f5a332a
[squash] PR #1068: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
ad1b3d3
[squash] PR #1067: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
c3aa458
[squash] PR #1066: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
a378ce7
[squash] PR #1065: enhance: improve uploadImage error logging
SujalMahapatra Aug 3, 2026
ef4a6ea
[squash] PR #1064: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
3892607
[squash] PR #1062: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
6930d7b
[squash] PR #1060: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
6a43ad7
[squash] PR #1059: feat: add DSA sheet progress backup & restore (JSO…
ashroxy Aug 3, 2026
e046d45
[squash] PR #1058: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
f614424
[squash] PR #1056: refactor: extract daily challenge seed generation …
SujalMahapatra Aug 3, 2026
59a685b
[squash] PR #1054: Robustness: Add Global Unhandled Promise Rejection…
sahare77 Aug 3, 2026
c616a8f
[squash] PR #1053: Tech Debt: Add Database Indexes on Frequently Quer…
sahare77 Aug 3, 2026
394d5c2
[squash] PR #1052: Tech Debt: Remove Unnecessary Console Logging in J…
sahare77 Aug 3, 2026
84c513c
[squash] PR #1051: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
b14ac3e
[squash] PR #1048: fix: resolve 2 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
be1fe3a
[squash] PR #1046: Tech Debt: Remove Unnecessary Logs and Hardcoded L…
sahare77 Aug 3, 2026
748dfa3
[squash] PR #1045: fix: resolve 1 bugs in PrepPilot
saurabhhhcodes Aug 3, 2026
e745faa
implemented sample test files
KaranUnique Aug 3, 2026
399232f
fixed profuction issues
KaranUnique Aug 3, 2026
6ec645f
feat: add AI interview vocabulary builder
jainiksha Aug 3, 2026
465e0b7
Merge pull request #940 from ionfwsrijan/fix/924-system-instruction-g…
KaranUnique Aug 3, 2026
d02b9c9
Merge branch 'main' of https://github.com/Canopus-Labs/PrepPilot
KaranUnique Aug 3, 2026
a1be0fa
fix: remove cookie-session/lusca, fix window reference, fix refreshTo…
KaranUnique Aug 3, 2026
54220f4
chore: remove scripts containing secrets
KaranUnique Aug 3, 2026
285cda4
Merge pull request #946 from ionfwsrijan/fix/930-register-no-enumeration
KaranUnique Aug 3, 2026
2a89574
Merge pull request #1118 from jainiksha/feature/ai-interview-vocabula…
KaranUnique Aug 3, 2026
78b0e61
feat: add interview resource reading tracker
jainiksha Aug 3, 2026
4eee576
feat: add AI personalized daily challenge generator
jainiksha Aug 3, 2026
c6b72c0
Merge pull request #1121 from jainiksha/feature/interview-resource-re…
KaranUnique Aug 3, 2026
34f007e
fix: Remove debug console.log statements
openhands-agent Aug 3, 2026
1baada0
Merge pull request #969 from jainiksha/feature/personalized-weak-topi…
KaranUnique Aug 3, 2026
1e53bf5
Merge pull request #970 from jainiksha/feature/interview-preparation-…
KaranUnique Aug 3, 2026
993594d
Merge pull request #972 from jainiksha/feature/ai-project-recommendation
KaranUnique Aug 3, 2026
dbd7c5c
Merge pull request #971 from jainiksha/feature/resume-version-history
KaranUnique Aug 3, 2026
c6e4a6e
Merge pull request #973 from jainiksha/feature/bookmark-interview-exp…
KaranUnique Aug 3, 2026
00fde80
Merge pull request #974 from jainiksha/feature/ai-skill-gap-analyzer
KaranUnique Aug 3, 2026
cd1f476
Merge pull request #975 from jainiksha/feature/interview-milestone-no…
KaranUnique Aug 3, 2026
10f9501
Merge pull request #976 from jainiksha/feature/ai-interview-difficult…
KaranUnique Aug 3, 2026
50f302a
Merge pull request #977 from jainiksha/feature/preparation-statistics…
KaranUnique Aug 3, 2026
07d8758
Merge pull request #1122 from jainiksha/feature/ai-personalized-daily…
KaranUnique Aug 3, 2026
fb83f91
fix(env): log non-blocking warnings for missing optional env vars (#732)
suhaniiz Aug 3, 2026
790553c
feat: add complete jakes resume template
mittalsonal Aug 4, 2026
119e023
Merge pull request #1042 from saurabhhhcodes/fix/PrepPilot-30080
KaranUnique Aug 4, 2026
cc7e38e
Merge pull request #1039 from saurabhhhcodes/fix/PrepPilot-38772
KaranUnique Aug 4, 2026
a42aab5
Merge pull request #1170 from mittalsonal/637-jakes-resume-template
KaranUnique Aug 4, 2026
f25d688
fix: remove window reference in setInterval (Node.js compat)
KaranUnique Aug 4, 2026
ef3374a
feat: add AI resume bullet point enhancer
jainiksha Aug 4, 2026
8f20fa3
feat: add AI technical concept explainer
jainiksha Aug 4, 2026
9b6b468
feat: add custom practice session builder
jainiksha Aug 4, 2026
7a69612
feat: add AI time management advisor
jainiksha Aug 4, 2026
e3c6532
feat: add coding speed analytics
jainiksha Aug 4, 2026
13442ec
feat: add interview preparation playlist
jainiksha Aug 4, 2026
39bbbb3
feat: add AI interview confidence score
jainiksha Aug 4, 2026
941374d
feat: add interview readiness checklist
jainiksha Aug 4, 2026
f985edf
feat: add AI interview question collections
jainiksha Aug 4, 2026
40d1906
feat: add interview progress milestone sharing
jainiksha Aug 4, 2026
591fbfd
fix(auth): add request body validation in registerUser (#758)
suhaniiz Aug 4, 2026
c1944c5
fix(auth): revoke refresh tokens and clear cookies on password change…
suhaniiz Aug 4, 2026
5d6d48c
Merge pull request #1181 from jainiksha/feature/interview-progress-mi…
KaranUnique Aug 4, 2026
1ff1ab4
Merge pull request #1180 from jainiksha/feature/interview-question-co…
KaranUnique Aug 4, 2026
1c431d1
Merge pull request #1179 from jainiksha/feature/interview-readiness-c…
KaranUnique Aug 4, 2026
514f459
Merge pull request #1178 from jainiksha/feature/ai-interview-confiden…
KaranUnique Aug 4, 2026
6c9f541
Merge pull request #1177 from jainiksha/feature/interview-preparation…
KaranUnique Aug 4, 2026
67d55a9
Merge pull request #1176 from jainiksha/feature/coding-speed-analytics
KaranUnique Aug 4, 2026
9e8428c
Merge pull request #1172 from jainiksha/feature/ai-resume-bullet-enha…
KaranUnique Aug 4, 2026
576d3fb
Merge pull request #1174 from jainiksha/feature/custom-practice-sessi…
KaranUnique Aug 4, 2026
80ecedd
Merge pull request #1175 from jainiksha/feature/ai-time-management-ad…
KaranUnique Aug 4, 2026
91d5e8f
Merge pull request #1173 from jainiksha/feature/ai-technical-concept-…
KaranUnique Aug 4, 2026
74f2c8e
Merge pull request #1191 from suhaniiz/fix/759-revoke-refresh-tokens-…
KaranUnique Aug 4, 2026
4f21d64
implemented github actions for restricting spam issues and pr's
KaranUnique Aug 4, 2026
e11f29b
feat: add AI interview answer improvement suggestions
jainiksha Aug 4, 2026
097ba88
feat: add company interview preparation tracker
jainiksha Aug 4, 2026
36d7c99
feat: add AI learning path recommendations
jainiksha Aug 4, 2026
bbfb956
feat: add interview preparation journal
jainiksha Aug 4, 2026
0b39c1d
feat: add interview preparation resource completion tracker
jainiksha Aug 4, 2026
164f47e
fix: Add missing dependency in BookmarkCollections useMemo
sahare77 Aug 4, 2026
69afebf
feat: add AI interview readiness timeline
jainiksha Aug 4, 2026
5fb0af2
feat: add AI interview question revision queue
jainiksha Aug 4, 2026
1c7e6bf
feat: add interview goal deadline tracker
jainiksha Aug 4, 2026
b5f32c7
feat: add AI personalized revision checklist
jainiksha Aug 4, 2026
37fe2c3
feat: add AI preparation progress insights widget
jainiksha Aug 4, 2026
9ca9f63
Merge pull request #1235 from jainiksha/feature/ai-preparation-progre…
KaranUnique Aug 5, 2026
e2005e9
Merge pull request #1209 from jainiksha/feature/ai-interview-answer-i…
KaranUnique Aug 5, 2026
6216d05
Merge pull request #1234 from jainiksha/feature/ai-personalized-revis…
KaranUnique Aug 5, 2026
34754d9
Merge pull request #1233 from jainiksha/feature/interview-goal-deadli…
KaranUnique Aug 5, 2026
92ad341
Merge pull request #1232 from jainiksha/feature/interview-question-re…
KaranUnique Aug 5, 2026
0b80e17
Merge pull request #1231 from jainiksha/feature/interview-readiness-t…
KaranUnique Aug 5, 2026
c04b125
Merge pull request #1213 from jainiksha/feature/resource-completion-t…
KaranUnique Aug 5, 2026
3b2f5ac
Merge pull request #1212 from jainiksha/feature/interview-preparation…
KaranUnique Aug 5, 2026
7b46139
Merge pull request #1211 from jainiksha/feature/ai-learning-path-reco…
KaranUnique Aug 5, 2026
61c2219
Merge pull request #1210 from jainiksha/feature/company-interview-tra…
KaranUnique Aug 5, 2026
079c89c
Merge pull request #1123 from saidai-bhuvanesh/fix/remove-debug-conso…
KaranUnique Aug 5, 2026
52ff3e9
Merge pull request #1126 from suhaniiz/fix/732-missing-optional-env-w…
KaranUnique Aug 5, 2026
ed30271
fix: GHSA-p6gq-j5cr-w38f security vulnerability
anupamme Aug 5, 2026
e8671bc
Merge pull request #1224 from sahare77/fix/bookmark-dependency
KaranUnique Aug 5, 2026
b7dfd5d
ci: add issue claim bot + exempt jainiksha from rate limit
KaranUnique Aug 5, 2026
fb1f898
fix: mount roadmap routes so the Project Roadmap feature stops 404ing
ionfwsrijan Aug 5, 2026
119c475
fix: upgrade nodemailer to ^9.0.4 for SMTP security hardening
anupamme Aug 5, 2026
39ce62d
Create stale.yml
itsdakshjain Aug 5, 2026
e024384
Merge pull request #1248 from anupamme/fix-repo-preppilot-ghsa-p6gq-j…
KaranUnique Aug 6, 2026
11b2e89
Merge pull request #1305 from itsdakshjain/stale
KaranUnique Aug 6, 2026
32c4e5c
Merge pull request #1278 from ionfwsrijan/fix/1265-mount-roadmap-routes
KaranUnique Aug 6, 2026
54d2cc8
feat: add AI interview preparation habit tracker
jainiksha Aug 6, 2026
25e05a2
feat: add AI topic mastery progress bar
jainiksha Aug 6, 2026
0b93581
feat: add AI interview preparation milestone calendar
jainiksha Aug 6, 2026
dcf4044
feat: add AI personalized interview preparation tips
jainiksha Aug 6, 2026
237116e
feat: add AI interview preparation snapshot
jainiksha Aug 6, 2026
6526011
Merge pull request #1373 from jainiksha/feature/ai-interview-preparat…
KaranUnique Aug 6, 2026
cd6e3be
Merge pull request #1372 from jainiksha/feature/ai-personalized-inter…
KaranUnique Aug 6, 2026
4415312
Merge pull request #1371 from jainiksha/feature/ai-interview-preparat…
KaranUnique Aug 6, 2026
734d550
Merge pull request #1370 from jainiksha/feature/ai-topic-mastery-prog…
KaranUnique Aug 6, 2026
8acb5b8
Merge pull request #1369 from jainiksha/feature/ai-interview-preparat…
KaranUnique Aug 6, 2026
830c85c
fix: send createSession 201 only after the transaction commits
ionfwsrijan Aug 6, 2026
e88b83a
Merge branch 'data' into fix/1442-create-session-transaction
KaranUnique Aug 8, 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
167 changes: 167 additions & 0 deletions .github/workflows/issue-claim-bot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
# ─────────────────────────────────────────────────────────────────────────────
# issue-claim-bot.yml
#
# PURPOSE:
# • Posts a welcome comment when a new Issue is opened, inviting contributors
# to claim it with /claim.
# • Handles /claim comments: assigns the issue, adds a label, and replies.
# • Prevents duplicate claims and handles all edge cases gracefully.
#
# CUSTOMISATION:
# CLAIMED_LABEL — label added when an issue is claimed (created if missing)
# EXEMPT_USERS — comma-separated GitHub usernames who are always allowed
# ─────────────────────────────────────────────────────────────────────────────
name: Issue Claim Bot

on:
issues:
types: [opened]
issue_comment:
types: [created] # only new comments; ignore edits/deletions

permissions:
issues: write
contents: read

env:
CLAIMED_LABEL: "claimed"

jobs:
# ── JOB 1: Welcome message when a new issue is opened ──────────────────────
welcome:
name: Post welcome comment
runs-on: ubuntu-latest
if: github.event_name == 'issues' && github.event.action == 'opened'

steps:
- name: Comment welcome message
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { owner, repo } = context.repo;
const issueNumber = context.payload.issue.number;

await github.rest.issues.createComment({
owner, repo,
issue_number: issueNumber,
body:
`Thanks for creating this issue!\n\n` +
`If you'd like to work on it, simply comment:\n\n` +
`> /claim\n\n` +
`The **first** person to claim the issue will be assigned automatically.\n\n` +
`Happy contributing!`,
});
core.info(`Welcome comment posted on #${issueNumber}`);

# ── JOB 2: Handle /claim comments ─────────────────────────────────────────
handle-claim:
name: Handle /claim
runs-on: ubuntu-latest
# Only run on issue_comment events (not issue opened)
if: github.event_name == 'issue_comment' && github.event.action == 'created'

steps:
- name: Process /claim command
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { owner, repo } = context.repo;
const comment = context.payload.comment;
const issue = context.payload.issue;
const actor = comment.user.login;
const LABEL = process.env.CLAIMED_LABEL;

// ── Guard: case-insensitive /claim check (trim whitespace) ───────
const body = comment.body.trim().toLowerCase();
if (body !== "/claim") {
core.info("Comment is not '/claim' — ignoring.");
return;
}

core.info(`/claim received on #${issue.number} from @${actor}`);

// ── Guard: skip bots ──────────────────────────────────────────────
if (comment.user.type === "Bot" || actor.endsWith("[bot]")) {
core.info("Commenter is a bot — ignoring.");
return;
}

// ── Guard: skip if this is a PR (issue_comment fires on PRs too) ─
if (issue.pull_request) {
core.info("This is a PR comment, not an issue — ignoring.");
return;
}

// ── Guard: skip closed issues ────────────────────────────────────
if (issue.state === "closed") {
await github.rest.issues.createComment({
owner, repo,
issue_number: issue.number,
body: `⚠️ @${actor} — This issue is already **closed** and cannot be claimed.`,
});
return;
}

// ── Check existing assignees ──────────────────────────────────────
const assignees = (issue.assignees || []).map(a => a.login);

if (assignees.length > 0) {
// Already claimed — inform the commenter
const claimedBy = assignees[0];
await github.rest.issues.createComment({
owner, repo,
issue_number: issue.number,
body:
`❌ This issue has already been claimed by **@${claimedBy}**.\n\n` +
`Please look for another open issue or create a new one to contribute.\n\n` +
`Thank you for your interest!`,
});
core.info(`Issue #${issue.number} already assigned to @${claimedBy} — notified @${actor}.`);
return;
}

// ── Assign issue to the claimant ─────────────────────────────────
await github.rest.issues.addAssignees({
owner, repo,
issue_number: issue.number,
assignees: [actor],
});

// ── Ensure 'claimed' label exists (create if missing) ─────────────
try {
await github.rest.issues.getLabel({ owner, repo, name: LABEL });
} catch (err) {
if (err.status === 404) {
await github.rest.issues.createLabel({
owner, repo,
name: LABEL,
color: "0075ca", // blue
description: "This issue has been claimed by a contributor",
});
core.info(`Created label '${LABEL}'`);
} else {
throw err;
}
}

// ── Add 'claimed' label ───────────────────────────────────────────
await github.rest.issues.addLabels({
owner, repo,
issue_number: issue.number,
labels: [LABEL],
});

// ── Post success comment ──────────────────────────────────────────
await github.rest.issues.createComment({
owner, repo,
issue_number: issue.number,
body:
`✅ **@${actor}** has successfully claimed this issue!\n\n` +
`You've been assigned. Happy coding!\n\n` +
`> **Tip:** Please open a Pull Request linked to this issue when you're ready.\n` +
`> Add \`Closes #${issue.number}\` in your PR description.`,
});

core.info(`Issue #${issue.number} successfully claimed by @${actor}.`);
174 changes: 174 additions & 0 deletions .github/workflows/rate-limit-contributions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# ─────────────────────────────────────────────────────────────────────────────
# rate-limit-contributions.yml
#
# PURPOSE:
# Prevents repository spam by auto-closing any new Issue or Pull Request
# from a contributor who already has 3 or more open submissions of that type.
#
# CUSTOMISATION:
# Change the MAX_OPEN_ISSUES and MAX_OPEN_PRS env vars below to adjust limits.
# Admins / maintainers / collaborators are always exempt.
# ─────────────────────────────────────────────────────────────────────────────
name: Rate-limit contributions

on:
issues:
types: [opened]
pull_request_target: # use pull_request_target so GITHUB_TOKEN has write perms on forks
types: [opened]

# Minimal, scoped permissions
permissions:
issues: write
pull-requests: write
contents: read

env:
# ── Tune these values to change the limits ──────────────────────────────────
MAX_OPEN_ISSUES: 3 # max simultaneous open Issues per contributor
MAX_OPEN_PRS: 3 # max simultaneous open PRs per contributor
RATE_LIMITED_LABEL: "rate-limited"

jobs:
check-rate-limit:
runs-on: ubuntu-latest
# Skip the check entirely for bots (dependabot, renovate, etc.)
if: ${{ !contains(github.actor, '[bot]') }}

steps:
- name: Enforce contribution rate limit
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
// ── Config ─────────────────────────────────────────────────────
const MAX_OPEN_ISSUES = parseInt(process.env.MAX_OPEN_ISSUES, 10);
const MAX_OPEN_PRS = parseInt(process.env.MAX_OPEN_PRS, 10);
const LABEL = process.env.RATE_LIMITED_LABEL;

// ── Excluded contributors (always exempt, regardless of role) ───
const EXCLUDED_USERS = [
"jainiksha", // project lead / trusted contributor
];

const CLOSE_MESSAGE =
`Thank you for your contribution!\n\n` +
`To keep reviews manageable and maintain repository quality, ` +
`contributors may have a maximum of **${MAX_OPEN_ISSUES} open Issues** ` +
`and **${MAX_OPEN_PRS} open Pull Requests** at any given time.\n\n` +
`Please wait until one of your existing submissions is reviewed or ` +
`closed before opening additional ones.\n\n` +
`If you believe this was closed by mistake, feel free to contact the maintainers.`;

const { repo: { owner, repo }, actor } = context;
const isIssue = context.eventName === "issues";
const itemNumber = isIssue
? context.payload.issue.number
: context.payload.pull_request.number;

core.info(`Event: ${context.eventName} | Author: ${actor} | #${itemNumber}`);

// ── 0. Exempt explicitly excluded users ─────────────────────────
if (EXCLUDED_USERS.map(u => u.toLowerCase()).includes(actor.toLowerCase())) {
core.info(`${actor} is in the exclusion list — skipping rate limit.`);
return;
}

// ── 1. Exempt specific contributors, repo owner, admins and collaborators ──
const EXEMPT_USERS = ["jainiksha"]; // add more usernames here if needed
if (EXEMPT_USERS.map(u => u.toLowerCase()).includes(actor.toLowerCase())) {
core.info(`${actor} is in the exempt list — skipping rate limit.`);
return;
}

try {
const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({
owner, repo, username: actor,
});
// permission levels: admin | maintain | write | triage | read
if (["admin", "maintain", "write"].includes(perm.permission)) {
core.info(`${actor} has '${perm.permission}' permission — skipping rate limit.`);
return;
}
} catch (err) {
// 404 = not a collaborator; any other error → log but continue
if (err.status !== 404) core.warning(`Permission check failed: ${err.message}`);
}

// ── 2. Count open Issues / PRs by this author ───────────────────
// GitHub search API: one request for issues, one for PRs.
// We exclude the newly created item from each count so the
// threshold is "already had N open BEFORE this one".

async function countOpen(type) {
// type = "issue" or "pr"
const qualifier = type === "issue" ? "is:issue" : "is:pr";
const { data } = await github.rest.search.issuesAndPullRequests({
q: `repo:${owner}/${repo} is:open ${qualifier} author:${actor}`,
per_page: 100, // max per page; enough for any sane contributor
});
// Subtract 1 for the item we just opened (it's already in the index)
return Math.max(0, data.total_count - 1);
}

const openIssues = isIssue ? await countOpen("issue") : null;
const openPRs = isIssue ? null : await countOpen("pr");

core.info(`Open issues by ${actor} (excl. current): ${openIssues ?? "n/a"}`);
core.info(`Open PRs by ${actor} (excl. current): ${openPRs ?? "n/a"}`);

// ── 3. Decide whether to close ──────────────────────────────────
const shouldClose = isIssue
? openIssues >= MAX_OPEN_ISSUES
: openPRs >= MAX_OPEN_PRS;

if (!shouldClose) {
core.info("Within limit — no action needed.");
return;
}

core.info(`Limit exceeded — closing #${itemNumber} and adding label '${LABEL}'.`);

// ── 4. Ensure the label exists (create it if needed) ─────────────
try {
await github.rest.issues.getLabel({ owner, repo, name: LABEL });
} catch {
await github.rest.issues.createLabel({
owner, repo,
name: LABEL,
color: "e11d48", // red-600
description: "Closed automatically: contributor rate limit reached",
});
}

// ── 5. Add label ─────────────────────────────────────────────────
await github.rest.issues.addLabels({
owner, repo,
issue_number: itemNumber,
labels: [LABEL],
});

// ── 6. Post comment ───────────────────────────────────────────────
await github.rest.issues.createComment({
owner, repo,
issue_number: itemNumber,
body: CLOSE_MESSAGE,
});

// ── 7. Close the item ─────────────────────────────────────────────
if (isIssue) {
await github.rest.issues.update({
owner, repo,
issue_number: itemNumber,
state: "closed",
state_reason: "not_planned",
});
} else {
await github.rest.pulls.update({
owner, repo,
pull_number: itemNumber,
state: "closed",
});
}

core.info(`#${itemNumber} closed successfully.`);
Loading