Files
agent-park/.planning/codebase/STRUCTURE.md
T
2026-04-18 19:28:53 +08:00

12 KiB
Raw Blame History

Codebase Structure

Analysis Date: 2026-04-18

Directory Layout

agent_park/
├── prisma/                    # Prisma schema, migrations, and seed script
├── src/app/                   # Next.js App Router entry points, layouts, API routes, global assets
├── src/components/            # Reusable UI grouped by feature area
├── src/hooks/                 # Server-side query/read-model modules
├── src/i18n/                  # next-intl request configuration
├── src/lib/                   # Shared utilities, validation, Prisma client, taxonomy logic
├── src/messages/              # Locale message JSON files
├── .eslintrc.json             # ESLint rules
├── .prettierrc.json           # Prettier rules
├── next.config.js             # Next.js config with next-intl plugin
├── tailwind.config.ts         # Tailwind theme and content scan config
├── tsconfig.json              # TypeScript config and `@/*` path alias
├── vercel.json                # Vercel build/deploy config
└── vitest.config.ts           # Vitest config for `src/**/*.test.ts`

Directory Purposes

prisma/:

  • Purpose: Own the database contract and seed path.
  • Contains: prisma/schema.prisma, migration directories under prisma/migrations/*, and prisma/seed.ts.
  • Key files: prisma/schema.prisma, prisma/seed.ts

src/app/:

  • Purpose: Hold all App Router entry points, route-local components, API handlers, and app-wide assets.
  • Contains: layout.tsx, page.tsx, route.ts, route-local client components, globals.css, robots.ts, sitemap.ts, and icon.svg.
  • Key files: src/app/layout.tsx, src/app/[locale]/layout.tsx, src/app/[locale]/page.tsx, src/app/[locale]/projects/page.tsx, src/app/api/projects/route.ts, src/app/api/signals/route.ts

src/app/[locale]/:

  • Purpose: Group locale-prefixed user-facing routes.
  • Contains: localized pages such as src/app/[locale]/page.tsx, src/app/[locale]/projects/page.tsx, src/app/[locale]/projects/[id]/page.tsx, src/app/[locale]/signals/page.tsx, src/app/[locale]/about/page.tsx, and fallbacks like src/app/[locale]/not-found.tsx.
  • Key files: src/app/[locale]/layout.tsx, src/app/[locale]/projects/ProjectsPageClient.tsx, src/app/[locale]/projects/ProjectsResultsClient.tsx

src/app/api/:

  • Purpose: Group JSON endpoints and webhook handlers by resource.
  • Contains: route handlers and a route-local service module at src/app/api/tags/maintenance/service.ts.
  • Key files: src/app/api/projects/route.ts, src/app/api/projects/[slug]/route.ts, src/app/api/search/ai/route.ts, src/app/api/signals/route.ts, src/app/api/tags/maintenance/route.ts, src/app/api/tags/reset-projects/route.ts, src/app/api/webhook/signals/route.ts

src/components/:

  • Purpose: Store reusable UI by domain area, not by primitive type.
  • Contains: feature folders home, layout, locale, project, search, and signals.
  • Key files: src/components/project/ProjectList.tsx, src/components/project/ProjectDetail.tsx, src/components/search/AISearchBar.tsx, src/components/signals/SignalFeedClient.tsx

src/hooks/:

  • Purpose: Hold server-side data-fetching and read-model builders.
  • Contains: src/hooks/useProjects.ts and src/hooks/useHome.ts.
  • Key files: src/hooks/useProjects.ts, src/hooks/useHome.ts

src/i18n/:

  • Purpose: Configure next-intl request handling.
  • Contains: src/i18n/request.ts.
  • Key files: src/i18n/request.ts

src/lib/:

  • Purpose: Hold cross-cutting domain and infrastructure utilities.
  • Contains: auth, cache helpers, Prisma client, GitHub link helpers, tag taxonomy, slug generation, hotness scoring, and validation schemas.
  • Key files: src/lib/auth.ts, src/lib/cache.ts, src/lib/prisma.ts, src/lib/tag-taxonomy.ts, src/lib/signal-hotness.ts, src/lib/validations.ts, src/lib/github/badges.ts

src/messages/:

  • Purpose: Store locale dictionaries loaded by next-intl.
  • Contains: src/messages/en.json and src/messages/zh.json.
  • Key files: src/messages/en.json, src/messages/zh.json

Key File Locations

Entry Points:

  • src/app/layout.tsx: Root HTML/body shell and conditional analytics.
  • src/app/[locale]/layout.tsx: Locale-aware site shell, navigation, footer, and translation provider.
  • src/app/[locale]/page.tsx: Localized home page.
  • src/app/[locale]/projects/page.tsx: Projects search/browse page.
  • src/app/[locale]/projects/[id]/page.tsx: Project detail page.
  • src/app/[locale]/signals/page.tsx: Signals feed page shell.
  • src/app/[locale]/about/page.tsx: About page.
  • src/middleware.ts: Locale routing middleware.

API Endpoints:

  • src/app/api/projects/route.ts: Paginated projects list API.
  • src/app/api/projects/[slug]/route.ts: Single-project JSON endpoint.
  • src/app/api/search/ai/route.ts: AI search proxy and hydrator.
  • src/app/api/signals/route.ts: Cursor-paginated signals feed API.
  • src/app/api/tags/route.ts: Tags list API.
  • src/app/api/tags/maintenance/route.ts: Authenticated tag update/merge API.
  • src/app/api/tags/reset-projects/route.ts: Authenticated project-tag replacement API.
  • src/app/api/webhook/signals/route.ts: Authenticated signal ingestion webhook.

Configuration:

  • next.config.js: Wraps Next config with the next-intl plugin and remote image rules.
  • tailwind.config.ts: Tailwind content paths and theme extension.
  • tsconfig.json: Strict TypeScript settings and the @/* alias.
  • vitest.config.ts: Node test environment and src/**/*.test.ts inclusion.
  • vercel.json: Build/install commands and region targeting.
  • .eslintrc.json: Lint rules.
  • .prettierrc.json: Formatting rules.
  • .env.example: Template environment file. .env and .env.local are present in the repository root but were not inspected.

