Skip to content

Conversation

@OUMIMANDAL
Copy link
Contributor

This PR fixes the homepage container flexibility issue:

  • Footer now sticks to the bottom during loading on screens > 1100px
  • Used flex min-h-screen flex-col in layout.tsx
  • No changes to package.json, scripts, or lock files

Fixes #2033

OUMIMANDAL and others added 30 commits August 19, 2025 22:57
…om/OUMIMANDAL/Nest-milestones into fix-homepage-container-flexibility

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
…om/OUMIMANDAL/Nest-milestones into fix-homepage-container-flexibility

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.8 to 3.29.9.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@76621b6...df55935)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.29.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* add id field

* update code

* add id field by inheriting from strawberry.relay.Node
arkid15r and others added 20 commits August 29, 2025 01:59
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.9 to 3.29.10.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@df55935...96f518a)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.29.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Added test for RecentIssues Component

* Updated code format

* update missing title test

---------

Co-authored-by: Kate Golovanova <[email protected]>
* Integrate lighthouseci

* use nest.owasp.dev

* run lighthouse after staging deployment

* Update code

* Update code temporarily

* run lighthouse after staging deployment

* remove github app environment variable and test

* run lighthouse after staging deployment

* Update code

---------

Co-authored-by: Arkadii Yakovets <[email protected]>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 31, 2025

Summary by CodeRabbit

  • New Features

    • New global loading screen and Issue metadata component.
    • Expanded site metadata (icons, OpenGraph/Twitter).
    • Revamped light/dark theme and Tailwind v4 integration.
    • Footer now shows current year and release/version link.
    • Added Lighthouse CI config.
  • Changes

    • Home and About pages simplified to static content.
    • Updated app layout structure; minor UI polish with no behavioral impact.
  • Tests

    • New test scripts, unified test:all, streamlined Playwright invocation.
  • Chores

    • CI updated (pnpm removed; Lighthouse via npx); CodeQL actions bumped.
    • Dependency updates/downgrades; PostCSS/Tailwind config migration.
    • Workspace/TS configs added; Sentry environment fallback.

Walkthrough

This PR updates CI workflows, migrates frontend styling/build to Tailwind v4, adjusts Next.js app layout and pages, introduces new and refactored frontend components, modifies various configs (including removing Apollo), adds schema validation utilities in Python, and changes multiple className orders with largely cosmetic impact.

Changes

Cohort / File(s) Summary
CI workflows
.github/workflows/run-ci-cd.yaml, .github/workflows/run-code-ql.yaml
Switch Lighthouse to npx LHCI CLI and remove pnpm install/cache; update CodeQL action SHAs.
Pre-commit
.pre-commit-config.yaml
Inserted blank lines in ruff-pre-commit block; no functional change.
Backend config
backend/pyproject.toml
Multiple duplicated blocks/entries; dependency tweak (strawberry-graphql ^0.278.1); extensive Ruff/Mypy/DjLint/Coverage/Pytest config additions and duplicates.
Schema utilities (Python)
schema/utils/schema_validators.py
New jsonschema validation helper with email/uri format checks, cached registry, and validate_data API.
Frontend build/tools (Tailwind v4 migration)
frontend/tailwind.config.ts, frontend/postcss.config.js, frontend/src/app/globals.css, frontend/package.json, frontend/pnpm-workspace.yaml, frontend/tsconfig.tsnode.json
Migrate Tailwind to v4: new config (TS, darkMode class, plugins import), switch to @tailwindcss/postcss, large CSS token rework (light/dark), add build/test scripts, dep updates (Tailwind upgrade, assorted version changes), workspace build lists, TS config for scripts.
Frontend Lighthouse integration
frontend/Makefile, frontend/lighthouserc.json
Replace pnpm script targets with npx LHCI autorun and add LHCI config file.
Frontend app shell/layout
frontend/src/app/layout.tsx, frontend/src/wrappers/provider.tsx, frontend/src/app/loading.tsx, frontend/src/sentry.server.config.ts
Layout refactor to flex/min-h-screen with main flex-1; richer metadata; remove exported dynamic flag; remove ApolloProvider; add app-level loading component; Sentry environment now defaults to “development” if missing.
Frontend pages simplified
frontend/src/app/page.tsx, frontend/src/app/about/page.tsx, frontend/src/app/about/layout.tsx
Replace data-driven pages with minimal static content; remove About metadata export.
Frontend new/updated components (functional)
frontend/src/components/Footer.tsx, frontend/src/components/RecentIssues.tsx, frontend/src/components/IssueMetadata.tsx, frontend/src/components/TestCard.tsx, frontend/src/types/issue.ts
Footer accepts className and adds version/year footer note; RecentIssues uses new IssueMetadata; add IssueMetadata component; add TestCard component; Issue type gains optional repositoryName.
Frontend cosmetic class reorders
frontend/src/app/global-error.tsx, frontend/src/app/snapshots/[id]/page.tsx, frontend/src/app/snapshots/page.tsx, frontend/src/components/* (Card, CardDetailsPage, GeneralCompliantComponent, Header, InfoBlock, ItemCardList, LoadingSpinner, LoginPageContent, LogoCarousel, MetricsScoreCircle, Modal, ModeToggle, ModuleCard, ModuleForm, MultiSearch, NavButton, NavDropDown, ProgramForm, RecentReleases, RepositoriesCard, ScrollToTop, Search, SearchPageLayout, SingleModuleCard, SnapshotCard, TopContributorsList, TruncatedText, UserCard, UserMenu, skeletons/ApiKeySkelton, skeletons/Card)
Reordering Tailwind utility classes; no behavioral changes.
Root package
package.json
New root package.json with Next/React deps and metadata; basic test script.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Assessment against linked issues

Objective Addressed Explanation
Fix Home Page container flexibility (footer should stick to bottom during initial load) [#2033]

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
Add schema validation utilities (schema/utils/schema_validators.py) Not related to footer/layout behavior on Home page.
Extensive backend tooling/config edits incl. duplicated entries (backend/pyproject.toml) Unrelated to the Home page footer issue.
Remove ApolloProvider integration (frontend/src/wrappers/provider.tsx) Not tied to footer positioning or Home page layout.
Introduce root-level package.json with Next/React deps (package.json) Out of scope for fixing footer behavior.
Add/modify Lighthouse CI integration (frontend/Makefile, frontend/lighthouserc.json, .github/workflows/run-ci-cd.yaml) CI changes are unrelated to the stated UI objective.

Possibly related PRs

Suggested labels

frontend, ci, backend, makefile, docker, frontend-tests

Suggested reviewers

  • kasya
  • arkid15r

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@sonarqubecloud
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
85 Security Hotspots

See analysis details on SonarQube Cloud

Copy link
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: 15

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
frontend/src/components/ModuleForm.tsx (1)

268-271: Fix error handling in debounced fetchSuggestions.

  • When query is empty, also hide suggestions.
  • Error constructor: pass { cause } option; throwing inside a debounced async often results in unhandled rejections. Prefer logging + user-facing error state.
     debounce(async (query: string) => {
       if (!query.trim()) {
-        setRawResults([])
-        return
+        setRawResults([])
+        setShowSuggestions(false)
+        return
       }
@@
       } catch (err) {
         setRawResults([])
         setShowSuggestions(false)
-        throw new Error('Error fetching suggestions:', err)
+        console.error('Error fetching suggestions', err)
+        setError('Unable to fetch project suggestions. Please try again.')
+        // Optionally keep the cause if you really need an Error object:
+        // const e = new Error('Error fetching suggestions', { cause: err as unknown })
+        // console.error(e)
       }
     }, 300),

Also applies to: 281-285

frontend/src/components/Card.tsx (1)

121-124: Fix invalid Tailwind variant chain (duplicate dark:)

dark:hover:dark:text-gray-400 won’t parse correctly; should be dark:hover:text-gray-400.

Apply:

-                    className="h-5 w-5 text-blue-500 hover:text-gray-600 dark:hover:dark:text-gray-400"
+                    className="h-5 w-5 text-blue-500 hover:text-gray-600 dark:hover:text-gray-400"
frontend/src/components/UserCard.tsx (1)

29-29: next/image: replace deprecated objectFit prop

Newer Next.js versions require style or utility classes instead of the objectFit prop.

-            <Image fill src={`${avatar}&s=160`} alt={name || 'user'} objectFit="cover" />
+            <Image fill src={`${avatar}&s=160`} alt={name || 'user'} style={{ objectFit: 'cover' }} />
+            {/*
+              Alternatively: add className="object-cover" and keep style minimal.
+            */}
frontend/src/components/LogoCarousel.tsx (1)

