Skip to content

Feature/oumi sponsor#181

Merged
tyaga001 merged 3 commits into
mainfrom
feature/oumi-sponsor
Apr 7, 2026
Merged

Feature/oumi sponsor#181
tyaga001 merged 3 commits into
mainfrom
feature/oumi-sponsor

Conversation

@tyaga001
Copy link
Copy Markdown
Owner

@tyaga001 tyaga001 commented Apr 7, 2026

Summary by CodeRabbit

  • Documentation
    • Added a short PR/commit guideline to project docs to encourage concise, one-line PR titles (~50 chars) and imperative-voice subjects.
  • Chores
    • Updated Sponsors section: added Oumi, reordered tiles, and swapped/updated sponsor images for improved presentation.
  • Refactor
    • Sponsors list made data-driven and rendered responsively for more consistent display.

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 7, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
devtoolsacademy Ready Ready Preview, Comment Apr 7, 2026 6:44am

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 7, 2026

Walkthrough

Adds a Cursor rule and AGENTS.md guidance for short, one-line commit/PR subjects; updates README sponsor table and assets; refactors CurrentSponsors.tsx to a typed, data-driven sponsor list and grid rendering, adding/reordering sponsor entries.

Changes

Cohort / File(s) Summary
Commit & PR conventions
\.cursor/rules/pr-commits.mdc, AGENTS.md
Add a Cursor rule file and AGENTS.md entry specifying very short, one-line commit/PR subject guidance (imperative mood, ~50 chars, avoid multi-paragraph messages).
Sponsors — README markup
README.md
Update VIP Sponsors table: swap CodeRabbit asset to coderabbit-light.svg, remove/reflow cells, add Oumi tile, and re-add EloqData in a different position.
Sponsors — UI component
src/components/CurrentSponsors.tsx
Refactor component to use a typed Sponsor model and a sponsors array; replace hardcoded link/image markup with a responsive <ul>/<li> grid rendered from data; update imports and image rendering (use next/image with explicit width/height), add/reorder sponsor entries (including Oumi).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning No pull request description was provided by the author, leaving all required template sections (Summary, Type of Change, Changes Made, Testing, etc.) completely unfilled. Add a comprehensive PR description following the template, including a summary of changes, type of change selection, detailed list of changes made, and testing confirmation.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Feature/oumi sponsor' directly reflects the main change: adding Oumi as a new sponsor with corresponding updates across multiple files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/oumi-sponsor

Comment @coderabbitai help to get the list of available commands and usage tips.

Made-with: Cursor
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
AGENTS.md (1)

356-369: Optional wording tweak to avoid “short vs descriptive” ambiguity.