Core Logic:

  • src/hooks/useProjects.ts: Project list/detail queries, filter normalization, tag grouping, caching, and retry logic.
  • src/hooks/useHome.ts: Home-page aggregate data builder.
  • src/lib/tag-taxonomy.ts: Tag category metadata and inference rules.
  • src/lib/validations.ts: Zod schemas for API inputs and domain payloads.
  • src/app/api/tags/maintenance/service.ts: Transactional tag maintenance logic.
  • src/lib/signal-hotness.ts: Signal hot-score computation and schema capability detection.

Testing:

  • src/lib/auth.test.ts
  • src/lib/validations.test.ts
  • src/lib/validations.tag-maintenance.test.ts
  • src/app/api/tags/route.test.ts
  • src/app/api/tags/maintenance/route.test.ts
  • src/app/api/tags/maintenance/service.test.ts
  • src/app/api/tags/reset-projects/route.test.ts
  • e2e/: Not present in the inspected repository tree.

Naming Conventions

Files:

  • Use Next.js route conventions inside src/app, for example page.tsx, layout.tsx, route.ts, not-found.tsx, robots.ts, and sitemap.ts.
  • Use PascalCase.tsx for reusable components, for example src/components/project/ProjectCard.tsx, src/components/project/ProjectSidebar.tsx, and src/components/home/HomeOverviewStats.tsx.
  • Keep route-specific helper components adjacent to the route they support, for example src/app/[locale]/projects/ProjectsPageClient.tsx and src/app/[locale]/projects/ProjectsResultsClient.tsx.
  • Use lower-case or kebab-case utility filenames in src/lib, for example src/lib/prisma.ts, src/lib/cache.ts, src/lib/tag-taxonomy.ts, and src/lib/signal-hotness.ts.
  • Keep test files adjacent to the code they cover using *.test.ts, for example src/app/api/tags/maintenance/service.test.ts.