13-18: Avoid DOM mutation with innerHTML; can cause unbounded duplication and memory bloat

Duplicating innerHTML on each effect run risks exponential growth if sponsors prop identity changes. Render a doubled list instead.

-import { useEffect, useRef } from 'react'
+import { useMemo, useRef } from 'react'
@@
-  useEffect(() => {
-    if (scrollerRef.current) {
-      const scrollContainer = scrollerRef.current
-      scrollContainer.innerHTML += scrollContainer.innerHTML
-    }
-  }, [sponsors])
+  const items = useMemo(() => [...sponsors, ...sponsors], [sponsors])
@@
-          ref={scrollerRef}
-          className="animate-scroll flex w-full gap-6"
-          style={{ animationDuration: `${sponsors.length * 2}s` }}
+          ref={scrollerRef}
+          className="animate-scroll flex w-full gap-6"
+          style={{ animationDuration: `${sponsors.length * 2}s` }}
@@
-          {sponsors.map((sponsor, index) => (
+          {items.map((sponsor, index) => (
             <div
               key={`${sponsor.name}-${index}`}
               className="flex min-w-[220px] flex-shrink-0 flex-col items-center rounded-lg p-5"
             >

Optionally remove the now-unused ref entirely if it’s only for the previous mutation logic.

.github/workflows/run-ci-cd.yaml (1)

130-136: Fix typo in job name: “Denendencies” → “Dependencies”

User-facing label in Actions UI.

-  scan-ci-dependencies:
-    name: Run CI Denendencies Scan
+  scan-ci-dependencies:
+    name: Run CI Dependencies Scan
🧹 Nitpick comments (37)
frontend/src/components/skeletons/ApiKeySkelton.tsx (3)

1-1: Nit: filename typo “Skelton” → “Skeleton”

Standardize naming to avoid import mistakes and IDE search misses.

Proposed rename (Git move):

-frontend/src/components/skeletons/ApiKeySkelton.tsx
+frontend/src/components/skeletons/ApiKeySkeleton.tsx

If you adopt this, update any imports that reference the old path.


5-5: Optional a11y: mark skeleton container as a live status

Align with CardSkeleton (which already uses role="status") so SRs get a polite loading announcement.

Apply:

-    <div className="flex min-h-[80vh] flex-col items-center p-8">
+    <div role="status" aria-live="polite" aria-label="Loading API keys" className="flex min-h-[80vh] flex-col items-center p-8">

5-5: Optional: reduce repetition with a helper for shared skeleton classes

Many nodes repeat "animate-pulse rounded bg-gray-200 dark:bg-gray-700". Consider a cn() helper or component to cut noise.

Example:

-<div className="h-4 w-96 animate-pulse rounded bg-gray-200 dark:bg-gray-700"></div>
+<SkeletonBlock className="h-4 w-96" />

(Where SkeletonBlock wraps the common classes.)

frontend/src/components/skeletons/Card.tsx (1)

19-21: Optional: ensure class sorting is automated to avoid churn

If not already, enable the Prettier Tailwind plugin so utility ordering is consistent and future diffs stay minimal.

Would you like a .prettierrc update + example configuration?

frontend/src/components/NavDropDown.tsx (2)

15-24: Type the ref and harden outside-click check

Typing the ref exposes a TS issue with EventTarget; guard with instanceof Node to keep strictness green.

-  const dropdownRef = useRef(null)
+  const dropdownRef = useRef<HTMLDivElement | null>(null)
...
-    function handleClickOutside(event: MouseEvent) {
-      if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
+    function handleClickOutside(event: MouseEvent) {
+      if (
+        dropdownRef.current &&
+        event.target instanceof Node &&
+        !dropdownRef.current.contains(event.target)
+      ) {
         setIsOpen(false)
       }
     }

71-79: Prefer stable keys over array indices

Use a deterministic key to avoid unnecessary re-renders on reordering.

-          {link.submenu.map((submenu, idx) => (
+          {link.submenu.map((submenu) => (
             <Link
-              key={idx}
+              key={submenu.href || submenu.text}
frontend/src/types/issue.ts (1)

9-11: Document duplicated repositoryName Add a JSDoc comment above repositoryName?: string in frontend/src/types/issue.ts clarifying that it duplicates repository?.name (selected via GraphQL for convenience). All GraphQL queries in src/server/queries already include repositoryName, so it’s consistently populated. Remove the manual verification step.

   number?: string
+  /** Duplicate of repository?.name from GraphQL; use repository?.name when available. */
   repositoryName?: string
   organizationName?: string
   projectName: string
frontend/src/components/SearchPageLayout.tsx (1)

43-43: Replace justify-normal with justify-start and add mt-auto to <Footer />

  • Tailwind’s justify-normal maps to justify-content: normal (same as flex-start by default); use justify-start or drop it for clarity.
  • Make the footer stick to the bottom by adding mt-auto in app/layout.tsx (either via <Footer className="mt-auto" /> or wrapping it in a container with mt-auto).
frontend/src/components/SearchPageLayout.tsx
-    <div className="text-text flex min-h-screen w-full flex-col items-center justify-normal p-5">
+    <div className="text-text flex min-h-screen w-full flex-col items-center justify-start p-5">

frontend/src/app/layout.tsx
-          <Footer />
+          <Footer className="mt-auto" />
.pre-commit-config.yaml (1)

13-15: No-op whitespace change; consider avoiding churn.

The extra blank lines won’t affect behavior but may fight yamlfmt in this same config. Recommend keeping blocks compact to reduce formatter flip-flops.

frontend/src/components/RepositoriesCard.tsx (2)

24-26: Use a stable key instead of array index.

Index keys can cause unnecessary re-renders and subtle UI bugs on reordering. Prefer the repository’s stable identifier.

-        {displayedRepositories.map((repository, index) => {
-          return <RepositoryItem key={index} details={repository} />
+        {displayedRepositories.map((repository) => {
+          return <RepositoryItem key={repository.key} details={repository} />
         })}

40-40: Verify/non-standard Tailwind class: h-46.

"h-46" isn’t in Tailwind’s default scale. If not added in your theme, it will be a no-op. Consider an arbitrary value or nearest scale class.

-    <div className="flex h-46 w-full flex-col gap-3 rounded-lg border p-4 shadow-sm ease-in-out hover:shadow-md dark:border-gray-700 dark:bg-gray-800">
+    <div className="flex h-[11.5rem] w-full flex-col gap-3 rounded-lg border p-4 shadow-sm ease-in-out hover:shadow-md dark:border-gray-700 dark:bg-gray-800">
frontend/src/components/ModuleForm.tsx (1)

57-57: Potentially invalid Tailwind utility: justify-normal.

Tailwind’s default doesn’t include justify-normal. If not added via plugin/custom utilities, it’s ignored. Use justify-start (or desired value).

-    <div className="text-text flex w-full flex-col items-center justify-normal p-5">
+    <div className="text-text flex w-full flex-col items-center justify-start p-5">
frontend/src/components/ProgramForm.tsx (1)

54-54: Replace nested min-h-screen with min-h-full and justify-normal with justify-start in all inner page wrappers

Inner components (ProgramForm.tsx line 54, SearchPageLayout.tsx 43, ModuleForm.tsx 57, snapshots/page.tsx 65–66, etc.) each use min-h-screen and the nonstandard justify-normal. These should defer to the root’s min-h-screen/dvh flex layout by switching to min-h-full and justify-start.

frontend/src/components/RecentReleases.tsx (1)

40-43: Use a stable key instead of array index.

Index keys can cause incorrect DOM reuse if list order changes. Prefer a deterministic key from the item.

Apply:

-          {data.map((item, index) => (
-            <div key={index} className="mb-4 w-full rounded-lg bg-gray-200 p-4 dark:bg-gray-700">
+          {data.map((item) => (
+            <div
+              key={`${item.organizationName}/${item.repositoryName}/${item.tagName}`}
+              className="mb-4 w-full rounded-lg bg-gray-200 p-4 dark:bg-gray-700"
+            >
frontend/src/app/snapshots/page.tsx (1)

66-66: Avoid nested 100vh; align with sticky footer layout.

Inner container should not be min-h-screen if the page layout provides the flex/min-height scaffold. Use min-h-full and a standard justify value.

Apply:

-      <div className="text-text flex min-h-screen w-full flex-col items-center justify-normal p-5">
+      <div className="text-text flex min-h-full w-full flex-col items-center justify-start p-5">

Architecture tip (no code change here): In app/layout.tsx, ensure:

  • body: min-h-dvh flex flex-col
  • main: flex-1
    This guarantees the footer sticks to the bottom on tall screens without needing 100vh on child pages.
frontend/src/components/NavButton.tsx (1)

24-24: No-op Tailwind class reordering — LGTM.

Optional: if this renders many times, consider using CSS (group-hover) to avoid state toggles on hover to reduce re-renders.

frontend/src/components/TruncatedText.tsx (1)

40-40: Remove duplicate utilities; truncate already implies them.

truncate sets overflow-hidden text-ellipsis whitespace-nowrap. Keep just truncate (plus block), rely on ${className} for extras.

-      className={`block truncate overflow-hidden text-ellipsis whitespace-nowrap ${className}`}
+      className={`block truncate ${className}`}
frontend/src/components/ModeToggle.tsx (1)

25-25: Improve toggle a11y (add aria-pressed) and keep ring token usage consistent

Expose pressed state for screen readers; also confirm --ring token exists with Tailwind v4 token setup.

Apply:

         <Button
           onPress={darkModeHandler}
-          className="focus-visible:ring-ring relative h-10 w-10 transform rounded-full bg-[#87a1bc] transition-all duration-200 hover:ring-1 hover:ring-[#b0c7de] hover:ring-offset-0 focus-visible:ring-1 focus-visible:outline-none active:scale-95 disabled:pointer-events-none disabled:opacity-50 dark:bg-slate-900 dark:text-white dark:hover:bg-slate-900/90 dark:hover:ring-[#46576b]"
+          className="focus-visible:ring-ring relative h-10 w-10 transform rounded-full bg-[#87a1bc] transition-all duration-200 hover:ring-1 hover:ring-[#b0c7de] hover:ring-offset-0 focus-visible:ring-1 focus-visible:outline-none active:scale-95 disabled:pointer-events-none disabled:opacity-50 dark:bg-slate-900 dark:text-white dark:hover:bg-slate-900/90 dark:hover:ring-[#46576b]"
           isIconOnly={true}
           aria-label={theme === 'dark' ? 'Enable light mode' : 'Enable dark mode'}
+          aria-pressed={theme === 'dark'}
         >
frontend/src/app/loading.tsx (1)

1-30: Loading screen: add dark-mode styles and ARIA status; prefer min-h-screen

Improves a11y and visual parity in dark mode, avoids iOS toolbar jump.

Apply:

-    <div className="flex h-screen w-full items-center justify-center bg-white">
+    <div className="flex min-h-screen w-full items-center justify-center bg-white dark:bg-slate-900">
       <div className="flex flex-col items-center space-y-4">
-        <svg
-          className="h-12 w-12 animate-spin text-blue-500"
+        <svg
+          className="h-12 w-12 animate-spin text-blue-500"
+          role="status"
           xmlns="http://www.w3.org/2000/svg"
           fill="none"
           viewBox="0 0 24 24"
         >
@@
-        <p className="text-sm text-gray-600">Loading...</p>
+        <p className="text-sm text-gray-600 dark:text-gray-300">
+          Loading...
+          <span className="sr-only">Please wait</span>
+        </p>
frontend/pnpm-workspace.yaml (1)

1-9: pnpm-workspace.yaml appears mis-scoped/mis-specified; verify config keys and file location.

  • pnpm-workspace.yaml typically defines packages/catalogs; build controls like “onlyBuiltDependencies”/“ignoredBuiltDependencies” are usually set in .npmrc (hyphenated: only-built-dependencies, never-built-dependencies) or package.json under "pnpm".
  • Placing a workspace file under frontend/ may create an unintended nested workspace or be ignored depending on how installs run.

Action: Move these settings to .npmrc or package.json at the workspace root, and ensure correct key names.

frontend/src/components/MultiSearch.tsx (1)

244-247: Add an accessible name to the clear button.

Provide an aria-label so screen readers announce the control.

Apply this diff:

-              <button
+              <button
+                aria-label="Clear search"
                 className="absolute top-1/2 right-2 -translate-y-1/2 rounded-full p-1 text-gray-400 hover:text-gray-600"
                 onClick={handleClearSearch}
               >

Optional: consider type="search" for the input to gain native semantics and OS-provided clear affordances.

frontend/src/app/about/page.tsx (1)

1-8: Confirm intentional simplification of About page content.

This reduces the page to static copy; if prior data-driven sections existed, this could be a regression unrelated to the footer fix. Please confirm intent and that internal links/SEO aren’t impacted.

frontend/src/components/MetricsScoreCircle.tsx (1)

63-63: Respect prefers-reduced-motion for the alert pulse.

Minor a11y improvement: disable pulse animation when users prefer reduced motion.

Apply this diff:

-          <div className="absolute inset-0 animate-pulse rounded-full bg-red-400/20"></div>
+          <div className="absolute inset-0 animate-pulse motion-reduce:animate-none rounded-full bg-red-400/20"></div>
frontend/src/components/TestCard.tsx (1)

8-10: Button should explicitly set type to avoid unintended form submit

If this card is ever placed inside a form, the button will implicitly be type="submit". Set type="button".

-      <button className="bg-primary text-primary-foreground hover:bg-primary/80 rounded-md px-4 py-2">
+      <button type="button" className="bg-primary text-primary-foreground hover:bg-primary/80 rounded-md px-4 py-2">
frontend/src/app/page.tsx (1)

6-8: Avoid hardcoding framework version in UI copy

“Next.js 15” may age quickly; prefer generic wording.

-      <p className="text-muted-foreground text-lg">
-        This is the Home Page built with Next.js 15 (App Router).
-      </p>
+      <p className="text-muted-foreground text-lg">
+        This is the Home Page built with the Next.js App Router.
+      </p>
schema/utils/schema_validators.py (2)

20-27: Return booleans from format checkers for clarity

validators.* may return ValidationFailure (falsy) not strictly bool. Coerce explicitly.

 @format_checker.checks("email")
 def check_email_format(value):
-    return validators.email(value)
+    return bool(validators.email(value))
@@
 @format_checker.checks("uri")
 def check_uri_format(value):
-    return validators.url(value)
+    return bool(validators.url(value))

41-51: Optional: include instance path in errors for easier debugging

Return e.message loses context. Consider including JSON path.

-    except ValidationError as e:
-        return e.message
+    except ValidationError as e:
+        # Example: 'field "email": <message>'
+        return f'{e.json_path}: {e.message}'
frontend/tailwind.config.ts (1)

62-70: Respect reduced motion preferences for infinite animations

Optional UX polish: disable the marquee animation when prefers-reduced-motion is set.

Add in globals.css or here via a utility; example (in CSS):

@media (prefers-reduced-motion: reduce) {
  .animate-scroll { animation: none !important; }
}
frontend/src/app/globals.css (2)

347-349: Use theme tokens for dropdown colors for light/dark parity

Hardcoded bg/text colors bypass your CSS vars. Prefer popover tokens.

-.dropdown-menu {
-  @apply absolute top-full left-0 mt-2 w-48 rounded-lg bg-white p-3 shadow-lg dark:bg-gray-800;
+.dropdown-menu {
+  @apply absolute top-full left-0 mt-2 w-48 rounded-lg bg-popover text-popover-foreground p-3 shadow-lg;
   @apply invisible opacity-0 transition-all duration-200 ease-in-out;
   @apply flex flex-col space-y-2;
 }

177-187: Respect reduced motion for animations

Disable non-essential animations when users prefer reduced motion.

 @keyframes fade-in-out {
@@
 .animate-fade-in-out {
   animation: fade-in-out 2s ease-in-out infinite;
 }
+
+@media (prefers-reduced-motion: reduce) {
+  .animate-fade-in-out,
+  .animate-spin,
+  .animate-fadeIn,
+  .animate-scaleIn {
+    animation: none !important;
+  }
+}

Also applies to: 109-111

frontend/lighthouserc.json (1)

1-19: Consider desktop emulation to reflect tall-screen behavior

To better catch regressions related to tall viewports (e.g., >1100px), add desktop emulation. Also optional: pin a viewport height.

 {
   "ci": {
     "assert": {
       "assertions": {
         "categories:performance": ["warn", { "minScore": 0.9 }],
         "categories:accessibility": ["warn", { "minScore": 0.9 }],
         "categories:best-practices": ["warn", { "minScore": 0.9 }],
         "categories:seo": ["warn", { "minScore": 0.9 }]
       }
     },
     "collect": {
-      "url": ["https://nest.owasp.dev/"],
-      "numberOfRuns": 3
+      "url": ["https://nest.owasp.dev/"],
+      "numberOfRuns": 3,
+      "settings": {
+        "emulatedFormFactor": "desktop"
+      }
     },
     "upload": {
       "target": "temporary-public-storage"
     }
   }
 }
frontend/Makefile (1)

30-31: LGTM: direct LHCI CLI invocation pinned at a version

Clear and reproducible. Optional: mirror desktop emulation locally to match CI.

-	@cd frontend && npx -y @lhci/[email protected] autorun --collect.url=http://localhost:3000
+	@cd frontend && npx -y @lhci/[email protected] autorun --collect.url=http://localhost:3000 --collect.settings.emulatedFormFactor=desktop
.github/workflows/run-ci-cd.yaml (1)

500-504: Scope check: does this belong to the “footer sticks to bottom” PR?

This adds/changes CI behavior (LHCI). If the intent is only the footer fix, consider a separate PR.

frontend/src/components/Footer.tsx (2)

12-18: Make Footer composable and avoid template string class merge

Extend native footer props and use clsx to safely merge classes; also pass through {...props}.

 'use client'
 import { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons'
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
 import { Button } from '@heroui/button'
 import Link from 'next/link'
 import { useState, useCallback } from 'react'
+import clsx from 'clsx'
 import type { Section } from 'types/section'
 import { footerIcons } from 'utils/constants'
 import { footerSections } from 'utils/constants'
 import { ENVIRONMENT, RELEASE_VERSION } from 'utils/env.client'

-// Add className to props
-interface FooterProps {
-  className?: string
-}
+interface FooterProps extends React.ComponentPropsWithoutRef<'footer'> {}

-export default function Footer({ className }: FooterProps) {
+export default function Footer({ className, ...props }: FooterProps) {
   const [openSection, setOpenSection] = useState<string | null>(null)
   …
-  return (
-    <footer className={`w-full border-t bg-slate-200 dark:bg-slate-800 ${className || ''}`}>
+  return (
+    <footer className={clsx('w-full border-t bg-slate-200 dark:bg-slate-800', className)} {...props}>

Also applies to: 25-26


33-36: Use valid, stable IDs in aria-controls/id (titles can contain spaces)

Current IDs are derived from titles (e.g., "OWASP Nest"), which can include spaces and non-ideal characters for IDs/ARIA. Slugify to ensure validity and better a11y.

-                aria-controls={`footer-section-${section.title}`}
+                aria-controls={`footer-section-${section.title.replace(/\s+/g, '-').toLowerCase()}`}-                id={`footer-section-${section.title}`}
+                id={`footer-section-${section.title.replace(/\s+/g, '-').toLowerCase()}`}

Also applies to: 47-50

frontend/package.json (2)

68-71: De-duplicate tailwindcss-animate (declared in deps and devDeps)

Keep it in devDependencies only (it’s a build-time plugin); remove from dependencies.

   "dependencies": {
     …
-    "tailwind-merge": "^3.3.1",
-    "tailwindcss-animate": "^1.0.7"
+    "tailwind-merge": "^3.3.1"
   },
   "devDependencies": {
     …
     "tailwindcss": "^4.1.12",
     "tailwindcss-animate": "^1.0.7",

Also applies to: 116-118


5-13: Wire Tailwind config generation into the build

build:tailwind isn’t invoked by build. Add a prebuild hook so CI doesn’t miss it.

   "scripts": {
     "build:tailwind": "ts-node --project tsconfig.tsnode.json scripts/generate-tailwind-config.ts",
+    "prebuild": "pnpm build:tailwind",
     "build": "next build",
     "build:turbo": "next build --turbo",

Also applies to: 16-21

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 7cd6d44 and 14a64e1.

⛔ Files ignored due to path filters (4)
  • backend/poetry.lock is excluded by !**/*.lock
  • cspell/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • docs/poetry.lock is excluded by !**/*.lock
  • frontend/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (60)
  • .github/workflows/run-ci-cd.yaml (1 hunks)
  • .github/workflows/run-code-ql.yaml (2 hunks)
  • .pre-commit-config.yaml (1 hunks)
  • backend/pyproject.toml (7 hunks)
  • frontend/Makefile (1 hunks)
  • frontend/lighthouserc.json (1 hunks)
  • frontend/package.json (6 hunks)
  • frontend/pnpm-workspace.yaml (1 hunks)
  • frontend/postcss.config.js (1 hunks)
  • frontend/src/app/about/layout.tsx (1 hunks)
  • frontend/src/app/about/page.tsx (1 hunks)
  • frontend/src/app/global-error.tsx (1 hunks)
  • frontend/src/app/globals.css (9 hunks)
  • frontend/src/app/layout.tsx (2 hunks)
  • frontend/src/app/loading.tsx (1 hunks)
  • frontend/src/app/page.tsx (1 hunks)
  • frontend/src/app/snapshots/[id]/page.tsx (1 hunks)
  • frontend/src/app/snapshots/page.tsx (1 hunks)
  • frontend/src/components/Card.tsx (2 hunks)
  • frontend/src/components/CardDetailsPage.tsx (1 hunks)
  • frontend/src/components/Footer.tsx (3 hunks)
  • frontend/src/components/GeneralCompliantComponent.tsx (1 hunks)
  • frontend/src/components/Header.tsx (2 hunks)
  • frontend/src/components/InfoBlock.tsx (1 hunks)
  • frontend/src/components/IssueMetadata.tsx (1 hunks)
  • frontend/src/components/ItemCardList.tsx (1 hunks)
  • frontend/src/components/LoadingSpinner.tsx (1 hunks)
  • frontend/src/components/LoginPageContent.tsx (1 hunks)
  • frontend/src/components/LogoCarousel.tsx (3 hunks)
  • frontend/src/components/MetricsScoreCircle.tsx (1 hunks)
  • frontend/src/components/Modal.tsx (1 hunks)
  • frontend/src/components/ModeToggle.tsx (1 hunks)
  • frontend/src/components/ModuleCard.tsx (1 hunks)
  • frontend/src/components/ModuleForm.tsx (1 hunks)
  • frontend/src/components/MultiSearch.tsx (2 hunks)
  • frontend/src/components/NavButton.tsx (1 hunks)
  • frontend/src/components/NavDropDown.tsx (1 hunks)
  • frontend/src/components/ProgramForm.tsx (1 hunks)
  • frontend/src/components/RecentIssues.tsx (1 hunks)
  • frontend/src/components/RecentReleases.tsx (1 hunks)
  • frontend/src/components/RepositoriesCard.tsx (1 hunks)
  • frontend/src/components/ScrollToTop.tsx (1 hunks)
  • frontend/src/components/Search.tsx (1 hunks)
  • frontend/src/components/SearchPageLayout.tsx (1 hunks)
  • frontend/src/components/SingleModuleCard.tsx (1 hunks)
  • frontend/src/components/SnapshotCard.tsx (1 hunks)
  • frontend/src/components/TestCard.tsx (1 hunks)
  • frontend/src/components/TopContributorsList.tsx (1 hunks)
  • frontend/src/components/TruncatedText.tsx (1 hunks)
  • frontend/src/components/UserCard.tsx (1 hunks)
  • frontend/src/components/UserMenu.tsx (2 hunks)
  • frontend/src/components/skeletons/ApiKeySkelton.tsx (3 hunks)
  • frontend/src/components/skeletons/Card.tsx (2 hunks)
  • frontend/src/sentry.server.config.ts (1 hunks)
  • frontend/src/types/issue.ts (1 hunks)
  • frontend/src/wrappers/provider.tsx (2 hunks)
  • frontend/tailwind.config.ts (2 hunks)
  • frontend/tsconfig.tsnode.json (1 hunks)
  • package.json (1 hunks)
  • schema/utils/schema_validators.py (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-12T17:14:28.536Z
Learnt from: Rajgupta36
PR: OWASP/Nest#1717
File: frontend/src/app/mentorship/programs/[programKey]/edit/page.tsx:90-128
Timestamp: 2025-07-12T17:14:28.536Z
Learning: Both ProgramForm (programCard.tsx) and ModuleForm (mainmoduleCard.tsx) components already implement HTML validation using the `required` attribute on form fields. The browser's native validation prevents form submission and displays error messages when required fields are empty, eliminating the need for additional JavaScript validation before GraphQL mutations.

Applied to files:

  • frontend/src/components/ProgramForm.tsx
🧬 Code graph analysis (6)
frontend/src/sentry.server.config.ts (1)
frontend/src/utils/env.client.ts (1)
  • ENVIRONMENT (3-3)
frontend/src/components/UserCard.tsx (1)
backend/apps/mentorship/api/internal/nodes/mentor.py (2)
  • name (18-20)
  • login (23-25)
frontend/src/components/IssueMetadata.tsx (3)
frontend/src/types/issue.ts (1)
  • Issue (3-20)
frontend/src/utils/dateFormatter.ts (1)
  • formatDate (1-20)
frontend/src/components/TruncatedText.tsx (1)
  • TruncatedText (3-45)
frontend/src/components/RecentIssues.tsx (2)
frontend/src/types/issue.ts (1)
  • Issue (3-20)
frontend/src/components/IssueMetadata.tsx (1)
  • IssueMetadata (17-46)
frontend/src/components/Footer.tsx (2)
frontend/src/utils/constants.ts (1)
  • footerSections (52-104)
frontend/src/types/section.ts (1)
  • Section (3-6)
frontend/src/app/layout.tsx (4)
frontend/src/wrappers/provider.tsx (1)
  • Providers (19-34)
frontend/src/components/Header.tsx (1)
  • Header (20-248)
frontend/src/utils/env.server.ts (1)
  • IS_GITHUB_AUTH_ENABLED (6-6)
frontend/src/utils/env.client.ts (1)
  • GTM_ID (5-5)
🔇 Additional comments (47)
frontend/src/components/skeletons/ApiKeySkelton.tsx (1)

9-10: LGTM: Tailwind utility reordering only

Class reordering doesn’t change behavior; rendering and dark-mode tokens remain identical.

Also applies to: 16-16, 18-21, 28-29, 34-35, 37-37, 56-56, 59-59, 62-62, 65-65, 68-68, 71-71, 82-82, 84-85, 87-88

frontend/src/components/skeletons/Card.tsx (2)

20-20: LGTM: container class reordering

Only order changed; visuals and interactions unaffected.


60-60: LGTM: contributor avatar skeleton class order swap

No functional difference; styling remains equivalent.

frontend/src/components/SnapshotCard.tsx (1)

14-14: No-op Tailwind class reorder — OK

Reordering utilities here doesn’t change rendering. Looks good.

frontend/src/components/NavDropDown.tsx (1)

69-70: No-op Tailwind class reorder — OK

Positioning is unchanged; fine to merge.

frontend/src/components/InfoBlock.tsx (1)

30-30: No-op Tailwind class reorder — OK

No functional change.

frontend/src/components/RepositoriesCard.tsx (1)

40-40: Class reordering is fine.

No functional change from moving "flex" ahead of "h-46".

frontend/src/components/ModuleForm.tsx (1)

57-57: Class reordering is fine.

No functional change; layout unaffected.

frontend/src/app/snapshots/[id]/page.tsx (1)

113-114: Class reordering is fine.

No functional change; margins remain identical.

frontend/src/components/LoadingSpinner.tsx (1)

16-16: Class reordering is fine.

Spinner behavior unchanged.

frontend/src/components/CardDetailsPage.tsx (1)

90-92: Whitespace-only change — OK

No functional impact. Safe to keep.

frontend/src/components/ItemCardList.tsx (1)

74-74: Class reorder only — OK

No behavior change.

frontend/src/components/Modal.tsx (1)

57-57: Class reorder only — OK

No functional impact on the Close button.

frontend/src/components/LoginPageContent.tsx (1)

65-65: Class reorder only — OK

No runtime or styling behavior change.

frontend/src/app/global-error.tsx (1)

43-43: No-op Tailwind class reordering — LGTM.

frontend/src/components/RecentReleases.tsx (1)

67-67: No-op Tailwind class reordering — LGTM.

frontend/src/components/SingleModuleCard.tsx (1)

82-82: Class order change is fine.

Purely presentational reordering of Tailwind utilities; no behavior change.

frontend/src/components/GeneralCompliantComponent.tsx (1)

30-30: LGTM — order-only Tailwind tweak.

No functional change; positioning remains centered.

frontend/src/components/ModuleCard.tsx (1)

77-77: LGTM — cosmetic class reordering.

No impact on layout or behavior.

.github/workflows/run-code-ql.yaml (2)

56-56: Verified analyze action SHA matches intended upstream commit
SHA 96f518a34f7a870018057716cc4d7a5c014bd61c is a valid merge commit dated 2025-08-18T11:45:49Z in the github/codeql-action repo; no changes needed.


32-32: Verify and Align Pinned CodeQL Action Version

The SHA 96f518a34f7a870018057716cc4d7a5c014bd61c exists upstream (commit date 2025-08-18) but no release tag (e.g. v3.29.10) points at it. If you meant to pin to the official v3.29.10 release, switch to uses: github/codeql-action/[email protected] (or its tag commit SHA); otherwise confirm that this specific merge commit won’t be removed.

frontend/src/sentry.server.config.ts (1)

7-7: Sane fallback prevents runtime error when ENVIRONMENT is unset

Using a default before .toLowerCase() avoids crashes in local/dev. Looks good.

frontend/src/components/UserMenu.tsx (2)

41-41: Class reordering only — no behavioral change

Safe Tailwind order tweak for the loading avatar.


90-91: Dropdown positioning class order change is harmless

No functional impact; render and A11y attributes remain intact.

frontend/src/components/TopContributorsList.tsx (1)

57-57: Tailwind class reorder is non-functional

No change to layout/overflow behavior for truncated contributor names.

frontend/src/components/Header.tsx (3)

56-56: Header container class order shuffle

No change to stacking or positioning; safe.


150-152: Mobile menu wrapper class order shuffle

No runtime/visual regression expected; same utilities preserved.


154-155: Padding order swap only

Purely cosmetic; fine to merge.

frontend/src/components/Search.tsx (4)

73-74: Icon classes reordered

No effect on positioning; OK.


81-82: Input classes reordered

No behavioral changes; focus/ring logic unchanged.


85-90: Clear button classes reordered

No functional change; event handling intact.


69-96: Invert loading conditional UI currently shows the search input when !isLoaded and the <Skeleton> when isLoaded. If isLoaded means “ready,” swap these branches (or rename the flag to match its behavior).

frontend/src/components/Card.tsx (2)

32-32: LGTM: class order tweak on container
No behavior change; safe.


57-57: LGTM: title utility reordering
No behavior change; safe.

frontend/postcss.config.js (1)

3-5: Verified Tailwind PostCSS plugin installation and version alignment
@tailwindcss/postcss@^4.1.12 aligns with tailwindcss@^4.1.12 and autoprefixer@^10.4.21 is present.

frontend/src/app/loading.tsx (1)

1-30: Scope check: does this address the footer-sticks-to-bottom objective?

The PR description mentions updating layout.tsx with flex min-h-screen flex-col, but that change isn’t visible here. Please confirm app/layout.tsx also sets display: flex and min-h-screen, and that your <main> uses flex-1, so the footer reliably anchors at the bottom during loading on tall screens.

frontend/src/app/about/layout.tsx (1)

1-4: Verify removal of route-level metadata is intentional and aligned with footer fix scope.

Dropping the About metadata shifts SEO/OpenGraph to global defaults. If About had custom title/OG before, confirm app/layout.tsx now covers it. Also, since this PR’s objective is footer stickiness, please confirm this change isn’t scope creep.

frontend/src/components/MultiSearch.tsx (1)

231-233: LGTM: class reordering is a no-op.

No behavioral change; safe.

Also applies to: 240-241, 244-249, 252-253

frontend/src/components/MetricsScoreCircle.tsx (1)

54-54: LGTM: Tailwind class reordering only.

No functional changes.

Also applies to: 57-57, 58-58, 63-63

frontend/src/components/UserCard.tsx (1)

41-61: Class reordering is no-op; safe to merge

Styling order changes don’t affect rendering. Looks good.

frontend/src/components/LogoCarousel.tsx (1)

25-26: Class reordering only; no functional diffs

No behavior change; safe.

Also applies to: 56-63, 74-75

frontend/src/app/page.tsx (1)

4-8: Verify sticky-footer classes in layout and footer
Ensure the root wrapper in frontend/src/app/layout.tsx includes min-h-screen flex flex-col (or equivalent), and that your <footer> element has mt-auto to stay pinned to the bottom.

frontend/src/app/globals.css (1)

225-227: Verify license compliance: hiding map attributions

Hiding .leaflet-control-attribution may violate your tile provider/OSM terms.

If needed, restyle instead of hiding, or render custom attributions per provider terms.

frontend/tsconfig.tsnode.json (1)

1-10: LGTM

Config is tight and scoped to the generator script.

frontend/src/components/RecentIssues.tsx (2)

20-21: LGTM: clear visual emphasis

Icon styling reads well and remains accessible.


26-27: Good reuse via IssueMetadata; verify parent is a Client Component

If the child (IssueMetadata) uses Next hooks, ensure an ancestor has "use client", or the child declares it.

frontend/src/app/layout.tsx (1)

67-75: LGTM: flex layout fixes the sticky footer

Adding flex min-h-screen flex-col on body and wrapping content in

correctly pins the footer to the bottom across tall viewports and during loading.

Comment on lines +10 to 15
authors = [ "Arkadii Yakovets <[email protected]>" ]
readme = "README.md"

packages = [ { include = "apps" } ]
packages = [ { include = "apps" } ]

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Duplicate keys in [tool.poetry] and [tool.poetry.dependencies] break TOML parsing

Repeated authors, packages, and django-storages will cause parse errors.

-authors = [ "Arkadii Yakovets <[email protected]>" ]
-
-packages = [ { include = "apps" } ]
+ # (keep a single authors key above)
+ # (keep a single packages key below)

-django-storages = { extras = [ "s3" ], version = "^1.14.4" }
+ # (remove duplicate; keep one django-storages entry)

Also applies to: 25-26

🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 10 to 15 (and also lines 25 to 26), there
are duplicate keys (authors, packages and a duplicate dependency entry such as
django-storages) which will break TOML parsing; remove the repeated entries so
each key appears only once: consolidate authors into a single authors = [...]
entry, keep a single packages = [...] entry, and ensure each dependency is
listed only once in [tool.poetry.dependencies] (delete or merge the duplicate
dependency line), then run a TOML validator to confirm the file parses.

Comment on lines +70 to +127
line-length = 99
lint.select = [ "ALL" ]
lint.extend-select = [ "I" ]
lint.ignore = [
"ANN", # https://docs.astral.sh/ruff/rules/#flake8-annotations-ann/
"ARG002", # https://docs.astral.sh/ruff/rules/unused-method-argument/
"C901", # https://docs.astral.sh/ruff/rules/complex-structure/
"COM812", # https://docs.astral.sh/ruff/rules/missing-trailing-comma/
"D407", # https://docs.astral.sh/ruff/rules/missing-dashed-underline-after-section/
"DJ012", # https://docs.astral.sh/ruff/rules/django-unordered-body-content-in-model/
"FIX002", # https://docs.astral.sh/ruff/rules/line-contains-todo/
"PLC0415", # https://docs.astral.sh/ruff/rules/import-outside-top-level/
"PLR0912", # https://docs.astral.sh/ruff/rules/too-many-branches/
"PLR0913", # https://docs.astral.sh/ruff/rules/too-many-arguments/
"PLR0915", # https://docs.astral.sh/ruff/rules/too-many-statements/
"RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/
"TD003", # https://docs.astral.sh/ruff/rules/missing-todo-link/
]
lint.per-file-ignores."**/__init__.py" = [
"D104", # https://docs.astral.sh/ruff/rules/undocumented-public-package/
"F401", # https://docs.astral.sh/ruff/rules/unused-import/
]
lint.per-file-ignores."**/management/commands/*.py" = [
"D101", # https://docs.astral.sh/ruff/rules/undocumented-public-class/
"D102", # https://docs.astral.sh/ruff/rules/undocumented-public-method/
"T201", # https://docs.astral.sh/ruff/rules/print/
]
lint.per-file-ignores."**/migrations/*.py" = [
"D100", # https://docs.astral.sh/ruff/rules/undocumented-public-module/
"D101", # https://docs.astral.sh/ruff/rules/undocumented-public-class/
"D104", # https://docs.astral.sh/ruff/rules/undocumented-public-package/
"E501", # https://docs.astral.sh/ruff/rules/line-too-long/
"RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/
]
lint.per-file-ignores."**/models/*.py" = [
"D106", # https://docs.astral.sh/ruff/rules/undocumented-public-nested-class/
]
lint.per-file-ignores."**/rest/v1/*.py" = [
"ARG001", # https://docs.astral.sh/ruff/rules/unused-function-argument/
"B008", # https://docs.astral.sh/ruff/rules/function-call-in-default-argument/
]
lint.per-file-ignores."**/settings/*.py" = [
"RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/
]
lint.per-file-ignores."**/tests/**/*.py" = [
"D100", # https://docs.astral.sh/ruff/rules/undocumented-public-module/
"D101", # https://docs.astral.sh/ruff/rules/undocumented-public-class/
"D102", # https://docs.astral.sh/ruff/rules/undocumented-public-method/
"D103", # https://docs.astral.sh/ruff/rules/undocumented-public-function/
"D107", # https://docs.astral.sh/ruff/rules/undocumented-public-init/
"PLR2004", # https://docs.astral.sh/ruff/rules/magic-value-comparison/
"RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/
"S101", # https://docs.astral.sh/ruff/rules/assert/
"SLF001", # https://docs.astral.sh/ruff/rules/private-member-access/
]
[tool.ruff]
target-version = "py313"

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Second [tool.ruff] table duplicates the first; remove one

Having two [tool.ruff] blocks with overlapping keys is invalid.

-[tool.ruff]
-target-version = "py313"
-
-line-length = 99
-lint.select = [ "ALL" ]
-lint.extend-select = [ "I" ]
-lint.ignore = [
-  "ANN",
-  "ARG002",
-  "C901",
-  "COM812",
-  "D407",
-  "DJ012",
-  "FIX002",
-  "PLC0415",
-  "PLR0912",
-  "PLR0913",
-  "PLR0915",
-  "RUF012",
-  "TD003",
-]
-lint.per-file-ignores."**/__init__.py" = [ "D104", "F401" ]
-lint.per-file-ignores."**/management/commands/*.py" = [ "D101", "D102", "T201" ]
-lint.per-file-ignores."**/migrations/*.py" = [ "D100", "D101", "D104", "E501", "RUF012" ]
-lint.per-file-ignores."**/models/*.py" = [ "D106" ]
-lint.per-file-ignores."**/rest/v1/*.py" = [ "ARG001", "B008" ]
-lint.per-file-ignores."**/settings/*.py" = [ "RUF012" ]
-lint.per-file-ignores."**/tests/**/*.py" = [ "D100","D101","D102","D103","D107","PLR2004","RUF012","S101","SLF001" ]

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 70 to 127, there is a duplicate
[tool.ruff] table which conflicts with the earlier [tool.ruff] section; remove
the second duplicate block (or merge any unique keys from it into the first
[tool.ruff] section) so that only a single [tool.ruff] table remains in
pyproject.toml and keys are not repeated.

Comment on lines +198 to +207
"--cov-config=pyproject.toml",
"--cov-fail-under=80",
"--cov-precision=2",
"--cov-report=term-missing",
"--cov=.",
"--dist=loadscope",
"--durations-min=1",
"--durations=5",
"--no-cov-on-fail",
"--numprocesses=auto",
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

pytest addopts and filterwarnings duplicated; keep a single set

Dupes increase noise and may confuse tooling.

   "--numprocesses=auto",
-  "--cov-config=pyproject.toml",
-  "--cov-fail-under=80",
-  "--cov-precision=2",
-  "--cov-report=term-missing",
-  "--cov=.",
-  "--dist=loadscope",
-  "--durations-min=1",
-  "--durations=5",
-  "--no-cov-on-fail",
-  "--numprocesses=auto",
 ]
@@
-  "ignore::DeprecationWarning:pytest_cov",
-  "ignore::DeprecationWarning:xdist",
-  "ignore::django.conf.RemovedInDjango60Warning:django",
-  "ignore::pydantic.warnings.PydanticDeprecatedSince20",

Also applies to: 214-218

🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 198-207 (and also duplicated at 214-218),
the pytest addopts and filterwarnings entries are duplicated; open the file,
locate both blocks and remove the redundant copy so each pytest option appears
only once, keeping a single canonical set (merge any differing options into that
one set), and ensure flags like --cov, --dist, --numprocesses, and
filterwarnings are present only in that single block.

Comment on lines +235 to +248
[tool.coverage.run]
branch = true
omit = [
"__init__.py",
"**/admin.py",
"**/apps.py",
"**/migrations/*",
"**/mentorship/*", # TODO: work in progress
"manage.py",
"settings/*",
"tests/*",
"wsgi.py",
]

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Duplicate [tool.coverage.run] block

Only one coverage run block should exist.

-[tool.coverage.run]
-branch = true
-omit = [
-  "__init__.py",
-  "**/admin.py",
-  "**/apps.py",
-  "**/migrations/*",
-  "**/mentorship/*", # TODO: work in progress
-  "manage.py",
-  "settings/*",
-  "tests/*",
-  "wsgi.py",
-]
📝 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
[tool.coverage.run]
branch = true
omit = [
"__init__.py",
"**/admin.py",
"**/apps.py",
"**/migrations/*",
"**/mentorship/*", # TODO: work in progress
"manage.py",
"settings/*",
"tests/*",
"wsgi.py",
]
# (Removed duplicate [tool.coverage.run] block)
🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 235 to 248 there is a duplicate
[tool.coverage.run] block; remove this redundant block (or merge its omit
entries into the single canonical [tool.coverage.run] section elsewhere in the
file) so that only one [tool.coverage.run] table exists, combining any unique
settings/omit patterns into that single section.

ignore_missing_imports = true
mypy_path = "backend"
plugins = [ "strawberry.ext.mypy_plugin" ]
plugins = [ "strawberry.ext.mypy_plugin" ]
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Duplicate mypy plugin and overrides

Remove the extra plugin line and duplicate override block.

-plugins = [ "strawberry.ext.mypy_plugin" ]
@@
-[[tool.mypy.overrides]]
-disable_error_code = [ "attr-defined" ]
-module = [ "apps.*.models.mixins.*", "apps.*.admin.*" ]

Also applies to: 259-266

🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 254 (and also duplicate override block at
lines 259-266), there are duplicate entries for the mypy plugin and a duplicated
override block; remove the extra plugins = [ "strawberry.ext.mypy_plugin" ] line
and delete the redundant override block so each plugin and override appears only
once, leaving a single plugins declaration and a single override block as the
authoritative configuration.

Comment on lines +14 to 16
<h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white">
<p>{title}</p>
</h3>
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Fix invalid heading markup (h3 wrapping p)

A heading element must contain phrasing content; a block-level p inside h3 is invalid and hurts a11y/semantics. Inline the title directly.

-        <h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white">
-          <p>{title}</p>
-        </h3>
+        <h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white">
+          {title}
+        </h3>
📝 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
<h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white">
<p>{title}</p>
</h3>
<h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white">
{title}
</h3>
🤖 Prompt for AI Agents
In frontend/src/components/SnapshotCard.tsx around lines 14 to 16, the h3
currently wraps a block-level <p> which is invalid HTML; remove the <p> and
inline the title directly inside the h3 (keep the existing className and
interpolation, e.g. replace <p>{title}</p> with {title}) so the heading contains
phrasing content only and preserves semantics/accessibility.

Comment on lines +9 to +11
// 🚫 Apollo temporarily disabled
// import { ApolloProvider } from '@apollo/client'
// import apolloClient from 'utils/helpers/apolloClient'
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Apollo removal: verify no remaining dependencies

Without ApolloProvider, any useQuery/useApolloClient calls will throw. Please verify no Apollo usage remains.

Also applies to: 26-28


🏁 Script executed:

#!/bin/bash
# Find Apollo usage across the repo
rg -nP "(from\s+['\"]@apollo/client['\"]|useQuery\s*\(|useMutation\s*\(|ApolloProvider|gql`)" -C2

Length of output: 116


🏁 Script executed:

#!/bin/bash
# Find Apollo usage across the repo with corrected regex quoting
patterns=(
  "from\\s+[\"']@apollo/client[\"']"
  "useQuery\\s*\\("
  "useMutation\\s*\\("
  "ApolloProvider"
  "gql\`"
)
for p in "${patterns[@]}"; do
  echo "Searching for pattern: $p"
  rg -nP "$p" -C2 || true
done

Length of output: 54591


Re-enable ApolloProvider or remove all Apollo hook usages: Numerous useQuery/useMutation/useApolloClient calls remain across pages (e.g. frontend/src/app/**) and components (e.g. ModuleForm.tsx, useLogout.ts), so disabling ApolloProvider (provider.tsx lines 9–11 & 26–28) will break the app.

🤖 Prompt for AI Agents
In frontend/src/wrappers/provider.tsx around lines 9–11 and 26–28, the
ApolloProvider import and usage were commented out which will break
components/pages that call useQuery/useMutation/useApolloClient; restore the two
imports (ApolloProvider from '@apollo/client' and apolloClient from
'utils/helpers/apolloClient') and re-wrap the app children with <ApolloProvider
client={apolloClient}>...</ApolloProvider> in the component return, ensuring the
import paths are correct and the apolloClient instance is initialized before
rendering.

Comment on lines +14 to 19
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
border: 'hsl(var(--border))',
text: 'hsl(var(--text))',
'owasp-blue': '#98AFC7',
card: {
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Undefined CSS var --text; alias or remove to avoid invalid hsl(var(--text))

globals.css doesn’t define --text. This will yield invalid color at runtime.

       colors: {
         background: 'hsl(var(--background))',
         foreground: 'hsl(var(--foreground))',
         border: 'hsl(var(--border))',
-        text: 'hsl(var(--text))',
+        // Alias to foreground to preserve any usage of text-*
+        text: 'hsl(var(--foreground))',
         'owasp-blue': '#98AFC7',

Run to confirm no stray --text token is defined and to find any text-text usages:


🏁 Script executed:

#!/bin/bash
rg -nP '\-\-text\s*:' frontend/src/app/globals.css || true
rg -n 'text-text' frontend || true

Length of output: 639


Alias undefined CSS variable --text in Tailwind config Replace text: 'hsl(var(--text))' with text: 'hsl(var(--foreground))' so existing .text-text classes (used in four components) yield valid colors at runtime.

🤖 Prompt for AI Agents
In frontend/tailwind.config.ts around lines 14 to 19, the Tailwind color alias
uses an undefined CSS variable `--text` (text: 'hsl(var(--text))'), causing
`.text-text` classes to produce invalid colors; change that entry to reference
the existing foreground variable (text: 'hsl(var(--foreground))') so
`.text-text` resolves to a valid color at runtime.

Comment on lines +1 to +28
{
"name": "nest-milestones",
"version": "1.0.0",
"description": "<div align=\"center\">",
"main": "index.js",
"directories": {
"doc": "docs"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/OUMIMANDAL/Nest-milestones.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/OUMIMANDAL/Nest-milestones/issues"
},
"homepage": "https://github.com/OUMIMANDAL/Nest-milestones#readme",
"dependencies": {
"next": "^15.4.6",
"react": "^19.1.1",
"react-dom": "^19.1.1"
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Remove root package.json — unrelated app scaffold, wrong repo metadata, and conflicting Next/React versions

This introduces a second app at repo root with Next 15/React 19 and links to a different GitHub project. It’s unrelated to fixing the footer and risks tooling conflicts.

Please drop this file from the PR. If you intended a separate example app, move it to its own repo/PR.
To confirm no stray manifests remain:


🏁 Script executed:

#!/bin/bash
# List all package.json files (excluding node_modules)
fd -a package.json -E node_modules

Length of output: 148


🏁 Script executed:

#!/bin/bash
# Inspect the first 20 lines of cspell and frontend package.json
head -n 20 cspell/package.json
echo "---- frontend/package.json ----"
head -n 20 frontend/package.json

Length of output: 1455


🏁 Script executed:

#!/bin/bash
# Inspect the first 30 lines of root package.json
head -n 30 package.json

Length of output: 679


Remove root package.json
This manifest for “nest-milestones” (Next 15/React 19) is unrelated to the repo’s frontend and will conflict with existing tooling; delete it or move it to its own repository.

🤖 Prompt for AI Agents
package.json lines 1-28: This root package.json belongs to an unrelated
Next/React project and will conflict with the repository; remove the file from
the repo (git rm package.json) or move it into its own repository, then update
or remove any references to it in CI/CD, root-level scripts, workspace configs,
and README; if you move it, preserve commit history (git mv to new repo or
export), and ensure the repository root has the correct package.json for this
project (or none) to prevent tooling conflicts.

Comment on lines +31 to +38
return Registry().with_resource(
COMMON_JSON,
Resource.from_contents(
json.load(
Path.open(f"{Path(__file__).parent.parent.resolve()}/{COMMON_JSON}"),
),
),
)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix file loading: Path.open misused; use Path().open or importlib.resources

Path.open is an instance method; calling it as a static with a string will fail. Also wrap IO in a context manager.

Apply:

-def get_registry():
-    return Registry().with_resource(
-        COMMON_JSON,
-        Resource.from_contents(
-            json.load(
-                Path.open(f"{Path(__file__).parent.parent.resolve()}/{COMMON_JSON}"),
-            ),
-        ),
-    )
+def get_registry():
+    common_path = Path(__file__).resolve().parent.parent / COMMON_JSON
+    with common_path.open("r", encoding="utf-8") as f:
+        common = json.load(f)
+    return Registry().with_resource(
+        COMMON_JSON,
+        Resource.from_contents(common),
+    )
📝 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
return Registry().with_resource(
COMMON_JSON,
Resource.from_contents(
json.load(
Path.open(f"{Path(__file__).parent.parent.resolve()}/{COMMON_JSON}"),
),
),
)
def get_registry():
common_path = Path(__file__).resolve().parent.parent / COMMON_JSON
with common_path.open("r", encoding="utf-8") as f:
common = json.load(f)
return Registry().with_resource(
COMMON_JSON,
Resource.from_contents(common),
)
🤖 Prompt for AI Agents
In schema/utils/schema_validators.py around lines 31 to 38, the code incorrectly
calls Path.open as a static method with a string and does not use a context
manager; replace that with a proper Path object for the file (e.g.
Path(__file__).parent.parent / COMMON_JSON) and open it with a context manager
(with path.open('r') as f: json.load(f)), or alternatively load the resource via
importlib.resources.open_text, then pass the loaded JSON to
Resource.from_contents; ensure file handles are closed by using the with block.

@kasya kasya closed this Sep 1, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix Home Page container flexibility

7 participants