Skip to content

Enforce strict co-location pattern in website app#46

Merged
saddlepaddle merged 5 commits intomainfrom
restructure-web-app
Nov 9, 2025
Merged

Enforce strict co-location pattern in website app#46
saddlepaddle merged 5 commits intomainfrom
restructure-web-app

Conversation

@saddlepaddle
Copy link
Copy Markdown
Collaborator

@saddlepaddle saddlepaddle commented Nov 9, 2025

Summary

Refactored website app to strictly follow the co-location pattern defined in AGENTS.md. Moved components to correct nesting levels based on usage, extracted multi-component files, and removed dead code.

Changes

  • Moved Header, Footer, WaitlistModal from shared layout/ to app/components/ (used only in page.tsx)
  • Extracted HeroCanvas multi-component file into LitBackground component and helpers
  • Deleted unused ScaleFeaturesSection component
  • Added project-structure-validator agent for ongoing compliance checking

Testing

All type checks pass. Components are correctly co-located and follow architectural patterns.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Interactive Hero with layered canvas background and parallax, Client logo marquee, Features section with animated entries and waitlist CTA (modal wired up)
  • Refactoring

    • Page simplified to modular sections and component export re-organization for cleaner imports
  • Removals

    • Legacy tilt-card motion component and related exports removed
  • Documentation

    • Added project structure guidance and a validator specification with reporting format and performance notes

saddlepaddle and others added 2 commits November 8, 2025 22:29
- Extract page sections into dedicated components (HeroSection, ClientLogosSection, ScaleFeaturesSection, FeaturesSection)
- Nest sub-components under parent's components/ directory when only used once
- Move shared layout components (Header, Footer, WaitlistModal) to components/layout/
- Co-locate constants, config, hooks, and shaders with their components
- Reduce main page.tsx from 419 lines to ~30 lines of orchestration
- Add comprehensive Project Structure documentation to AGENTS.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Move Header, Footer, WaitlistModal to app/components/ (used only in page.tsx)
- Extract HeroCanvas multi-component file:
  - calculateGlareProperties → helpers.ts
  - LitBackground → components/LitBackground/
- Delete unused ScaleFeaturesSection component
- Update all imports to use relative paths
- Add project-structure-validator agent for ongoing compliance

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 9, 2025

Walkthrough

Adds project-structure-validator docs and tooling, updates AGENTS.md with project-structure guidance, introduces UI components (HeroSection, HeroCanvas and shaders, ClientLogosSection, FeaturesSection), consolidates barrel exports, refactors page composition, removes a motion component and index exports, and adds a script to build a component import graph.

Changes