Directories:

  • Group reusable UI by product area under src/components, for example src/components/project and src/components/search.
  • Group route files by URL shape under src/app, for example src/app/[locale]/projects/[id] and src/app/api/projects/[slug].
  • Keep infrastructure and domain utilities flat under src/lib instead of nesting many sublayers. The only nested utility folder detected is src/lib/github/.

Where to Add New Code

New User-Facing Page or Route Segment:

  • Primary code: add a new route under src/app/[locale]/... using Next conventions, for example src/app/[locale]/new-section/page.tsx.
  • Shared shell changes: modify src/app/[locale]/layout.tsx only if the new route needs site-wide navigation or footer changes.
  • Metadata/SEO for the route: colocate generateMetadata in the route file, following src/app/[locale]/about/page.tsx and src/app/[locale]/signals/page.tsx.

New API Endpoint:

  • Primary code: add route.ts under src/app/api/<resource>/.
  • Route-local helpers or service logic: colocate them next to the route, following src/app/api/tags/maintenance/service.ts.
  • Validation: add or extend schemas in src/lib/validations.ts unless the validation is tightly route-local and one-off.

New Reusable UI Component:

  • Implementation: place it in the matching feature folder under src/components/.
  • Examples:
    • Project-related UI goes in src/components/project/.
    • Search UI goes in src/components/search/.
    • Home-page modules go in src/components/home/.
  • If a component is only used by one route and owns that routes browser state, colocate it under the route folder in src/app/[locale]/..., following src/app/[locale]/projects/ProjectsPageClient.tsx.

New Data Query or Read Model:

  • Shared project/home reads: extend src/hooks/useProjects.ts or src/hooks/useHome.ts.
  • New domain-specific reads: add a new module under src/hooks/ if the logic becomes large enough to stand alone.
  • Use src/lib/prisma.ts for Prisma access instead of creating new Prisma clients.

New Shared Utility or Domain Rule:

  • Shared helpers: add to src/lib/.
  • Taxonomy/tag rules: extend src/lib/tag-taxonomy.ts.
  • Request validation: extend src/lib/validations.ts.
  • Authentication helpers for internal APIs: extend src/lib/auth.ts.

New Locale Strings:

  • Add keys to both src/messages/en.json and src/messages/zh.json.
  • Resolve them through next-intl in route or component code, following src/app/[locale]/layout.tsx and src/components/project/ProjectList.tsx.

New Database Model or Field:

  • Schema: update prisma/schema.prisma.
  • Migration: create a new directory under prisma/migrations/.
  • Seed updates: modify prisma/seed.ts only if the new data is required for local bootstrapping.

New Tests:

  • API and utility tests: colocate with the source file as *.test.ts.
  • There is no current e2e/ directory in the inspected tree, so introducing end-to-end tests will require creating that top-level directory explicitly.

Special Directories

src/app/[locale]/projects/:

  • Purpose: Contains one route page plus its route-local client islands.
  • Generated: No
  • Committed: Yes

src/app/api/tags/maintenance/:

  • Purpose: Contains a route handler, a service module, and colocated tests for the tag-maintenance feature.
  • Generated: No
  • Committed: Yes

prisma/migrations/:

  • Purpose: Stores schema migration history.
  • Generated: Yes
  • Committed: Yes

.next/:

  • Purpose: Next.js build output and development cache.
  • Generated: Yes
  • Committed: No

.planning/codebase/:

  • Purpose: Stores generated repository mapping documents such as this file.
  • Generated: Yes
  • Committed: Uncertain from inspected source files alone.

Placement Rules

Use src/app for route ownership:

  • Put code in src/app only when it directly maps to a URL, metadata document, or route-local UI state.

Use src/components for reuse across routes:

  • Promote a route-local component into src/components only when another route needs it or it becomes generic enough to stand alone.

Treat src/hooks as a server query layer, not browser hooks:

  • The existing useProjects.ts and useHome.ts modules are imported by server components and API handlers. Follow that pattern when adding read models there.

Keep Prisma out of most UI files:

  • UI code typically consumes data returned by src/hooks/* or JSON from src/app/api/*.
  • Direct Prisma calls are concentrated in src/hooks/*, src/app/api/*, and src/lib/prisma.ts.

Structure analysis: 2026-04-18