Line 356 says “very short,” while Line 368 says “descriptive PR titles.” Consider “short but descriptive” in one place to prevent conflicting interpretation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@AGENTS.md` around lines 356 - 369, Update the PR guidance to remove the "very
short" vs "descriptive" ambiguity by changing the phrase "For PRs, keep the
subject line very short (about one line, ~50 characters or less when practical)"
to "For PRs, keep the subject line short but descriptive (about one line, ~50
characters or less when practical)" and ensure the Pull Requests section still
encourages descriptive titles and descriptions so both lines convey the same
"short but descriptive" intent.
src/components/CurrentSponsors.tsx (1)

15-15: Consider removing empty Props interface.

The Props interface is empty and adds no value. You could simplify by using React.FC without the generic parameter.

Proposed simplification
-interface Props {}
-
 ...

-const CurrentSponsors: React.FC<Props> = () => {
+const CurrentSponsors: React.FC = () => {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/CurrentSponsors.tsx` at line 15, Remove the empty Props
interface and update the CurrentSponsors component signature to stop referencing
it: locate the empty interface declaration "Props" and the component
"CurrentSponsors" (currently typed as React.FC<Props>) and remove the interface,
changing the component to a plain React.FC or an untyped/implicit function
component signature so the generic parameter is no longer used.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@README.md`:
- Around line 117-119: Replace the Oumi image used in the README with the same
wordmark asset used by the component: update the <img> src in the README (the
anchor/img block shown) to reference "oumi-wordmark.svg" instead of "oumi.svg"
so it matches the asset imported by CurrentSponsors.tsx and maintains
consistency across the repo.

In `@src/components/CurrentSponsors.tsx`:
- Line 85: Prettier flags the single-line <li> element in the CurrentSponsors
component; reformat the JSX attributes of the <li key={id} className="flex
w-full max-w-[240px] justify-center sm:max-w-[260px]"> so each attribute is on
its own line (e.g., <li key={id} className=...> split across multiple lines) to
satisfy the formatter; update the JSX in the CurrentSponsors component where the
<li> for id is rendered and run the project's Prettier/lint script to confirm
the violation is resolved.
- Line 83: In the CurrentSponsors component, update the Tailwind utility classes
on the UL element (the element with className containing "items-center
justify-items-center") to use the shorthand by replacing "items-center
justify-items-center" with "place-items-center" so the className becomes
consistent with Tailwind's recommended shorthand.

---

Nitpick comments:
In `@AGENTS.md`:
- Around line 356-369: Update the PR guidance to remove the "very short" vs
"descriptive" ambiguity by changing the phrase "For PRs, keep the subject line
very short (about one line, ~50 characters or less when practical)" to "For PRs,
keep the subject line short but descriptive (about one line, ~50 characters or
less when practical)" and ensure the Pull Requests section still encourages
descriptive titles and descriptions so both lines convey the same "short but
descriptive" intent.

In `@src/components/CurrentSponsors.tsx`:
- Line 15: Remove the empty Props interface and update the CurrentSponsors
component signature to stop referencing it: locate the empty interface
declaration "Props" and the component "CurrentSponsors" (currently typed as
React.FC<Props>) and remove the interface, changing the component to a plain
React.FC or an untyped/implicit function component signature so the generic
parameter is no longer used.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 80acd359-dc39-4199-9744-54e87575a450

📥 Commits

Reviewing files that changed from the base of the PR and between 6d100eb and 2fcef82.

⛔ Files ignored due to path filters (4)
  • src/assets/coderabbit-light.svg is excluded by !**/*.svg
  • src/assets/coderabbit.svg is excluded by !**/*.svg
  • src/assets/oumi-wordmark.svg is excluded by !**/*.svg
  • src/assets/oumi.svg is excluded by !**/*.svg
📒 Files selected for processing (4)
  • .cursor/rules/pr-commits.mdc
  • AGENTS.md
  • README.md
  • src/components/CurrentSponsors.tsx

Comment thread README.md
Comment on lines +117 to +119
<a href="https://oumi.ai/?ref=devtoolsacademy" target="_blank" rel="noopener noreferrer">
<img src="https://raw.githubusercontent.com/tyaga001/devtoolsacademy/main/src/assets/oumi.svg" alt="Oumi" height="50" />
</a>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify Oumi logo assets exist in the repository

echo "=== Searching for Oumi-related assets ==="
fd -i 'oumi' --type f src/assets/

echo ""
echo "=== Checking specific files referenced ==="
# Check oumi.svg (referenced in README)
if [ -f "src/assets/oumi.svg" ]; then
  echo "✓ src/assets/oumi.svg exists"
else
  echo "✗ src/assets/oumi.svg NOT FOUND"
fi

# Check oumi-wordmark.svg (referenced in CurrentSponsors.tsx)
if [ -f "src/assets/oumi-wordmark.svg" ]; then
  echo "✓ src/assets/oumi-wordmark.svg exists"
else
  echo "✗ src/assets/oumi-wordmark.svg NOT FOUND"
fi

Repository: tyaga001/devtoolsacademy

Length of output: 269


🏁 Script executed:

# Find and inspect CurrentSponsors.tsx to verify which Oumi asset it uses
fd -i 'CurrentSponsors' --type f

echo ""
echo "=== Checking CurrentSponsors.tsx for Oumi asset import ==="
cat src/components/CurrentSponsors.tsx | head -50

echo ""
echo "=== Searching for all oumi references in the component ==="
rg -i 'oumi' src/components/CurrentSponsors.tsx -A 2 -B 2

Repository: tyaga001/devtoolsacademy

Length of output: 2080


Update README to use the same Oumi asset as the component for consistency.

The README currently references oumi.svg, but CurrentSponsors.tsx imports oumi-wordmark.svg. Both assets exist in the repository, but using the wordmark variant in the README would maintain consistency across the codebase. Update line 118 to use oumi-wordmark.svg instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 117 - 119, Replace the Oumi image used in the README
with the same wordmark asset used by the component: update the <img> src in the
README (the anchor/img block shown) to reference "oumi-wordmark.svg" instead of
"oumi.svg" so it matches the asset imported by CurrentSponsors.tsx and maintains
consistency across the repo.

Comment thread src/components/CurrentSponsors.tsx Outdated
Comment thread src/components/CurrentSponsors.tsx Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/components/CurrentSponsors.tsx (3)

28-65: Rename sponsors constant to UPPER_CASE.

Line 28 declares a module-level constant in lower camel case; this repo rule asks for UPPER_CASE constants.

Proposed fix
-const sponsors: SponsorInterface[] = [
+const SPONSORS: SponsorInterface[] = [
@@
-            {sponsors.map(({ id, href, logo, alt }) => (
+            {SPONSORS.map(({ id, href, logo, alt }) => (

As per coding guidelines, use UPPER_CASE for constants and environment variables.

Also applies to: 84-84

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/CurrentSponsors.tsx` around lines 28 - 65, Rename the
module-level constant named sponsors to UPPER_CASE (e.g., SPONSORS) throughout
the file; update its declaration (the Sponsor[] array currently assigned to
sponsors) and every reference to that identifier (including any JSX or functions
that iterate or import it) so the symbol name matches the repo rule for
UPPER_CASE constants; also apply the same rename for the other module-level
constant mentioned around line 84 to follow the same convention.