Cohort / File(s) Summary
Project structure & tooling
AGENTS.md, .claude/agents/project-structure-validator.md, .claude/agents/project-structure-validator/.gitignore, .claude/agents/project-structure-validator/build-component-graph.sh
Adds detailed Project Structure guidance to AGENTS.md and a new project-structure-validator doc; adds .gitignore entry and a bash script that scans TS/TSX files and emits a component import graph to .component-graph.json.
HeroSection & parallax/fade wrappers
apps/website/src/app/components/HeroSection/HeroSection.tsx, apps/website/src/app/components/HeroSection/index.ts, apps/website/src/app/components/HeroSection/components/HeroParallax/..., apps/website/src/app/components/HeroSection/components/FadeUp/...
Adds HeroSection component composing parallax and FadeUp wrappers and re-exports for HeroSection and related utilities.
HeroCanvas, LitBackground, config, helpers, shaders
apps/website/src/app/components/HeroSection/components/HeroCanvas/HeroCanvas.tsx, .../HeroCanvas/components/LitBackground/..., .../HeroCanvas/config.ts, .../HeroCanvas/helpers.ts, .../HeroCanvas/shaders/vertex.ts, .../HeroCanvas/shaders/fragment.ts, .../LitBackground/index.ts
New HeroCanvas wrapper (react-three fiber Canvas), refactored LitBackground, exported typed config constants, a calculateGlareProperties helper, and embedded vertex/fragment shader strings implementing dynamic waves and lighting.
Client logos carousel
apps/website/src/app/components/ClientLogosSection/ClientLogosSection.tsx, apps/website/src/app/components/ClientLogosSection/constants.ts, apps/website/src/app/components/ClientLogosSection/index.ts
Adds ClientLogosSection component (infinite marquee using framer-motion), a CLIENT_LOGOS constant list, and a barrel export.
Features section
apps/website/src/app/components/FeaturesSection/FeaturesSection.tsx, apps/website/src/app/components/FeaturesSection/index.ts
Adds FeaturesSection component with animated feature items and a Join waitlist CTA, plus a barrel export.
Page composition & state hookup
apps/website/src/app/page.tsx
Replaces inline UI/data with imports for Header, HeroSection, ClientLogosSection, FeaturesSection, Footer, and WaitlistModal; wires WaitlistModal open/close state and removes legacy in-file components and constants.
Barrel exports (small components)
apps/website/src/app/components/Header/index.ts, apps/website/src/app/components/Footer/index.ts, apps/website/src/app/components/WaitlistModal/index.ts, apps/website/src/app/components/HeroSection/components/FadeUp/index.ts, apps/website/src/app/components/HeroSection/components/HeroParallax/index.ts, apps/website/src/app/components/HeroSection/components/HeroCanvas/components/LitBackground/index.ts
Adds multiple index files re-exporting components for consistent imports.
Header import adjustment
apps/website/src/app/components/Header/Header.tsx
Adjusts WaitlistModal import path from ./WaitlistModal to ../WaitlistModal.
Motion components removed / index cleaned
apps/website/src/components/motion/TiltCard.tsx, apps/website/src/components/motion/index.ts
Removes the TiltCard component and removes motion index exports (FadeUp, HeroParallax, TiltCard).
Re-exports for new components
apps/website/src/app/components/ClientLogosSection/index.ts, apps/website/src/app/components/FeaturesSection/index.ts, etc.
Adds re-exports to surface the new components from their directories.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant P as page.tsx
    participant H as Header
    participant Hero as HeroSection
    participant C as HeroCanvas
    participant L as ClientLogosSection
    participant F as FeaturesSection
    participant M as WaitlistModal
    participant Ft as Footer

    U->>P: request page
    P->>H: render Header
    P->>Hero: render HeroSection
    Hero->>C: initialize three.js Canvas
    C->>C: load config & shaders\ncompute glare via helpers
    P->>L: render ClientLogosSection (marquee)
    P->>F: render FeaturesSection (pass onOpenWaitlist)
    U->>F: click "Join waitlist"
    F->>P: onOpenWaitlist()
    P->>M: open WaitlistModal
    U->>M: interact / close
    P->>Ft: render Footer
Loading
sequenceDiagram
    autonumber
    participant Script as build-component-graph.sh
    participant FS as File system
    participant Parser as grep / sed / awk
    participant Out as .component-graph.json

    Script->>FS: find TS/TSX files (exclude tests/stories/node_modules)
    Script->>Parser: extract import statements & component names
    Parser->>Script: aggregate import counts and importers
    Script->>Out: write JSON graph (.component-graph.json)
    Script->>FS: log output path
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Focus review on:

  • shader code (vertex/fragment) and matching uniform/attribute usage
  • calculateGlareProperties timing math vs TEXT_CONFIG values
  • three.js / react-three-fiber Canvas props (DPR, performance, Suspense usage)
  • config constants alignment with shader expectations (naming/types)
  • page state hookup for WaitlistModal and changed import paths
  • removed motion exports and any remaining consumers referencing them

Poem

🐇
I hop through lines of code and light,
shaders dance and logos flight,
sections stitched from day to night,
a graph is born, components bright,
I thump my paws — the site feels right!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Enforce strict co-location pattern in website app' directly reflects the main objective of the PR: enforcing co-location architectural patterns as defined in AGENTS.md.
Description check ✅ Passed The PR description provides a clear Summary section explaining the refactoring and co-location pattern enforcement. However, it only partially follows the provided template: it lacks Related Issues, Type of Change, Testing details, and Additional Notes sections.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch restructure-web-app

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

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)
AGENTS.md (1)

77-114: Add languages to fenced code blocks.

Markdownlint (MD040) is flagging these tree/layout snippets because the fences lack a language hint. Adding something like ```text (or another appropriate language) will clear the warnings and keep automated docs checks happy.

WEB_APP_RESTRUCTURE_PLAN.md (1)

22-41: Annotate fenced code blocks with a language.

Same markdownlint MD040 warning here—the large structure block is missing a language identifier. Please add ```text (or whichever fits best) so the documentation lint stays green.

apps/website/src/app/components/HeroSection/components/HeroCanvas/shaders/fragment.ts (1)

1-35: Remove unused uniform or wire it into the shader

uMetalness is declared, set from config, and uploaded every frame, but it never factors into the lighting math. Please either put it to use (e.g., blend it into the specular term) or drop the uniform so the shader stays lean and easier to reason about.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 22b0b65 and fc038d3.

📒 Files selected for processing (26)
  • .claude/agents/project-structure-validator.md (1 hunks)
  • AGENTS.md (2 hunks)
  • WEB_APP_RESTRUCTURE_PLAN.md (1 hunks)
  • apps/website/src/app/components/ClientLogosSection/ClientLogosSection.tsx (1 hunks)
  • apps/website/src/app/components/ClientLogosSection/constants.ts (1 hunks)
  • apps/website/src/app/components/ClientLogosSection/index.ts (1 hunks)
  • apps/website/src/app/components/FeaturesSection/FeaturesSection.tsx (1 hunks)
  • apps/website/src/app/components/FeaturesSection/index.ts (1 hunks)
  • apps/website/src/app/components/Footer/index.ts (1 hunks)
  • apps/website/src/app/components/Header/Header.tsx (1 hunks)
  • apps/website/src/app/components/Header/index.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/HeroSection.tsx (1 hunks)
  • apps/website/src/app/components/HeroSection/components/FadeUp/index.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroCanvas/HeroCanvas.tsx (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroCanvas/components/LitBackground/LitBackground.tsx (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroCanvas/components/LitBackground/index.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroCanvas/config.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroCanvas/helpers.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroCanvas/shaders/fragment.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroCanvas/shaders/vertex.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/components/HeroParallax/index.ts (1 hunks)
  • apps/website/src/app/components/HeroSection/index.ts (1 hunks)
  • apps/website/src/app/components/WaitlistModal/index.ts (1 hunks)
  • apps/website/src/app/page.tsx (1 hunks)
  • apps/website/src/components/motion/TiltCard.tsx (0 hunks)
  • apps/website/src/components/motion/index.ts (0 hunks)
💤 Files with no reviewable changes (2)
  • apps/website/src/components/motion/index.ts
  • apps/website/src/components/motion/TiltCard.tsx
🧰 Additional context used
🧬 Code graph analysis (6)
apps/website/src/app/components/HeroSection/HeroSection.tsx (3)
apps/website/src/app/components/HeroSection/components/HeroParallax/HeroParallax.tsx (1)
  • HeroParallax (20-63)
apps/website/src/app/components/HeroSection/components/HeroCanvas/HeroCanvas.tsx (1)
  • HeroCanvas (11-39)
apps/website/src/app/components/HeroSection/components/FadeUp/FadeUp.tsx (1)
  • FadeUp (24-46)
apps/website/src/app/components/HeroSection/components/HeroCanvas/helpers.ts (1)
apps/website/src/app/components/HeroSection/components/HeroCanvas/config.ts (1)
  • TEXT_CONFIG (33-49)
apps/website/src/app/components/ClientLogosSection/ClientLogosSection.tsx (1)
apps/website/src/app/components/ClientLogosSection/constants.ts (1)
  • CLIENT_LOGOS (1-11)
apps/website/src/app/components/FeaturesSection/FeaturesSection.tsx (1)
apps/website/src/app/components/FeaturesSection/index.ts (1)
  • FeaturesSection (1-1)
apps/website/src/app/components/HeroSection/components/HeroCanvas/HeroCanvas.tsx (1)
apps/website/src/app/components/HeroSection/components/HeroCanvas/components/LitBackground/LitBackground.tsx (1)
  • LitBackground (19-258)
apps/website/src/app/components/HeroSection/components/HeroCanvas/components/LitBackground/LitBackground.tsx (1)
apps/website/src/app/components/HeroSection/components/HeroCanvas/components/LitBackground/index.ts (1)
  • LitBackground (1-1)
🪛 markdownlint-cli2 (0.18.1)
AGENTS.md

76-76: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

WEB_APP_RESTRUCTURE_PLAN.md

21-21: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


52-52: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


226-226: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


228-228: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


374-374: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (8)
apps/website/src/app/components/Header/Header.tsx (1)

5-5: LGTM! Import path correctly updated for new structure.

The import path change from "./WaitlistModal" to "../WaitlistModal" correctly reflects the restructured co-location where WaitlistModal is now a sibling directory under components/ rather than nested within Header/.

apps/website/src/app/components/ClientLogosSection/index.ts (1)

1-1: LGTM! Clean barrel export.

Standard barrel export pattern that enables cleaner imports and aligns with the co-location structure.

apps/website/src/app/components/FeaturesSection/index.ts (1)

1-1: LGTM! Consistent barrel export.

Follows the same clean pattern as other component exports in this refactoring.

apps/website/src/app/components/HeroSection/components/HeroParallax/index.ts (1)

1-1: LGTM! Multi-export barrel.

Correctly exports both the component and its associated hook, maintaining a clean public API.

apps/website/src/app/components/HeroSection/components/FadeUp/index.ts (1)

1-1: LGTM! Standard barrel export.

Clean component re-export following the established pattern.

apps/website/src/app/components/HeroSection/index.ts (1)

1-1: LGTM! Top-level component export.

Standard barrel export for the HeroSection component, consistent with other top-level sections.

apps/website/src/app/components/Header/index.ts (1)

1-1: LGTM! Header component export.

Enables clean imports of the Header component via the directory path.

apps/website/src/app/components/Footer/index.ts (1)

1-1: LGTM! Footer component export.

Final component barrel export completing the consistent co-location pattern across all top-level sections.

Comment on lines +28 to +38
className="flex gap-12 sm:gap-16 md:gap-24"
animate={{
x: [0, -1000],
}}
transition={{
x: {
repeat: Number.POSITIVE_INFINITY,
repeatType: "loop",
duration: 20,
ease: "linear",
},
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 | 🟠 Major

Fix marquee offset to avoid gaps

Hard-coding x: [0, -1000] makes the marquee drift out of sync with the actual logo width. On wider viewports the strip resets before the next copy lines up, producing a backward jump; on narrower viewports it keeps sliding past the content and leaves blank space before looping. Drive the animation with a relative offset so the second copy is always aligned when the loop restarts.

-							animate={{
-								x: [0, -1000],
-							}}
+							animate={{
+								x: ["0%", "-33.333333%"],
+							}}
 							
 							transition={{
 								x: {
 									repeat: Number.POSITIVE_INFINITY,
 									repeatType: "loop",
 									duration: 20,
 									ease: "linear",
📝 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
className="flex gap-12 sm:gap-16 md:gap-24"
animate={{
x: [0, -1000],
}}
transition={{
x: {
repeat: Number.POSITIVE_INFINITY,
repeatType: "loop",
duration: 20,
ease: "linear",
},
className="flex gap-12 sm:gap-16 md:gap-24"
animate={{
x: ["0%", "-33.333333%"],
}}
transition={{
x: {
repeat: Number.POSITIVE_INFINITY,
repeatType: "loop",
duration: 20,
ease: "linear",
},

saddlepaddle and others added 3 commits November 8, 2025 23:18
- Add component graph builder script for fast dependency analysis
- Update agent to always build graph first (avoids 15-20+ grep operations)
- Add test coverage checking requirement (rule #5)
- Define concise output format with performance tracking
- Add self-improvement requirement for iterative agent refinement
- Co-locate all agent resources in .claude/agents/project-structure-validator/
- Add .gitignore for generated graph files

Performance improvements:
- Reduced tool calls from 30+ to ~10
- Pre-computed import counts eliminate slow grep operations
- Test coverage check integrated into workflow

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Test co-location is optional, not mandatory. Removed:
- Bullet #5 from AGENTS.md structure rules
- Test coverage checks from agent validation steps
- Test coverage metrics from agent output format

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
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 (2)
AGENTS.md (2)

98-103: Align test file examples with Rule 5 requirement.

Rule 5 (line 124–125) mandates co-located .test.tsx files for all components, but the examples for SidebarNav and SidebarFooter omit them. For consistency and clarity, either:

  1. Add .test.tsx files to these examples, or
  2. Document when test files are optional

Compare with the HeroCanvas example (line 111), which correctly shows the test file.

Apply this diff to include test files:

 │   ├── SidebarNav/
 │   │   ├── SidebarNav.tsx
+│   │   ├── SidebarNav.test.tsx
 │   │   └── index.ts
 │   └── SidebarFooter/
 │       ├── SidebarFooter.tsx
+│       ├── SidebarFooter.test.tsx
 │       └── index.ts

120-122: Clarify "highest shared parent" guidance in Rule 2.

The co-location rule states "If used 2+ times, promote to highest shared parent's components/," but it's unclear how to handle components used across unrelated branches (e.g., both dashboard/ and settings/). When no natural parent exists, should they go directly to app/components/?

Consider adding an example or explicit guidance to reduce ambiguity.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8f49694 and b06df11.

📒 Files selected for processing (1)
  • AGENTS.md (2 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.18.1)
AGENTS.md

76-76: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (1)
AGENTS.md (1)

72-125: Excellent documentation for Project Structure enforcement.

The new section provides prescriptive, well-structured guidance with clear examples and actionable rules. This aligns well with the PR's goal to enforce co-location and modularization. The examples effectively demonstrate nesting depth, test co-location, and the "last resort" top-level components/ pattern.

Comment thread AGENTS.md

All projects in this repo should be structured like this:

```
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 language identifier to fenced code block.

The code block is missing a language specifier, which violates MD040 and impacts syntax highlighting. Update the opening fence to include text or bash.

-```
+```text
 app/
 ├── page.tsx
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

76-76: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In AGENTS.md around line 76, the fenced code block opening fence is missing a
language identifier (violates MD040); update the opening fence to include a
language such as text or bash (e.g., change ``` to ```text) so the block becomes
a proper fenced code block with syntax highlighting.

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

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b06df11 and 272d785.

📒 Files selected for processing (2)
  • .claude/agents/project-structure-validator.md (1 hunks)
  • AGENTS.md (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • .claude/agents/project-structure-validator.md
🧰 Additional context used
🪛 markdownlint-cli2 (0.18.1)
AGENTS.md

76-76: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (2)
AGENTS.md (2)

72-123: Well-structured Project Structure guidance with clear co-location rules.

The new section provides comprehensive, prescriptive guidance on folder layout and component co-location. The rules are clear:

  • One component per file
  • Co-locate dependencies (hooks, utils, constants, tests)
  • Promote to shared parent's components/ only when used 2+ times
  • Use components/ at app root as a last resort

Examples are concrete and illustrative. The guidance aligns well with the PR objectives of enforcing strict co-location patterns. The addition of test, story, and config co-location alongside components demonstrates practical understanding.


14-15: Improved documentation clarity with new agent rules and packages/ui guidance.

  • Lines 14–15: Clear, inline instruction for adding shadcn components improves discoverability.
  • Lines 68–70: New rules (type safety, avoid running dev servers, search narrowly) are sensible additions that support code quality and automation constraints.

Also applies to: 68-70

Comment thread AGENTS.md
Comment on lines +76 to +78
```
app/
├── page.tsx
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

Fix missing language identifier in fenced code block (MD040).

The opening fence at line 76 is missing a language specifier, which violates MD040. This was previously flagged and remains unresolved. Update the opening fence to include text:

-```
+```text
 app/
 ├── page.tsx
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

76-76: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In AGENTS.md around lines 76 to 78, the fenced code block opening fence is
missing a language identifier (MD040); update the opening fence to include the
language specifier "text" so the block starts with ```text and the listed tree
lines remain unchanged, then save the file.

@saddlepaddle saddlepaddle merged commit 6a9789b into main Nov 9, 2025
2 of 5 checks passed
AviPeltz pushed a commit that referenced this pull request Nov 9, 2025
* Restructure website app with strict co-location pattern

- Extract page sections into dedicated components (HeroSection, ClientLogosSection, ScaleFeaturesSection, FeaturesSection)
- Nest sub-components under parent's components/ directory when only used once
- Move shared layout components (Header, Footer, WaitlistModal) to components/layout/
- Co-locate constants, config, hooks, and shaders with their components
- Reduce main page.tsx from 419 lines to ~30 lines of orchestration
- Add comprehensive Project Structure documentation to AGENTS.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Enforce strict co-location pattern in website app

- Move Header, Footer, WaitlistModal to app/components/ (used only in page.tsx)
- Extract HeroCanvas multi-component file:
  - calculateGlareProperties → helpers.ts
  - LitBackground → components/LitBackground/
- Delete unused ScaleFeaturesSection component
- Update all imports to use relative paths
- Add project-structure-validator agent for ongoing compliance

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Improve project-structure-validator agent performance and output

- Add component graph builder script for fast dependency analysis
- Update agent to always build graph first (avoids 15-20+ grep operations)
- Add test coverage checking requirement (rule #5)
- Define concise output format with performance tracking
- Add self-improvement requirement for iterative agent refinement
- Co-locate all agent resources in .claude/agents/project-structure-validator/
- Add .gitignore for generated graph files

Performance improvements:
- Reduced tool calls from 30+ to ~10
- Pre-computed import counts eliminate slow grep operations
- Test coverage check integrated into workflow

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove Structure Rules heading from AGENTS.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove test coverage requirement from structure rules

Test co-location is optional, not mandatory. Removed:
- Bullet #5 from AGENTS.md structure rules
- Test coverage checks from agent validation steps
- Test coverage metrics from agent output format

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
@coderabbitai coderabbitai Bot mentioned this pull request Nov 9, 2025
5 tasks
@Kitenite Kitenite mentioned this pull request Nov 9, 2025
5 tasks
@Kitenite Kitenite deleted the restructure-web-app branch November 11, 2025 18:18
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