diff --git a/pr_list_latest.json b/pr_list_latest.json new file mode 100644 index 0000000..4702a3d --- /dev/null +++ b/pr_list_latest.json @@ -0,0 +1 @@ +[{"comments":[{"id":"IC_kwDORQ49-c7vAshs","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"> [!WARNING]\n> You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!","createdAt":"2026-03-06T06:48:45Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/55#issuecomment-4009937004","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAsiu","author":{"login":"vercel"},"authorAssociation":"NONE","body":"[vc]: #NNRL0BvSJntcygUTJlFjWRLNDn3ZPzd7PFSE3U8Wr+g=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItdXNlci1zdW1tYXJ5IiwicHJvamVjdElkIjoicHJqX0tMWWhLa1BSVkROR1NrakM4RGxpb09QOFNvd3kiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtZml4LWNvLTVjZDIxOS1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAifSwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2hpcm9raXMtcHJvamVjdHMtYWZkNjE4YzcvZ2l0aHViLXVzZXItc3VtbWFyeS81OVVUeVVzUVhlanUxaE1qSmZhZFAzckhiVnlyIiwicHJldmlld1VybCI6ImdpdGh1Yi11c2VyLXN1bW1hcnktZ2l0LWZpeC1jby01Y2QyMTktaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy52ZXJjZWwuYXBwIiwibmV4dENvbW1pdFN0YXR1cyI6IkRFUExPWUVEIn1dfQ==\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\n\n| Project | Deployment | Actions | Updated (UTC) |\n| :--- | :----- | :------ | :------ |\n| [github-user-summary](https://vercel.com/hirokis-projects-afd618c7/github-user-summary) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/hirokis-projects-afd618c7/github-user-summary/59UTyUsQXeju1hMjJfadP3rHbVyr) | [Preview](https://github-user-summary-git-fix-co-5cd219-hirokis-projects-afd618c7.vercel.app), [Comment](https://vercel.live/open-feedback/github-user-summary-git-fix-co-5cd219-hirokis-projects-afd618c7.vercel.app?via=pr-comment-feedback-link) | Mar 6, 2026 6:48am |\n\n","createdAt":"2026-03-06T06:48:46Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/55#issuecomment-4009937070","viewerDidAuthor":false}],"headRefName":"fix/consolidated-prs-complete","number":55,"reviews":[],"title":"📦 [Consolidated] PR #38~#48 の統合・競合解消およびレビュー指摘対応"},{"comments":[{"id":"IC_kwDORQ49-c7vAsdr","author":{"login":"google-labs-jules"},"authorAssociation":"CONTRIBUTOR","body":"👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.\n\nWhen you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.\n\nI'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!\n\nFor more direct control, you can switch me to **Reactive Mode**. When this mode is on, I will only act on comments where you specifically mention me with `@jules`. You can find this option in the **Pull Request** section of your [global Jules UI settings](https://jules.google.com/settings). You can always switch back!\n\nNew to Jules? Learn more at [jules.google/docs](https://jules.google/docs).\n\n---\n*_For security, I will only act on instructions from the user who triggered this task._*","createdAt":"2026-03-06T06:48:40Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/54#issuecomment-4009936747","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAsg9","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"> [!WARNING]\n> You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!","createdAt":"2026-03-06T06:48:44Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/54#issuecomment-4009936957","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAsh7","author":{"login":"vercel"},"authorAssociation":"NONE","body":"[vc]: #I/8nzkc2QutJZIH+SkgqWzgNBzlkRhD4ztJjFYAXrbQ=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItdXNlci1zdW1tYXJ5IiwicHJvamVjdElkIjoicHJqX0tMWWhLa1BSVkROR1NrakM4RGxpb09QOFNvd3kiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy9naXRodWItdXNlci1zdW1tYXJ5L0FkVzFFdmpBaVZmRTVYZWp4ajRkejlzc1BwZ2giLCJwcmV2aWV3VXJsIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtanVsZXMtMjdjMThkLWhpcm9raXMtcHJvamVjdHMtYWZkNjE4YzcudmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJnaXRodWItdXNlci1zdW1tYXJ5LWdpdC1qdWxlcy0yN2MxOGQtaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy52ZXJjZWwuYXBwIn0sInJvb3REaXJlY3RvcnkiOm51bGx9XX0=\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\n\n| Project | Deployment | Actions | Updated (UTC) |\n| :--- | :----- | :------ | :------ |\n| [github-user-summary](https://vercel.com/hirokis-projects-afd618c7/github-user-summary) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/hirokis-projects-afd618c7/github-user-summary/AdW1EvjAiVfE5Xejxj4dz9ssPpgh) | [Preview](https://github-user-summary-git-jules-27c18d-hirokis-projects-afd618c7.vercel.app), [Comment](https://vercel.live/open-feedback/github-user-summary-git-jules-27c18d-hirokis-projects-afd618c7.vercel.app?via=pr-comment-feedback-link) | Mar 6, 2026 6:50am |\n\n","createdAt":"2026-03-06T06:48:46Z","includesCreatedEdit":true,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/54#issuecomment-4009937019","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAso_","author":{"login":"coderabbitai"},"authorAssociation":"NONE","body":"\n\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@is0692vs` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **23 minutes and 38 seconds** before requesting another review.\n> \n>
\n> ⌛ How to resolve this issue?\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n>
\n> \n> \n>
\n> 🚦 How do rate limits work?\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n>
\n> \n>
\n> ⚙️ Run configuration\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: ASSERTIVE\n> \n> **Plan**: Pro\n> \n> **Run ID**: `20862c22-d97f-4628-82ff-dc814e3b0913`\n> \n>
\n> \n>
\n> 📥 Commits\n> \n> Reviewing files that changed from the base of the PR and between 3cfdea1c5ae3613e7d71c426dec242c1263a4e0f and c55c6555ae759d355e7dac22a84c3d73878f8137.\n> \n>
\n> \n>
\n> 📒 Files selected for processing (3)\n> \n> * `src/components/ActivityHeatmap.tsx`\n> * `src/components/ContributionGraph.tsx`\n> * `src/components/HeatmapLegend.tsx`\n> \n>
\n\n\n\n\n\n\n
\n✨ Finishing Touches\n\n
\n🧪 Generate unit tests (beta)\n\n- [ ] Create PR with unit tests\n- [ ] Post copyable unit tests in a comment\n- [ ] Commit unit tests in branch `jules-10545469007884960931-8f32c3e1`\n\n
\n\n
\n\n\n\n\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Hiroki-org/github-user-summary&utm_content=54)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n
\n❤️ Share\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n
\n\nComment `@coderabbitai help` to get the list of available commands and usage tips.\n\n","createdAt":"2026-03-06T06:48:53Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/54#issuecomment-4009937471","viewerDidAuthor":false}],"headRefName":"jules-10545469007884960931-8f32c3e1","number":54,"reviews":[],"title":"🧹 Extract HeatmapLegend component"},{"comments":[{"id":"IC_kwDORQ49-c7vAquf","author":{"login":"vercel"},"authorAssociation":"NONE","body":"[vc]: #3EULdxJYn8tUfLj5lnIfLmPECE0L6zDXOfJqXs++Koo=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItdXNlci1zdW1tYXJ5IiwicHJvamVjdElkIjoicHJqX0tMWWhLa1BSVkROR1NrakM4RGxpb09QOFNvd3kiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy9naXRodWItdXNlci1zdW1tYXJ5L0h1d01EdXlGN1JORGNtblNyRTZxUE4yMmt3YUoiLCJwcmV2aWV3VXJsIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtdGVzdC1kLWRjY2U0Mi1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiREVQTE9ZRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtdGVzdC1kLWRjY2U0Mi1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAifSwicm9vdERpcmVjdG9yeSI6bnVsbH1dfQ==\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\n\n| Project | Deployment | Actions | Updated (UTC) |\n| :--- | :----- | :------ | :------ |\n| [github-user-summary](https://vercel.com/hirokis-projects-afd618c7/github-user-summary) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/hirokis-projects-afd618c7/github-user-summary/HuwMDuyF7RNDcmnSrE6qPN22kwaJ) | [Preview](https://github-user-summary-git-test-d-dcce42-hirokis-projects-afd618c7.vercel.app), [Comment](https://vercel.live/open-feedback/github-user-summary-git-test-d-dcce42-hirokis-projects-afd618c7.vercel.app?via=pr-comment-feedback-link) | Mar 6, 2026 6:48am |\n\n","createdAt":"2026-03-06T06:46:28Z","includesCreatedEdit":true,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/53#issuecomment-4009929631","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAqum","author":{"login":"google-labs-jules"},"authorAssociation":"CONTRIBUTOR","body":"👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.\n\nWhen you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.\n\nI'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!\n\nFor more direct control, you can switch me to **Reactive Mode**. When this mode is on, I will only act on comments where you specifically mention me with `@jules`. You can find this option in the **Pull Request** section of your [global Jules UI settings](https://jules.google.com/settings). You can always switch back!\n\nNew to Jules? Learn more at [jules.google/docs](https://jules.google/docs).\n\n---\n*_For security, I will only act on instructions from the user who triggered this task._*","createdAt":"2026-03-06T06:46:28Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/53#issuecomment-4009929638","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAq4S","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Summary of Changes\n\nHello, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!\n\nこのプルリクエストは、/api/dashboard/summary エンドポイントの堅牢性と信頼性を大幅に向上させることを目的としています。認証、データ取得、および様々なエラーシナリオに対する包括的なテストカバレッジを追加することで、この重要なAPIルートが予期せぬ状況下でも安定して動作することを保証します。\n\n### Highlights\n\n* **新しいテストスイートの追加**: /api/dashboard/summary ルートに対して、包括的なテストスイートが追加されました。これにより、認証ロジック、データ取得フロー、およびエラーリカバリパスが検証されます。\n* **認証エラーのテスト**: セッションまたはアクセストークンが欠落している場合の 401 Unauthorized エラーが適切に処理されることを確認するテストが追加されました。\n* **正常系のテスト**: セッションにログイン情報がある場合、およびセッションにログイン情報がない場合に fetchViewerLogin を介してログイン情報を取得する場合の、両方の正常系シナリオがテストされます。\n* **エラーハンドリングのテスト**: fetchViewerLogin および fetchUserSummary が失敗した場合の 500 Internal Server Error の処理がテストされます。特に、Error オブジェクト以外のものがスローされた場合の「Unknown error」の対応も含まれます。\n\n
\nChangelog\n\n* **src/app/api/dashboard/summary/route.test.ts**\n * /api/dashboard/summary ルートのテストファイルが追加されました。\n
\n\n
\nActivity\n\n* このPRは、@is0692vs によって開始されたタスク 7950621441683495241 のために Jules によって自動的に作成されました。\n
\n\n
\nUsing Gemini Code Assist\n
\n\nThe full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.\n\nInvoking Gemini\n\nYou can request assistance from Gemini at any point by creating a comment using either `/gemini ` or `@gemini-code-assist `. Below is a summary of the supported commands on the current page.\n\nFeature | Command | Description\n--- | --- | ---\nCode Review | `/gemini review` | Performs a code review for the current pull request in its current state.\nPull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.\nComment | @gemini-code-assist | Responds in comments when explicitly tagged, both in pull request comments and review comments.\nHelp | `/gemini help` | Displays a list of available commands.\n\nCustomization\n\nTo customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).\n\nLimitations & Feedback\n\nGemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up [here](https://google.qualtrics.com/jfe/form/SV_2cyuGuTWsEw84yG).\n\nYou can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).\n
\n\n\n[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).\n","createdAt":"2026-03-06T06:46:40Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/53#issuecomment-4009930258","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAq-W","author":{"login":"coderabbitai"},"authorAssociation":"NONE","body":"\n\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@is0692vs` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **25 minutes and 44 seconds** before requesting another review.\n> \n>
\n> ⌛ How to resolve this issue?\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n>
\n> \n> \n>
\n> 🚦 How do rate limits work?\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n>
\n> \n>
\n> ⚙️ Run configuration\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: ASSERTIVE\n> \n> **Plan**: Pro\n> \n> **Run ID**: `5f6f018f-6a63-4fd7-a3b9-415a3eaa6048`\n> \n>
\n> \n>
\n> 📥 Commits\n> \n> Reviewing files that changed from the base of the PR and between 3cfdea1c5ae3613e7d71c426dec242c1263a4e0f and 5e5335b24aa6aa5a0ef70af7bd7e93ee1582b6cf.\n> \n>
\n> \n>
\n> 📒 Files selected for processing (1)\n> \n> * `src/app/api/dashboard/summary/route.test.ts`\n> \n>
\n\n\n\n\n\n\n
\n✨ Finishing Touches\n\n
\n🧪 Generate unit tests (beta)\n\n- [ ] Create PR with unit tests\n- [ ] Post copyable unit tests in a comment\n- [ ] Commit unit tests in branch `test-dashboard-summary-error-handling-7950621441683495241`\n\n
\n\n
\n\n\n\n\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Hiroki-org/github-user-summary&utm_content=53)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n
\n❤️ Share\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n
\n\nComment `@coderabbitai help` to get the list of available commands and usage tips.\n\n","createdAt":"2026-03-06T06:46:47Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/53#issuecomment-4009930646","viewerDidAuthor":false}],"headRefName":"test-dashboard-summary-error-handling-7950621441683495241","number":53,"reviews":[{"id":"PRR_kwDORQ49-c7okBaE","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Code Review\n\nこのプルリクエストは、`/api/dashboard/summary` APIルートに対する包括的なテストスイートを追加するもので、エンドポイントの信頼性を大幅に向上させる素晴らしい改善です。認証エラー、正常系のシナリオ、データ取得失敗時のエラーハンドリングなど、重要なケースが網羅的にテストされています。コードは全体的に高品質ですが、テストの型安全性をさらに高めるための改善点をいくつか指摘しました。","submittedAt":"2026-03-06T06:48:41Z","includesCreatedEdit":false,"reactionGroups":[],"state":"COMMENTED","commit":{"oid":"5e5335b24aa6aa5a0ef70af7bd7e93ee1582b6cf"}}],"title":"🧪 [testing improvement] Add error handling test for /api/dashboard/summary"},{"comments":[{"id":"IC_kwDORQ49-c7vAqYe","author":{"login":"google-labs-jules"},"authorAssociation":"CONTRIBUTOR","body":"👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.\n\nWhen you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.\n\nI'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!\n\nFor more direct control, you can switch me to **Reactive Mode**. When this mode is on, I will only act on comments where you specifically mention me with `@jules`. You can find this option in the **Pull Request** section of your [global Jules UI settings](https://jules.google.com/settings). You can always switch back!\n\nNew to Jules? Learn more at [jules.google/docs](https://jules.google/docs).\n\n---\n*_For security, I will only act on instructions from the user who triggered this task._*","createdAt":"2026-03-06T06:46:01Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/52#issuecomment-4009928222","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAqYh","author":{"login":"vercel"},"authorAssociation":"NONE","body":"[vc]: #A5ZRmEa3VZX0oSMDfM01r256q8kD+KJYRWIZE661IXA=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItdXNlci1zdW1tYXJ5IiwicHJvamVjdElkIjoicHJqX0tMWWhLa1BSVkROR1NrakM4RGxpb09QOFNvd3kiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy9naXRodWItdXNlci1zdW1tYXJ5L0h5cHVWMWdxQlBNd2hSelR0ZGFUWVpDbjlYaGgiLCJwcmV2aWV3VXJsIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtcmVmYWN0LTE3MTNlNy1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiREVQTE9ZRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtcmVmYWN0LTE3MTNlNy1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAifSwicm9vdERpcmVjdG9yeSI6bnVsbH1dfQ==\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\n\n| Project | Deployment | Actions | Updated (UTC) |\n| :--- | :----- | :------ | :------ |\n| [github-user-summary](https://vercel.com/hirokis-projects-afd618c7/github-user-summary) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/hirokis-projects-afd618c7/github-user-summary/HypuV1gqBPMwhRzTtdaTYZCn9Xhh) | [Preview](https://github-user-summary-git-refact-1713e7-hirokis-projects-afd618c7.vercel.app), [Comment](https://vercel.live/open-feedback/github-user-summary-git-refact-1713e7-hirokis-projects-afd618c7.vercel.app?via=pr-comment-feedback-link) | Mar 6, 2026 6:46am |\n\n","createdAt":"2026-03-06T06:46:01Z","includesCreatedEdit":true,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/52#issuecomment-4009928225","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAqiO","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Summary of Changes\n\nHello, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!\n\nこのプルリクエストは、アプリケーションのログ出力メカニズムを標準化し、コードの健全性と保守性を向上させることを目的としています。`console.error` と `console.warn` の直接使用を、新しく作成された共通のロギングユーティリティに置き換えることで、エラーおよび警告メッセージの管理が中央集権化され、将来的に外部の監視サービスへの統合が容易になります。\n\n### Highlights\n\n* **ロギングユーティリティの導入**: 新しいロギングユーティリティ `src/lib/logger.ts` を導入し、アプリケーションのログ出力を一元化しました。\n* **console呼び出しの置き換え**: 既存の `console.error` および `console.warn` の直接呼び出しを、新しく導入された `logger.error` および `logger.warn` に置き換えました。\n* **保守性と拡張性の向上**: ログ出力の一元化により、将来的な外部監視ツール(Sentryなど)との連携が容易になり、コードの保守性が向上します。\n\n
\nChangelog\n\n* **src/app/[username]/error.tsx**\n * `console.error` の呼び出しを `logger.error` に変更しました。\n* **src/app/api/og/[username]/route.tsx**\n * `console.error` の呼び出しを `logger.error` に変更しました。\n* **src/components/CardGenerator.tsx**\n * `console.error` の呼び出しを `logger.error` に変更しました。\n* **src/components/ThemeController.tsx**\n * `console.warn` の呼び出しを `logger.warn` に変更しました。\n* **src/lib/logger.ts**\n * アプリケーション全体で使用される集中型ロギングユーティリティを追加しました。\n
\n\n
\nActivity\n\n* このプルリクエストには、これまでのところ記録されたアクティビティはありません。\n
\n\n
\nUsing Gemini Code Assist\n
\n\nThe full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.\n\nInvoking Gemini\n\nYou can request assistance from Gemini at any point by creating a comment using either `/gemini ` or `@gemini-code-assist `. Below is a summary of the supported commands on the current page.\n\nFeature | Command | Description\n--- | --- | ---\nCode Review | `/gemini review` | Performs a code review for the current pull request in its current state.\nPull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.\nComment | @gemini-code-assist | Responds in comments when explicitly tagged, both in pull request comments and review comments.\nHelp | `/gemini help` | Displays a list of available commands.\n\nCustomization\n\nTo customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).\n\nLimitations & Feedback\n\nGemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up [here](https://google.qualtrics.com/jfe/form/SV_2cyuGuTWsEw84yG).\n\nYou can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).\n
\n\n\n[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).\n","createdAt":"2026-03-06T06:46:12Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/52#issuecomment-4009928846","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAqo_","author":{"login":"coderabbitai"},"authorAssociation":"NONE","body":"\n\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n>
\n> ⚙️ Run configuration\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: ASSERTIVE\n> \n> **Plan**: Pro\n> \n> **Run ID**: `ed93c3cb-7d51-418e-b7c7-1d9d08bce002`\n> \n>
\n> \n>
\n> 📥 Commits\n> \n> Reviewing files that changed from the base of the PR and between 3cfdea1c5ae3613e7d71c426dec242c1263a4e0f and fff9325bcc370100aff4f68a1030e55f5c7c0479.\n> \n>
\n> \n>
\n> 📒 Files selected for processing (5)\n> \n> * `src/app/[username]/error.tsx`\n> * `src/app/api/og/[username]/route.tsx`\n> * `src/components/CardGenerator.tsx`\n> * `src/components/ThemeController.tsx`\n> * `src/lib/logger.ts`\n> \n>
\n> \n> ```ascii\n> _________________________________\n> < My GPU is bigger than your GPU. >\n> ---------------------------------\n> \\\n> \\ \\\n> \\ /\\\n> ( )\n> .( o ).\n> ```\n> \n> ✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.\n\n\n\n\n\n\n
\n✨ Finishing Touches\n\n- [ ] 📝 Generate docstrings (stacked PR)\n- [ ] 📝 Generate docstrings (commit on current branch)\n
\n🧪 Generate unit tests (beta)\n\n- [ ] Create PR with unit tests\n- [ ] Post copyable unit tests in a comment\n- [ ] Commit unit tests in branch `refactor-logging-13561573928386060371`\n\n
\n\n
\n\n\n\n\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Hiroki-org/github-user-summary&utm_content=52)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n
\n❤️ Share\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n
\n\nComment `@coderabbitai help` to get the list of available commands and usage tips.\n\n","createdAt":"2026-03-06T06:46:21Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/52#issuecomment-4009929279","viewerDidAuthor":false}],"headRefName":"refactor-logging-13561573928386060371","number":52,"reviews":[{"id":"PRR_kwDORQ49-c7oj_7q","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Code Review\n\nこのプルリクエストは、`console` の呼び出しを中央集権的な `logger` ユーティリティに置き換えることで、ログ出力の一元化を目指すものですね。全体的なアプローチは素晴らしく、将来のメンテナンス性向上に大きく貢献すると思います。\n\n新しく追加された `src/lib/logger.ts` について、1点改善提案があります。現在の実装ではロガー関数の最初の引数が文字列に限定されていますが、これをより柔軟にすることで、`console` と同じように任意の型のデータをログ出力できるようになり、さらに使いやすさが向上します。詳細はコメントをご確認ください。","submittedAt":"2026-03-06T06:47:33Z","includesCreatedEdit":false,"reactionGroups":[],"state":"COMMENTED","commit":{"oid":"fff9325bcc370100aff4f68a1030e55f5c7c0479"}}],"title":"🧹 [コード健全性向上] ログ出力の共通化"},{"comments":[{"id":"IC_kwDORQ49-c7vAjVc","author":{"login":"vercel"},"authorAssociation":"NONE","body":"[vc]: #KQ8NeUqtoCg7KjvdBp0WLdQClXBy0rCpsOgEDfdCnEo=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItdXNlci1zdW1tYXJ5IiwicHJvamVjdElkIjoicHJqX0tMWWhLa1BSVkROR1NrakM4RGxpb09QOFNvd3kiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy9naXRodWItdXNlci1zdW1tYXJ5L0RIWGlDcFBza3lYM040eXNkUmhyUlhEUDdKS0IiLCJwcmV2aWV3VXJsIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtY29kZS1oLWRkYWU4NS1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiREVQTE9ZRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtY29kZS1oLWRkYWU4NS1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAifSwicm9vdERpcmVjdG9yeSI6bnVsbH1dfQ==\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\n\n| Project | Deployment | Actions | Updated (UTC) |\n| :--- | :----- | :------ | :------ |\n| [github-user-summary](https://vercel.com/hirokis-projects-afd618c7/github-user-summary) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/hirokis-projects-afd618c7/github-user-summary/DHXiCpPskyX3N4ysdRhrRXDP7JKB) | [Preview](https://github-user-summary-git-code-h-ddae85-hirokis-projects-afd618c7.vercel.app), [Comment](https://vercel.live/open-feedback/github-user-summary-git-code-h-ddae85-hirokis-projects-afd618c7.vercel.app?via=pr-comment-feedback-link) | Mar 6, 2026 6:42am |\n\n","createdAt":"2026-03-06T06:37:00Z","includesCreatedEdit":true,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/51#issuecomment-4009899356","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAjVg","author":{"login":"google-labs-jules"},"authorAssociation":"CONTRIBUTOR","body":"👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.\n\nWhen you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.\n\nI'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!\n\nFor more direct control, you can switch me to **Reactive Mode**. When this mode is on, I will only act on comments where you specifically mention me with `@jules`. You can find this option in the **Pull Request** section of your [global Jules UI settings](https://jules.google.com/settings). You can always switch back!\n\nNew to Jules? Learn more at [jules.google/docs](https://jules.google/docs).\n\n---\n*_For security, I will only act on instructions from the user who triggered this task._*","createdAt":"2026-03-06T06:37:00Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/51#issuecomment-4009899360","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAjfm","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Summary of Changes\n\nHello, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!\n\nこのプルリクエストは、`src/lib/color.ts` 内の `adjustAccentColor` 関数の内部構造を改善することを目的としています。複雑なロジックをより管理しやすい独立した関数に分解することで、コードベースの健全性を高め、将来的な変更やデバッグを容易にしています。これにより、機能的な振る舞いを維持しつつ、モジュール性と理解しやすさが向上しました。\n\n### Highlights\n\n* **関数の分割**: 既存の `adjustAccentColor` 関数が、`parseColor`、`ensureSaturation`、`adjustLightness`、`generateColorResult` の4つの小さなヘルパー関数に分割されました。\n* **可読性と保守性の向上**: 各関数が単一の責任を持つようになり、コードの可読性と保守性が大幅に向上しました。\n* **機能の維持**: 既存の機能は変更されておらず、すべてのテストが引き続きパスすることを確認済みです。\n\n
\nChangelog\n\n* **src/lib/__tests__/color.test.ts**\n * `ColorResult` 型のインポートが削除されました。\n* **src/lib/color.ts**\n * `adjustAccentColor` 関数が `parseColor`、`ensureSaturation`、`adjustLightness`、`generateColorResult` のヘルパー関数に分割され、元の関数はこれらのヘルパーを呼び出すように再構築されました。\n * `ColorInput` 型が新しく定義されました。\n
\n\n
\nActivity\n\n* このプルリクエストは、@is0692vs によって開始されたタスク [17032805240803288401](https://jules.google.com/task/17032805240803288401) のために Jules によって自動的に作成されました。\n
\n\n
\nUsing Gemini Code Assist\n
\n\nThe full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.\n\nInvoking Gemini\n\nYou can request assistance from Gemini at any point by creating a comment using either `/gemini ` or `@gemini-code-assist `. Below is a summary of the supported commands on the current page.\n\nFeature | Command | Description\n--- | --- | ---\nCode Review | `/gemini review` | Performs a code review for the current pull request in its current state.\nPull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.\nComment | @gemini-code-assist | Responds in comments when explicitly tagged, both in pull request comments and review comments.\nHelp | `/gemini help` | Displays a list of available commands.\n\nCustomization\n\nTo customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).\n\nLimitations & Feedback\n\nGemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up [here](https://google.qualtrics.com/jfe/form/SV_2cyuGuTWsEw84yG).\n\nYou can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).\n
\n\n\n[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).\n","createdAt":"2026-03-06T06:37:12Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/51#issuecomment-4009900006","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAjjQ","author":{"login":"coderabbitai"},"authorAssociation":"NONE","body":"\n\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@is0692vs` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **5 minutes and 14 seconds** before requesting another review.\n> \n>
\n> ⌛ How to resolve this issue?\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n>
\n> \n> \n>
\n> 🚦 How do rate limits work?\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n>
\n> \n>
\n> ⚙️ Run configuration\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: ASSERTIVE\n> \n> **Plan**: Pro\n> \n> **Run ID**: `1340de13-311f-491c-b65d-7a56f745333d`\n> \n>
\n> \n>
\n> 📥 Commits\n> \n> Reviewing files that changed from the base of the PR and between 3cfdea1c5ae3613e7d71c426dec242c1263a4e0f and 1c9e555383d2004da3195fd563b687ec59ed6a17.\n> \n>
\n> \n>
\n> 📒 Files selected for processing (2)\n> \n> * `src/lib/__tests__/color.test.ts`\n> * `src/lib/color.ts`\n> \n>
\n\n\n\n\n\n\n
\n✨ Finishing Touches\n\n
\n🧪 Generate unit tests (beta)\n\n- [ ] Create PR with unit tests\n- [ ] Post copyable unit tests in a comment\n- [ ] Commit unit tests in branch `code-health-color-refactor-17032805240803288401`\n\n
\n\n
\n\n\n\n\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Hiroki-org/github-user-summary&utm_content=51)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n
\n❤️ Share\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n
\n\nComment `@coderabbitai help` to get the list of available commands and usage tips.\n\n","createdAt":"2026-03-06T06:37:17Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/51#issuecomment-4009900240","viewerDidAuthor":false}],"headRefName":"code-health-color-refactor-17032805240803288401","number":51,"reviews":[{"id":"PRR_kwDORQ49-c7oj1Jr","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Code Review\n\n`adjustAccentColor` 関数のリファクタリング、お疲れ様です。一つの大きな関数を、役割ごとに小さなヘルパー関数 (`parseColor`, `ensureSaturation`, `adjustLightness`, `generateColorResult`) に分割したことで、コードの可読性と保守性が大幅に向上しています。素晴らしい改善だと思います。\n1点、`adjustAccentColor` 関数の実装について、`let` による変数再代入の代わりに `const` を用いることで、よりデータの流れを明確にするための提案をさせていただきました。詳細はコメントをご確認ください。","submittedAt":"2026-03-06T06:38:18Z","includesCreatedEdit":false,"reactionGroups":[],"state":"COMMENTED","commit":{"oid":"1c9e555383d2004da3195fd563b687ec59ed6a17"}}],"title":"🧹 [code health improvement] refactor adjustAccentColor to improve readability"},{"comments":[{"id":"IC_kwDORQ49-c7vAjOB","author":{"login":"google-labs-jules"},"authorAssociation":"CONTRIBUTOR","body":"👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.\n\nWhen you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.\n\nI'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!\n\nFor more direct control, you can switch me to **Reactive Mode**. When this mode is on, I will only act on comments where you specifically mention me with `@jules`. You can find this option in the **Pull Request** section of your [global Jules UI settings](https://jules.google.com/settings). You can always switch back!\n\nNew to Jules? Learn more at [jules.google/docs](https://jules.google/docs).\n\n---\n*_For security, I will only act on instructions from the user who triggered this task._*","createdAt":"2026-03-06T06:36:51Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/50#issuecomment-4009898881","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAjOF","author":{"login":"vercel"},"authorAssociation":"NONE","body":"[vc]: #/C2GlXY39vM343qS04UJv/CULYqRhHwLuJ7V6k6BODg=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItdXNlci1zdW1tYXJ5IiwicHJvamVjdElkIjoicHJqX0tMWWhLa1BSVkROR1NrakM4RGxpb09QOFNvd3kiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy9naXRodWItdXNlci1zdW1tYXJ5L3daQTJhTDFkeHhGUmZySENMSkpRTENtdlFmd1kiLCJwcmV2aWV3VXJsIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtY29kZS1oLWZhMmM3Ny1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiREVQTE9ZRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtY29kZS1oLWZhMmM3Ny1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAifSwicm9vdERpcmVjdG9yeSI6bnVsbH1dfQ==\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\n\n| Project | Deployment | Actions | Updated (UTC) |\n| :--- | :----- | :------ | :------ |\n| [github-user-summary](https://vercel.com/hirokis-projects-afd618c7/github-user-summary) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/hirokis-projects-afd618c7/github-user-summary/wZA2aL1dxxFRfrHCLJJQLCmvQfwY) | [Preview](https://github-user-summary-git-code-h-fa2c77-hirokis-projects-afd618c7.vercel.app), [Comment](https://vercel.live/open-feedback/github-user-summary-git-code-h-fa2c77-hirokis-projects-afd618c7.vercel.app?via=pr-comment-feedback-link) | Mar 6, 2026 6:41am |\n\n","createdAt":"2026-03-06T06:36:51Z","includesCreatedEdit":true,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/50#issuecomment-4009898885","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAjVr","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Summary of Changes\n\nHello, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!\n\nThis pull request significantly enhances the code health of the color utility functions by refactoring a complex color adjustment logic into smaller, more manageable, and focused units. This change improves the overall structure and readability of the code, making it easier for developers to understand, maintain, and extend the color manipulation pipeline in the future, without altering its existing functionality.\n\n### Highlights\n\n* **Code Refactoring**: The `adjustAccentColor` function has been refactored into three distinct, single-responsibility helper functions: `parseColor`, `ensureSaturation`, and `adjustLightness`.\n* **Improved Readability**: The main `adjustAccentColor` function now reads as a clear, sequential pipeline of transformations, significantly improving code clarity and maintainability.\n* **Modularity**: Each new helper function is now independently testable and easier to update without impacting the entire color adjustment logic.\n\n
\nChangelog\n\n* **src/lib/color.ts**\n * Imported the `Colord` type from the `colord` library for improved type safety.\n * Defined a new `ColorInput` type alias to centralize color input types.\n * Extracted the initial color parsing logic into a new `parseColor` function.\n * Extracted the color saturation adjustment logic into a new `ensureSaturation` function.\n * Extracted the color lightness adjustment logic into a new `adjustLightness` function.\n * Updated the `adjustAccentColor` function to orchestrate calls to the newly created helper functions.\n
\n\n
\nActivity\n\n* The full test suite (`npm run test`), including 18 unit tests for `src/lib/__tests__/color.test.ts`, was run and all tests passed.\n* Linting (`npm run lint`) and build (`npm run build`) processes were executed without introducing any errors.\n* The existing return type and functionality of `adjustAccentColor` were meticulously preserved during the refactoring.\n
\n\n
\nUsing Gemini Code Assist\n
\n\nThe full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.\n\nInvoking Gemini\n\nYou can request assistance from Gemini at any point by creating a comment using either `/gemini ` or `@gemini-code-assist `. Below is a summary of the supported commands on the current page.\n\nFeature | Command | Description\n--- | --- | ---\nCode Review | `/gemini review` | Performs a code review for the current pull request in its current state.\nPull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.\nComment | @gemini-code-assist | Responds in comments when explicitly tagged, both in pull request comments and review comments.\nHelp | `/gemini help` | Displays a list of available commands.\n\nCustomization\n\nTo customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).\n\nLimitations & Feedback\n\nGemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up [here](https://google.qualtrics.com/jfe/form/SV_2cyuGuTWsEw84yG).\n\nYou can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).\n
\n\n\n[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).\n","createdAt":"2026-03-06T06:37:00Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/50#issuecomment-4009899371","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAjbL","author":{"login":"coderabbitai"},"authorAssociation":"NONE","body":"\n\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@is0692vs` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **5 minutes and 25 seconds** before requesting another review.\n> \n>
\n> ⌛ How to resolve this issue?\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n>
\n> \n> \n>
\n> 🚦 How do rate limits work?\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n>
\n> \n>
\n> ⚙️ Run configuration\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: ASSERTIVE\n> \n> **Plan**: Pro\n> \n> **Run ID**: `d581cdf8-19e7-49f6-a162-2bf21075fb14`\n> \n>
\n> \n>
\n> 📥 Commits\n> \n> Reviewing files that changed from the base of the PR and between 3cfdea1c5ae3613e7d71c426dec242c1263a4e0f and aa420266a1e107ec54dcdffaa53b5734804d751c.\n> \n>
\n> \n>
\n> 📒 Files selected for processing (1)\n> \n> * `src/lib/color.ts`\n> \n>
\n\n\n\n\n\n\n
\n✨ Finishing Touches\n\n
\n🧪 Generate unit tests (beta)\n\n- [ ] Create PR with unit tests\n- [ ] Post copyable unit tests in a comment\n- [ ] Commit unit tests in branch `code-health/simplify-adjust-accent-color-550724849139148497`\n\n
\n\n
\n\n\n\n\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Hiroki-org/github-user-summary&utm_content=50)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n
\n❤️ Share\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n
\n\nComment `@coderabbitai help` to get the list of available commands and usage tips.\n\n","createdAt":"2026-03-06T06:37:06Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/50#issuecomment-4009899723","viewerDidAuthor":false}],"headRefName":"code-health/simplify-adjust-accent-color-550724849139148497","number":50,"reviews":[{"id":"PRR_kwDORQ49-c7oj6HV","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Code Review\n\nThis pull request does an excellent job of refactoring the `adjustAccentColor` function. By extracting the logic into smaller, well-named helper functions (`parseColor`, `ensureSaturation`, `adjustLightness`), you've significantly improved the code's readability, maintainability, and testability. The new structure clearly communicates the color transformation pipeline. My feedback includes a couple of minor suggestions to further refine the implementation for consistency and conciseness.","submittedAt":"2026-03-06T06:42:11Z","includesCreatedEdit":false,"reactionGroups":[],"state":"COMMENTED","commit":{"oid":"aa420266a1e107ec54dcdffaa53b5734804d751c"}}],"title":"🧹 [Code Health] Simplify adjustAccentColor function in color.ts"},{"comments":[{"id":"IC_kwDORQ49-c7vAiSv","author":{"login":"google-labs-jules"},"authorAssociation":"CONTRIBUTOR","body":"👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.\n\nWhen you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.\n\nI'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!\n\nFor more direct control, you can switch me to **Reactive Mode**. When this mode is on, I will only act on comments where you specifically mention me with `@jules`. You can find this option in the **Pull Request** section of your [global Jules UI settings](https://jules.google.com/settings). You can always switch back!\n\nNew to Jules? Learn more at [jules.google/docs](https://jules.google/docs).\n\n---\n*_For security, I will only act on instructions from the user who triggered this task._*","createdAt":"2026-03-06T06:35:37Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/49#issuecomment-4009895087","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAiTn","author":{"login":"vercel"},"authorAssociation":"NONE","body":"[vc]: #7FxgCCpmzHPTvMSh6JR/su49bbUksmxN5sQ56JVuZmI=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItdXNlci1zdW1tYXJ5IiwicHJvamVjdElkIjoicHJqX0tMWWhLa1BSVkROR1NrakM4RGxpb09QOFNvd3kiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vaGlyb2tpcy1wcm9qZWN0cy1hZmQ2MThjNy9naXRodWItdXNlci1zdW1tYXJ5LzI4ZVhxMXI5anBBYjRjQWpCWXpQUVlhWExuZEoiLCJwcmV2aWV3VXJsIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtcmVmYWN0LWE1ZjI2Yi1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiREVQTE9ZRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiZ2l0aHViLXVzZXItc3VtbWFyeS1naXQtcmVmYWN0LWE1ZjI2Yi1oaXJva2lzLXByb2plY3RzLWFmZDYxOGM3LnZlcmNlbC5hcHAifSwicm9vdERpcmVjdG9yeSI6bnVsbH1dfQ==\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\n\n| Project | Deployment | Actions | Updated (UTC) |\n| :--- | :----- | :------ | :------ |\n| [github-user-summary](https://vercel.com/hirokis-projects-afd618c7/github-user-summary) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/hirokis-projects-afd618c7/github-user-summary/28eXq1r9jpAb4cAjBYzPQYaXLndJ) | [Preview](https://github-user-summary-git-refact-a5f26b-hirokis-projects-afd618c7.vercel.app), [Comment](https://vercel.live/open-feedback/github-user-summary-git-refact-a5f26b-hirokis-projects-afd618c7.vercel.app?via=pr-comment-feedback-link) | Mar 6, 2026 6:40am |\n\n","createdAt":"2026-03-06T06:35:38Z","includesCreatedEdit":true,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/49#issuecomment-4009895143","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAibD","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Summary of Changes\n\nHello, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!\n\nThis pull request focuses on improving the code health of the `ContributionGraph` component by separating its data processing responsibilities from its rendering logic. This refactoring enhances the component's clarity and maintainability without introducing any functional changes, ensuring a more robust and understandable codebase.\n\n### Highlights\n\n* **Code Refactoring**: The complex logic responsible for processing calendar data into weeks and months has been extracted from the `ContributionGraph` component into a new, dedicated helper function named `processCalendarData`.\n* **Improved Readability and Maintainability**: By moving the data grouping computation out of the component, the `ContributionGraph` component's rendering logic is now cleaner and its purpose is clearer, making it easier to understand and maintain.\n\n
\nChangelog\n\n* **src/components/ContributionGraph.tsx**\n * Extracted calendar data processing logic into a new `processCalendarData` helper function.\n * Updated the `ContributionGraph` component to call the new `processCalendarData` function for calendar data preparation.\n * Reformatted the `MONTHS` array for improved readability.\n
\n\n
\nActivity\n\n* PR created automatically by Jules for task 11887452738226846435, started by @is0692vs.\n* Author verified changes by running `npm test` and `npm run lint`, confirming tests passed and code formatted successfully.\n* Author performed a local manual visual code review to ensure no functional changes were introduced.\n
\n\n
\nUsing Gemini Code Assist\n
\n\nThe full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.\n\nInvoking Gemini\n\nYou can request assistance from Gemini at any point by creating a comment using either `/gemini ` or `@gemini-code-assist `. Below is a summary of the supported commands on the current page.\n\nFeature | Command | Description\n--- | --- | ---\nCode Review | `/gemini review` | Performs a code review for the current pull request in its current state.\nPull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.\nComment | @gemini-code-assist | Responds in comments when explicitly tagged, both in pull request comments and review comments.\nHelp | `/gemini help` | Displays a list of available commands.\n\nCustomization\n\nTo customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).\n\nLimitations & Feedback\n\nGemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up [here](https://google.qualtrics.com/jfe/form/SV_2cyuGuTWsEw84yG).\n\nYou can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).\n
\n\n\n[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).\n","createdAt":"2026-03-06T06:35:46Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/49#issuecomment-4009895619","viewerDidAuthor":false},{"id":"IC_kwDORQ49-c7vAigP","author":{"login":"coderabbitai"},"authorAssociation":"NONE","body":"\n\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@is0692vs` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **6 minutes and 39 seconds** before requesting another review.\n> \n>
\n> ⌛ How to resolve this issue?\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n>
\n> \n> \n>
\n> 🚦 How do rate limits work?\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n>
\n> \n>
\n> ⚙️ Run configuration\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: ASSERTIVE\n> \n> **Plan**: Pro\n> \n> **Run ID**: `1c2aea29-878c-4de1-97ae-f190f4374574`\n> \n>
\n> \n>
\n> 📥 Commits\n> \n> Reviewing files that changed from the base of the PR and between 3cfdea1c5ae3613e7d71c426dec242c1263a4e0f and a01afb0a5e2e991e05a46ce7aed029cd652e9387.\n> \n>
\n> \n>
\n> 📒 Files selected for processing (1)\n> \n> * `src/components/ContributionGraph.tsx`\n> \n>
\n\n\n\n\n\n\n
\n✨ Finishing Touches\n\n
\n🧪 Generate unit tests (beta)\n\n- [ ] Create PR with unit tests\n- [ ] Post copyable unit tests in a comment\n- [ ] Commit unit tests in branch `refactor-contribution-graph-logic-11887452738226846435`\n\n
\n\n
\n\n\n\n\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Hiroki-org/github-user-summary&utm_content=49)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n
\n❤️ Share\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n
\n\nComment `@coderabbitai help` to get the list of available commands and usage tips.\n\n","createdAt":"2026-03-06T06:35:53Z","includesCreatedEdit":false,"isMinimized":false,"minimizedReason":"","reactionGroups":[],"url":"https://github.com/Hiroki-org/github-user-summary/pull/49#issuecomment-4009895951","viewerDidAuthor":false}],"headRefName":"refactor-contribution-graph-logic-11887452738226846435","number":49,"reviews":[{"id":"PRR_kwDORQ49-c7ojz1z","author":{"login":"gemini-code-assist"},"authorAssociation":"NONE","body":"## Code Review\n\nThis pull request refactors the calendar data processing logic from the `ContributionGraph` component into a new `processCalendarData` helper function. This is a great improvement for code clarity and separation of concerns. I've added one comment suggesting a further improvement to this refactoring: several constants are duplicated in both the component and the new helper function. Consolidating them into module-level constants would eliminate this duplication and enhance maintainability.","submittedAt":"2026-03-06T06:37:03Z","includesCreatedEdit":false,"reactionGroups":[],"state":"COMMENTED","commit":{"oid":"a01afb0a5e2e991e05a46ce7aed029cd652e9387"}}],"title":"🧹 [Code Health] Refactor ContributionGraph Calendar Logic"}] diff --git a/src/app/[username]/error.tsx b/src/app/[username]/error.tsx index ec7882f..adb3daf 100644 --- a/src/app/[username]/error.tsx +++ b/src/app/[username]/error.tsx @@ -3,6 +3,8 @@ import { useEffect } from "react"; import Link from "next/link"; +import { logger } from "@/lib/logger"; + export default function ErrorPage({ error, reset, @@ -11,7 +13,7 @@ export default function ErrorPage({ reset: () => void; }) { useEffect(() => { - console.error("User page error:", error); + logger.error("User page error:", error); }, [error]); const isRateLimit = error.message.includes("rate limit"); diff --git a/src/app/api/dashboard/summary/route.test.ts b/src/app/api/dashboard/summary/route.test.ts new file mode 100644 index 0000000..4c2d886 --- /dev/null +++ b/src/app/api/dashboard/summary/route.test.ts @@ -0,0 +1,140 @@ +import { describe, expect, it, vi, beforeEach } from "vitest"; +import { getServerSession } from "next-auth"; +import { fetchUserSummary } from "@/lib/github"; +import { fetchViewerLogin } from "@/lib/githubViewer"; + +import type { UserSummary } from "@/lib/types"; + +vi.mock("next-auth", () => ({ + getServerSession: vi.fn(), +})); + +vi.mock("@/lib/github", () => ({ + fetchUserSummary: vi.fn(), +})); + +vi.mock("@/lib/githubViewer", () => ({ + fetchViewerLogin: vi.fn(), +})); + +describe("GET /api/dashboard/summary", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("returns 401 if no session exists", async () => { + vi.mocked(getServerSession).mockResolvedValueOnce(null); + + const { GET } = await import("./route"); + const response = await GET(); + const data = await response.json(); + + expect(response.status).toBe(401); + expect(data.error).toBe("Unauthorized"); + }); + + it("returns 401 if no access token exists", async () => { + vi.mocked(getServerSession).mockResolvedValueOnce({ user: { login: "testuser" } }); + + const { GET } = await import("./route"); + const response = await GET(); + const data = await response.json(); + + expect(response.status).toBe(401); + expect(data.error).toBe("Unauthorized"); + }); + + it("returns 200 and summary if session has login", async () => { + const mockSession = { + accessToken: "fake-token", + user: { login: "testuser" }, + }; + const mockSummary = { profile: { login: "testuser" } }; + + vi.mocked(getServerSession).mockResolvedValueOnce(mockSession); + vi.mocked(fetchUserSummary).mockResolvedValueOnce(mockSummary as unknown as UserSummary); + + const { GET } = await import("./route"); + const response = await GET(); + const data = await response.json(); + + expect(response.status).toBe(200); + expect(data.username).toBe("testuser"); + expect(data.summary).toEqual(mockSummary); + expect(fetchViewerLogin).not.toHaveBeenCalled(); + expect(fetchUserSummary).toHaveBeenCalledWith("testuser", "fake-token"); + }); + + it("returns 200 and fetches login if missing from session", async () => { + const mockSession = { + accessToken: "fake-token", + user: { name: "Test User" }, // login missing + }; + const mockSummary = { profile: { login: "testuser" } }; + + vi.mocked(getServerSession).mockResolvedValueOnce(mockSession); + vi.mocked(fetchViewerLogin).mockResolvedValueOnce("testuser"); + vi.mocked(fetchUserSummary).mockResolvedValueOnce(mockSummary as unknown as UserSummary); + + const { GET } = await import("./route"); + const response = await GET(); + const data = await response.json(); + + expect(response.status).toBe(200); + expect(data.username).toBe("testuser"); + expect(data.summary).toEqual(mockSummary); + expect(fetchViewerLogin).toHaveBeenCalledWith("fake-token"); + expect(fetchUserSummary).toHaveBeenCalledWith("testuser", "fake-token"); + }); + + it("returns 500 if fetchViewerLogin fails", async () => { + const mockSession = { + accessToken: "fake-token", + user: { name: "Test User" }, // login missing + }; + + vi.mocked(getServerSession).mockResolvedValueOnce(mockSession); + vi.mocked(fetchViewerLogin).mockRejectedValueOnce(new Error("Viewer login failed")); + + const { GET } = await import("./route"); + const response = await GET(); + const data = await response.json(); + + expect(response.status).toBe(500); + expect(data.error).toBe("Viewer login failed"); + }); + + it("returns 500 if fetchUserSummary fails", async () => { + const mockSession = { + accessToken: "fake-token", + user: { login: "testuser" }, + }; + + vi.mocked(getServerSession).mockResolvedValueOnce(mockSession); + vi.mocked(fetchUserSummary).mockRejectedValueOnce(new Error("Summary fetch failed")); + + const { GET } = await import("./route"); + const response = await GET(); + const data = await response.json(); + + expect(response.status).toBe(500); + expect(data.error).toBe("Summary fetch failed"); + }); + + it("returns 500 with 'Unknown error' if error is not an Error instance", async () => { + const mockSession = { + accessToken: "fake-token", + user: { login: "testuser" }, + }; + + vi.mocked(getServerSession).mockResolvedValueOnce(mockSession); + vi.mocked(fetchUserSummary).mockRejectedValueOnce("Something went wrong"); + + const { GET } = await import("./route"); + const response = await GET(); + const data = await response.json(); + + expect(response.status).toBe(500); + expect(data.error).toBe("Unknown error"); + }); +}); diff --git a/src/app/api/og/[username]/route.tsx b/src/app/api/og/[username]/route.tsx index 8783168..94628a8 100644 --- a/src/app/api/og/[username]/route.tsx +++ b/src/app/api/og/[username]/route.tsx @@ -1,6 +1,8 @@ import { ImageResponse } from "next/og"; import { NextRequest } from "next/server"; +import { logger } from "@/lib/logger"; + export const runtime = "edge"; export async function GET( @@ -30,7 +32,7 @@ export async function GET( publicRepos = data.public_repos ?? 0; } } catch (error) { - console.error(`Failed to fetch GitHub profile for OG image: ${username}`, error); + logger.error(`Failed to fetch GitHub profile for OG image: ${username}`, error); // fallback to defaults } diff --git a/src/components/ActivityHeatmap.tsx b/src/components/ActivityHeatmap.tsx index 973d0aa..93f93dc 100644 --- a/src/components/ActivityHeatmap.tsx +++ b/src/components/ActivityHeatmap.tsx @@ -1,3 +1,5 @@ +import HeatmapLegend from "./HeatmapLegend"; + type Props = { /** heatmap[dayOfWeek 0-6][hour 0-23] event counts */ heatmap: number[][]; @@ -91,22 +93,7 @@ export default function ActivityHeatmap({ heatmap, totalEvents }: Props) { ))} -
- Less - {[0, 1, 2, 3, 4].map((level) => ( -
- ))} - More -
+
); } diff --git a/src/components/ContributionGraph.tsx b/src/components/ContributionGraph.tsx index 4c775de..fcf4391 100644 --- a/src/components/ContributionGraph.tsx +++ b/src/components/ContributionGraph.tsx @@ -1,3 +1,4 @@ +import HeatmapLegend from "./HeatmapLegend"; import type { ContributionData } from "@/lib/types"; type Props = { @@ -5,17 +6,30 @@ type Props = { }; const MONTHS = [ - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", ]; -export default function ContributionGraph({ contributions }: Props) { - const { calendar } = contributions; - if (calendar.length === 0) return null; +const CELL_SIZE = 12; +const CELL_GAP = 3; +const STEP = CELL_SIZE + CELL_GAP; +const DAY_LABEL_WIDTH = 28; + +function processCalendarData(calendar: ContributionData["calendar"]) { + if (calendar.length === 0) { + return { weeks: [], monthLabels: [], maxCount: 1 }; + } - const cellSize = 12; - const cellGap = 3; - const step = cellSize + cellGap; const maxCount = Math.max(...calendar.map((d) => d.count), 1); // Group entries by week columns @@ -39,10 +53,6 @@ export default function ContributionGraph({ contributions }: Props) { } if (currentWeek.length > 0) weeks.push(currentWeek); - const dayLabelWidth = 28; - const svgWidth = dayLabelWidth + weeks.length * step + cellGap; - const svgHeight = 7 * step + 20; - const monthLabels: { label: string; x: number }[] = []; let lastMonth = -1; weeks.forEach((week, wIdx) => { @@ -51,12 +61,24 @@ export default function ContributionGraph({ contributions }: Props) { if (month !== lastMonth) { monthLabels.push({ label: MONTHS[month], - x: dayLabelWidth + wIdx * step, + x: DAY_LABEL_WIDTH + wIdx * STEP, }); lastMonth = month; } }); + return { weeks, monthLabels, maxCount }; +} + +export default function ContributionGraph({ contributions }: Props) { + const { calendar } = contributions; + if (calendar.length === 0) return null; + + const { weeks, monthLabels, maxCount } = processCalendarData(calendar); + + const svgWidth = DAY_LABEL_WIDTH + weeks.length * STEP + CELL_GAP; + const svgHeight = 7 * STEP + 20; + const dayLabels = ["", "Mon", "", "Wed", "", "Fri", ""]; function getIntensityColor(count: number): string { @@ -97,7 +119,7 @@ export default function ContributionGraph({ contributions }: Props) { {label} @@ -109,39 +131,25 @@ export default function ContributionGraph({ contributions }: Props) { week.map((entry) => ( - {entry.date}: {entry.count} contribution{entry.count !== 1 ? "s" : ""} + {entry.date}: {entry.count} contribution + {entry.count !== 1 ? "s" : ""} )), )} -
- Less - {[0, 1, 2, 3, 4].map((level) => ( -
- ))} - More -
+
); } diff --git a/src/components/HeatmapLegend.tsx b/src/components/HeatmapLegend.tsx new file mode 100644 index 0000000..d6dae51 --- /dev/null +++ b/src/components/HeatmapLegend.tsx @@ -0,0 +1,20 @@ +export default function HeatmapLegend() { + return ( +
+ Less + {[0, 1, 2, 3, 4].map((level) => ( +
+ ))} + More +
+ ); +} diff --git a/src/lib/__tests__/color.test.ts b/src/lib/__tests__/color.test.ts index e3bdb1c..222af79 100644 --- a/src/lib/__tests__/color.test.ts +++ b/src/lib/__tests__/color.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { adjustAccentColor, type ColorResult } from "../color"; +import { adjustAccentColor } from "../color"; /** * adjustAccentColor のユニットテスト diff --git a/src/lib/color.ts b/src/lib/color.ts index 02ab06b..439c1e8 100644 --- a/src/lib/color.ts +++ b/src/lib/color.ts @@ -1,4 +1,4 @@ -import { colord, extend } from "colord"; +import { colord, extend, type Colord } from "colord"; import mixPlugin from "colord/plugins/mix"; import namesPlugin from "colord/plugins/names"; import a11yPlugin from "colord/plugins/a11y"; @@ -21,14 +21,10 @@ const TARGET_MIN_LIGHTNESS = 45; const TARGET_MAX_LIGHTNESS = 85; const HOVER_LIGHTEN_AMOUNT = 0.1; -/** - * Adjusts the given color to be suitable for use as an accent color in a dark theme. - * Ensures sufficient saturation and appropriate lightness. - * @param color Hex string or RGB object/array - */ -export function adjustAccentColor(color: string | [number, number, number] | { r: number; g: number; b: number }): ColorResult { - let c; +type ColorInput = string | [number, number, number] | { r: number; g: number; b: number }; +function parseColor(color: ColorInput): Colord { + let c: Colord; if (Array.isArray(color)) { c = colord({ r: color[0], g: color[1], b: color[2] }); } else { @@ -37,28 +33,34 @@ export function adjustAccentColor(color: string | [number, number, number] | { r // Ensure valid color, fallback to default blue if invalid if (!c.isValid()) { - c = colord(DEFAULT_ACCENT_COLOR); + return colord(DEFAULT_ACCENT_COLOR); } + return c; +} - // Adjust saturation: if too low, saturate +function ensureSaturation(c: Colord): Colord { const s = c.toHsl().s; if (s < MIN_SATURATION_FOR_HIGH_BOOST) { - c = c.saturate(HIGH_SATURATION_BOOST); + return c.saturate(HIGH_SATURATION_BOOST); } else if (s < MIN_SATURATION_FOR_LOW_BOOST) { - c = c.saturate(LOW_SATURATION_BOOST); + return c.saturate(LOW_SATURATION_BOOST); } + return c; +} - // Adjust lightness for dark mode context - // Should be bright enough to glow, but not white +function adjustLightness(c: Colord): Colord { const l = c.toHsl().l; if (l < TARGET_MIN_LIGHTNESS) { // Lift to at least TARGET_MIN_LIGHTNESS - c = c.lighten((TARGET_MIN_LIGHTNESS - l) / 100); + return c.lighten((TARGET_MIN_LIGHTNESS - l) / 100); } else if (l > TARGET_MAX_LIGHTNESS) { // Dim to at most TARGET_MAX_LIGHTNESS - c = c.darken((l - TARGET_MAX_LIGHTNESS) / 100); + return c.darken((l - TARGET_MAX_LIGHTNESS) / 100); } + return c; +} +function generateColorResult(c: Colord): ColorResult { const hex = c.toHex(); const rgb = c.toRgb(); const rgbString = `${rgb.r}, ${rgb.g}, ${rgb.b}`; @@ -72,3 +74,15 @@ export function adjustAccentColor(color: string | [number, number, number] | { r accentHover: hover, }; } + +/** + * Adjusts the given color to be suitable for use as an accent color in a dark theme. + * Ensures sufficient saturation and appropriate lightness. + * @param color Hex string or RGB object/array + */ +export function adjustAccentColor(color: ColorInput): ColorResult { + const parsed = parseColor(color); + const saturated = ensureSaturation(parsed); + const lightened = adjustLightness(saturated); + return generateColorResult(lightened); +} diff --git a/src/lib/logger.ts b/src/lib/logger.ts new file mode 100644 index 0000000..3901c78 --- /dev/null +++ b/src/lib/logger.ts @@ -0,0 +1,25 @@ +/** + * Centralized logger for the application. + * Currently wraps console methods, but can be easily extended to use + * external logging services (e.g., Sentry, Axiom, Datadog) in the future. + */ + +type LogFn = (message: unknown, ...args: unknown[]) => void; + +interface Logger { + info: LogFn; + warn: LogFn; + error: LogFn; +} + +export const logger: Logger = { + info: (message, ...args) => { + console.info(message, ...args); + }, + warn: (message, ...args) => { + console.warn(message, ...args); + }, + error: (message, ...args) => { + console.error(message, ...args); + }, +};