15-22: Use interface naming convention for props/data types.

Lines 15-22 define props/data types without the required Interface suffix, and the data structure is declared as a type instead of an interface.

Proposed fix
-interface Props {}
+interface CurrentSponsorsPropsInterface {}
 
-type Sponsor = {
+interface SponsorInterface {
   id: string
   href: string
   logo: StaticImageData
   alt: string
 }
@@
-const sponsors: Sponsor[] = [
+const sponsors: SponsorInterface[] = [
@@
-const CurrentSponsors: React.FC<Props> = () => {
+const CurrentSponsors: React.FC<CurrentSponsorsPropsInterface> = () => {

As per coding guidelines, define interfaces for component props and data structures and use PascalCase with the Interface suffix for type names.

Also applies to: 67-67

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/CurrentSponsors.tsx` around lines 15 - 22, Rename the plain
`type Sponsor` and `interface Props` to use interface declarations with
PascalCase and an `Interface` suffix (e.g. `SponsorInterface` and
`PropsInterface`), and update all references in the CurrentSponsors component
(including any usage around the previous `Sponsor` list and the component
signature `CurrentSponsors`) to use the new interface names; convert the `type
Sponsor` into `interface SponsorInterface { id: string; href: string; logo:
StaticImageData; alt: string }` and change `Props` to `interface PropsInterface
{}` (or add required props) and update the component props annotation
accordingly.

2-14: Reorder imports to match repository grouping rule.

Line 4 places a type import before local @/ imports; your rule requires type imports after local imports.

Proposed fix
 import * as React from "react"
 import Image from "next/image"
-import type { StaticImageData } from "next/image"
+import { Heart } from "lucide-react"
+import { Link } from "next-view-transitions"
 
 import StreamLogo from "@/assets/stream.png"
 import CodeRabbitLogo from "@/assets/coderabbit.svg"
 import EloqDataLogo from "@/assets/eloqdata.png"
 import ClineLogo from "@/assets/cline.svg"
 import OrchidsLogo from "@/assets/orchids.png"
 import OumiWordmark from "@/assets/oumi-wordmark.svg"
-import { Heart } from "lucide-react"
-import { Link } from "next-view-transitions"
+import type { StaticImageData } from "next/image"

As per coding guidelines, group imports in order: React, third-party libraries, local imports using @/ aliases, then type imports.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/CurrentSponsors.tsx` around lines 2 - 14, Imports in
CurrentSponsors.tsx are misordered: the type import "StaticImageData" from
"next/image" appears before local "@/..." imports; move type imports after local
imports to follow repository grouping (React, third-party, local "@/..."
aliases, then type imports). Reorder the import block so React and third-party
imports (e.g., React, Image, Link, Heart) come first, then all local asset
imports (StreamLogo, CodeRabbitLogo, EloqDataLogo, ClineLogo, OrchidsLogo,
OumiWordmark), and finally the type import "StaticImageData".
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/CurrentSponsors.tsx`:
- Around line 89-94: The anchor inside the CurrentSponsors component that
renders each sponsor (the <a href={href} ...> in CurrentSponsors.tsx) lacks an
aria-label; update the link to include a meaningful aria-label (e.g., using the
sponsor name or title from the sponsor object/variable used when mapping
sponsors) so screen readers get an explicit label; find the map/loop that
renders the anchor in CurrentSponsors and add aria-label={`Sponsor:
${sponsor.name}`} (or similar) ensuring the label uses an existing unique
property like sponsor.name or sponsor.title.

---

Nitpick comments:
In `@src/components/CurrentSponsors.tsx`:
- Around line 28-65: Rename the module-level constant named sponsors to
UPPER_CASE (e.g., SPONSORS) throughout the file; update its declaration (the
Sponsor[] array currently assigned to sponsors) and every reference to that
identifier (including any JSX or functions that iterate or import it) so the
symbol name matches the repo rule for UPPER_CASE constants; also apply the same
rename for the other module-level constant mentioned around line 84 to follow
the same convention.
- Around line 15-22: Rename the plain `type Sponsor` and `interface Props` to
use interface declarations with PascalCase and an `Interface` suffix (e.g.
`SponsorInterface` and `PropsInterface`), and update all references in the
CurrentSponsors component (including any usage around the previous `Sponsor`
list and the component signature `CurrentSponsors`) to use the new interface
names; convert the `type Sponsor` into `interface SponsorInterface { id: string;
href: string; logo: StaticImageData; alt: string }` and change `Props` to
`interface PropsInterface {}` (or add required props) and update the component
props annotation accordingly.
- Around line 2-14: Imports in CurrentSponsors.tsx are misordered: the type
import "StaticImageData" from "next/image" appears before local "@/..." imports;
move type imports after local imports to follow repository grouping (React,
third-party, local "@/..." aliases, then type imports). Reorder the import block
so React and third-party imports (e.g., React, Image, Link, Heart) come first,
then all local asset imports (StreamLogo, CodeRabbitLogo, EloqDataLogo,
ClineLogo, OrchidsLogo, OumiWordmark), and finally the type import
"StaticImageData".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4cb86437-5389-4df7-b5d4-d93a3cd7ecac

📥 Commits

Reviewing files that changed from the base of the PR and between 2fcef82 and 6b5e466.

📒 Files selected for processing (1)
  • src/components/CurrentSponsors.tsx

Comment on lines +89 to +94
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className="group flex w-full flex-col items-center justify-center rounded-xl px-3 py-2 outline-none ring-white/0 transition duration-200 hover:ring-2 hover:ring-white/10 focus-visible:ring-2 focus-visible:ring-white/20"
>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add aria-label on sponsor links for explicit accessibility compliance.

The interactive <a> at Lines 89-94 is missing aria-label.

Proposed fix
                 <a
                   href={href}
                   target="_blank"
                   rel="noopener noreferrer"
+                  aria-label={`Visit ${alt}`}
                   className="group flex w-full flex-col items-center justify-center rounded-xl px-3 py-2 outline-none ring-white/0 transition duration-200 hover:ring-2 hover:ring-white/10 focus-visible:ring-2 focus-visible:ring-white/20"
                 >

As per coding guidelines, include aria-label attributes on interactive elements for accessibility.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className="group flex w-full flex-col items-center justify-center rounded-xl px-3 py-2 outline-none ring-white/0 transition duration-200 hover:ring-2 hover:ring-white/10 focus-visible:ring-2 focus-visible:ring-white/20"
>
<a
href={href}
target="_blank"
rel="noopener noreferrer"
aria-label={`Visit ${alt}`}
className="group flex w-full flex-col items-center justify-center rounded-xl px-3 py-2 outline-none ring-white/0 transition duration-200 hover:ring-2 hover:ring-white/10 focus-visible:ring-2 focus-visible:ring-white/20"
>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/CurrentSponsors.tsx` around lines 89 - 94, The anchor inside
the CurrentSponsors component that renders each sponsor (the <a href={href} ...>
in CurrentSponsors.tsx) lacks an aria-label; update the link to include a
meaningful aria-label (e.g., using the sponsor name or title from the sponsor
object/variable used when mapping sponsors) so screen readers get an explicit
label; find the map/loop that renders the anchor in CurrentSponsors and add
aria-label={`Sponsor: ${sponsor.name}`} (or similar) ensuring the label uses an
existing unique property like sponsor.name or sponsor.title.

@tyaga001 tyaga001 merged commit 0ec50fd into main Apr 7, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant